Kannel 1.4.5 + redis is used to send sms via SMSC using smpp protocol.
When processing dlrs, once in a while we receive an ERROR similar to the following: ERROR: SMPP[XXXXX]: got DLR but could not find message or was not interested in it id<143914440> dst<XXXXXXX0842> If sms body is long, it becomes a real problem as almost every 2nd receipt can not be matched to the original submission. So let me explain what I believe is a serious bug: Kannel submits a request to send an sms to SMSC: smpp submit_sm 2020-03-31 22:53:43 [10846] [6] DEBUG: type_name: submit_sm 2020-03-31 22:53:43 [10846] [6] DEBUG: command_id: 4 = 0x00000004 2020-03-31 22:53:43 [10846] [6] DEBUG: sequence_number: 3305 = 0x00000ce9 2020-03-31 22:53:43 [10846] [6] DEBUG: destination_addr: "XXXXXXX0842" 2020-03-31 22:53:43 [10846] [6] DEBUG: sm_length: 159 = 0x0000009f 2020-03-31 22:53:43 [10846] [6] DEBUG: more_messages_to_send: 1 = 0x00000001 ... 2020-03-31 22:53:43 [10846] [6] DEBUG: type_name: submit_sm 2020-03-31 22:53:43 [10846] [6] DEBUG: command_id: 4 = 0x00000004 2020-03-31 22:53:43 [10846] [6] DEBUG: sequence_number: 3306 = 0x00000cea 2020-03-31 22:53:43 [10846] [6] DEBUG: destination_addr: "XXXXXXX0842" 2020-03-31 22:53:43 [10846] [6] DEBUG: sm_length: 48 = 0x00000030 It gets gets an ACK from the SMSC: smpp submit_sm_resp 2020-03-31 22:53:43 [10846] [6] DEBUG: type_name: submit_sm_resp 2020-03-31 22:53:43 [10846] [6] DEBUG: command_id: 2147483652 = 0x80000004 2020-03-31 22:53:43 [10846] [6] DEBUG: sequence_number: 3305 = 0x00000ce9 2020-03-31 22:53:43 [10846] [6] DEBUG: message_id: "0893F5C7" writes it to redis 2020-03-31 22:53:43 [10846] [6] DEBUG: DLR[redis]: Adding DLR smsc=smsc_123, ts=143914439, src=XXXXXXX8356, dst=XXXXXXX0842, mask=31, boxc= It converts it to fake DLR8 and posts (actually http get) to our API. So far so good, sms is going to the recipient and we have ACK (fake DLR8 as a proof). 2020-03-31 22:53:43 [10846] [6] DEBUG: type_name: submit_sm_resp 2020-03-31 22:53:43 [10846] [6] DEBUG: command_id: 2147483652 = 0x80000004 2020-03-31 22:53:43 [10846] [6] DEBUG: sequence_number: 3306 = 0x00000cea 2020-03-31 22:53:43 [10846] [6] DEBUG: message_id: "0893F5C8" 2020-03-31 22:53:43 [10846] [6] DEBUG: SMSC[smsc_123]: creating DLR message 2020-03-31 22:53:43 [10846] [6] DEBUG: SMSC[smsc_123]: DLR = http://XXXX Note message_id is +1 to what redis has ( we will need it later). Now, sms is delivered and our provider sends us a delivery receipt. 2020-03-31 22:53:43 [10846] [6] DEBUG: type_name: deliver_sm 2020-03-31 22:53:43 [10846] [6] DEBUG: command_id: 5 = 0x00000005 2020-03-31 22:53:43 [10846] [6] DEBUG: sequence_number: 1650 = 0x00000672 2020-03-31 22:53:43 [10846] [6] DEBUG: source_addr: "XXXXXXX0842" 2020-03-31 22:53:43 [10846] [6] DEBUG: sm_length: 102 = 0x00000066 Kannel goes to redis but could not find the key needed: 2020-03-31 22:53:43 [10846] [6] DEBUG: DLR[redis]: Looking for DLR smsc=smsc_123, ts=143914440, dst=XXXXXXX0842, type=2 2020-03-31 22:53:43 [10846] [6] WARNING: DLR[redis]: DLR from SMSC<smsc_123> for DST<XXXXXXX0842> not found. 2020-03-31 22:53:43 [10846] [6] ERROR: SMPP[smsc_123]: got DLR but could not find message or was not interested in it id<143914440> dst<XXXXXXX0842>, type<2> Manually examining the redis confirms that there is no key: Message_id converted from hex to int: 0893F5C8 => 143914440 redis-cli keys "dlr:smsc_123:143914440" (empty list or set) Now to revisit on what was written to redis: 2020-03-31 22:53:43 [10846] [6] DEBUG: DLR[redis]: Adding DLR smsc=smsc_123, ts=143914439, src=XXXXXXX8356, dst=XXXXXXX0842, mask=31, boxc= and compare to what is expected: 2020-03-31 22:53:43 [10846] [6] DEBUG: DLR[redis]: Looking for DLR smsc=smsc_123, ts=143914440, dst=XXXXXXX0842, type=2 Now we getting somewhere: 0893F5C7 (part 1) => 143914439 is written to redis 0893F5C8 (part 2) => 143914440 is used to create DLR8 0893F5C8 (part 2) => 143914440 is used on receiving deliver_sm to look-up in redis. But in fact we should be looking for 0893F5C7 (part 1) => 143914439? no? Correct: redis-cli keys "dlr:smsc_123:143914439" 1) "dlr:smsc_123:143914439" As you see kannel writes to redis ts = message_id from part 1, but on receiving a dlr it is looking for ts = message_id from part 2, could not find it, and as a result dlr is lost. The puzzling part, as bug is not consistent. As I mentioned before, some of the message(s) are Ok (???). Not sure what trips kannel to look for a wrong message_id though. Sometimes it matches message_id from part2 to part2, and everything is good.