<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Hello,</p>
    <p>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).</p>
    <p>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.</p>
    <p>Cheers,<br>
      Daniel<br>
    </p>
    <div class="moz-cite-prefix">On 26.01.22 16:53, Lewis Hutchinson
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CWXP265MB2517B239EEE4CAD560E27B0AC5209@CWXP265MB2517.GBRP265.PROD.OUTLOOK.COM">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style>@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}div.WordSection1
        {page:WordSection1;}</style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
      <div class="WordSection1">
        <p class="MsoNormal">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.<br>
          <br>
          <u>Build Details</u><br>
          <br>
          Version: kamailio 5.5.3 (x86_64/linux)<br>
          Kamailio kemi python <br>
          <br>
          <u>Scenario</u><br>
          <br>
          Relevant config<br>
          <br>
          def ksr_route_api_query(self, msg):<o:p></o:p></p>
        <p class="MsoNormal">        KSR.log("info", "SUBSCRIBE API
          Query Starts")<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">        # Create new Transaction<o:p></o:p></p>
        <p class="MsoNormal">        KSR.tm.t_newtran()<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">        async def main():<o:p></o:p></p>
        <p class="MsoNormal">            url =
          '<a class="moz-txt-link-freetext" href="https://api.hidingtheurl.com/subscribe">https://api.hidingtheurl.com/subscribe</a>'<o:p></o:p></p>
        <p class="MsoNormal">            payload = {<o:p></o:p></p>
        <p class="MsoNormal">                "ruri": KSR.pv.get("$ru"),<o:p></o:p></p>
        <p class="MsoNormal">                "from": KSR.pv.get("$fu"),<o:p></o:p></p>
        <p class="MsoNormal">                "from_tag":
          KSR.pv.gete("$ft"),<o:p></o:p></p>
        <p class="MsoNormal">                "to": KSR.pv.get("$tu"),<o:p></o:p></p>
        <p class="MsoNormal">                "callid":
          KSR.pv.get("$ci"),<o:p></o:p></p>
        <p class="MsoNormal">                "cseq": KSR.pv.get("$cs"),<o:p></o:p></p>
        <p class="MsoNormal">                "contact":
          KSR.pv.gete("$ct"),<o:p></o:p></p>
        <p class="MsoNormal">                "supported":
          KSR.pv.get("$hdr(Supported)"),<o:p></o:p></p>
        <p class="MsoNormal">                "event":
          KSR.pv.get("$hdr(Event)"),<o:p></o:p></p>
        <p class="MsoNormal">                "expires":
          KSR.pv.get("$hdr(Expires)"),<o:p></o:p></p>
        <p class="MsoNormal">                "diversion":
          KSR.pv.get("$di"),<o:p></o:p></p>
        <p class="MsoNormal">                "body": KSR.pv.get("$rb")<o:p></o:p></p>
        <p class="MsoNormal">                }<o:p></o:p></p>
        <p class="MsoNormal">            async with
          aiohttp.ClientSession() as session:<o:p></o:p></p>
        <p class="MsoNormal">                async with
          session.post(url, json=payload) as response:<o:p></o:p></p>
        <p class="MsoNormal">                    if response.status ==
          0:<o:p></o:p></p>
        <p class="MsoNormal">                       
          KSR.xlog.xinfo(f"SUB Manager Timeout: {response.status}")<o:p></o:p></p>
        <p class="MsoNormal">                        KSR.tm.t_reply(408,
          "SUB Manager Timeout")<o:p></o:p></p>
        <p class="MsoNormal">                    elif response.status
          >= 500:<o:p></o:p></p>
        <p class="MsoNormal">                       
          KSR.xlog.xinfo(f"SUB Manager Down: {response.status}")<o:p></o:p></p>
        <p class="MsoNormal">                        KSR.tm.t_reply(500,
          "SUB Manager Down")<o:p></o:p></p>
        <p class="MsoNormal">                    elif response.status
          >= 400:<o:p></o:p></p>
        <p class="MsoNormal">                       
          KSR.xlog.xinfo(f"SUB Manager Error: {response.status}")<o:p></o:p></p>
        <p class="MsoNormal">                        KSR.tm.t_reply(400,
          "SUB Manager Error")<o:p></o:p></p>
        <p class="MsoNormal">                    else:<o:p></o:p></p>
        <p class="MsoNormal">                        if response.status
          == 200:<o:p></o:p></p>
        <p class="MsoNormal">                           
          KSR.xlog.xinfo(f"SUB Manager Success: {response.status}")<o:p></o:p></p>
        <p class="MsoNormal">                           
          KSR.tm.t_reply(200, "OK")<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">        KSR.log("info", "SUBSCRIBE API
          Query Ends")<o:p></o:p></p>
        <p class="MsoNormal">        asyncio.run(main())<o:p></o:p></p>
        <p class="MsoNormal">        # API Query Ends<br>
          <br>
          <u>Scenario</u><br>
          <br>
          <o:p></o:p></p>
        <p class="MsoNormal">Initial SUBSCRIBE >>> hits
          Kamailio >>> send payload in JSON to API get receive
          200OK response from API and send a 200OK on to Device
          <o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">SUBSCRIBE --------><o:p></o:p></p>
        <p class="MsoNormal"><------------ 200 OK <o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">After Subscription Expiry<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">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...<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">SUBSCRIBE --------><o:p></o:p></p>
        <p class="MsoNormal"><------------ 200 OK <o:p></o:p></p>
        <p class="MsoNormal"><<<--------- 200 OK <o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><br>
          This happens for all following re-SUBSCRIBE's<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">The 200 OK are identical, and it is a re
          transmission, but I can’t work out why..<br>
          <br>
          Relevant DEBUG is below<br>
          <br>
          Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: INFO:
          <script>: SUB Manager Success: 200<o:p></o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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]<o:p></o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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)!<o:p></o:p></p>
        <p class="MsoNormal">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)<o:p></o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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:<o:p></o:p></p>
        <p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39
          kamailio[11234]: DEBUG: tm [t_reply.c:648]: _reply_light():
          finished<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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)!<o:p></o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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<o:p></o:p></p>
        <p class="MsoNormal">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<br>
          <br>
          <br>
          Everything works well as is but I want to clean up this issue
          or at least understand what is causing it.<br>
          <br>
          <br>
          <o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><b><span
              style="font-size:12.0pt;color:black;mso-fareast-language:EN-GB">Lewis</span></b><span
