Skip to content

Commit

Permalink
topos_redis: update fields and reduce expires for termintated dialogs
Browse files Browse the repository at this point in the history
  • Loading branch information
miconda committed Mar 2, 2017
1 parent 5851bf0 commit e712d32
Showing 1 changed file with 114 additions and 3 deletions.
117 changes: 114 additions & 3 deletions src/modules/topos_redis/topos_redis_storage.c
Expand Up @@ -267,7 +267,7 @@ int tps_redis_insert_dialog(tps_data_t *td)

rrpl = _tps_redis_api.exec_argv(rsrv, argc, (const char **)argv, argvlen);
if(rrpl==NULL) {
LM_ERR("failed to execute expireredis command\n");
LM_ERR("failed to execute expire redis command\n");
if(rsrv->ctxRedis->err) {
LM_ERR("redis error: %s\n", rsrv->ctxRedis->errstr);
}
Expand Down Expand Up @@ -386,15 +386,15 @@ int tps_redis_insert_branch(tps_data_t *td)
argvlen[argc] = rkey.len;
argc++;

lval = (unsigned long)_tps_api.get_dialog_expire();
lval = (unsigned long)_tps_api.get_branch_expire();
if(lval==0) {
return 0;
}
TPS_REDIS_SET_ARGNV(lval, rp, &rval, argc, argv, argvlen);

rrpl = _tps_redis_api.exec_argv(rsrv, argc, (const char **)argv, argvlen);
if(rrpl==NULL) {
LM_ERR("failed to execute expireredis command\n");
LM_ERR("failed to execute expire redis command\n");
if(rsrv->ctxRedis->err) {
LM_ERR("redis error: %s\n", rsrv->ctxRedis->errstr);
}
Expand Down Expand Up @@ -910,5 +910,116 @@ int tps_redis_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
*/
int tps_redis_end_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
{
char* argv[TPS_REDIS_NR_KEYS];
size_t argvlen[TPS_REDIS_NR_KEYS];
int argc = 0;
str rcmd = str_init("HMSET");
str rkey = STR_NULL;
char *rp;
str rval = STR_NULL;
redisc_server_t *rsrv = NULL;
redisReply *rrpl = NULL;
int32_t liflags;
unsigned long lval = 0;

if(sd->a_uuid.len<=0 && sd->b_uuid.len<=0) {
LM_INFO("no uuid for this message\n");
return -1;
}

rsrv = _tps_redis_api.get_server(&_topos_redis_serverid);
if(rsrv==NULL) {
LM_ERR("cannot find redis server [%.*s]\n",
_topos_redis_serverid.len, _topos_redis_serverid.s);
return -1;
}

memset(argv, 0, TPS_REDIS_NR_KEYS * sizeof(char*));
memset(argvlen, 0, TPS_REDIS_NR_KEYS * sizeof(size_t));
argc = 0;

rp = _tps_redis_cbuf;
memcpy(rp, _tps_redis_dprefix.s, _tps_redis_dprefix.len);

if(sd->a_uuid.len>0) {
memcpy(rp + _tps_redis_dprefix.len,
sd->a_uuid.s, sd->a_uuid.len);
if(sd->a_uuid.s[0]=='b') {
rp[_tps_redis_dprefix.len] = 'a';
}
rp[_tps_redis_dprefix.len+sd->a_uuid.len] = '\0';
rkey.s = rp;
rkey.len = _tps_redis_dprefix.len+sd->a_uuid.len;
rp += _tps_redis_dprefix.len+sd->a_uuid.len+1;
} else {
memcpy(rp + _tps_redis_dprefix.len,
sd->b_uuid.s, sd->b_uuid.len);
if(sd->b_uuid.s[0]=='b') {
rp[_tps_redis_dprefix.len] = 'a';
}
rp[_tps_redis_dprefix.len+sd->b_uuid.len] = '\0';
rkey.s = rp;
rkey.len = _tps_redis_dprefix.len+sd->b_uuid.len;
rp += _tps_redis_dprefix.len+sd->b_uuid.len+1;
}

argv[argc] = rcmd.s;
argvlen[argc] = rcmd.len;
argc++;

argv[argc] = rkey.s;
argvlen[argc] = rkey.len;
argc++;

lval = (unsigned long)time(NULL);
TPS_REDIS_SET_ARGN(lval, rp, &rval, argc, &td_key_rectime,
argv, argvlen);
liflags = 0;
TPS_REDIS_SET_ARGN(liflags, rp, &rval, argc, &td_key_iflags,
argv, argvlen);

rrpl = _tps_redis_api.exec_argv(rsrv, argc, (const char **)argv, argvlen);
if(rrpl==NULL) {
LM_ERR("failed to execute redis command\n");
if(rsrv->ctxRedis->err) {
LM_ERR("redis error: %s\n", rsrv->ctxRedis->errstr);
}
return -1;
}
LM_DBG("updated on end the dialog record for [%.*s] with argc %d\n",
rkey.len, rkey.s, argc);

freeReplyObject(rrpl);

/* set expire for the key */
argc = 0;

argv[argc] = "EXPIRE";
argvlen[argc] = 6;
argc++;

argv[argc] = rkey.s;
argvlen[argc] = rkey.len;
argc++;

/* dialog ended -- keep it for branch lifetime only */
lval = (unsigned long)_tps_api.get_branch_expire();
if(lval==0) {
return 0;
}
TPS_REDIS_SET_ARGNV(lval, rp, &rval, argc, argv, argvlen);

rrpl = _tps_redis_api.exec_argv(rsrv, argc, (const char **)argv, argvlen);
if(rrpl==NULL) {
LM_ERR("failed to execute expire redis command\n");
if(rsrv->ctxRedis->err) {
LM_ERR("redis error: %s\n", rsrv->ctxRedis->errstr);
}
return -1;
}
LM_DBG("expire set on branch record for [%.*s] with argc %d\n",
rkey.len, rkey.s, argc);
freeReplyObject(rrpl);

return 0;
}

0 comments on commit e712d32

Please sign in to comment.