[sr-dev] git:master: modules_k/pua: Added (start|end|abort)_transaction calls ( when in DB only mode and where supported)

Peter Dunkley peter.dunkley at crocodile-rcs.com
Wed May 9 15:02:12 CEST 2012


Module: sip-router
Branch: master
Commit: ea2fab792425bf30197d47ae08f806a908fc3681
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ea2fab792425bf30197d47ae08f806a908fc3681

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Wed May  9 13:55:01 2012 +0100

modules_k/pua: Added (start|end|abort)_transaction calls (when in DB only mode and where supported)

- Helps with some multi-server/process race hazards

---

 modules_k/pua/pua.h            |    6 +++
 modules_k/pua/pua_db.c         |    4 --
 modules_k/pua/pua_db.h         |    2 -
 modules_k/pua/send_publish.c   |   85 +++++++++++++++++++++++++++------------
 modules_k/pua/send_subscribe.c |   75 ++++++++++++++++++++++++++++++-----
 5 files changed, 130 insertions(+), 42 deletions(-)

diff --git a/modules_k/pua/pua.h b/modules_k/pua/pua.h
index 1246532..34e2135 100644
--- a/modules_k/pua/pua.h
+++ b/modules_k/pua/pua.h
@@ -26,6 +26,7 @@
 #define PUBLISH_H
 
 #include "../../str.h"
+#include "../../lib/srdb1/db.h"
 #include "hash.h"
 
 #define INSERT_TYPE      1<<1
@@ -54,4 +55,9 @@ int reginfo_increase_version;
 extern int update_pua(ua_pres_t* p);
 extern int clean_puadb( int update_period, int min_expires );
 
+extern db_func_t pua_dbf;
+extern db1_con_t *pua_db;
+extern int pua_fetch_rows;
+
+
 #endif
diff --git a/modules_k/pua/pua_db.c b/modules_k/pua/pua_db.c
index a92b028..2e6c398 100644
--- a/modules_k/pua/pua_db.c
+++ b/modules_k/pua/pua_db.c
@@ -37,10 +37,6 @@
 #include "pua.h"
 #include "pua_db.h"
 
-/* database connection */
-extern db1_con_t *pua_db;
-extern int pua_fetch_rows;
-
 /* database colums */
 static str str_id_col = str_init( "id" );
 static str str_pres_uri_col = str_init("pres_uri");
diff --git a/modules_k/pua/pua_db.h b/modules_k/pua/pua_db.h
index 4348b6d..0cc82a9 100644
--- a/modules_k/pua/pua_db.h
+++ b/modules_k/pua/pua_db.h
@@ -47,8 +47,6 @@
 #define PUA_VERSION (1<<16)
 #define PUA_EXTRA_HEADERS (1<<17)
 
-extern db_func_t pua_dbf;
-
 void free_results_puadb( db1_res_t *res );
 int is_dialog_puadb(ua_pres_t *pres);
 int get_record_id_puadb(ua_pres_t *pres, str **rec_id );
diff --git a/modules_k/pua/send_publish.c b/modules_k/pua/send_publish.c
index 600ba8e..cfc759f 100644
--- a/modules_k/pua/send_publish.c
+++ b/modules_k/pua/send_publish.c
@@ -213,6 +213,15 @@ void publ_cback_func(struct cell *t, int type, struct tmcb_params *ps)
 	dbpres.watcher_uri = &watcher_uri;
 	dbpres.extra_headers = &extra_headers;
 
+	if (dbmode == PUA_DB_ONLY && pua_dbf.start_transaction)
+	{
+		if (pua_dbf.start_transaction(pua_db) < 0)
+		{
+			LM_ERR("in start_transaction\n");
+			goto error;
+		}
+	}
+
 	if(ps->param== NULL|| *ps->param== NULL)
 	{
 		LM_ERR("NULL callback parameter\n");
@@ -422,6 +431,16 @@ done:
 	}
 
 	if (res) free_results_puadb(res);
+
+	if (dbmode == PUA_DB_ONLY && pua_dbf.end_transaction)
+	{
+		if (pua_dbf.end_transaction(pua_db) < 0)
+		{
+			LM_ERR("in end_transaction\n");
+			goto error;
+		}
+	}
+
 	return;
 
 error:
@@ -433,6 +452,13 @@ error:
 	if(presentity) shm_free(presentity);
 
 	if (res) free_results_puadb(res);
