diff --git a/daemon/call.c b/daemon/call.c index de7eb641c..a0c82d327 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2286,7 +2286,7 @@ static struct call *call_create(const str *callid, struct callmaster *m) { } /* returns call with master_lock held in W */ -struct call *call_get_or_create(const str *callid, struct callmaster *m) { +struct call *call_get_or_create(const str *callid, struct callmaster *m, enum call_type type) { struct call *c; restart: @@ -2304,12 +2304,21 @@ restart: goto restart; } g_hash_table_insert(m->callhash, &c->callid, obj_get(c)); - if(! IS_BACKUP_CALL(c)) { + + if (type == CT_OWN_CALL) { mutex_lock(&m->totalstats_interval.managed_sess_lock); - m->totalstats_interval.managed_sess_max = MAX(m->totalstats_interval.managed_sess_max, - g_hash_table_size(m->callhash) - atomic64_get(&m->stats.foreign_sessions)); + m->totalstats_interval.managed_sess_max = MAX( + m->totalstats_interval.managed_sess_max, + g_hash_table_size(m->callhash) + - atomic64_get(&m->stats.foreign_sessions)); mutex_unlock(&m->totalstats_interval.managed_sess_lock); } + else if (type == CT_FOREIGN_CALL) { /* foreign call*/ + c->redis_foreign_call = 1; + c->is_backup_call = 1; + atomic64_inc(&m->stats.foreign_sessions); + atomic64_inc(&m->totalstats.total_foreign_sessions); + } rwlock_lock_w(&c->master_lock); rwlock_unlock_w(&m->hashlock); } @@ -2345,7 +2354,7 @@ struct call *call_get(const str *callid, struct callmaster *m) { /* returns call with master_lock held in W, or possibly NULL iff opmode == OP_ANSWER */ struct call *call_get_opmode(const str *callid, struct callmaster *m, enum call_opmode opmode) { if (opmode == OP_OFFER) - return call_get_or_create(callid, m); + return call_get_or_create(callid, m, CT_OWN_CALL); return call_get(callid, m); } diff --git a/daemon/call.h b/daemon/call.h index 214ad8145..b73289486 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -79,6 +79,11 @@ enum call_stream_state { CSS_RUNNING, }; +enum call_type { + CT_OWN_CALL = 0, + CT_FOREIGN_CALL, +}; + #include "obj.h" #include "aux.h" #include "bencode.h" @@ -491,7 +496,7 @@ void __monologue_viabranch(struct call_monologue *ml, const str *viabranch); struct packet_stream *__packet_stream_new(struct call *call); -struct call *call_get_or_create(const str *callid, struct callmaster *m); +struct call *call_get_or_create(const str *callid, struct callmaster *m, enum call_type); struct call *call_get_opmode(const str *callid, struct callmaster *m, enum call_opmode opmode); struct call_monologue *call_get_mono_dialogue(struct call *call, const str *fromtag, const str *totag, const str *viabranch); diff --git a/daemon/redis.c b/daemon/redis.c index e5ef18a7d..b47c39aff 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -233,7 +233,7 @@ int str_cut(char *str, int begin, int len) { return len; } -static void redis_restore_call(struct redis *r, struct callmaster *m, const redisReply *id); +static void redis_restore_call(struct redis *r, struct callmaster *m, const redisReply *id, enum call_type); static int redis_check_conn(struct redis *r); void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { @@ -315,15 +315,7 @@ void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { rlog(LOG_INFO, "Redis-Notifier: Call already exists with this callid:%s\n", rr->element[2]->str); goto err; } - redis_restore_call(r, cm, rr->element[2]); - // we lookup again to retrieve the call to insert the kayspace db id - c = g_hash_table_lookup(cm->callhash, &callid); - if (c) { - c->redis_foreign_call = 1; - c->is_backup_call = 1; - atomic64_inc(&cm->stats.foreign_sessions); - atomic64_inc(&cm->totalstats.total_foreign_sessions); - } + redis_restore_call(r, cm, rr->element[2], CT_FOREIGN_CALL); } if (strncmp(rr->element[3]->str,"del",3)==0) { @@ -1211,7 +1203,7 @@ static int redis_link_maps(struct redis *r, struct call *c, struct redis_list *m } -static void redis_restore_call(struct redis *r, struct callmaster *m, const redisReply *id) { +static void redis_restore_call(struct redis *r, struct callmaster *m, const redisReply *id, enum call_type type) { struct redis_hash call; struct redis_list tags, sfds, streams, medias, maps; struct call *c = NULL; @@ -1241,7 +1233,7 @@ static void redis_restore_call(struct redis *r, struct callmaster *m, const redi str_init_len(&s, id->str, id->len); //s.s = id->str; //s.len = id->len; - c = call_get_or_create(&s, m); + c = call_get_or_create(&s, m, type); err = "failed to create call struct"; if (!c) goto err8; @@ -1348,7 +1340,7 @@ static void restore_thread(void *call_p, void *ctx_p) { r = g_queue_pop_head(&ctx->r_q); mutex_unlock(&ctx->r_m); - redis_restore_call(r, ctx->m, call); + redis_restore_call(r, ctx->m, call, CT_OWN_CALL); mutex_lock(&ctx->r_m); g_queue_push_tail(&ctx->r_q, r);