<p>George Joseph <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/10555">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Corey Farrell: Looks good to me, but someone else must approve
  George Joseph: Looks good to me, approved; Approved for Submit

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res_pjsip_notify: improve realtime performance on CLI completion on the endpoint<br><br>The module 'res_pjsip_notify' inefficiently makes a lot of DB requests<br>on CLI completion on the endpoint.<br><br>For example if there are 10k endpoints the module makes 10k requests<br>of these 10k records.<br><br>Even if a part of the endpoint entered<br>the module makes the same 10k requests and then filtered them by itself.<br><br>This patch gathers endpoints container by prefix<br>and adds all gathered endpoints to completion at once.<br><br>ASTERISK-28137 #close<br><br>Change-Id: Ic20024912cc77bf4d3e476c4cd853293c52b254b<br>---<br>M res/res_pjsip_notify.c<br>1 file changed, 17 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/res/res_pjsip_notify.c b/res/res_pjsip_notify.c</span><br><span>index 35144fe..81555a0 100644</span><br><span>--- a/res/res_pjsip_notify.c</span><br><span>+++ b/res/res_pjsip_notify.c</span><br><span>@@ -888,30 +888,30 @@</span><br><span>  * \internal</span><br><span>  * \brief Do completion on the endpoint.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static char *cli_complete_endpoint(const char *word, int state)</span><br><span style="color: hsl(120, 100%, 40%);">+static char *cli_complete_endpoint(const char *word)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     char *result = NULL;</span><br><span>         int wordlen = strlen(word);</span><br><span style="color: hsl(0, 100%, 40%);">-     int which = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ao2_container * endpoints;</span><br><span>    struct ast_sip_endpoint *endpoint;</span><br><span style="color: hsl(0, 100%, 40%);">-      RAII_VAR(struct ao2_container *, endpoints,</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_sip_get_endpoints(), ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ao2_iterator i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      struct ao2_iterator i = ao2_iterator_init(endpoints, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      endpoints = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(),</span><br><span style="color: hsl(120, 100%, 40%);">+             "endpoint", word, wordlen);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (endpoints == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   i = ao2_iterator_init(endpoints, 0);</span><br><span>         while ((endpoint = ao2_iterator_next(&i))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                const char *name = ast_sorcery_object_get_id(endpoint);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!strncasecmp(word, name, wordlen) && ++which > state) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  result = ast_strdup(name);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_cli_completion_add(</span><br><span style="color: hsl(120, 100%, 40%);">+                       ast_strdup(ast_sorcery_object_get_id(endpoint)));</span><br><span>            ao2_cleanup(endpoint);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (result) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span>    }</span><br><span>    ao2_iterator_destroy(&i);</span><br><span style="color: hsl(0, 100%, 40%);">-   return result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      ao2_ref(endpoints, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return NULL;</span><br><span> }</span><br><span> </span><br><span> /*!</span><br><span>@@ -967,7 +967,7 @@</span><br><span>           return c;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return pos > 4 && !using_uri ? cli_complete_endpoint(word, state) : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  return pos > 4 && !using_uri ? cli_complete_endpoint(word) : NULL;</span><br><span> }</span><br><span> </span><br><span> /*!</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10555">change 10555</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/10555"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 16 </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ic20024912cc77bf4d3e476c4cd853293c52b254b </div>
<div style="display:none"> Gerrit-Change-Number: 10555 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Alexei Gradinari <alex2grad@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Corey Farrell <git@cfware.com> </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins2 (1000185) </div>