|
|
|
@ -319,45 +319,16 @@ void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { |
|
|
|
|
|
|
|
str_init(&callid,rr->element[2]->str); |
|
|
|
|
|
|
|
c = call_get(&callid, cm); |
|
|
|
if (c) { |
|
|
|
// because of call_get(..) |
|
|
|
rwlock_unlock_w(&c->master_lock); |
|
|
|
} |
|
|
|
|
|
|
|
if (strncmp(rr->element[3]->str,"sadd",4)==0) { |
|
|
|
if (c) { |
|
|
|
rlog(LOG_ERR, "Redis-Notifier: SADD already find call with callid: %s; deleting the existing one.\n", rr->element[2]->str); |
|
|
|
|
|
|
|
/* Failover scenario because of timeout on offer response: siprouter tries |
|
|
|
* to establish session with another rtpengine2 even though rtpengine1 |
|
|
|
* might have persisted part of the session. |
|
|
|
* |
|
|
|
* rtpengine1: on add, change call type from OWN to FOREIGN so call_destroy |
|
|
|
* won't update redis database*/ |
|
|
|
if (!IS_FOREIGN_CALL(c)) { |
|
|
|
c->foreign_call = 1; |
|
|
|
atomic64_inc(&cm->stats.foreign_sessions); |
|
|
|
atomic64_inc(&cm->totalstats.total_foreign_sessions); |
|
|
|
|
|
|
|
mutex_lock(&cm->totalstats_interval.managed_sess_lock); |
|
|
|
cm->totalstats_interval.managed_sess_min = MIN( |
|
|
|
cm->totalstats_interval.managed_sess_min, |
|
|
|
g_hash_table_size(cm->callhash) |
|
|
|
- atomic64_get(&cm->stats.foreign_sessions)); |
|
|
|
mutex_unlock(&cm->totalstats_interval.managed_sess_lock); |
|
|
|
} |
|
|
|
call_destroy(c); |
|
|
|
} |
|
|
|
if (strncmp(rr->element[3]->str,"sadd",4)==0) |
|
|
|
redis_restore_call(r, cm, rr->element[2], CT_FOREIGN_CALL); |
|
|
|
} |
|
|
|
|
|
|
|
if (strncmp(rr->element[3]->str,"del",3)==0) { |
|
|
|
c = call_get(&callid, cm); |
|
|
|
if (!c) { |
|
|
|
rlog(LOG_NOTICE, "Redis-Notifier: DEL did not find call with callid: %s\n", rr->element[2]->str); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
rwlock_unlock_w(&c->master_lock); |
|
|
|
call_destroy(c); |
|
|
|
} |
|
|
|
|
|
|
|
@ -1415,39 +1386,41 @@ static void redis_restore_call(struct redis *r, struct callmaster *m, const redi |
|
|
|
const char *err; |
|
|
|
int i; |
|
|
|
|
|
|
|
str_init_len(&s, id->str, id->len); |
|
|
|
//s.s = id->str; |
|
|
|
//s.len = id->len; |
|
|
|
c = call_get_or_create(&s, m, type); |
|
|
|
err = "failed to create call struct"; |
|
|
|
if (!c) |
|
|
|
goto err1; |
|
|
|
err = "call already exists"; |
|
|
|
if (c->last_signal) |
|
|
|
goto err2; |
|
|
|
err = "'call' data incomplete"; |
|
|
|
if (redis_get_hash(&call, r, "call", id, -1)) |
|
|
|
goto err1; |
|
|
|
goto err2; |
|
|
|
err = "'tags' incomplete"; |
|
|
|
if (redis_get_list_hash(&tags, r, "tag", id, &call, "num_tags")) |
|
|
|
goto err2; |
|
|
|
goto err3; |
|
|
|
err = "'sfds' incomplete"; |
|
|
|
if (redis_get_list_hash(&sfds, r, "sfd", id, &call, "num_sfds")) |
|
|
|
goto err3; |
|
|
|
goto err4; |
|
|
|
err = "'streams' incomplete"; |
|
|
|
if (redis_get_list_hash(&streams, r, "stream", id, &call, "num_streams")) |
|
|
|
goto err4; |
|
|
|
goto err5; |
|
|
|
err = "'medias' incomplete"; |
|
|
|
if (redis_get_list_hash(&medias, r, "media", id, &call, "num_medias")) |
|
|
|
goto err5; |
|
|
|
goto err6; |
|
|
|
err = "'maps' incomplete"; |
|
|
|
if (redis_get_list_hash(&maps, r, "map", id, &call, "num_maps")) |
|
|
|
goto err7; |
|
|
|
|
|
|
|
str_init_len(&s, id->str, id->len); |
|
|
|
//s.s = id->str; |
|
|
|
//s.len = id->len; |
|
|
|
c = call_get_or_create(&s, m, type); |
|
|
|
err = "failed to create call struct"; |
|
|
|
if (!c) |
|
|
|
goto err8; |
|
|
|
|
|
|
|
err = "missing 'created' timestamp"; |
|
|
|
if (redis_hash_get_time_t(&c->created, &call, "created")) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "missing 'last signal' timestamp"; |
|
|
|
if (redis_hash_get_time_t(&c->last_signal, &call, "last_signal")) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
if (redis_hash_get_int(&i, &call, "tos")) |
|
|
|
c->tos = 184; |
|
|
|
else |
|
|
|
@ -1461,59 +1434,59 @@ static void redis_restore_call(struct redis *r, struct callmaster *m, const redi |
|
|
|
|
|
|
|
err = "missing 'redis_hosted_db' value"; |
|
|
|
if (redis_hash_get_unsigned((unsigned int *) &c->redis_hosted_db, &call, "redis_hosted_db")) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
|
|
|
|
err = "failed to create sfds"; |
|
|
|
if (redis_sfds(c, &sfds)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to create streams"; |
|
|
|
if (redis_streams(c, &streams)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to create tags"; |
|
|
|
if (redis_tags(c, &tags)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to create medias"; |
|
|
|
if (redis_medias(r, c, &medias)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to create maps"; |
|
|
|
if (redis_maps(c, &maps)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
|
|
|
|
err = "failed to link sfds"; |
|
|
|
if (redis_link_sfds(&sfds, &streams)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to link streams"; |
|
|
|
if (redis_link_streams(r, c, &streams, &sfds, &medias)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to link tags"; |
|
|
|
if (redis_link_tags(r, c, &tags, &medias)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to link medias"; |
|
|
|
if (redis_link_medias(r, c, &medias, &streams, &maps, &tags)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
err = "failed to link maps"; |
|
|
|
if (redis_link_maps(r, c, &maps, &sfds)) |
|
|
|
goto err6; |
|
|
|
goto err8; |
|
|
|
|
|
|
|
redis_restore_recording(c, &call); |
|
|
|
|
|
|
|
err = NULL; |
|
|
|
obj_put(c); |
|
|
|
|
|
|
|
err6: |
|
|
|
rwlock_unlock_w(&c->master_lock); |
|
|
|
err8: |
|
|
|
redis_destroy_list(&maps); |
|
|
|
err7: |
|
|
|
redis_destroy_list(&medias); |
|
|
|
err5: |
|
|
|
err6: |
|
|
|
redis_destroy_list(&streams); |
|
|
|
err4: |
|
|
|
err5: |
|
|
|
redis_destroy_list(&sfds); |
|
|
|
err3: |
|
|
|
err4: |
|
|
|
redis_destroy_list(&tags); |
|
|
|
err2: |
|
|
|
err3: |
|
|
|
redis_destroy_hash(&call); |
|
|
|
err2: |
|
|
|
rwlock_unlock_w(&c->master_lock); |
|
|
|
err1: |
|
|
|
log_info_clear(); |
|
|
|
if (err) { |
|
|
|
|