while doing pua module tests in db_mode=2, i used pua_mi to send two
publish requests. in both of them id and etag params had value '.'.
first generated publish request without sip-if-match header (as it
should) and after 200 ok was received, record was properly inserted to
pua table with etag value a.1413029856.5521.112.0 and empty pres_id.
the second for a different pres_uri however resulted in error in
presence server:
Oct 12 10:06:42 siika /usr/bin/pres-serv[5522]: ERROR: presence [presentity.c:807]:
update_presentity(): No E_Tag match a.1413029856.5521.112.0
after digging into it, i found with wireshark that the second publish
indeed included sip-if-match header with that etag value even when it
was initial publish (etag and id params '.') for another pres_uri.
then i took a look at pua source and found that if etag param is null it
is not included in db query at all leaving only pres_id param to match
against:
ua_pres_t *get_record_puadb(str pres_id, str *etag, ua_pres_t *result, db1_res_t **dbres)
{
int n_query_cols = 0, nr_rows;
...
q_cols[n_query_cols] = &str_pres_id_col;
q_vals[n_query_cols].type = DB1_STR;
q_vals[n_query_cols].nul = 0;
q_vals[n_query_cols].val.str_val = pres_id;
n_query_cols++;
if (etag != NULL)
{
q_cols[n_query_cols] = &str_etag_col;
q_vals[n_query_cols].type = DB1_STR;
q_vals[n_query_cols].nul = 0;
q_vals[n_query_cols].val.str_val.s = etag->s;
q_vals[n_query_cols].val.str_val.len = etag->len;
n_query_cols++;
}
...
if(query_fn(pua_db, q_cols, 0, q_vals,
NULL,n_query_cols,0,0,&res) < 0)
{
LM_ERR("DB query error\n");
return(NULL);
}
of course this kind of query matched the just inserted record for
another pres_uri, which is wrong.
how should this be fixed? is it enough to always add etag value to the
query or should also pres_uri be added just in case etags for different
pres_uris would match? or perhaps the best fix would be to skip the
query altogether in send_publish if etag is null?
has anyone else ever used pua module in db_mode=2?
-- juha