style="font-size:12.0pt;color:black;mso-fareast-language:EN-GB"><o:p></o:p></span></p>
      </div>
      <br>
      <fieldset class="moz-mime-attachment-header"></fieldset>
      <pre class="moz-quote-pre" wrap="">__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
  * <a class="moz-txt-link-abbreviated" href="mailto:sr-users@lists.kamailio.org">sr-users@lists.kamailio.org</a>
Important: keep the mailing list in the recipients, do not reply only to the sender!
Edit mailing list options or unsubscribe:
  * <a class="moz-txt-link-freetext" href="https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users">https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users</a>
</pre>
    </blockquote>
    <pre class="moz-signature" cols="72">-- 
Daniel-Constantin Mierla -- <a class="moz-txt-link-abbreviated" href="http://www.asipto.com">www.asipto.com</a>
<a class="moz-txt-link-abbreviated" href="http://www.twitter.com/miconda">www.twitter.com/miconda</a> -- <a class="moz-txt-link-abbreviated" href="http://www.linkedin.com/in/miconda">www.linkedin.com/in/miconda</a>
Kamailio Advanced Training - Online
  Feb 21-24, 2022 (America Timezone)
  * <a class="moz-txt-link-freetext" href="https://www.asipto.com/sw/kamailio-advanced-training-online/">https://www.asipto.com/sw/kamailio-advanced-training-online/</a></pre>
  </body>
</html>