<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@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;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"Andale Mono";
        panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
code
        {mso-style-priority:99;
        font-family:"Courier New",serif;}
span.E-MailFormatvorlage21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
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]-->
</head>
<body lang="DE" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hello,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">regarding limiting the number of gateways retries, you can use different failure routes (e.g. jump from first to second and then stop), you can keep an counter, or probably just rely
 on ds_next_dst() reaching the end of available gateways in the XAVP (did not checked code).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Cheers,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Henning<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">-- <o:p>
</o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Henning Westerholt –
</span><span style="mso-fareast-language:EN-US"><a href="https://skalatan.de/blog/"><span lang="EN-GB" style="color:#0563C1">https://skalatan.de/blog/</span></a></span><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Kamailio services –
</span><span style="mso-fareast-language:EN-US"><a href="https://gilawa.com/"><span lang="EN-GB" style="color:#0563C1">https://gilawa.com</span></a></span><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-left:35.4pt"><b>From:</b> Unai Rodriguez <unai@rodr.org>
<br>
<b>Sent:</b> Tuesday, December 13, 2022 5:32 PM<br>
<b>To:</b> Kamailio (SER) - Users Mailing List <sr-users@lists.kamailio.org>; Henning Westerholt <hw@gilawa.com><br>
<b>Subject:</b> RE: [SR-Users] How to have Kamailio retry backends<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
<div name="messageBodySection">
<div>
<p class="MsoNormal" style="margin-left:35.4pt">Hi Henning/All,<br>
<br>
After some digging we realized the system was already retrying thanks to this block on kamailio.cfg<br>
<br>
<code><span style="font-size:10.0pt"># Try next destionations in failure route</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">failure_route[RTF_DISPATCH] {</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">    <b>if</b></span></code><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span><code><span style="font-size:10.0pt">(t_is_canceled()) {</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">        exit;</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">    }</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">    # next DST - only <b>for</b></span></code><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span><code><span style="font-size:10.0pt">500</span></code><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span><code><span style="font-size:10.0pt">or
 local timeout</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">    <b>if</b></span></code><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span><code><span style="font-size:10.0pt">(t_check_status("500")</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">            or (t_branch_timeout() and !t_branch_replied())) {</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">        <b>if</b>(ds_next_dst()) {</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">            t_on_failure("RTF_DISPATCH");</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">            route(RELAY);</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">            exit;</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">        }</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">    }</span></code><span style="font-size:12.0pt"><br>
</span><code><span style="font-size:10.0pt">}</span></code><span style="font-size:12.0pt"><br>
<br>
</span>How can we control the maximum number of retries? Seems to be infinite at the moment? Or <span style="font-size:12.0pt;font-family:Consolas;color:black">!t_branch_replied()</span>means that each backend can only reply once?<br>
<br>
Thanks you<o:p></o:p></p>
</div>
</div>
<div name="messageSignatureSection">
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">With best wishes, <o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">Unai Rodriguez<o:p></o:p></p>
</div>
</div>
</div>
<div name="messageReplySection">
<p class="MsoNormal" style="margin-left:35.4pt">On 6 Dec 2022, 10:04 +0100, Henning Westerholt <<a href="mailto:hw@gilawa.com">hw@gilawa.com</a>>, wrote:<br>
<br>
<o:p></o:p></p>
<blockquote style="border:none;border-left:solid windowtext 1.0pt;padding:0cm 0cm 0cm 8.0pt;margin-left:3.75pt;margin-top:3.75pt;margin-right:3.75pt;margin-bottom:3.75pt">
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span style="mso-fareast-language:EN-US">Hello,</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span style="mso-fareast-language:EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US">you can implement this by using a failure_route. There is one example in the dispatcher module configuration how to do it.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US">Cheers,</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US">Henning</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US"> </span><o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US">--</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US">Henning Westerholt –</span><span lang="EN-GB">
</span><span style="mso-fareast-language:EN-US"><a href="https://skalatan.de/blog/"><span lang="EN-GB" style="color:#0563C1">https://skalatan.de/blog/</span></a></span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US">Kamailio services –</span><span lang="EN-GB">
</span><span style="mso-fareast-language:EN-US"><a href="https://gilawa.com/"><span lang="EN-GB" style="color:#0563C1">https://gilawa.com</span></a></span><o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-GB" style="mso-fareast-language:EN-US"> </span><o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:70.8pt">
<b>From:</b> sr-users <<a href="mailto:sr-users-bounces@lists.kamailio.org">sr-users-bounces@lists.kamailio.org</a>>
<b>On Behalf Of</b> Unai Rodriguez<br>
<b>Sent:</b> Saturday, December 3, 2022 5:16 PM<br>
<b>To:</b> <a href="mailto:sr-users@lists.kamailio.org">sr-users@lists.kamailio.org</a><br>
<b>Subject:</b> [SR-Users] How to have Kamailio retry backends<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:70.8pt">
 <o:p></o:p></p>
