Module: sip-router
Branch: master
Commit: 0411d363ab8eb9cf146852a1c6cd8cf146acfc6d
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0411d36…
Author: Morten Tryfoss <morten(a)tryfoss.no>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Mon Mar 3 19:53:42 2014 +0100
db_cluster: new parameter max_query_length
- set threshold in second after which a connection is marked inactive if
the query fails
- allow to let connectioncs being active if the error is due to some sql
mistake
- default is 0 (set connection innactive immediately, same behavior as
so far)
---
modules/db_cluster/README | 23 ++++++++++++++++-
modules/db_cluster/db_cluster_mod.c | 2 +
modules/db_cluster/dbcl_api.c | 34 +++++++++++++++++++++++----
modules/db_cluster/doc/db_cluster_admin.xml | 23 ++++++++++++++++++
4 files changed, 75 insertions(+), 7 deletions(-)
diff --git a/modules/db_cluster/README b/modules/db_cluster/README
index aecbcee..0364bf6 100644
--- a/modules/db_cluster/README
+++ b/modules/db_cluster/README
@@ -28,6 +28,7 @@ Daniel-Constantin Mierla
3.1. connection (str)
3.2. cluster (str)
3.3. inactive_interval (int)
+ 3.4. max_query_length (int)
4. Usage
@@ -36,7 +37,8 @@ Daniel-Constantin Mierla
1.1. Set connection parameter
1.2. Set cluster parameter
1.3. Set inactive_interval parameter
- 1.4. Set cluster parameter
+ 1.4. Set max_query_length parameter
+ 1.5. Set cluster parameter
Chapter 1. Admin Guide
@@ -53,6 +55,7 @@ Chapter 1. Admin Guide
3.1. connection (str)
3.2. cluster (str)
3.3. inactive_interval (int)
+ 3.4. max_query_length (int)
4. Usage
@@ -90,6 +93,7 @@ Chapter 1. Admin Guide
3.1. connection (str)
3.2. cluster (str)
3.3. inactive_interval (int)
+ 3.4. max_query_length (int)
3.1. connection (str)
@@ -148,6 +152,21 @@ modparam("db_cluster", "cluster",
"cls1=>con1=9s8p;con2=9s8p")
modparam("db_cluster", "inactive_interval", 180)
...
+3.4. max_query_length (int)
+
+ How long (seconds) a failed db operation needs to last before
+ deactivating the connection for inactive_interval seconds. This
+ prevents disabling of connections that reply fast with error codes,
+ thus being active (e.g., due to primary key insert errors). In such
+ cases, the database server is active.
+
+ Default value is 0.
+
+ Example 1.4. Set max_query_length parameter
+...
+modparam("db_cluster", "max_query_length", 5)
+...
+
4. Usage
Practically, all the modules that want to use a cluster, have to set
@@ -169,7 +188,7 @@ modparam("db_cluster", "inactive_interval", 180)
to be used for parallel writing from acc and round-robin reading by
sqlops.
- Example 1.4. Set cluster parameter
+ Example 1.5. Set cluster parameter
...
modparam("db_cluster", "connection",
"c1=>mysql://kamailio:kamailiorw@localhost/kamailio1")
diff --git a/modules/db_cluster/db_cluster_mod.c b/modules/db_cluster/db_cluster_mod.c
index c0b78cb..1d15531 100644
--- a/modules/db_cluster/db_cluster_mod.c
+++ b/modules/db_cluster/db_cluster_mod.c
@@ -37,6 +37,7 @@ int dbcl_con_param(modparam_t type, void *val);
int dbcl_cls_param(modparam_t type, void *val);
int dbcl_inactive_interval = 300;
+int dbcl_max_query_length = 0;
/*! \brief
* DB Cluster module interface
@@ -53,6 +54,7 @@ static param_export_t params[] = {
{"connection", STR_PARAM|USE_FUNC_PARAM, (void*)dbcl_con_param},
{"cluster", STR_PARAM|USE_FUNC_PARAM, (void*)dbcl_cls_param},
{"inactive_interval", INT_PARAM, &dbcl_inactive_interval},
+ {"max_query_length", INT_PARAM, &dbcl_max_query_length},
{0, 0, 0}
};
diff --git a/modules/db_cluster/dbcl_api.c b/modules/db_cluster/dbcl_api.c
index 0269343..2629a84 100644
--- a/modules/db_cluster/dbcl_api.c
+++ b/modules/db_cluster/dbcl_api.c
@@ -33,10 +33,12 @@
#include "../../trim.h"
#include "../../globals.h"
#include "../../lib/srdb1/db.h"
+#include "../../timer.h"
#include "dbcl_data.h"
#include "dbcl_api.h"
+extern int dbcl_max_query_length;
#define DBCL_READ(command) \
do {\
@@ -44,6 +46,7 @@
int i;\
int j;\
int k;\
+ unsigned int sec = 0;\
db1_con_t *dbh=NULL;\
dbcl_cls_t *cls=NULL;\
cls = (dbcl_cls_t*)_h->tail;\
@@ -60,6 +63,7 @@
{\
LM_DBG("serial operation - cluster [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
+ sec = get_ticks();\
dbh = cls->rlist[i].clist[j]->dbh;\
ret = cls->rlist[i].clist[j]->dbf.command;\
if (ret==0) {\
@@ -69,7 +73,10 @@
LM_DBG("serial operation - failre on cluster"\
" [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
- dbcl_inactive_con(cls->rlist[i].clist[j]);\
+ sec = get_ticks() - sec;\
+ if(sec >= dbcl_max_query_length){\
+ dbcl_inactive_con(cls->rlist[i].clist[j]);\
+ }\
}\
}\
}\
@@ -83,6 +90,7 @@
{\
LM_DBG("round robin operation - cluster [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
+ sec = get_ticks();\
dbh = cls->rlist[i].clist[j]->dbh;\
ret = cls->rlist[i].clist[j]->dbf.command;\
if (ret==0)\
@@ -94,7 +102,10 @@
LM_DBG("round robin operation - failre on cluster"\
" [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
- dbcl_inactive_con(cls->rlist[i].clist[j]);\
+ sec = get_ticks() - sec;\
+ if(sec >= dbcl_max_query_length){\
+ dbcl_inactive_con(cls->rlist[i].clist[j]);\
+ }\
}\
}\
}\
@@ -118,6 +129,7 @@
int i;\
int j;\
int k;\
+ unsigned int sec = 0;\
db1_con_t *dbh=NULL;\
dbcl_cls_t *cls=NULL;\
cls = (dbcl_cls_t*)_h->tail;\
@@ -136,6 +148,7 @@
{\
LM_DBG("serial operation - cluster [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
+ sec = get_ticks();\
dbh = cls->wlist[i].clist[j]->dbh;\
ret = cls->wlist[i].clist[j]->dbf.command;\
if (ret==0) {\
@@ -145,7 +158,10 @@
LM_DBG("serial operation - failure on cluster"\
" [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
- dbcl_inactive_con(cls->wlist[i].clist[j]);\
+ sec = get_ticks() - sec;\
+ if(sec >= dbcl_max_query_length){\
+ dbcl_inactive_con(cls->wlist[i].clist[j]);\
+ }\
}\
}\
}\
@@ -159,6 +175,7 @@
{\
LM_DBG("round robin operation - cluster [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
+ sec = get_ticks();\
dbh = cls->wlist[i].clist[j]->dbh;\
ret = cls->wlist[i].clist[j]->dbf.command;\
if (ret==0)\
@@ -170,7 +187,10 @@
LM_DBG("round robin operation - failure on cluster"\
" [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
- dbcl_inactive_con(cls->wlist[i].clist[j]);\
+ sec = get_ticks() - sec;\
+ if(sec >= dbcl_max_query_length){\
+ dbcl_inactive_con(cls->wlist[i].clist[j]);\
+ }\
}\
}\
}\
@@ -183,6 +203,7 @@
{\
LM_DBG("parallel operation - cluster [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
+ sec = get_ticks();\
dbh = cls->wlist[i].clist[j]->dbh;\
rc = cls->wlist[i].clist[j]->dbf.command;\
if(rc==0) {\
@@ -192,7 +213,10 @@
LM_DBG("parallel operation - failure on cluster"\
" [%.*s] (%d/%d)\n",\
cls->name.len, cls->name.s, i, j);\
- dbcl_inactive_con(cls->wlist[i].clist[j]);\
+ sec = get_ticks() - sec;\
+ if(sec >= dbcl_max_query_length){\
+ dbcl_inactive_con(cls->wlist[i].clist[j]);\
+ }\
}\
ret |= rc;\
}\
diff --git a/modules/db_cluster/doc/db_cluster_admin.xml
b/modules/db_cluster/doc/db_cluster_admin.xml
index d849f20..17543fd 100644
--- a/modules/db_cluster/doc/db_cluster_admin.xml
+++ b/modules/db_cluster/doc/db_cluster_admin.xml
@@ -146,6 +146,29 @@ modparam("db_cluster", "inactive_interval", 180)
</programlisting>
</example>
</section>
+ <section id="db_cluster.p.max_query_length">
+ <title><varname>max_query_length</varname> (int)</title>
+ <para>
+ How long (seconds) a failed db operation needs to last before
+ deactivating the connection for inactive_interval seconds. This
+ prevents disabling of connections that reply fast with error
+ codes, thus being active (e.g., due to primary key insert errors).
+ In such cases, the database server is active.
+ </para>
+ <para>
+ <emphasis>
+ Default value is 0.
+ </emphasis>
+ </para>
+ <example>
+ <title>Set <varname>max_query_length</varname>
parameter</title>
+ <programlisting format="linespecific">
+...
+modparam("db_cluster", "max_query_length", 5)
+...
+</programlisting>
+ </example>
+ </section>
</section>
<section>
<title>Usage</title>