Skip to content
Snippets Groups Projects
Commit bc2420ee authored by Chris-Savinovich's avatar Chris-Savinovich Committed by Chris Savinovich
Browse files

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
parent 2c35dfc5
Branches
Tags
No related merge requests found
...@@ -530,12 +530,22 @@ static pj_bool_t distributor(pjsip_rx_data *rdata) ...@@ -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 * we are being overloaded and need to defer adding new work to
* the system. To defer the work we will ignore the request and * the system. To defer the work we will ignore the request and
* rely on the peer's transport layer to retransmit the message. * rely on the peer's transport layer to retransmit the message.
* We usually work off the overload within a few seconds. The * We usually work off the overload within a few seconds.
* alternative is to send back a 503 response to these requests * If transport is non-UDP we send a 503 response instead.
* and be done with it.
*/ */
ast_debug(3, "Taskprocessor overload alert: Ignoring '%s'.\n", switch (rdata->tp_info.transport->key.type) {
pjsip_rx_data_get_info(rdata)); 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); ao2_cleanup(dist);
return PJ_TRUE; return PJ_TRUE;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment