]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Send a 503 response when overload state if reliable transport.
authorChris-Savinovich <csavinovich@digium.com>
Tue, 6 Nov 2018 22:44:34 +0000 (16:44 -0600)
committerChris Savinovich <csavinovich@digium.com>
Wed, 7 Nov 2018 12:59:18 +0000 (07:59 -0500)
When Asterisk's taskprocessors get overloaded we need to reduce the work
load. res_pjsip currently ignores new SIP requests and relies on SIP
retransmissions in the hope that the overload condition will clear soon
enough to handle the retransmitted SIP request.
This change adds the following code after ast_taskprocessor_alert_get()
has returned TRUE:
1- identifies transport type. If non-udp then send a 503 response
2- if transport type is udp/udp6 then ignore, as before.

Change-Id: I1c230b40d43a254ea0f226b7acf9ee480a5d3836

res/res_pjsip/pjsip_distributor.c

index 9b3fcdcc31f6ce7058d7deb32628f056e82e27ba..d67b942e9e554fee23d03711601ffab35087307b 100644 (file)
@@ -530,12 +530,22 @@ static pj_bool_t distributor(pjsip_rx_data *rdata)
                         * we are being overloaded and need to defer adding new work to
                         * the system.  To defer the work we will ignore the request and
                         * rely on the peer's transport layer to retransmit the message.
-                        * We usually work off the overload within a few seconds.  The
-                        * alternative is to send back a 503 response to these requests
-                        * and be done with it.
+                        * We usually work off the overload within a few seconds.
+                        * If transport is non-UDP we send a 503 response instead.
                         */
-                       ast_debug(3, "Taskprocessor overload alert: Ignoring '%s'.\n",
-                               pjsip_rx_data_get_info(rdata));
+                       switch (rdata->tp_info.transport->key.type) {
+                       case PJSIP_TRANSPORT_UDP6:
+                       case PJSIP_TRANSPORT_UDP:
+                               ast_debug(3, "Taskprocessor overload alert: Ignoring '%s'.\n",
+                                       pjsip_rx_data_get_info(rdata));
+                               break;
+                       default:
+                               ast_debug(3, "Taskprocessor overload on non-udp transport. Received:'%s'. "
+                                       "Responding with a 503.\n", pjsip_rx_data_get_info(rdata));
+                               pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata,
+                                       PJSIP_SC_SERVICE_UNAVAILABLE, NULL, NULL, NULL);
+                               break;
+                       }
                        ao2_cleanup(dist);
                        return PJ_TRUE;
                }