[sr-dev] git:master:1c0242fe: presence: Fully implement table locking for updating the presentity table

Phil Lavin phil.lavin at synety.com
Mon Feb 22 23:20:21 CET 2016


Module: kamailio
Branch: master
Commit: 1c0242fecb1a5ea9a3fde54b8ce331886e564d39
URL: https://github.com/kamailio/kamailio/commit/1c0242fecb1a5ea9a3fde54b8ce331886e564d39

Author: Phil Lavin <phil.lavin at synety.com>
Committer: Phil Lavin <phil.lavin at 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/1c0242fecb1a5ea9a3fde54b8ce331886e564d39.diff
Patch: https://github.com/kamailio/kamailio/commit/1c0242fecb1a5ea9a3fde54b8ce331886e564d39.patch

---

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;
 }
 




More information about the sr-dev mailing list