Hi List,
attached patch should fix a shutdown sequence for smpp driver. The problem is
that smpp module should read as long no unbind_resp received otherwise we
will missing #max-pending-submits ack's from smsc.
smpp_properly_shutdown.diff:
smsc/smsc_smpp.c | 22 +++++++++++++++-------
smscconn.c | 14 +++++++++++---
2 files changed, 26 insertions(+), 10 deletions(-)
Comments and votes please...
--
Best regards / Mit besten Gr��en aus D�sseldorf
Dipl.-Ing.
Alexander Malysh
___________________________________________
Centrium GmbH
Vogelsanger Weg 80
40470 D�sseldorf
Fon: +49 (0211) 74 84 51 80
Fax: +49 (0211) 277 49 109
email: a.malysh at centrium.de
web: www.centrium.de
msn: olek2002 at hotmail.com
icq: 98063111
___________________________________________
Please avoid sending me Word or PowerPoint attachments.
See http://www.fsf.org/philosophy/no-word-attachments.html
Index: gw/smscconn.c
===================================================================
RCS file: /home/cvs/gateway/gw/smscconn.c,v
retrieving revision 1.40
diff -a -u -r1.40 smscconn.c
--- gw/smscconn.c 27 Jul 2003 14:45:28 -0000 1.40
+++ gw/smscconn.c 2 Sep 2003 15:01:05 -0000
@@ -207,11 +207,19 @@
}
/* Call SMSC specific destroyer */
- if (conn->shutdown)
+ if (conn->shutdown) {
+ /*
+ * we must unlock here, because module manipulate their state
+ * and will try to lock this mutex.Otherwise we have deadlock!
+ */
+ mutex_unlock(conn->flow_mutex);
conn->shutdown(conn, finish_sending);
- else
+ }
+ else {
conn->why_killed = SMSCCONN_KILLED_SHUTDOWN;
- mutex_unlock(conn->flow_mutex);
+ mutex_unlock(conn->flow_mutex);
+ }
+
return;
}
Index: gw/smsc/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_smpp.c,v
retrieving revision 1.49
diff -a -u -r1.49 smsc_smpp.c
--- gw/smsc/smsc_smpp.c 2 Sep 2003 11:30:30 -0000 1.49
+++ gw/smsc/smsc_smpp.c 2 Sep 2003 15:01:05 -0000
@@ -56,6 +56,7 @@
#define SMPP_THROTTLING_SLEEP_TIME 15
#define SMPP_DEFAULT_CONNECTION_TIMEOUT 10 * SMPP_ENQUIRE_LINK_INTERVAL
#define SMPP_DEFAULT_WAITACK 60
+#define SMPP_DEFAULT_SHUTDOWN_TIMEOUT 30
/*
@@ -1309,23 +1310,30 @@
timeout = last_enquire_sent + smpp->enquire_link_interval
- date_universal_now();
+ if (conn_wait(conn, timeout) == -1)
+ break;
+
/* unbind
- * TODO: read so long as unbind_resp received. Otherwise we have
+ * Read so long as unbind_resp received or timeout passed. Otherwise we have
* double delivered messages.
*/
if (smpp->quitting) {
send_unbind(smpp, conn);
- while ((ret = read_pdu(smpp, conn, &len, &pdu)) == 1) {
- dump_pdu("Got PDU:", smpp->conn->id, pdu);
- handle_pdu(smpp, conn, pdu, &pending_submits);
- smpp_pdu_destroy(pdu);
+ last_response = time(NULL);
+ while(conn_wait(conn, 1.00) != -1 &&
+ difftime(time(NULL), last_response) < SMPP_DEFAULT_SHUTDOWN_TIMEOUT &&
+ smpp->conn->status != SMSCCONN_DISCONNECTED) {
+ if (read_pdu(smpp, conn, &len, &pdu) == 1) {
+ dump_pdu("Got PDU:", smpp->conn->id, pdu);
+ handle_pdu(smpp, conn, pdu, &pending_submits);
+ smpp_pdu_destroy(pdu);
+ }
}
debug("bb.sms.smpp", 0, "SMPP[%s]: %s: break and shutting down",
octstr_get_cstr(smpp->conn->id), __PRETTY_FUNCTION__);
- }
- if (smpp->quitting || conn_wait(conn, timeout) == -1)
break;
+ }
send_enquire_link(smpp, conn, &last_enquire_sent);