Skip to content

Commit

Permalink
introduced contactid as composed of aorhash|recrod label|contact label
Browse files Browse the repository at this point in the history
  • Loading branch information
ionutrazvanionita committed Jul 24, 2015
1 parent c959f49 commit 04c9add
Show file tree
Hide file tree
Showing 12 changed files with 304 additions and 172 deletions.
4 changes: 2 additions & 2 deletions modules/usrloc/dlist.c
Expand Up @@ -142,9 +142,9 @@ static int get_domain_db_ucontacts(udomain_t *d, void *buf, int *len,

i = snprintf(query_buf, sizeof query_buf, "select %.*s, %.*s, %.*s,"
#ifdef ORACLE_USRLOC
" %.*s, %.*s from %s where %.*s > %.*s and mod(id, %u) = %u",
" %.*s, %.*s from %s where %.*s > %.*s and mod(contact_id, %u) = %u",
#else
" %.*s, %.*s from %s where %.*s > %.*s and id %% %u = %u",
" %.*s, %.*s from %s where %.*s > %.*s and contact_id %% %u = %u",
#endif
received_col.len, received_col.s,
contact_col.len, contact_col.s,
Expand Down
27 changes: 27 additions & 0 deletions modules/usrloc/dlist.h
Expand Up @@ -115,5 +115,32 @@ int find_domain(str* _d, udomain_t** _p);
typedef udomain_t* (*get_next_udomain_t) (udomain_t* _d);
udomain_t* get_next_udomain(udomain_t *_d);

#define CID_GET_CLABEL(_cid) (_cid&0xFFFF)
#define CID_NEXT_RLABEL(_dom, _sl) (_dom->table[_sl].next_label++)

static inline uint64_t
pack_indexes(unsigned short aorhash, unsigned int rlabel, unsigned short clabel)
{

return clabel + ((uint64_t)rlabel << 16) + ((uint64_t)aorhash << 48);

}


static inline int
unpack_indexes(uint64_t v,
unsigned short *aorhash, unsigned int *rlabel, unsigned short *clabel)
{
if (aorhash == NULL || rlabel == NULL || clabel == NULL) {
LM_ERR("invalid arguments\n");
return -1;
}

*clabel = v & 0xFFFF;
*rlabel = (v >> 16) & 0xFFFFFFFF;
*aorhash = (v >> 48);

return 0;
}

#endif /* UDLIST_H */
3 changes: 1 addition & 2 deletions modules/usrloc/hslot.c
Expand Up @@ -105,7 +105,7 @@ void ul_release_idx(int idx)
int init_slot(struct udomain* _d, hslot_t* _s, int n)
{
_s->records = map_create( AVLMAP_SHARED | AVLMAP_NO_DUPLICATE);
_s->next_label = rand();
_s->next_label = 0;

if( _s->records == NULL )
return -1;
Expand Down Expand Up @@ -145,7 +145,6 @@ int slot_add(hslot_t* _s, struct urecord* _r)

void ** dest;

_r->label = _s->next_label++;
dest = map_get( _s->records, _r->aor );

if( dest == NULL )
Expand Down
168 changes: 88 additions & 80 deletions modules/usrloc/ucontact.c
Expand Up @@ -48,6 +48,7 @@
#include "ucontact.h"
#include "ureplication.h"
#include "udomain.h"
#include "dlist.h"

extern event_id_t ei_c_update_id;

Expand Down Expand Up @@ -92,8 +93,8 @@ static int compute_next_hop(ucontact_t *contact)
/*! \brief
* Create a new contact structure
*/
ucontact_t* new_ucontact(str* _dom, str* _aor, str* _contact,
unsigned int label, ucontact_info_t* _ci)
ucontact_t*
new_ucontact(str* _dom, str* _aor, str* _contact, ucontact_info_t* _ci)
{
ucontact_t *c;

Expand Down Expand Up @@ -135,7 +136,8 @@ ucontact_t* new_ucontact(str* _dom, str* _aor, str* _contact,
c->cflags = _ci->cflags;
c->methods = _ci->methods;
c->last_modified = _ci->last_modified;
c->label = label;
c->label = CID_GET_CLABEL(_ci->contact_id);
c->contact_id = _ci->contact_id;

if (compute_next_hop(c) != 0) {
LM_ERR("failed to resolve next hop\n");
Expand Down Expand Up @@ -463,140 +465,146 @@ int db_insert_ucontact(ucontact_t* _c,query_list_t **ins_list, int update)
static db_ps_t myI_ps = NULL;
static db_ps_t myR_ps = NULL;
char* dom;
db_key_t keys[17];
db_val_t vals[17];
db_key_t keys[18];
db_val_t vals[18];

if (_c->flags & FL_MEM) {
return 0;
}

keys[0] = &user_col;
keys[1] = &contact_col;
keys[2] = &expires_col;
keys[3] = &q_col;
keys[4] = &callid_col;
keys[5] = &cseq_col;
keys[6] = &flags_col;
keys[7] = &cflags_col;
keys[8] = &user_agent_col;
keys[9] = &received_col;
keys[10] = &path_col;
keys[11] = &sock_col;
keys[12] = &methods_col;
keys[13] = &last_mod_col;
keys[14] = &sip_instance_col;
keys[15] = &attr_col;
keys[16] = &domain_col;
keys[0] = &contactid_col;
keys[1] = &user_col;
keys[2] = &contact_col;
keys[3] = &expires_col;
keys[4] = &q_col;
keys[5] = &callid_col;
keys[6] = &cseq_col;
keys[7] = &flags_col;
keys[8] = &cflags_col;
keys[9] = &user_agent_col;
keys[10] = &received_col;
keys[11] = &path_col;
keys[12] = &sock_col;
keys[13] = &methods_col;
keys[14] = &last_mod_col;
keys[15] = &sip_instance_col;
keys[16] = &attr_col;
keys[17] = &domain_col;

vals[0].nul = 0;
vals[0].type = DB_BIGINT;
vals[0].val.bigint_val = _c->contact_id;

vals[0].type = DB_STR;
vals[0].nul = 0;
vals[0].val.str_val.s = _c->aor->s;
vals[0].val.str_val.len = _c->aor->len;

vals[1].type = DB_STR;
vals[1].nul = 0;
vals[1].val.str_val.s = _c->c.s;
vals[1].val.str_val.len = _c->c.len;
vals[1].val.str_val.s = _c->aor->s;
vals[1].val.str_val.len = _c->aor->len;

vals[2].type = DB_DATETIME;
vals[2].type = DB_STR;
vals[2].nul = 0;
vals[2].val.time_val = _c->expires;
vals[2].val.str_val.s = _c->c.s;
vals[2].val.str_val.len = _c->c.len;

vals[3].type = DB_DOUBLE;
vals[3].type = DB_DATETIME;
vals[3].nul = 0;
vals[3].val.double_val = q2double(_c->q);
vals[3].val.time_val = _c->expires;

vals[4].type = DB_STR;
vals[4].type = DB_DOUBLE;
vals[4].nul = 0;
vals[4].val.str_val.s = _c->callid.s;
vals[4].val.str_val.len = _c->callid.len;
vals[4].val.double_val = q2double(_c->q);

vals[5].type = DB_INT;
vals[5].type = DB_STR;
vals[5].nul = 0;
vals[5].val.int_val = _c->cseq;
vals[5].val.str_val.s = _c->callid.s;
vals[5].val.str_val.len = _c->callid.len;

vals[6].type = DB_INT;
vals[6].nul = 0;
vals[6].val.bitmap_val = _c->flags;
vals[6].val.int_val = _c->cseq;

vals[7].type = DB_STR;
vals[7].type = DB_INT;
vals[7].nul = 0;
vals[7].val.str_val = bitmask_to_flag_list(FLAG_TYPE_BRANCH, _c->cflags);
vals[7].val.bitmap_val = _c->flags;

vals[8].type = DB_STR;
vals[8].nul = 0;
vals[8].val.str_val.s = _c->user_agent.s;
vals[8].val.str_val.len = _c->user_agent.len;
vals[8].val.str_val = bitmask_to_flag_list(FLAG_TYPE_BRANCH, _c->cflags);

vals[9].type = DB_STR;
if (_c->received.s == 0) {
vals[9].nul = 1;
} else {
vals[9].nul = 0;
vals[9].val.str_val.s = _c->received.s;
vals[9].val.str_val.len = _c->received.len;
}
vals[9].nul = 0;
vals[9].val.str_val.s = _c->user_agent.s;
vals[9].val.str_val.len = _c->user_agent.len;

vals[10].type = DB_STR;
if (_c->path.s == 0) {
if (_c->received.s == 0) {
vals[10].nul = 1;
} else {
vals[10].nul = 0;
vals[10].val.str_val.s = _c->path.s;
vals[10].val.str_val.len = _c->path.len;
vals[10].val.str_val.s = _c->received.s;
vals[10].val.str_val.len = _c->received.len;
}

vals[11].type = DB_STR;
if (_c->path.s == 0) {
vals[11].nul = 1;
} else {
vals[11].nul = 0;
vals[11].val.str_val.s = _c->path.s;
vals[11].val.str_val.len = _c->path.len;
}

vals[12].type = DB_STR;
if (_c->sock) {
vals[11].val.str_val = _c->sock->adv_sock_str.len ?
vals[12].val.str_val = _c->sock->adv_sock_str.len ?
_c->sock->adv_sock_str: _c->sock->sock_str;
vals[11].nul = 0;
vals[12].nul = 0;
} else {
vals[11].nul = 1;
vals[12].nul = 1;
}

vals[12].type = DB_BITMAP;
vals[13].type = DB_BITMAP;
if (_c->methods == 0xFFFFFFFF) {
vals[12].nul = 1;
vals[13].nul = 1;
} else {
vals[12].val.bitmap_val = _c->methods;
vals[12].nul = 0;
vals[13].val.bitmap_val = _c->methods;
vals[13].nul = 0;
}

vals[13].type = DB_DATETIME;
vals[13].nul = 0;
vals[13].val.time_val = _c->last_modified;
vals[14].type = DB_DATETIME;
vals[14].nul = 0;
vals[14].val.time_val = _c->last_modified;

vals[14].type = DB_STR;
vals[15].type = DB_STR;
if (_c->instance.s == 0) {
vals[14].nul = 1;
vals[15].nul = 1;
} else {
vals[14].nul = 0;
vals[14].val.str_val.s = _c->instance.s;
vals[14].val.str_val.len = _c->instance.len;
vals[15].nul = 0;
vals[15].val.str_val.s = _c->instance.s;
vals[15].val.str_val.len = _c->instance.len;
}

vals[15].type = DB_STR;
vals[16].type = DB_STR;
if (_c->attr.s == 0) {
vals[15].nul = 1;
vals[16].nul = 1;
} else {
vals[15].nul = 0;
vals[15].val.str_val.s = _c->attr.s;
vals[15].val.str_val.len = _c->attr.len;
vals[16].nul = 0;
vals[16].val.str_val.s = _c->attr.s;
vals[16].val.str_val.len = _c->attr.len;
}

if (use_domain) {
vals[16].type = DB_STR;
vals[16].nul = 0;
vals[17].type = DB_STR;
vals[17].nul = 0;

dom = q_memchr(_c->aor->s, '@', _c->aor->len);
if (dom==0) {
vals[0].val.str_val.len = 0;
vals[16].val.str_val = *_c->aor;
vals[17].val.str_val = *_c->aor;
} else {
vals[0].val.str_val.len = dom - _c->aor->s;
vals[16].val.str_val.s = dom + 1;
vals[16].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
vals[17].val.str_val.s = dom + 1;
vals[17].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
}
}

Expand All @@ -610,18 +618,18 @@ int db_insert_ucontact(ucontact_t* _c,query_list_t **ins_list, int update)
CON_PS_REFERENCE(ul_dbh) = &myI_ps;
if (ins_list) {
if (con_set_inslist(&ul_dbf,ul_dbh,ins_list,keys,
(use_domain) ? (17) : (16)) < 0 )
(use_domain) ? (18) : (17)) < 0 )
CON_RESET_INSLIST(ul_dbh);
}

if (ul_dbf.insert(ul_dbh, keys, vals, (use_domain) ? (17) : (16)) < 0) {
if (ul_dbf.insert(ul_dbh, keys, vals, (use_domain) ? (18) : (17)) < 0) {
LM_ERR("inserting contact in db failed\n");
return -1;
}
} else {
/* do insert-update / replace */
CON_PS_REFERENCE(ul_dbh) = &myR_ps;
if (ul_dbf.insert_update(ul_dbh, keys, vals, (use_domain) ? (17) : (16)) < 0) {
if (ul_dbf.insert_update(ul_dbh, keys, vals, (use_domain) ? (18) : (17)) < 0) {
LM_ERR("inserting contact in db failed\n");
return -1;
}
Expand Down
16 changes: 14 additions & 2 deletions modules/usrloc/ucontact.h
Expand Up @@ -67,6 +67,12 @@ typedef enum flags {
* Main structure for handling of registered Contact: data
*/
typedef struct ucontact {
uint64_t contact_id; /*!< 64 bit Contact identifier
0-------0-------------0---------------0
|0 - 15 | 16 - 47 | 48 - 63 |
|aorhash| record label| contact label |
0-------0-------------0---------------0
*/
str* domain; /*!< Pointer to domain name (NULL terminated) */
str* aor; /*!< Pointer to the AOR string in record structure*/
str c; /*!< Contact address */
Expand All @@ -93,6 +99,12 @@ typedef struct ucontact {
} ucontact_t;

typedef struct ucontact_info {
uint64_t contact_id; /*!< 64 bit Contact identifier
0-------0-------------0---------------0
|0 - 15 | 16 - 47 | 48 - 63 |
|aorhash| record label| contact label |
0-------0-------------0---------------0
*/
str received;
str* path;
time_t expires;
Expand Down Expand Up @@ -123,8 +135,8 @@ typedef struct ucontact_info {
/*! \brief
* Create a new contact structure
*/
ucontact_t* new_ucontact(str* _dom, str* _aor, str* _contact,
unsigned int label, ucontact_info_t* _ci);
ucontact_t*
new_ucontact(str* _dom, str* _aor, str* _contact, ucontact_info_t* _ci);


/*! \brief
Expand Down

0 comments on commit 04c9add

Please sign in to comment.