Browse Source

remove redis-role redundancy

Change-Id: Id5a39d008169d4b01cd33a7d82bb0896983e47bc
changes/96/4596/1
Richard Fuchs 10 years ago
parent
commit
725638bccb
6 changed files with 49 additions and 45 deletions
  1. +9
    -9
      daemon/call.c
  2. +6
    -6
      daemon/call_interfaces.c
  3. +2
    -2
      daemon/main.c
  4. +2
    -2
      daemon/media_socket.c
  5. +19
    -18
      daemon/redis.c
  6. +11
    -8
      daemon/redis.h

+ 9
- 9
daemon/call.c View File

@ -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");
}


+ 6
- 6
daemon/call_interfaces.c View File

@ -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);


+ 2
- 2
daemon/main.c View File

@ -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");
}


+ 2
- 2
daemon/media_socket.c View File

@ -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:


+ 19
- 18
daemon/redis.c View File

@ -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);
}

+ 11
- 8
daemon/redis.h View File

@ -14,9 +14,11 @@
#include <hiredis/hiredis.h>
#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 *);


Loading…
Cancel
Save