Skip to content
Snippets Groups Projects
Commit e407b8af authored by Alexei Gradinari's avatar Alexei Gradinari
Browse files

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
parent e81d33e7
No related branches found
No related tags found
No related merge requests found
......@@ -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);
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);
}
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))) {
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;
}
/*!
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment