Module: kamailio Branch: master Commit: 1c0242fecb1a5ea9a3fde54b8ce331886e564d39 URL: https://github.com/kamailio/kamailio/commit/1c0242fecb1a5ea9a3fde54b8ce33188...
Author: Phil Lavin phil.lavin@synety.com Committer: Phil Lavin phil.lavin@synety.com Date: 2016-02-19T12:07:41Z
presence: Fully implement table locking for updating the presentity table
- Implement table locking for all routes through update_presentity in order to avoid a number of different race conditions which resulted in extraneous data being put into the presentity table.
---
Modified: modules/presence/presentity.c
---
Diff: https://github.com/kamailio/kamailio/commit/1c0242fecb1a5ea9a3fde54b8ce33188... Patch: https://github.com/kamailio/kamailio/commit/1c0242fecb1a5ea9a3fde54b8ce33188...
---
diff --git a/modules/presence/presentity.c b/modules/presence/presentity.c index 0f3c3e5..1c385b5 100644 --- a/modules/presence/presentity.c +++ b/modules/presence/presentity.c @@ -426,6 +426,15 @@ int update_presentity(struct sip_msg* msg, presentity_t* presentity, str* body, goto error; }
+ if (pa_dbf.start_transaction) + { + if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0) + { + LM_ERR("in start_transaction\n"); + goto error; + } + } + LM_DBG("inserting %d cols into table\n",n_query_cols); if (pa_dbf.insert(pa_db, query_cols, query_vals, n_query_cols) < 0) @@ -468,22 +477,8 @@ int update_presentity(struct sip_msg* msg, presentity_t* presentity, str* body, if (pa_dbf.replace(pa_db, query_cols, query_vals, n_query_cols, 4, 0) < 0) { LM_ERR("replacing record in database\n"); - if (pa_dbf.abort_transaction) - { - if (pa_dbf.abort_transaction(pa_db) < 0) - LM_ERR("in abort_transaction\n"); - } goto error; } - - if (pa_dbf.end_transaction) - { - if (pa_dbf.end_transaction(pa_db) < 0) - { - LM_ERR("in end_transaction\n"); - goto error; - } - } }
if( publ_send200ok(msg, presentity->expires, presentity->etag)< 0) @@ -503,6 +498,15 @@ int update_presentity(struct sip_msg* msg, presentity_t* presentity, str* body, goto error; }
+ if (pa_dbf.start_transaction) + { + if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0) + { + LM_ERR("in start_transaction\n"); + goto error; + } + } + if(EVENT_DIALOG_SLA(presentity->event->evp)) {
@@ -837,6 +841,15 @@ int update_presentity(struct sip_msg* msg, presentity_t* presentity, str* body, if(pres_uri.s) pkg_free(pres_uri.s);
+ if (pa_dbf.end_transaction) + { + if (pa_dbf.end_transaction(pa_db) < 0) + { + LM_ERR("in end_transaction\n"); + goto error; + } + } + return 0;
send_412: @@ -867,6 +880,15 @@ int update_presentity(struct sip_msg* msg, presentity_t* presentity, str* body, if(pres_uri.s) pkg_free(pres_uri.s);
+ if (pa_dbf.abort_transaction) + { + if (pa_dbf.abort_transaction(pa_db) < 0) + { + LM_ERR("in abort_transaction\n"); + goto error; + } + } + return ret; }