Hi,

I have very fast access to an SMSC for testing purposes, and I think I
have discovered an interesting problem in internal DLR storage.

I have limited the throughput to 1 message per second and encountered no
problems with the internal DLR storage; but somehow when I push it
harder to the top speed, I think the internal storage gets confused.

Here is a small snap of what I get in the *Apache* access_log, when I
limit the throughput to 1/sec:

        127.0.0.1 - - [13/Sep/2004:19:12:26 +0300] "GET 
/~skyblue/update-dlr.php?id=204&status=8 HTTP/1.1" 200 21
        127.0.0.1 - - [13/Sep/2004:19:12:26 +0300] "GET 
/~skyblue/update-dlr.php?id=204&status=4 HTTP/1.1" 200 21
        127.0.0.1 - - [13/Sep/2004:19:12:27 +0300] "GET 
/~skyblue/update-dlr.php?id=205&status=8 HTTP/1.1" 200 21
        127.0.0.1 - - [13/Sep/2004:19:12:27 +0300] "GET 
/~skyblue/update-dlr.php?id=205&status=4 HTTP/1.1" 200 21
        127.0.0.1 - - [13/Sep/2004:19:12:28 +0300] "GET 
/~skyblue/update-dlr.php?id=206&status=8 HTTP/1.1" 200 21
        127.0.0.1 - - [13/Sep/2004:19:12:28 +0300] "GET 
/~skyblue/update-dlr.php?id=206&status=4 HTTP/1.1" 200 21

and here is another somewhat small snap of what I get (demonstrating how
it gets confused) in the *Apache* access_log, when there's no throughput
limiting:

        127.0.0.1 - - [13/Sep/2004:19:33:22 +0300] "GET 
/~skyblue/update-dlr.php?id=40&status=8 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:22 +0300] "GET 
/~skyblue/update-dlr.php?id=326&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:22 +0300] "GET 
/~skyblue/update-dlr.php?id=326&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:22 +0300] "GET 
/~skyblue/update-dlr.php?id=64&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=326&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=64&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=326&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=326&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=64&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=64&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=64&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:23 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:24 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:24 +0300] "GET 
/~skyblue/update-dlr.php?id=326&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:24 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:24 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200
        127.0.0.1 - - [13/Sep/2004:19:33:25 +0300] "GET 
/~skyblue/update-dlr.php?id=43&status=4 HTTP/1.1" 200

Patch attached.

Cheers,
-- 
Enver ALTIN                   |        http://skyblue.gen.tr/
Software developer @ Parkyeri |      http://www.parkyeri.com/
Index: ChangeLog
===================================================================
RCS file: /home/cvs/gateway/ChangeLog,v
retrieving revision 1.2554
diff -u -p -d -r1.2554 ChangeLog
--- ChangeLog	10 Sep 2004 20:11:26 -0000	1.2554
+++ ChangeLog	13 Sep 2004 17:12:11 -0000
@@ -1,3 +1,7 @@
+2004-09-13 Enver ALTIN <skyblue at skyblue.gen.tr>
+	* gw/dlr_mem.c: Fixed internal DLR matching problem (compare the
+	destination too).
+
 2004-09-10 Alexander Malysh <amalysh at kannel.org>
     * gwlib/gwlib.h: added 'gw-prioqueue.h'. fixed compile error.
 
Index: gw/dlr_mem.c
===================================================================
RCS file: /home/cvs/gateway/gw/dlr_mem.c,v
retrieving revision 1.7
diff -u -p -d -r1.7 dlr_mem.c
--- gw/dlr_mem.c	8 Aug 2004 19:50:18 -0000	1.7
+++ gw/dlr_mem.c	13 Sep 2004 17:12:11 -0000
@@ -122,10 +122,7 @@ static void dlr_mem_add(struct dlr_entry
  */
 static int dlr_mem_entry_match(struct dlr_entry *dlr, const Octstr *smsc, const Octstr *ts, const Octstr *dst)
 {
-    /* XXX: check destination addr too, because e.g. for UCP is not enough to check only
-     *          smsc and timestamp (timestamp is even without milliseconds)
-     */
-    if(octstr_compare(dlr->smsc,smsc) == 0 && octstr_compare(dlr->timestamp,ts) == 0)
+    if(octstr_compare(dlr->smsc,smsc) == 0 && octstr_compare(dlr->timestamp,ts) == 0 && octstr_compare(dlr->destination,dst) == 0)
         return 0;
 
     return 1;

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to