Hello,
looks like after sending the response execution continues somewhere else
hitting t_check_trans() which detect the transaction exists and re-sends
the last last reply (as it is supposed to behave).
Be also careful with async processing in python, I am not familiar with
it at all, just be aware that kamailio has a multi-process design and
uses per-process global variables. if you do multi-threading async
processing in python, be sure you ensure consistency of globals and
avoid races to read+change them.
Cheers,
Daniel
On 26.01.22 16:53, Lewis Hutchinson wrote:
First of all I should start by saying this is my first post so go easy
on me!! : ) and thank for everyone’s efforts to share knowledge it has
been invaluable for my kamailio learning.
_Build Details_
Version: kamailio 5.5.3 (x86_64/linux)
Kamailio kemi python
_Scenario_
Relevant config
def ksr_route_api_query(self, msg):
KSR.log("info", "SUBSCRIBE API Query Starts")
# Create new Transaction
KSR.tm.t_newtran()
async def main():
url = 'https://api.hidingtheurl.com/subscribe'
payload = {
"ruri": KSR.pv.get("$ru"),
"from": KSR.pv.get("$fu"),
"from_tag": KSR.pv.gete("$ft"),
"to": KSR.pv.get("$tu"),
"callid": KSR.pv.get("$ci"),
"cseq": KSR.pv.get("$cs"),
"contact": KSR.pv.gete("$ct"),
"supported": KSR.pv.get("$hdr(Supported)"),
"event": KSR.pv.get("$hdr(Event)"),
"expires": KSR.pv.get("$hdr(Expires)"),
"diversion": KSR.pv.get("$di"),
"body": KSR.pv.get("$rb")
}
async with aiohttp.ClientSession() as session:
async with session.post(url, json=payload) as response:
if response.status == 0:
KSR.xlog.xinfo(f"SUB Manager Timeout:
{response.status}")
KSR.tm.t_reply(408, "SUB Manager Timeout")
elif response.status >= 500:
KSR.xlog.xinfo(f"SUB Manager Down:
{response.status}")
KSR.tm.t_reply(500, "SUB Manager Down")
elif response.status >= 400:
KSR.xlog.xinfo(f"SUB Manager Error:
{response.status}")
KSR.tm.t_reply(400, "SUB Manager Error")
else:
if response.status == 200:
KSR.xlog.xinfo(f"SUB Manager Success:
{response.status}")
KSR.tm.t_reply(200, "OK")
KSR.log("info", "SUBSCRIBE API Query Ends")
asyncio.run(main())
# API Query Ends
_Scenario_
Initial SUBSCRIBE >>> hits Kamailio >>> send payload in JSON to API
get receive 200OK response from API and send a 200OK on to Device
SUBSCRIBE -------->
<------------ 200 OK
After Subscription Expiry
re-SUBSCRIBE >>> hits Kamailio >>> send payload in JSON to API get
200OK response from API and send a 200OK on to Device but also another
200OK a fraction of a second later...
SUBSCRIBE -------->
<------------ 200 OK
<<<--------- 200 OK
This happens for all following re-SUBSCRIBE's
The 200 OK are identical, and it is a re transmission, but I can’t
work out why..
Relevant DEBUG is below
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: INFO: <script>: SUB
Manager Success: 200
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3
[apy_kemi.c:232]: sr_apy_kemi_exec_func_ex(): execution of method: t_reply
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3
[apy_kemi.c:287]: sr_apy_kemi_exec_func_ex(): params[2] for: t_reply
are int-str: [200] [OK]
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_lookup.c:1034]: t_check_msg(): msg (0x7eff0cd4e828) id=2/11234
global id=2/11234 T start=0x7eff0918d7d8
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_lookup.c:1108]: t_check_msg(): T (0x7eff0918d7d8) already found for
msg (0x7eff0cd4e828)!
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: <core>
[core/msg_translator.c:162]: check_via_address(): (80.111.111.111,
80.111.111.111, 0)
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_reply.c:1763]: cleanup_uac_timers(): RETR/FR timers reset
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_reply.c:637]: _reply_light(): reply sent out - buf=0x7eff0cd50938:
SIP/2.0 200 OK#015#012Via:... shmem=0x7eff09190ca8: SIP/2.0 200
OK#015#012Via:
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_reply.c:648]: _reply_light(): finished
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3
[apy_kemi.c:232]: sr_apy_kemi_exec_func_ex(): execution of method:
t_precheck_trans
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3
[apy_kemi.c:232]: sr_apy_kemi_exec_func_ex(): execution of method:
t_check_trans
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_lookup.c:1034]: t_check_msg(): msg (0x7eff0cd4e828) id=2/11234
global id=2/11234 T start=0x7eff0918d7d8
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_lookup.c:1108]: t_check_msg(): T (0x7eff0918d7d8) already found for
msg (0x7eff0cd4e828)!
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm
[t_reply.c:1703]: t_retransmit_reply(): reply retransmitted.
buf=0x7eff0cb18220: SIP/2.0 2..., shmem=0x7eff09190ca8: SIP/2.0 2
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3
[apy_kemi.c:112]: sr_kemi_config_engine_python(): execution of route
type 1 with no name returned 1
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: <core>
[core/receive.c:514]: receive_msg(): request-route executed in: 38258 usec
Everything works well as is but I want to clean up this issue or at
least understand what is causing it.
*Lewis*
__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
* sr-users(a)lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the sender!
Edit mailing list options or unsubscribe:
*
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
--
Daniel-Constantin Mierla --
www.asipto.com
www.twitter.com/miconda --
www.linkedin.com/in/miconda
Kamailio Advanced Training - Online
Feb 21-24, 2022 (America Timezone)
*
https://www.asipto.com/sw/kamailio-advanced-training-online/