[sr-dev] git:master: mqueue: Add new psuedo-variable to return mqueue size

Hugh Waite hugh.waite at crocodile-rcs.com
Thu Jan 30 23:19:19 CET 2014


Hello,
I found that the mq_size() function has a major limitation in that if 
the queue size is zero, the function never returns (retcode of 0 means 
stop processing). Therefore I have added this PV to solve the issue.

I can add a note to the README indicating this limitation, but I wonder 
if this exported function is useful at all. Should it be kept, removed 
or altered to do something different when the queue is empty?

Hugh

On 30/01/2014 22:01, Hugh Waite wrote:
> Module: sip-router
> Branch: master
> Commit: 40ea6ffd76cf32aafc594038d17555edbc816b50
> URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=40ea6ffd76cf32aafc594038d17555edbc816b50
>
> Author: Hugh Waite <hugh.waite at crocodile-rcs.com>
> Committer: Hugh Waite <hugh.waite at crocodile-rcs.com>
> Date:   Thu Jan 30 21:58:43 2014 +0000
>
> mqueue: Add new psuedo-variable to return mqueue size
>
> - Using PV will return a value when the length is zero
>
> ---
>
>   modules/mqueue/README               |   78 +++++++++++++++++++++--------------
>   modules/mqueue/doc/mqueue_admin.xml |   30 +++++++++++---
>   modules/mqueue/mqueue_api.c         |   25 +++++++++++
>   modules/mqueue/mqueue_api.h         |    2 +
>   modules/mqueue/mqueue_mod.c         |    2 +
>   5 files changed, 100 insertions(+), 37 deletions(-)
>
> diff --git a/modules/mqueue/README b/modules/mqueue/README
> index 8d41f8a..b58607c 100644
> --- a/modules/mqueue/README
> +++ b/modules/mqueue/README
> @@ -1,3 +1,4 @@
> +
>   mqueue Module
>   
>   Elena-Ramona Modroiu
> @@ -18,7 +19,7 @@ Alex Balashov
>      <abalashov at evaristesys.com>
>   
>      Copyright ? 2010 Elena-Ramona Modroiu (asipto.com)
> -     __________________________________________________________________
> +     _________________________________________________________________
>   
>      Table of Contents
>   
> @@ -36,10 +37,12 @@ Alex Balashov
>   
>           4. Functions
>   
> -              4.1. mq_add(queue, key, value)
> -              4.2. mq_fetch(queue)
> -              4.3. mq_pv_free(queue)
> -              4.4. mq_size(queue)
> +              4.1. mq_add(queue, key, value)
> +              4.2. mq_fetch(queue)
> +              4.3. mq_pv_free(queue)
> +              4.4. mq_size(queue)
> +
> +        5. Exported Pseudo-variables
>   
>      List of Examples
>   
> @@ -65,20 +68,22 @@ Chapter 1. Admin Guide
>   
>      4. Functions
>   
> -        4.1. mq_add(queue, key, value)
> -        4.2. mq_fetch(queue)
> -        4.3. mq_pv_free(queue)
> -        4.4. mq_size(queue)
> +        4.1. mq_add(queue, key, value)
> +        4.2. mq_fetch(queue)
> +        4.3. mq_pv_free(queue)
> +        4.4. mq_size(queue)
> +
> +   5. Exported Pseudo-variables
>   
>   1. Overview
>   
> -   The mqueue module offers a generic message queue system in shared
> -   memory for inter-process communication using the config file. One
> -   example of usage is to send time consuming operations to one or several
> -   timer processes that consumes items in the queue, without affecting SIP
> -   message handling in the socket-listening process.
> +   The  mqueue  module  offers  a  generic message queue system in shared
> +   memory  for  inter-process  communication  using  the config file. One
> +   example  of  usage  is  to  send  time  consuming operations to one or
> +   several  timer  processes  that  consumes  items in the queue, without
> +   affecting SIP message handling in the socket-listening process.
>   
> -   There can be many defined queues. Access to queued values is done via
> +   There  can be many defined queues. Access to queued values is done via
>      pseudo variables.
>   
>   2. Dependencies
> @@ -93,7 +98,7 @@ Chapter 1. Admin Guide
>   
>   2.2. External Libraries or Applications
>   
> -   The following libraries or applications must be installed before
> +   The  following  libraries  or  applications  must  be installed before
>      running Kamailio with this module loaded:
>        * None.
>   
> @@ -105,15 +110,15 @@ Chapter 1. Admin Guide
>   
>      Definition of a memory queue
>   
> -   Default value is "none".
> +   Default value is "none".
>   
> -   Value must be a list of parameters: attr=value;... The attribute 'name'
> -   is mandatory, defining the name of the queue. Optional attribute 'size'
> -   specifies the maximum number of items in queue, if it is execeeded the
> -   oldest one is removed.
> +   Value  must  be  a  list  of  parameters: attr=value;... The attribute
> +   'name'  is  mandatory,  defining  the  name  of  the  queue.  Optional
> +   attribute 'size' specifies the maximum number of items in queue, if it
> +   is execeeded the oldest one is removed.
>   
> -   The parameter can be set many times, each holding the definition of one
> -   queue.
> +   The  parameter  can  be set many times, each holding the definition of
> +   one queue.
>   
>      Example 1.1. Set mqueue parameter
>   ...
> @@ -123,14 +128,14 @@ modparam("mqueue", "mqueue", "name=qaz")
>   
>   4. Functions
>   
> -   4.1. mq_add(queue, key, value)
> -   4.2. mq_fetch(queue)
> -   4.3. mq_pv_free(queue)
> -   4.4. mq_size(queue)
> +   4.1. mq_add(queue, key, value)
> +   4.2. mq_fetch(queue)
> +   4.3. mq_pv_free(queue)
> +   4.4. mq_size(queue)
>   
>   4.1.  mq_add(queue, key, value)
>   
> -   Add a new item (key, value) in the queue. If max size of queue is
> +   Add  a  new  item  (key,  value) in the queue. If max size of queue is
>      exceeded, the oldest one is removed.
>   
>      Example 1.2. mq_add usage
> @@ -140,10 +145,10 @@ mq_add("myq", "$rU", "call from $fU");
>   
>   4.2.  mq_fetch(queue)
>   
> -   Take oldest item from queue and fill $mqk(queue) and $mqv(queue) pseudo
> -   variables.
> +   Take  oldest  item  from  queue  and  fill $mqk(queue) and $mqv(queue)
> +   pseudo variables.
>   
> -   Return: true on success (1); false on failure (-1) or no item fetched
> +   Return:  true on success (1); false on failure (-1) or no item fetched
>      (-2).
>   
>      Example 1.3. mq_fetch usage
> @@ -173,3 +178,14 @@ mq_pv_free("myq");
>   $var(q_size) = mq_size("queue");
>   xlog("L_INFO", "Size of queue is: $var(q_size)\n");
>   ...
> +
> +5. Exported Pseudo-variables
> +
> +     * $mqv(mqueue) - the most recent item key fetched from the specified
> +       mqueue
> +     * $mqv(mqueue)  -  the  most  recent  item  value  fetched  from the
> +       specified mqueue
> +     * $mq_size(mqueue) - the size of the specified mqueue
> +
> +   Exported pseudo-variables are documented at
> +   http://www.kamailio.org/wiki/.
> diff --git a/modules/mqueue/doc/mqueue_admin.xml b/modules/mqueue/doc/mqueue_admin.xml
> index a444cc4..1aee029 100644
> --- a/modules/mqueue/doc/mqueue_admin.xml
> +++ b/modules/mqueue/doc/mqueue_admin.xml
> @@ -61,7 +61,7 @@
>       <section>
>   	<title>Parameters</title>
>   
> -	<section>
> +	<section id="mqueue.p.mqueue">
>   	    <title><varname>mqueue</varname> (string)</title>
>   	    <para>
>   		Definition of a memory queue
> @@ -96,7 +96,7 @@ modparam("mqueue", "mqueue", "name=qaz")
>   	
>       <section>
>   	<title>Functions</title>
> - 	<section>
> + 	<section id="mqueue.f.mq_add">
>   	    <title>
>   		<function moreinfo="none">mq_add(queue, key, value)</function>
>   	    </title>
> @@ -114,7 +114,7 @@ mq_add("myq", "$rU", "call from $fU");
>   	    </example>
>   	</section>
>   	
> - 	<section>
> + 	<section id="mqueue.f.mq_fetch">
>   	    <title>
>   		<function moreinfo="none">mq_fetch(queue)</function>
>   	    </title>
> @@ -139,7 +139,7 @@ while(mq_fetch("myq"))
>   	    </example>
>   	</section>
>   	
> - 	<section>
> + 	<section id="mqueue.f.mq_pv_free">
>   	    <title>
>   		<function moreinfo="none">mq_pv_free(queue)</function>
>   	    </title>
> @@ -157,7 +157,7 @@ mq_pv_free("myq");
>   	    </example>
>   	</section>
>   
> -	<section>
> +	<section id="mqueue.f.mq_size">
>   	    <title>
>   		<function moreinfo="none">mq_size(queue)</function>
>   	    </title>
> @@ -176,6 +176,24 @@ xlog("L_INFO", "Size of queue is: $var(q_size)\n");
>   	</section>
>   	
>       </section>
> -	
> +
> +    <section>
> +	<title>Exported Pseudo-variables</title>
> +		<itemizedlist>
> +			<listitem>
> +				<emphasis>$mqv(mqueue)</emphasis> - the most recent item key fetched from the specified mqueue
> +			</listitem>
> +			<listitem>
> +				<emphasis>$mqv(mqueue)</emphasis> - the most recent item value fetched from the specified mqueue
> +			</listitem>
> +			<listitem>
> +				<emphasis>$mq_size(mqueue)</emphasis> - the size of the specified mqueue
> +			</listitem>
> +		</itemizedlist>
> +		<para>
> +		Exported pseudo-variables are documented at &kamwikilink;.
> +		</para>
> +    </section>
> +
>   </chapter>
>   
> diff --git a/modules/mqueue/mqueue_api.c b/modules/mqueue/mqueue_api.c
> index 4a36909..e060991 100644
> --- a/modules/mqueue/mqueue_api.c
> +++ b/modules/mqueue/mqueue_api.c
> @@ -456,6 +456,31 @@ int pv_get_mqv(struct sip_msg *msg, pv_param_t *param,
>   	return pv_get_strval(msg, param, res, &mp->item->val);
>   }
>   
> +/**
> + *
> + */
> +int pv_get_mq_size(struct sip_msg *msg, pv_param_t *param,
> +		pv_value_t *res)
> +{
> +	int mqs = -1;
> +	str *in = pv_get_mq_name(msg, &param->pvn.u.isname.name.s);
> +
> +	if (in == NULL)
> +	{
> +		LM_ERR("failed to get mq name\n");
> +		return -1;
> +	}
> +
> +	mqs = _mq_get_csize(in);
> +
> +	if (mqs < 0)
> +	{
> +		LM_ERR("mqueue not found: %.*s\n", in->len, in->s);
> +		return -1;
> +	}
> +
> +	return pv_get_sintval(msg, param, res, mqs);
> +}
>   /* Return head->csize for a given queue */
>   
>   int _mq_get_csize(str *name)
> diff --git a/modules/mqueue/mqueue_api.h b/modules/mqueue/mqueue_api.h
> index cb695f1..1c69c69 100644
> --- a/modules/mqueue/mqueue_api.h
> +++ b/modules/mqueue/mqueue_api.h
> @@ -33,6 +33,8 @@ int pv_get_mqk(struct sip_msg *msg, pv_param_t *param,
>   		pv_value_t *res);
>   int pv_get_mqv(struct sip_msg *msg, pv_param_t *param,
>   		pv_value_t *res);
> +int pv_get_mq_size(struct sip_msg *msg, pv_param_t *param,
> +		pv_value_t *res);
>   
>   int mq_head_defined(void);
>   void mq_destroy(void);
> diff --git a/modules/mqueue/mqueue_mod.c b/modules/mqueue/mqueue_mod.c
> index 3eacf02..2115630 100644
> --- a/modules/mqueue/mqueue_mod.c
> +++ b/modules/mqueue/mqueue_mod.c
> @@ -59,6 +59,8 @@ static pv_export_t mod_pvs[] = {
>   		pv_parse_mq_name, 0, 0, 0 },
>   	{ {"mqv", sizeof("mqv")-1}, PVT_OTHER, pv_get_mqv, 0,
>   		pv_parse_mq_name, 0, 0, 0 },
> +	{ {"mq_size", sizeof("mq_size")-1}, PVT_OTHER, pv_get_mq_size, 0,
> +		pv_parse_mq_name, 0, 0, 0 },
>   	{ {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
>   };
>   
>
>
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev


-- 
Hugh Waite
Principal Design Engineer
Crocodile RCS Ltd.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-dev/attachments/20140130/08d44068/attachment.html>


More information about the sr-dev mailing list