diff --git a/daemon/call.c b/daemon/call.c index 36dac17d6..5e30c2d34 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -568,9 +568,9 @@ static void callmaster_timer(void *ptr) { if (update) { if (m->conf.redis_write) { - redis_update(ps->call, m->conf.redis_write, ANY_REDIS_ROLE); + redis_update(ps->call, m->conf.redis_write); } else if (m->conf.redis) { - redis_update(ps->call, m->conf.redis, MASTER_REDIS_ROLE); + redis_update(ps->call, m->conf.redis); } } @@ -1847,9 +1847,9 @@ void call_destroy(struct call *c) { obj_put(c); if (m->conf.redis_write) { - redis_delete(c, m->conf.redis_write, ANY_REDIS_ROLE); + redis_delete(c, m->conf.redis_write); } else if (m->conf.redis) { - redis_delete(c, m->conf.redis, MASTER_REDIS_ROLE); + redis_delete(c, m->conf.redis); } rwlock_lock_w(&c->master_lock); @@ -2713,9 +2713,9 @@ static void calls_dump_iterator(void *key, void *val, void *ptr) { struct callmaster *m = c->callmaster; if (m->conf.redis_write) { - redis_update(c, m->conf.redis_write, ANY_REDIS_ROLE); + redis_update(c, m->conf.redis_write); } else if (m->conf.redis) { - redis_update(c, m->conf.redis, MASTER_REDIS_ROLE); + redis_update(c, m->conf.redis); } } @@ -2724,7 +2724,7 @@ void calls_dump_redis(struct callmaster *m) { return; ilog(LOG_DEBUG, "Start dumping all call data to Redis...\n"); - redis_wipe(m->conf.redis, MASTER_REDIS_ROLE); + redis_wipe(m->conf.redis); g_hash_table_foreach(m->callhash, calls_dump_iterator, NULL); ilog(LOG_DEBUG, "Finished dumping all call data to Redis\n"); } @@ -2734,7 +2734,7 @@ void calls_dump_redis_read(struct callmaster *m) { return; ilog(LOG_DEBUG, "Start dumping all call data to read Redis...\n"); - redis_wipe(m->conf.redis_read, ANY_REDIS_ROLE); + redis_wipe(m->conf.redis_read); g_hash_table_foreach(m->callhash, calls_dump_iterator, NULL); ilog(LOG_DEBUG, "Finished dumping all call data to read Redis\n"); } @@ -2744,7 +2744,7 @@ void calls_dump_redis_write(struct callmaster *m) { return; ilog(LOG_DEBUG, "Start dumping all call data to write Redis...\n"); - redis_wipe(m->conf.redis_write, ANY_REDIS_ROLE); + redis_wipe(m->conf.redis_write); g_hash_table_foreach(m->callhash, calls_dump_iterator, NULL); ilog(LOG_DEBUG, "Finished dumping all call data to write Redis\n"); } diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 939c67742..9b2468174 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -187,9 +187,9 @@ static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_o rwlock_unlock_w(&c->master_lock); if (m->conf.redis_write) { - redis_update(c, m->conf.redis_write, ANY_REDIS_ROLE); + redis_update(c, m->conf.redis_write); } else if (m->conf.redis) { - redis_update(c, m->conf.redis, MASTER_REDIS_ROLE); + redis_update(c, m->conf.redis); } gettimeofday(&(monologue->started), NULL); @@ -339,9 +339,9 @@ out2: streams_free(&s); if (m->conf.redis_write) { - redis_update(c, m->conf.redis_write, ANY_REDIS_ROLE); + redis_update(c, m->conf.redis_write); } else if (m->conf.redis) { - redis_update(c, m->conf.redis, MASTER_REDIS_ROLE); + redis_update(c, m->conf.redis); } ilog(LOG_INFO, "Returning to SIP proxy: "STR_FORMAT"", STR_FMT0(ret)); @@ -720,9 +720,9 @@ static const char *call_offer_answer_ng(bencode_item_t *input, struct callmaster rwlock_unlock_w(&call->master_lock); if (m->conf.redis_write) { - redis_update(call, m->conf.redis_write, ANY_REDIS_ROLE); + redis_update(call, m->conf.redis_write); } else if (m->conf.redis) { - redis_update(call, m->conf.redis, MASTER_REDIS_ROLE); + redis_update(call, m->conf.redis); } obj_put(call); diff --git a/daemon/main.c b/daemon/main.c index 6684af0d1..d0dfcf545 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -587,10 +587,10 @@ no_kernel: // restore if (mc.redis_read) { - if (redis_restore(ctx->m, mc.redis_read, ANY_REDIS_ROLE)) + if (redis_restore(ctx->m, mc.redis_read)) die("Refusing to continue without working Redis read database"); } else if (mc.redis) { - if (redis_restore(ctx->m, mc.redis, MASTER_REDIS_ROLE)) + if (redis_restore(ctx->m, mc.redis)) die("Refusing to continue without working Redis database"); } diff --git a/daemon/media_socket.c b/daemon/media_socket.c index d4dc7db64..59886e1bc 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1397,9 +1397,9 @@ out: if (ca && update) { if (ca->callmaster->conf.redis_write) { - redis_update(ca, ca->callmaster->conf.redis, ANY_REDIS_ROLE); + redis_update(ca, ca->callmaster->conf.redis); } else if (ca->callmaster->conf.redis) { - redis_update(ca, ca->callmaster->conf.redis, MASTER_REDIS_ROLE); + redis_update(ca, ca->callmaster->conf.redis); } } done: diff --git a/daemon/redis.c b/daemon/redis.c index fa65aa2bf..d193598e8 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -124,7 +124,7 @@ static void redis_consume(struct redis *r) { /* called with r->lock held if necessary */ -static int redis_connect(struct redis *r, int wait, int role) { +static int redis_connect(struct redis *r, int wait) { struct timeval tv; redisReply *rp; char *s; @@ -161,18 +161,18 @@ static int redis_connect(struct redis *r, int wait, int role) { } if (!memcmp(s, "role:master", 9)) { - if (role == MASTER_REDIS_ROLE || role == ANY_REDIS_ROLE) { + if (r->role == MASTER_REDIS_ROLE || r->role == ANY_REDIS_ROLE) { ilog(LOG_INFO, "Connected to Redis in master mode"); goto done; - } else if (role == SLAVE_REDIS_ROLE) { + } else if (r->role == SLAVE_REDIS_ROLE) { ilog(LOG_INFO, "Connected to Redis in master mode, but wanted mode is slave; retrying..."); goto next; } } else if (!memcmp(s, "role:slave", 8)) { - if (role == SLAVE_REDIS_ROLE || role == ANY_REDIS_ROLE) { + if (r->role == SLAVE_REDIS_ROLE || r->role == ANY_REDIS_ROLE) { ilog(LOG_INFO, "Connected to Redis in slave mode"); goto done; - } else if (role == MASTER_REDIS_ROLE) { + } else if (r->role == MASTER_REDIS_ROLE) { ilog(LOG_INFO, "Connected to Redis in slave mode, but wanted mode is master; retrying..."); goto next; } @@ -206,7 +206,7 @@ err: -struct redis *redis_new(const endpoint_t *ep, int db, int role) { +struct redis *redis_new(const endpoint_t *ep, int db, enum redis_role role) { struct redis *r; r = g_slice_alloc0(sizeof(*r)); @@ -214,9 +214,10 @@ struct redis *redis_new(const endpoint_t *ep, int db, int role) { r->endpoint = *ep; sockaddr_print(&ep->address, r->host, sizeof(r->host)); r->db = db; + r->role = role; mutex_init(&r->lock); - if (redis_connect(r, 10, role)) + if (redis_connect(r, 10)) goto err; return r; @@ -239,11 +240,11 @@ static void redis_close(struct redis *r) { /* called with r->lock held if necessary */ -static void redis_check_conn(struct redis *r, int role) { +static void redis_check_conn(struct redis *r) { if (redisCommandNR(r->ctx, "PING") == 0) return; rlog(LOG_INFO, "Lost connection to Redis"); - if (redis_connect(r, 1, role)) + if (redis_connect(r, 1)) abort(); } @@ -1048,7 +1049,7 @@ static void restore_thread(void *call_p, void *ctx_p) { mutex_unlock(&ctx->r_m); } -int redis_restore(struct callmaster *m, struct redis *r, int role) { +int redis_restore(struct callmaster *m, struct redis *r) { redisReply *calls, *call; int i, ret = -1; GThreadPool *gtp; @@ -1060,7 +1061,7 @@ int redis_restore(struct callmaster *m, struct redis *r, int role) { log_level |= LOG_FLAG_RESTORE; rlog(LOG_DEBUG, "Restoring calls from Redis..."); - redis_check_conn(r, role); + redis_check_conn(r); calls = redis_get(r, REDIS_REPLY_ARRAY, "SMEMBERS calls"); @@ -1073,7 +1074,7 @@ int redis_restore(struct callmaster *m, struct redis *r, int role) { mutex_init(&ctx.r_m); g_queue_init(&ctx.r_q); for (i = 0; i < RESTORE_NUM_THREADS; i++) - g_queue_push_tail(&ctx.r_q, redis_new(&r->endpoint, r->db, role)); + g_queue_push_tail(&ctx.r_q, redis_new(&r->endpoint, r->db, r->role)); gtp = g_thread_pool_new(restore_thread, &ctx, RESTORE_NUM_THREADS, TRUE, NULL); for (i = 0; i < calls->elements; i++) { @@ -1185,7 +1186,7 @@ static void redis_update_dtls_fingerprint(struct redis *r, const char *pref, con */ /* must be called lock-free */ -void redis_update(struct call *c, struct redis *r, int role) { +void redis_update(struct call *c, struct redis *r) { GList *l, *n, *k, *m; struct call_monologue *ml, *ml2; struct call_media *media; @@ -1199,7 +1200,7 @@ void redis_update(struct call *c, struct redis *r, int role) { return; mutex_lock(&r->lock); - redis_check_conn(r, role); + redis_check_conn(r); rwlock_lock_r(&c->master_lock); @@ -1444,12 +1445,12 @@ void redis_update(struct call *c, struct redis *r, int role) { /* must be called lock-free */ -void redis_delete(struct call *c, struct redis *r, int role) { +void redis_delete(struct call *c, struct redis *r) { if (!r) return; mutex_lock(&r->lock); - redis_check_conn(r, role); + redis_check_conn(r); rwlock_lock_r(&c->master_lock); redis_delete_call(c, r); @@ -1462,12 +1463,12 @@ void redis_delete(struct call *c, struct redis *r, int role) { -void redis_wipe(struct redis *r, int role) { +void redis_wipe(struct redis *r) { if (!r) return; mutex_lock(&r->lock); - redis_check_conn(r, role); + redis_check_conn(r); redisCommandNR(r->ctx, "DEL calls"); mutex_unlock(&r->lock); } diff --git a/daemon/redis.h b/daemon/redis.h index d0bd7de7c..6961953db 100644 --- a/daemon/redis.h +++ b/daemon/redis.h @@ -14,9 +14,11 @@ #include -#define MASTER_REDIS_ROLE 0 -#define SLAVE_REDIS_ROLE 1 -#define ANY_REDIS_ROLE 2 +enum redis_role { + MASTER_REDIS_ROLE = 0, + SLAVE_REDIS_ROLE = 1, + ANY_REDIS_ROLE = 2, +}; struct callmaster; struct call; @@ -26,6 +28,7 @@ struct call; struct redis { endpoint_t endpoint; char host[64]; + enum redis_role role; redisContext *ctx; int db; @@ -75,11 +78,11 @@ INLINE gboolean g_hash_table_insert_check(GHashTable *h, gpointer k, gpointer v) -struct redis *redis_new(const endpoint_t *, int, int); -int redis_restore(struct callmaster *, struct redis *, int); -void redis_update(struct call *, struct redis *, int); -void redis_delete(struct call *, struct redis *, int); -void redis_wipe(struct redis *, int); +struct redis *redis_new(const endpoint_t *, int, enum redis_role); +int redis_restore(struct callmaster *, struct redis *); +void redis_update(struct call *, struct redis *); +void redis_delete(struct call *, struct redis *); +void redis_wipe(struct redis *);