[sr-dev] git:master: presence: bugfix: Add option to disable per-Table lock for database layer

Carsten Bock carsten at ng-voice.com
Thu Jan 30 21:56:22 CET 2014


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

Author: Carsten Bock <carsten at ng-voice.com>
Committer: Carsten Bock <carsten at ng-voice.com>
Date:   Thu Jan 30 21:55:11 2014 +0100

presence: bugfix: Add option to disable per-Table lock for database layer
(causes trouble with MySQL in DB_ONLY mode)

---

 modules/presence/doc/presence_admin.xml |   22 ++++++++++++++++++++++
 modules/presence/notify.c               |    6 +++---
 modules/presence/presence.c             |    7 +++++++
 modules/presence/presence.h             |    2 ++
 modules/presence/presentity.c           |    4 ++--
 modules/presence/subscribe.c            |    4 ++--
 6 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/modules/presence/doc/presence_admin.xml b/modules/presence/doc/presence_admin.xml
index 02b3562..8b18174 100644
--- a/modules/presence/doc/presence_admin.xml
+++ b/modules/presence/doc/presence_admin.xml
@@ -575,6 +575,28 @@ modparam("presence", "fetch_rows", 1000)
 </programlisting>
 	    </example>
 	</section>
+	<section>
+	    <title><varname>db_table_lock_type</varname> (integer)</title>
+	    <para>
+		Enable (=1) or disable (=0) the Locks for table during an transaction.
+		Locking only the "current" table causes problems with a MySQL-Databases
+		in "DB-Only" mode.
+	    </para>
+	    <para>
+		<emphasis>
+		    Default value is 1 (Write Lock for the Tables).
+		</emphasis>
+	    </para>
+	    <example>
+		<title>Set <varname>db_table_lock_type</varname> parameter</title>
+		<programlisting format="linespecific">
+...
+modparam("presence", "db_table_lock_type", 0)
+...
+</programlisting>
+	    </example>
+	</section>
+
 
 </section>
 
diff --git a/modules/presence/notify.c b/modules/presence/notify.c
index 0a7ffb2..402aacc 100644
--- a/modules/presence/notify.c
+++ b/modules/presence/notify.c
@@ -1335,7 +1335,7 @@ int publ_notify_notifier(str pres_uri, pres_ev_t *event)
 
 	if (pa_dbf.start_transaction)
 	{
-		if (pa_dbf.start_transaction(pa_db, DB_LOCKING_WRITE) < 0)
+		if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0)
 		{
 			LM_ERR("in start_transaction\n");
 			goto error;
@@ -2701,7 +2701,7 @@ int process_dialogs(int round, int presence_winfo)
 
 	if (pa_dbf.start_transaction)
 	{
-		if (pa_dbf.start_transaction(pa_db, DB_LOCKING_WRITE) < 0)
+		if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0)
 		{
 			LM_ERR("in start_transaction\n");
 			goto error;
@@ -2810,7 +2810,7 @@ int process_dialogs(int round, int presence_winfo)
 
 		if (pa_dbf.start_transaction)
 		{
-			if (pa_dbf.start_transaction(pa_db, DB_LOCKING_WRITE) < 0)
+			if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0)
 			{
 				LM_ERR("in start_transaction\n");
 				goto error;
diff --git a/modules/presence/presence.c b/modules/presence/presence.c
index 75e5da8..a35fcec 100644
--- a/modules/presence/presence.c
+++ b/modules/presence/presence.c
@@ -149,6 +149,9 @@ int pres_waitn_time = 5;
 int pres_notifier_poll_rate = 10;
 int pres_notifier_processes = 1;
 
+int db_table_lock_type = 1;
+db_locking_t db_table_lock = DB_LOCKING_WRITE;
+
 int *pres_notifier_id = NULL;
 
 int phtable_size= 9;
@@ -199,6 +202,7 @@ static param_export_t params[]={
 	{ "timeout_rm_subs",        INT_PARAM, &timeout_rm_subs},
 	{ "send_fast_notify",       INT_PARAM, &send_fast_notify},
 	{ "fetch_rows",             INT_PARAM, &pres_fetch_rows},
+	{ "db_table_lock_type",     INT_PARAM, &db_table_lock_type},
     {0,0,0}
 };
 
@@ -401,6 +405,9 @@ static int mod_init(void)
 		register_basic_timers(pres_notifier_processes);
 	}
 
+	if (db_table_lock_type != 1)
+		db_table_lock = DB_LOCKING_NONE;
+
 	pa_dbf.close(pa_db);
 	pa_db = NULL;
 
diff --git a/modules/presence/presence.h b/modules/presence/presence.h
index e064bb2..b94e4dc 100644
--- a/modules/presence/presence.h
+++ b/modules/presence/presence.h
@@ -94,6 +94,8 @@ extern int pres_notifier_processes;
 extern int phtable_size;
 extern phtable_t* pres_htable;
 
+extern db_locking_t db_table_lock;
+
 int update_watchers_status(str pres_uri, pres_ev_t* ev, str* rules_doc);
 int pres_auth_status(struct sip_msg* msg, str watcher_uri, str presentity_uri);
 
diff --git a/modules/presence/presentity.c b/modules/presence/presentity.c
index 47a828a..6d7ffd5 100644
--- a/modules/presence/presentity.c
+++ b/modules/presence/presentity.c
@@ -426,7 +426,7 @@ int update_presentity(struct sip_msg* msg, presentity_t* presentity, str* body,
 
 			if (pa_dbf.start_transaction)
 			{
-				if (pa_dbf.start_transaction(pa_db, DB_LOCKING_WRITE) < 0)
+				if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0)
 				{
 					LM_ERR("in start_transaction\n");
 					goto error;
@@ -1195,7 +1195,7 @@ int mark_presentity_for_delete(presentity_t *pres)
 
 	if (pa_dbf.start_transaction)
 	{
-		if (pa_dbf.start_transaction(pa_db, DB_LOCKING_WRITE) < 0)
+		if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0)
 		{
 			LM_ERR("in start_transaction\n");
 			goto error;
diff --git a/modules/presence/subscribe.c b/modules/presence/subscribe.c
index 0a18eff..1bd3a62 100644
--- a/modules/presence/subscribe.c
+++ b/modules/presence/subscribe.c
@@ -871,7 +871,7 @@ int handle_subscribe(struct sip_msg* msg, str watcher_user, str watcher_domain)
 			LM_ERR("unsuccessful use_table sql operation\n");
 			goto error;
 		}
-		if (pa_dbf.start_transaction(pa_db, DB_LOCKING_WRITE) < 0)
+		if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0)
 		{
 			LM_ERR("in start_transaction\n");
 			goto error;
@@ -1670,7 +1670,7 @@ void update_db_subs_timer_notifier(void)
 
 	if (pa_dbf.start_transaction)
 	{
-		if (pa_dbf.start_transaction(pa_db, DB_LOCKING_WRITE) < 0)
+		if (pa_dbf.start_transaction(pa_db, db_table_lock) < 0)
 		{
 			LM_ERR("in start_transaction\n");
 			goto error;




More information about the sr-dev mailing list