<div name="messageBodySection">
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:70.8pt">
<span style="font-family:"Arial",sans-serif">Dear List,</span><br>
<br>
<span style="font-family:"Arial",sans-serif">We’re using Kamailio to load balance MRCP requests to multiple backend groups with a configuration as follows:</span><br>
<br>
<span style="font-family:"Andale Mono",serif"># kamailio.cfg</span><br>
<span style="font-family:"Andale Mono",serif">...</span><br>
<span style="font-family:"Andale Mono",serif">...</span><br>
<span style="font-family:"Andale Mono",serif">route[DISPATCH] {</span><br>
<span style="font-family:"Andale Mono",serif">                if($ua=="mrcp_backend_1") {</span><br>
<span style="font-family:"Andale Mono",serif">                                if(!ds_select_dst("1", "4")) {</span><br>
<span style="font-family:"Andale Mono",serif">                                               send_reply("404", "No destination");</span><br>
<span style="font-family:"Andale Mono",serif">                                               exit;</span><br>
<span style="font-family:"Andale Mono",serif">                                }</span><br>
<span style="font-family:"Andale Mono",serif">                }</span><br>
<span style="font-family:"Andale Mono",serif">                if($ua=="mrcp_backend_2") {</span><br>
<span style="font-family:"Andale Mono",serif">                                if(!ds_select_dst("2", "4")) {</span><br>
<span style="font-family:"Andale Mono",serif">                                               send_reply("404", "No destination");</span><br>
<span style="font-family:"Andale Mono",serif">                                               exit;</span><br>
<span style="font-family:"Andale Mono",serif">                                }</span><br>
<span style="font-family:"Andale Mono",serif">                }</span><br>
<span style="font-family:"Andale Mono",serif">                xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");</span><br>
<span style="font-family:"Andale Mono",serif">                t_on_failure("RTF_DISPATCH");</span><br>
<span style="font-family:"Andale Mono",serif">                route(RELAY);</span><br>
<span style="font-family:"Andale Mono",serif">                exit;</span><br>
<span style="font-family:"Andale Mono",serif">}</span><br>
<span style="font-family:"Andale Mono",serif">...</span><br>
<span style="font-family:"Andale Mono",serif">...</span><br>
<br>
<span style="font-family:"Andale Mono",serif"># dispatcher.list</span><br>
<span style="font-family:"Andale Mono",serif">1 <a href="sip:mrcp01.server.int:8060;transport=tcp">
sip:mrcp01.server.int:8060;transport=tcp</a></span><br>
<span style="font-family:"Andale Mono",serif">1 <a href="sip:mrcp02.server.int:8060;transport=tcp">
sip:mrcp02.server.int:8060;transport=tcp</a></span><br>
<br>
<span style="font-family:"Andale Mono",serif">2 <a href="sip:mrcp03.server.int:8060;transport=tcp">
sip:mrcp03.server.int:8060;transport=tcp</a></span><br>
<span style="font-family:"Andale Mono",serif">2 <a href="sip:mrcp04.server.int:8060;transport=tcp">
sip:mrcp04.server.int:8060;transport=tcp</a></span><br>
<br>
With this configuration, Kamailio load balances the initial SIP INVITE among the MRCP servers. After the INVITE, the service communicates directly to the MRCP servers via SIP (for hanging up the call), MRCPv2 (for sending speech control messages), and RTP (for
 sending audio).<br>
<br>
We would like to implement a configurable number of retries, so that if a particular backend times out, Kamailio would retry X times to other backend(s). In short, <a href="https://cbonte.github.io/haproxy-dconv/2.4/configuration.html#4-retries" target="_blank">something
 equivalent to HAProxy’s retries</a>, but for Kamailio. This probably implies having Kamailio always as part of our communication (not just load balancing the initial SIP INVITE).<br>
<br>
I haven’t been able to find much information about this, could someone provide some pointers?<br>
<br>
Thank you so much<o:p></o:p></p>
</div>
</div>
<div name="messageSignatureSection">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:70.8pt">
 <o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:70.8pt">
With best wishes,<o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:70.8pt">
Unai Rodriguez<o:p></o:p></p>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</body>
</html>