[asterisk-dev] RealTime, Large Dialplans, and headaches... got any ideas?

Luigi Rizzo rizzo at icir.org
Tue Mar 27 14:06:06 MST 2007


On Tue, Mar 27, 2007 at 02:35:05PM -0600, Steve Murphy wrote:
> OK, I just closed 9037 after a conversation with kpfleming.
> Here is the situation:
> 
> 9037's reporter is complaining that with a large dialplan, in order to
> look up an extension, and do the pattern matching, asterisk pulls every
> extension from the context in the DB, and tries to find the best match.
> When the dialplan gets big, and you have hundreds/thousands (or more) of
> extensions, then this takes a while. The user was reporting 5 or more
> seconds.
> 
> I've been working on a search-tree algorithm that would find an
> extension match a bit faster in a large dialplan. It's speed is a
> function of the length of the patterns, not of how many extensions there
> are. I thought I might apply this to the RT extensions, and keep an
> in-mem copy of the search tree... but it depends on a lot of things,
> like being able to discern an update to the DB of the dialplan, so you
> can reform (or spot edit, which I believe is possible) the in-mem search
> tree.
> 
> Kevin pointed out:
> 
>         This is impossible because you have no way of knowing when the
>         database
>         is modified. Even if you did, you'd have to resort to rebuilding
>         the
>         'search tree' in memory, and if the dialplan is large enough
>         then the
>         other issue comes into the picture as well.
>         
>         This is an artifact of the way the Realtime system is
>         architected, which
>         means that it is broken. It is not fixable in the current
>         architecture.
> 
> If someone in the community has a brilliant flash of inspiration as to
> how this problem could be solved, we'd love to hear about it! Any ideas?

>From the description i would think that the real bottleneck is
the thousands queries to the database, rather (or before) the size
of the dialplan itself.

Googling a bit, it seems that you can get the modification date of
a database table with a "SHOW TABLE STATUS" query, and this would
at least help to know if the cache is in sync.

However, i have no idea if there is any provision in the current code
to load the entire realtime database in memory.
If yes, then you could do a quick 1-query check to verify that the
cache is in sync, and then do the lookup from memory.

	cheers
	luigi


More information about the asterisk-dev mailing list