From e407b8af2194463d78465ddc452ffce6516efa53 Mon Sep 17 00:00:00 2001 From: Alexei Gradinari Date: Fri, 26 Oct 2018 17:18:38 -0400 Subject: [PATCH] res_pjsip_notify: improve realtime performance on CLI completion on the endpoint The module 'res_pjsip_notify' inefficiently makes a lot of DB requests on CLI completion on the endpoint. For example if there are 10k endpoints the module makes 10k requests of these 10k records. Even if a part of the endpoint entered the module makes the same 10k requests and then filtered them by itself. This patch gathers endpoints container by prefix and adds all gathered endpoints to completion at once. ASTERISK-28137 #close Change-Id: Ic20024912cc77bf4d3e476c4cd853293c52b254b --- res/res_pjsip_notify.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/res/res_pjsip_notify.c b/res/res_pjsip_notify.c index 35144feec1..81555a03bc 100644 --- a/res/res_pjsip_notify.c +++ b/res/res_pjsip_notify.c @@ -888,30 +888,30 @@ static enum notify_result push_notify_channel(const char *channel_name, void *in * \internal * \brief Do completion on the endpoint. */ -static char *cli_complete_endpoint(const char *word, int state) +static char *cli_complete_endpoint(const char *word) { - char *result = NULL; int wordlen = strlen(word); - int which = 0; - + struct ao2_container * endpoints; struct ast_sip_endpoint *endpoint; - RAII_VAR(struct ao2_container *, endpoints, - ast_sip_get_endpoints(), ao2_cleanup); + struct ao2_iterator i; - struct ao2_iterator i = ao2_iterator_init(endpoints, 0); + endpoints = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(), + "endpoint", word, wordlen); + if (endpoints == NULL) { + return NULL; + } + + i = ao2_iterator_init(endpoints, 0); while ((endpoint = ao2_iterator_next(&i))) { - const char *name = ast_sorcery_object_get_id(endpoint); - if (!strncasecmp(word, name, wordlen) && ++which > state) { - result = ast_strdup(name); - } - + ast_cli_completion_add( + ast_strdup(ast_sorcery_object_get_id(endpoint))); ao2_cleanup(endpoint); - if (result) { - break; - } } ao2_iterator_destroy(&i); - return result; + + ao2_ref(endpoints, -1); + + return NULL; } /*! @@ -967,7 +967,7 @@ static char *cli_complete_notify(const char *line, const char *word, return c; } - return pos > 4 && !using_uri ? cli_complete_endpoint(word, state) : NULL; + return pos > 4 && !using_uri ? cli_complete_endpoint(word) : NULL; } /*!