Browse Source

TT#12800 restore SSRC table from redis

Change-Id: I9c6a5a33ae14e803e5badade8307d4f53f7a04a2
changes/00/12700/6
Richard Fuchs 9 years ago
parent
commit
2cf93904df
1 changed files with 35 additions and 2 deletions
  1. +35
    -2
      daemon/redis.c

+ 35
- 2
daemon/redis.c View File

@ -700,6 +700,16 @@ INLINE str *json_reader_get_string_value_uri_enc(JsonReader *root_reader) {
str *out = str_uri_decode_len(s, strlen(s)); str *out = str_uri_decode_len(s, strlen(s));
return out; // must be free'd return out; // must be free'd
} }
// XXX rework restore procedure to use functions like this everywhere and eliminate the GHashTable
INLINE long long json_reader_get_ll(JsonReader *root_reader, const char *key) {
if (!json_reader_read_member(root_reader, key))
return -1;
str *ret = json_reader_get_string_value_uri_enc(root_reader);
long long r = strtoll(ret->s, NULL, 10);
free(ret);
json_reader_end_member(root_reader);
return r;
}
static int json_get_hash(struct redis_hash *out, static int json_get_hash(struct redis_hash *out,
const char *key, unsigned int id, JsonReader *root_reader) const char *key, unsigned int id, JsonReader *root_reader)
@ -1379,6 +1389,28 @@ static int json_link_maps(struct call *c, struct redis_list *maps,
return 0; return 0;
} }
static int json_build_ssrc(struct call *c, JsonReader *root_reader) {
if (!json_reader_read_member(root_reader, "ssrc_table"))
return -1;
int nmemb = json_reader_count_elements(root_reader);
for (int jidx=0; jidx < nmemb; ++jidx) {
if (!json_reader_read_element(root_reader, jidx))
return -1;
u_int32_t ssrc = json_reader_get_ll(root_reader, "ssrc");
struct ssrc_entry *se = get_ssrc(ssrc, c->ssrc_hash);
se->input_ctx.srtp_index = json_reader_get_ll(root_reader, "in_srtp_index");
se->input_ctx.srtcp_index = json_reader_get_ll(root_reader, "in_srtcp_index");
se->output_ctx.srtp_index = json_reader_get_ll(root_reader, "out_srtp_index");
se->output_ctx.srtcp_index = json_reader_get_ll(root_reader, "out_srtcp_index");
se->payload_type = json_reader_get_ll(root_reader, "payload_type");
json_reader_end_element(root_reader);
}
json_reader_end_member (root_reader);
return 0;
}
static void json_restore_call(struct redis *r, struct callmaster *m, const str *callid, enum call_type type) { static void json_restore_call(struct redis *r, struct callmaster *m, const str *callid, enum call_type type) {
redisReply* rr_jsonStr; redisReply* rr_jsonStr;
struct redis_hash call; struct redis_hash call;
@ -1485,8 +1517,9 @@ static void json_restore_call(struct redis *r, struct callmaster *m, const str *
err = "failed to link maps"; err = "failed to link maps";
if (json_link_maps(c, &maps, &sfds, root_reader)) if (json_link_maps(c, &maps, &sfds, root_reader))
goto err8; goto err8;
// XXX restore SSRC table
err = "failed to restore SSRC table";
if (json_build_ssrc(c, root_reader))
goto err8;
// presence of this key determines whether we were recording at all // presence of this key determines whether we were recording at all
if (!redis_hash_get_str(&s, &call, "recording_meta_prefix")) { if (!redis_hash_get_str(&s, &call, "recording_meta_prefix")) {


Loading…
Cancel
Save