From c4426f10352c58ded0ac1c3d652c4f6f416f1cb8 Mon Sep 17 00:00:00 2001 From: Alexei Gradinari Date: Fri, 15 Apr 2016 12:59:42 -0400 Subject: [PATCH] res_pjsip: disable multi domain to improve realtime performace This patch added new global pjsip option 'disable_multi_domain'. Disabling Multi Domain can improve Realtime performance by reducing number of database requests. ASTERISK-25930 #close Change-Id: I2e7160f3aae68475d52742107949a799aa2c7dc7 --- CHANGES | 10 +++++ configs/samples/pjsip.conf.sample | 5 +++ ...8ab86e29_pjsip_add_disable_multi_domain.py | 31 +++++++++++++++ include/asterisk/res_pjsip.h | 8 ++++ res/res_pjsip.c | 6 +++ res/res_pjsip/config_global.c | 23 ++++++++++- res/res_pjsip_endpoint_identifier_anonymous.c | 38 ++++++++++--------- res/res_pjsip_endpoint_identifier_user.c | 38 ++++++++++--------- 8 files changed, 121 insertions(+), 38 deletions(-) create mode 100644 contrib/ast-db-manage/config/versions/8d478ab86e29_pjsip_add_disable_multi_domain.py diff --git a/CHANGES b/CHANGES index 29b1b76924..e58ff82266 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,16 @@ === ============================================================================== +------------------------------------------------------------------------------ +--- Functionality changes from Asterisk 13.8.0 to Asterisk 13.9.0 ------------ +------------------------------------------------------------------------------ + +res_pjsip +------------------ + * Added new global option (disable_multi_domain) to pjsip. + Disabling Multi Domain can improve realtime performace by reducing + number of database requsts. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 13.7.0 to Asterisk 13.8.0 ------------ ------------------------------------------------------------------------------ diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample index ebbd199e73..f87a671a8f 100644 --- a/configs/samples/pjsip.conf.sample +++ b/configs/samples/pjsip.conf.sample @@ -886,6 +886,11 @@ ;keep_alive_interval=20 ; The interval (in seconds) at which to send keepalive ; messages on all active connection-oriented transports ; (default: "0") +;disable_multi_domain=no + ; Disable Multi Domain support. + ; If disabled it can improve realtime performace by reducing + ; number of database requsts + ; (default: "no") ;endpoint_identifier_order=ip,username,anonymous ; The order by which endpoint identifiers are given priority. ; Identifier names are derived from res_pjsip_endpoint_identifier_* diff --git a/contrib/ast-db-manage/config/versions/8d478ab86e29_pjsip_add_disable_multi_domain.py b/contrib/ast-db-manage/config/versions/8d478ab86e29_pjsip_add_disable_multi_domain.py new file mode 100644 index 0000000000..8c4269ccd6 --- /dev/null +++ b/contrib/ast-db-manage/config/versions/8d478ab86e29_pjsip_add_disable_multi_domain.py @@ -0,0 +1,31 @@ +"""pjsip_add_disable_multi_domain + +Revision ID: 8d478ab86e29 +Revises: 3bcc0b5bc2c9 +Create Date: 2016-04-15 11:41:26.988997 + +""" + +# revision identifiers, used by Alembic. +revision = '8d478ab86e29' +down_revision = '3bcc0b5bc2c9' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects.postgresql import ENUM + +YESNO_NAME = 'yesno_values' +YESNO_VALUES = ['yes', 'no'] + +def upgrade(): + ############################# Enums ############################## + + # yesno_values have already been created, so use postgres enum object + # type to get around "already created" issue - works okay with mysql + yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False) + + op.add_column('ps_globals', sa.Column('disable_multi_domain', yesno_values)) + + +def downgrade(): + op.drop_column('ps_globals', 'disable_multi_domain') diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h index 3901cf73cb..f56eb7bb48 100644 --- a/include/asterisk/res_pjsip.h +++ b/include/asterisk/res_pjsip.h @@ -2192,6 +2192,14 @@ void ast_sip_get_default_from_user(char *from_user, size_t size); */ unsigned int ast_sip_get_keep_alive_interval(void); +/*! + * \brief Retrieve the system setting 'disable multi domain'. + * \since 13.9.0 + * + * \retval non zero if disable multi domain. + */ +unsigned int ast_sip_get_disable_multi_domain(void); + /*! * \brief Retrieve the system max initial qualify time. * diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 752491c1d9..37d52df0a8 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -1279,6 +1279,12 @@ The interval (in seconds) to send keepalives to active connection-oriented transports. + + Disable Multi Domain support + + If disabled it can improve realtime performace by reducing number of database requsts. + + The maximum amount of time from startup that qualifies should be attempted on all contacts. If greater than the qualify_frequency for an aor, qualify_frequency will be used instead. diff --git a/res/res_pjsip/config_global.c b/res/res_pjsip/config_global.c index 3d88ffc2a9..ca608dca6e 100644 --- a/res/res_pjsip/config_global.c +++ b/res/res_pjsip/config_global.c @@ -36,6 +36,7 @@ #define DEFAULT_MAX_INITIAL_QUALIFY_TIME 0 #define DEFAULT_FROM_USER "asterisk" #define DEFAULT_REGCONTEXT "" +#define DEFAULT_DISABLE_MULTI_DOMAIN 0 static char default_useragent[256]; @@ -58,6 +59,8 @@ struct global_config { unsigned int keep_alive_interval; /* The maximum time for all contacts to be qualified at startup */ unsigned int max_initial_qualify_time; + /*! Nonzero to disable multi domain support */ + unsigned int disable_multi_domain; }; static void global_destructor(void *obj) @@ -186,6 +189,21 @@ unsigned int ast_sip_get_keep_alive_interval(void) return interval; } +unsigned int ast_sip_get_disable_multi_domain(void) +{ + unsigned int disable_multi_domain; + struct global_config *cfg; + + cfg = get_global_cfg(); + if (!cfg) { + return DEFAULT_DISABLE_MULTI_DOMAIN; + } + + disable_multi_domain = cfg->disable_multi_domain; + ao2_ref(cfg, -1); + return disable_multi_domain; +} + unsigned int ast_sip_get_max_initial_qualify_time(void) { unsigned int time; @@ -330,8 +348,9 @@ int ast_sip_initialize_sorcery_global(void) ast_sorcery_object_field_register(sorcery, "global", "default_from_user", DEFAULT_FROM_USER, OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, default_from_user)); ast_sorcery_object_field_register(sorcery, "global", "regcontext", DEFAULT_REGCONTEXT, - OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, regcontext)); - + OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, regcontext)); + ast_sorcery_object_field_register(sorcery, "global", "disable_multi_domain", "no", + OPT_BOOL_T, 1, FLDSET(struct global_config, disable_multi_domain)); if (ast_sorcery_instance_observer_add(sorcery, &observer_callbacks_global)) { return -1; diff --git a/res/res_pjsip_endpoint_identifier_anonymous.c b/res/res_pjsip_endpoint_identifier_anonymous.c index b39c8632cc..b931338249 100644 --- a/res/res_pjsip_endpoint_identifier_anonymous.c +++ b/res/res_pjsip_endpoint_identifier_anonymous.c @@ -69,28 +69,30 @@ static struct ast_sip_endpoint *anonymous_identify(pjsip_rx_data *rdata) return NULL; } - /* Attempt to find the endpoint given the name and domain provided */ - snprintf(id, sizeof(id), "anonymous@%s", domain_name); - if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { - goto done; - } - - /* See if an alias exists for the domain provided */ - if ((alias = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "domain_alias", domain_name))) { - snprintf(id, sizeof(id), "anonymous@%s", alias->domain); + if (!ast_sip_get_disable_multi_domain()) { + /* Attempt to find the endpoint given the name and domain provided */ + snprintf(id, sizeof(id), "anonymous@%s", domain_name); if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { goto done; } - } - /* See if the transport this came in on has a provided domain */ - if ((transport_states = ast_sip_get_transport_states()) - && (transport_state = ao2_callback(transport_states, 0, find_transport_state_in_use, rdata)) - && (transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_state->id)) - && !ast_strlen_zero(transport->domain)) { - snprintf(id, sizeof(id), "anonymous@%s", transport->domain); - if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { - goto done; + /* See if an alias exists for the domain provided */ + if ((alias = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "domain_alias", domain_name))) { + snprintf(id, sizeof(id), "anonymous@%s", alias->domain); + if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { + goto done; + } + } + + /* See if the transport this came in on has a provided domain */ + if ((transport_states = ast_sip_get_transport_states()) + && (transport_state = ao2_callback(transport_states, 0, find_transport_state_in_use, rdata)) + && (transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_state->id)) + && !ast_strlen_zero(transport->domain)) { + snprintf(id, sizeof(id), "anonymous@%s", transport->domain); + if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { + goto done; + } } } diff --git a/res/res_pjsip_endpoint_identifier_user.c b/res/res_pjsip_endpoint_identifier_user.c index aa6d398cf9..10b08afb0a 100644 --- a/res/res_pjsip_endpoint_identifier_user.c +++ b/res/res_pjsip_endpoint_identifier_user.c @@ -69,28 +69,30 @@ static struct ast_sip_endpoint *username_identify(pjsip_rx_data *rdata) return NULL; } - /* Attempt to find the endpoint given the name and domain provided */ - snprintf(id, sizeof(id), "%s@%s", endpoint_name, domain_name); - if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { - goto done; - } - - /* See if an alias exists for the domain provided */ - if ((alias = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "domain_alias", domain_name))) { - snprintf(id, sizeof(id), "%s@%s", endpoint_name, alias->domain); + if (!ast_sip_get_disable_multi_domain()) { + /* Attempt to find the endpoint given the name and domain provided */ + snprintf(id, sizeof(id), "%s@%s", endpoint_name, domain_name); if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { goto done; } - } - /* See if the transport this came in on has a provided domain */ - if ((transport_states = ast_sip_get_transport_states()) - && (transport_state = ao2_callback(transport_states, 0, find_transport_state_in_use, rdata)) - && (transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_state->id)) - && !ast_strlen_zero(transport->domain)) { - snprintf(id, sizeof(id), "anonymous@%s", transport->domain); - if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { - goto done; + /* See if an alias exists for the domain provided */ + if ((alias = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "domain_alias", domain_name))) { + snprintf(id, sizeof(id), "%s@%s", endpoint_name, alias->domain); + if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { + goto done; + } + } + + /* See if the transport this came in on has a provided domain */ + if ((transport_states = ast_sip_get_transport_states()) + && (transport_state = ao2_callback(transport_states, 0, find_transport_state_in_use, rdata)) + && (transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_state->id)) + && !ast_strlen_zero(transport->domain)) { + snprintf(id, sizeof(id), "anonymous@%s", transport->domain); + if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) { + goto done; + } } }