[sr-dev] git:master:e688d656: modules/cdp: new mod param: workerq_length_threshold_percentage

Richard Good richard.good at smilecoms.com
Mon Jan 12 14:15:55 CET 2015


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

Author: Richard Good <richard.good at smilecoms.com>
Committer: Richard Good <richard.good at smilecoms.com>
Date: 2015-01-12T15:08:08+02:00

modules/cdp: new mod param: workerq_length_threshold_percentage

This is the threshold of the length of the worker queue as a percentage of
the maximum queue size - when exceeded a warning is written to the log
file. Nice to check if worker queue is growing.

---

Modified: modules/cdp/doc/cdp_admin.xml
Modified: modules/cdp/mod.c
Modified: modules/cdp/worker.c

---

Diff:  https://github.com/kamailio/kamailio/commit/e688d656427dd00d48f1e309c5d8ef991e432b67.diff
Patch: https://github.com/kamailio/kamailio/commit/e688d656427dd00d48f1e309c5d8ef991e432b67.patch

---

diff --git a/modules/cdp/doc/cdp_admin.xml b/modules/cdp/doc/cdp_admin.xml
index cdf65d2..234e270 100644
--- a/modules/cdp/doc/cdp_admin.xml
+++ b/modules/cdp/doc/cdp_admin.xml
@@ -126,6 +126,24 @@ modparam("cdp", "latency_threshold", 1000)
 </programlisting>
       </example>
     </section>
+    <section>
+      <title>workerq_length_threshold_percentage (int)</title>
+
+      <para>The threshold of the length of the worker queue as a percentage of 
+	  the maximum queue size - when exceeded a warning is written to the log
+	  file. 0  means disabled</para>
+
+      <para><emphasis> Default value is <quote>0</quote>. </emphasis></para>
+
+      <example>
+        <title>Set <varname>workerq_length_threshold_percentage</varname> parameter</title>
+
+        <programlisting format="linespecific">...
+modparam("cdp", "workerq_length_threshold_percentage", 25)
+...
+	</programlisting>
+      </example>
+    </section>
   </section>
 
   <section>
diff --git a/modules/cdp/mod.c b/modules/cdp/mod.c
index 6857d82..90900d3 100644
--- a/modules/cdp/mod.c
+++ b/modules/cdp/mod.c
@@ -62,6 +62,7 @@ char* config_file="DiameterPeer.xml"; 	/**< default DiameterPeer configuration f
 unsigned int latency_threshold = 500;			/**< default threshold for Diameter calls (ms) */
 unsigned int *latency_threshold_p = &latency_threshold;
 unsigned int workerq_latency_threshold = 100;	/**< default threshold for putting a task into worker queue (ms) */
+unsigned int workerq_length_threshold_percentage = 0;	/**< default threshold for worker queue length, percentage of max queue length - by default disabled */
 
 extern dp_config *config; 				/**< DiameterPeer configuration structure */
 
@@ -165,6 +166,7 @@ static param_export_t cdp_params[] = {
 	{ "config_file",				PARAM_STRING,	&config_file}, 				/**< configuration filename */
 	{ "latency_threshold", 			PARAM_INT, 		&latency_threshold},		/**<threshold above which we will log*/
 	{ "workerq_latency_threshold", 	PARAM_INT, 		&workerq_latency_threshold},/**<time threshold putting job into queue*/
+	{ "workerq_length_threshold_percentage", 	PARAM_INT, 		&workerq_length_threshold_percentage},/**<queue length threshold - percentage of max queue length*/
 	{ 0, 0, 0 }
 };
 
@@ -215,7 +217,7 @@ static int cdp_init( void )
 		LM_ERR("failed to register stat\n");
 		return -1;
 	}
-
+	
 	if (register_module_stats( exports.name, mod_stats)!=0 ) {
 		LM_ERR("failed to register core statistics\n");
 		return -1;
diff --git a/modules/cdp/worker.c b/modules/cdp/worker.c
index 5ab215c..4a45bc4 100644
--- a/modules/cdp/worker.c
+++ b/modules/cdp/worker.c
@@ -70,6 +70,7 @@ task_queue_t *tasks; /**< queue of tasks */
 cdp_cb_list_t *callbacks; /**< list of callbacks for message processing */
 
 extern unsigned int workerq_latency_threshold; /**<max delay for putting task into worker queue */
+extern unsigned int workerq_length_threshold_percentage;	/**< default threshold for worker queue length, percentage of max queue length */
 /**
  * Initializes the worker structures, like the task queue.
  */
@@ -207,6 +208,8 @@ void cb_remove(cdp_cb_t *cb) {
 int put_task(peer *p, AAAMessage *msg) {
 
     struct timeval start, stop;
+    int num_tasks, length_percentage;
+    
     long elapsed_useconds=0, elapsed_seconds=0, elapsed_millis=0;
     lock_get(tasks->lock);
 
@@ -246,6 +249,13 @@ int put_task(peer *p, AAAMessage *msg) {
         LM_WARN("Error releasing tasks->empty semaphore > %s!\n", strerror(errno));
     lock_release(tasks->lock);
 
+    if(workerq_length_threshold_percentage > 0) {
+	num_tasks = tasks->end - tasks->start;
+	length_percentage = num_tasks/tasks->max*100;
+	if(length_percentage > workerq_length_threshold_percentage) {
+	    LM_WARN("Queue length has exceeded length threshold percentage [%i] and is length [%i]", length_percentage, num_tasks);
+	}
+    }
     //int num_tasks = tasks->end - tasks->start;
     //LM_ERR("Added task to task queue.  Queue length [%i]", num_tasks);
 




More information about the sr-dev mailing list