[PATCH] fix bug #529 (sms-resend-* ignored for concatenated messages)
Konstantin Vayner <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
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
(text/x-patch, 1.3 KB)
--- 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;