+
+	if (dbmode == PUA_DB_ONLY && pua_dbf.abort_transaction)
+	{
+		if (pua_dbf.abort_transaction(pua_db) < 0)
+			LM_ERR("in abort_transaction\n");
+	}
+
 	return;
 }	
 
@@ -454,11 +480,20 @@ int send_publish( publ_info_t* publ )
 	db1_res_t *res=NULL;
 	ua_pres_t dbpres; 
 	str pres_uri={0,0}, watcher_uri={0,0}, extra_headers={0,0};
+	int ret = -1;
 
 	LM_DBG("pres_uri=%.*s\n", publ->pres_uri->len, publ->pres_uri->s );
 	
-	/* get event from list */
+	if (dbmode == PUA_DB_ONLY && pua_dbf.start_transaction)
+	{
+		if (pua_dbf.start_transaction(pua_db) < 0)
+		{
+			LM_ERR("in start_transaction\n");
+			goto error;
+		}
+	}
 
+	/* get event from list */
 	ev= get_event(publ->event);
 	if(ev== NULL)
 	{
@@ -495,8 +530,8 @@ int send_publish( publ_info_t* publ )
 	{
 		if (dbmode!=PUA_DB_ONLY) 
 			lock_release(&HashT->p_records[hash_code].lock);
-		free_results_puadb(res);
-		return 418;
+		ret = 418;
+		goto error;
 	}
 
 	if(publ->flag & INSERT_TYPE)
@@ -521,14 +556,14 @@ insert:
 		{
 			LM_DBG("request for a publish with expires 0 and"
 					" no record found\n");
-			free_results_puadb(res);
-			return 0;
+			goto done;
+			
 		}
 		if(publ->body== NULL)
 		{
 			LM_ERR("New PUBLISH and no body found- invalid request\n");
-			free_results_puadb(res);
-			return ERR_PUBLISH_NO_BODY;
+			ret = ERR_PUBLISH_NO_BODY;
+			goto error;
 		}
 	}
 	else
@@ -541,8 +576,7 @@ insert:
 			LM_ERR("while allocating memory\n");
 			if (dbmode!=PUA_DB_ONLY) 
 				lock_release(&HashT->p_records[hash_code].lock);
-			free_results_puadb(res);
-			return -1;
+			goto error;
 		}
 		memcpy(etag.s, presentity->etag.s, presentity->etag.len);
 		etag.len= presentity->etag.len;
@@ -650,26 +684,18 @@ send_publish:
 		goto error;
 	}
 
-	pkg_free(str_hdr);
+done:
+	ret = 0;
 
-	if( body && ret_code)
-	{
-		if(body->s)
-			xmlFree(body->s);
-		pkg_free(body);
-	}	
-	if(etag.s)
-		pkg_free(etag.s);
-	if(tuple_id)
+	if (dbmode == PUA_DB_ONLY && pua_dbf.end_transaction)
 	{
-		if(tuple_id->s)
-			pkg_free(tuple_id->s);
-		pkg_free(tuple_id);
+		if (pua_dbf.end_transaction(pua_db) < 0)
+		{
+			LM_ERR("in end_transaction\n");
+			goto error;
+		}
 	}
 
-	free_results_puadb(res);
-	return 0;
-
 error:
 	if(etag.s)
 		pkg_free(etag.s);
@@ -692,7 +718,14 @@ error:
 		pkg_free(tuple_id);
 	}
 	free_results_puadb(res);
-	return -1;
+
+	if (dbmode == PUA_DB_ONLY && pua_dbf.abort_transaction)
+	{
+		if (pua_dbf.abort_transaction(pua_db) < 0)
+			LM_ERR("in abort_transaction\n");
+	}
+
+	return ret;
 }
 
 ua_pres_t* publish_cbparam(publ_info_t* publ,str* body,str* tuple_id,
diff --git a/modules_k/pua/send_subscribe.c b/modules_k/pua/send_subscribe.c
index 9b89a4a..bc10b28 100644
--- a/modules_k/pua/send_subscribe.c
+++ b/modules_k/pua/send_subscribe.c
@@ -297,6 +297,16 @@ void subs_cback_func(struct cell *t, int cb_type, struct tmcb_params *ps)
 		LM_ERR("null callback parameter\n");
 		return;
 	}
+
+	if (dbmode == PUA_DB_ONLY && pua_dbf.start_transaction)
+	{
+		if (pua_dbf.start_transaction(pua_db) < 0)
+		{
+			LM_ERR("in start_transaction\n");
+			goto error;
+		}
+	}
+
 	LM_DBG("completed with status %d\n",ps->code) ;
 	hentity= (ua_pres_t*)(*ps->param);
 	hash_code= core_hash(hentity->pres_uri,hentity->watcher_uri,
@@ -676,6 +686,16 @@ done:
 		hentity->flag= flag;
 		run_pua_callbacks( hentity, msg);
 	}
+
+	if (dbmode == PUA_DB_ONLY && pua_dbf.end_transaction)
+	{
+		if (pua_dbf.end_transaction(pua_db) < 0)
+		{
+			LM_ERR("in end_transaction\n");
+			goto error;
+		}
+	}
+
 	goto end;
 
 error:	
@@ -685,6 +705,12 @@ error:
 	 	shm_free(presentity);
 	}
 
+	if (dbmode == PUA_DB_ONLY && pua_dbf.abort_transaction)
+	{
+		if (pua_dbf.abort_transaction(pua_db) < 0)
+			LM_ERR("in abort_transaction\n");
+	}
+
 end:
 
 	if(hentity)
@@ -889,7 +915,7 @@ int send_subscribe(subs_info_t* subs)
 	ua_pres_t* presentity= NULL;
 	str met= {"SUBSCRIBE", 9};
 	str* str_hdr= NULL;
-	int ret= 0;
+	int ret= -1;
 	unsigned int hash_code=0;
 	ua_pres_t* hentity= NULL;
 	int expires;
@@ -926,6 +952,15 @@ int send_subscribe(subs_info_t* subs)
 		return -1;
 	}
 
+	if (dbmode == PUA_DB_ONLY && pua_dbf.start_transaction)
+	{
+		if (pua_dbf.start_transaction(pua_db) < 0)
+		{
+			LM_ERR("in start_transaction\n");
+			goto error;
+		}
+	}
+
 	/* generation of hash and getting lock moved from here to further down */
 
 	if (dbmode==PUA_DB_ONLY)
@@ -980,8 +1015,7 @@ insert:
 		{
 			LM_ERR("while building callback"
 					" param\n");
-			ret= -1;
-			goto done;
+			goto error;
 		}
 		hentity->flag= flag;
 
@@ -1005,7 +1039,11 @@ insert:
 				uac_r.dialog = 0;
 			}
 			shm_free(hentity);
-			goto  done;
+
+			/* Although this is an error must not return -1 as the
+			   calling function must continue processing. */
+			ret = 0;
+			goto error;
 		}
 
 		/* Now create a temporary hash table entry.
@@ -1022,7 +1060,7 @@ insert:
 		if(presentity== NULL)
 		{
 			LM_ERR("no more share memory\n");
-			goto done;
+			goto error;
 		}
 		memset(presentity, 0, size);
 		size= sizeof(ua_pres_t);
@@ -1111,10 +1149,9 @@ insert:
 		if(td== NULL)
 		{
 			LM_ERR("while building tm dlg_t structure");
-			ret= -1;
 			if (dbmode!=PUA_DB_ONLY)
 				lock_release(&HashT->p_records[hash_code].lock);
-			goto done;
+			goto error;
 		}
 				
 		hentity= subs_cbparam_indlg(presentity, expires, REQ_OTHER);
@@ -1123,8 +1160,7 @@ insert:
 			LM_ERR("while building callback param\n");
 			if (dbmode!=PUA_DB_ONLY)
 				lock_release(&HashT->p_records[hash_code].lock);
-			ret= -1;
-			goto done;
+			goto error;
 		}
 		if (dbmode!=PUA_DB_ONLY)
 			lock_release(&HashT->p_records[hash_code].lock);
@@ -1139,14 +1175,33 @@ insert:
 			shm_free(hentity);
 			hentity= NULL;
 			LM_ERR("while sending request with t_request\n");
-			goto done;
+			goto error;
 		}
 	}
 
 
 done:
+	if (dbmode == PUA_DB_ONLY && pua_dbf.end_transaction)
+	{
+		if (pua_dbf.end_transaction(pua_db) < 0)
+		{
+			LM_ERR("in end_transaction\n");
+			goto error;
+		}
+	}
+
+	ret = 0;
+
+error:
 	pua_free_tm_dlg(td);
 	pkg_free(str_hdr);
 	free_results_puadb(res);
+
+	if (dbmode == PUA_DB_ONLY && pua_dbf.abort_transaction)
+	{
+		if (pua_dbf.abort_transaction(pua_db) < 0)
+			LM_ERR("in abort_transaction\n");
+	}
+
 	return ret;
 }




More information about the sr-dev mailing list