From bc2420ee0e8c92261ed204a4fa0f90eac01f729c Mon Sep 17 00:00:00 2001 From: Chris-Savinovich <csavinovich@digium.com> Date: Tue, 6 Nov 2018 16:44:34 -0600 Subject: [PATCH] res_pjsip: Send a 503 response when overload state if reliable transport. 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 | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/res/res_pjsip/pjsip_distributor.c b/res/res_pjsip/pjsip_distributor.c index 9b3fcdcc31..d67b942e9e 100644 --- a/res/res_pjsip/pjsip_distributor.c +++ b/res/res_pjsip/pjsip_distributor.c @@ -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; } -- GitLab