Re: [PATCH] fix bug #529 (sms-resend-* ignored for concatenated messages)

Alexander Malysh <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
Hi,

unfortunately this will not work as expected (the rule is: _all_ parts if multipart message have to be send via the same SMSC)...

example:

	SMSC-A -> splits (2 parts) -> 1 part sent OK -> 2 part get temp. error -> you put it into global queue for resend -> 2 part sent via SMSC-B -> handset rejects it

We have only two possibility here:
1) if temp error occurs put the _whole_ message into resend queue and resend then _all_ parts (very easy todo)
2) remember smsc which was used for first parts and resend it via the same smsc (complicated but save money :) )

Thanks,
Alexander Malysh

Am 16.12.2009 um 18:17 schrieb Konstantin Vayner:

> Bug report: http://redmine.kannel.org/issues/show/529
> 
> Quote from gw/bb_smscconn.c :
> 
> static void handle_split(SMSCConn *conn, Msg *msg, long reason)
> {
>     struct split_parts *split = msg->sms.split_parts;
> 
>     /*
>      * If temporarely failed, try again immediately but only if connection active.
>      * Because if connection is not active we will loop for ever here consuming 100% CPU
>      * time due to internal queue cleanup in smsc module that call bb_smscconn_failed.
>      */
>     if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&
>         smscconn_send(conn, msg) == 0) {
>         /* destroy this message because it will be duplicated in smsc module */
>         msg_destroy(msg);
>         return;
>     }
> 
> (end quote)
> 
> So, if an smsc is alive and throws temporary error every time you try to submit such a message, we enter endless loop of attempting to resend it....
> 
> 
> Suggested patch follows (also attached).
> Sorry its not cvs diff - having firewall issues accessing pserver now so i ran diff vs snapshot generated yesterday
> I will be able to produce a normal cvs diff tomorrow morning if it is needed
> 
> 
> --- kannel-snapshot/gw/bb_smscconn.c    2009-11-15 16:12:28.000000000 +0200
> +++ gateway-cvs/gw/bb_smscconn.c        2009-12-16 19:47:32.000000000 +0200
> @@ -203,18 +203,6 @@
>      struct split_parts *split = msg->sms.split_parts;
>      
>      /*
> -     * If temporarely failed, try again immediately but only if connection active.
> -     * Because if connection is not active we will loop for ever here consuming 100% CPU
> -     * time due to internal queue cleanup in smsc module that call bb_smscconn_failed.
> -     */
> -    if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&
> -        smscconn_send(conn, msg) == 0) {
> -        /* destroy this message because it will be duplicated in smsc module */
> -        msg_destroy(msg);
> -        return;
> -    }
> -    
> -    /*
>       * if the reason is not a success and status is still success
>       * then set status of a split to the reason.
>       * Note: reason 'malformed','discarded' or 'rejected' has higher priority!
> @@ -303,7 +291,7 @@
>  
>  void bb_smscconn_send_failed(SMSCConn *conn, Msg *sms, int reason, Octstr *reply)
>  {
> -    if (sms->sms.split_parts != NULL) {
> +    if (reason != SMSCCONN_FAILED_TEMPORARILY && sms->sms.split_parts != NULL) {
>          handle_split(conn, sms, reason);
>          octstr_destroy(reply);
>          return;
> 
> 
> 
> 
> 
> 
> <bb_smscconn.diff>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.