From 241d479de24d89ae858e8b5ac2436f99b6e9c856 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 4 May 2012 17:11:16 +0000 Subject: [PATCH] Push viabranch info into redis and restore it as well --- daemon/call.c | 16 +++++++++++----- daemon/call.h | 2 +- daemon/redis.c | 27 ++++++++++++++++++++++----- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 0c1d31729..6d845e0a7 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -1108,7 +1108,6 @@ static void call_destroy(struct call *c) { g_hash_table_remove(m->callhash, c->callid); #ifndef NO_REDIS - /* TODO: take into account the viabranch list */ redis_delete(c); #endif @@ -1309,7 +1308,6 @@ char *call_update_udp(const char **out, struct callmaster *m) { g_queue_clear(&q); #ifndef NO_REDIS - /* TODO: need to change structure in regards to viabranch as well */ redis_update(c); #endif @@ -1352,7 +1350,6 @@ char *call_lookup_udp(const char **out, struct callmaster *m) { g_queue_clear(&q); #ifndef NO_REDIS - /* TODO: need to change structure in regards to viabranch as well */ redis_update(c); #endif @@ -1577,14 +1574,14 @@ void calls_status(struct callmaster *m, struct control_stream *s) { #ifndef NO_REDIS -void call_restore(struct callmaster *m, char *uuid, redisReply **hash, GList *streams) { +void call_restore(struct callmaster *m, char *uuid, redisReply **hash, GList *streams, redisReply *branches) { struct call *c; struct callstream *cs; redisReply *rps[2], *rp; int i, kernel; struct peer *p; - c = call_get_or_create(hash[0]->str, NULL, m); /* TODO: restore viabranch as well */ + c = call_get_or_create(hash[0]->str, NULL, m); strcpy(c->redis_uuid, uuid); c->created = strtoll(hash[1]->str, NULL, 10); strdupfree(&c->calling_agent, "UNKNOWN(recovered)"); @@ -1618,6 +1615,15 @@ void call_restore(struct callmaster *m, char *uuid, redisReply **hash, GList *st if (kernel) kernelize(cs); } + + if (branches) { + for (i = 0; i < branches->elements; i++) { + rp = branches->element[i]; + if (rp->type != REDIS_REPLY_STRING) + continue; + g_hash_table_insert(c->branches, strdup(rp->str), (void *) 0x1); + } + } } diff --git a/daemon/call.h b/daemon/call.h index ac7a44d48..d1c7d0738 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -131,7 +131,7 @@ char *call_delete_udp(const char **, struct callmaster *); void calls_status(struct callmaster *, struct control_stream *); #ifndef NO_REDIS -void call_restore(struct callmaster *, char *, redisReply **, GList *); +void call_restore(struct callmaster *, char *, redisReply **, GList *, redisReply *); void calls_dump_redis(struct callmaster *); #endif diff --git a/daemon/redis.c b/daemon/redis.c index 832c615b7..eadff8185 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -197,7 +197,7 @@ static void redis_delete_uuid(char *uuid, struct callmaster *m) { count++; } - redisAppendCommand(r->ctx, "DEL %s-streams %s", uuid, uuid); + redisAppendCommand(r->ctx, "DEL %s-streams %s-viabranches %s", uuid, uuid, uuid); redisAppendCommand(r->ctx, "SREM calls %s", uuid); count += 2; @@ -210,7 +210,7 @@ static void redis_delete_uuid(char *uuid, struct callmaster *m) { int redis_restore(struct callmaster *m) { struct redis *r = m->redis; - redisReply *rp, *rp2, *rp3, *rp4, *rp5, *rp6; + redisReply *rp, *rp2, *rp3, *rp4, *rp5, *rp6, *rp7; GQueue q = G_QUEUE_INIT; int i, j, k, l; @@ -266,13 +266,21 @@ int redis_restore(struct callmaster *m) { } } - call_restore(m, rp2->str, rp3->element, q.head); + rp7 = redisCommand(r->ctx, "LRANGE %s-viabranches 0 -1", rp2->str); + if (rp7 && rp7->type != REDIS_REPLY_ARRAY) { + freeReplyObject(rp7); + rp7 = NULL; + } + + call_restore(m, rp2->str, rp3->element, q.head, rp7); if (q.head) g_list_foreach(q.head, (GFunc) freeReplyObject, NULL); g_queue_clear(&q); freeReplyObject(rp4); freeReplyObject(rp3); + if (rp7) + freeReplyObject(rp7); continue; @@ -324,7 +332,8 @@ void redis_update(struct call *c) { redisAppendCommand(r->ctx, "HMSET %s callid %s created %i", c->redis_uuid, c->callid, c->created); redisAppendCommand(r->ctx, "DEL %s-streams-temp", c->redis_uuid); - count += 2; + redisAppendCommand(r->ctx, "DEL %s-viabranches-temp", c->redis_uuid); + count += 3; for (l = c->callstreams->head; l; l = l->next) { cs = l->data; @@ -344,11 +353,19 @@ void redis_update(struct call *c) { count++; } + for (l = g_hash_table_get_keys(c->branches); l; l = l->next) { + redisAppendCommand(r->ctx, "RPUSH %s-viabranches-temp %s", c->redis_uuid, l->data); + count++; + } + g_list_free(l); + redisAppendCommand(r->ctx, "RENAME %s-streams-temp %s-streams", c->redis_uuid, c->redis_uuid); + redisAppendCommand(r->ctx, "RENAME %s-viabranches-temp %s-viabranches", c->redis_uuid, c->redis_uuid); redisAppendCommand(r->ctx, "EXPIRE %s-streams 86400", c->redis_uuid); + redisAppendCommand(r->ctx, "EXPIRE %s-viabranches 86400", c->redis_uuid); redisAppendCommand(r->ctx, "EXPIRE %s 86400", c->redis_uuid); redisAppendCommand(r->ctx, "SADD calls %s", c->redis_uuid); - count += 4; + count += 6; if (oldstreams) { if (oldstreams->type == REDIS_REPLY_ARRAY) {