[asterisk-dev] Contacts, Contact Status and Sorcery

Richard Mudgett rmudgett at digium.com
Thu Apr 30 14:28:13 CDT 2015


On Thu, Apr 30, 2015 at 2:10 PM, George Joseph <george.joseph at fairview5.com>
wrote:

>
> Change https://gerrit.asterisk.org/261 sparked some discussion about
> contacts and contact status so I'd like to continue that here.
>
> Today, dynamic contacts (incoming registrations) are created on the fly as
> full sorcery objects and stored in an astdb back-end so they survive a
> restart.  Permanent contacts however, are created on the fly as sorcery
> objects when the aor is created but instead of being managed by sorcery,
> are stored in an aor-specific container. Contact statuses for both types of
> contacts are created as full sorcery objects and stored in a memory
> back-end.  They obviously do not survive a restart.  This makes navigating
> the life-cycle of these objects a little convoluted.
>
> The handling of dynamic contacts is pretty straightforward and I have no
> issue there.  Permanent contacts are another matter however.  Because they
> aren't managed by sorcery, none of the sorcery life-cycle observers get
> called and you can't retrieve them by id from sorcery like you can for
> dynamic contacts.  When you're dealing with contacts in general, you have
> to understand and account for that.   So, my first suggestion is that we
> treat the permanent contacts exactly as dynamic ones.   I.E.  They become
> fully-managed objects and get stored in the astdb with a flag or their
> expiration set such that when asterisk reloads, they get immediately
> expired.  They'll then be immediately rebuilt as the aors are parsed.  We
> can then get rid of the aor-specific containers and the processing around
> them.
>
> Contact status is also pretty straightforward but there's one minor
> complication related to the fact that status is mutable and sorcery objects
> can't be...  So although status is backed up by a memory wizard (which is
> just an ao2_container), in order to update the status you have to clone the
> object and replace the original object with the new one (well, you don't
> have to but Josh gets upset if you don't :)).   It's easy enough but it's
> also extra code and an opportunity for reference leaks.   My proposal here
> is that we modify the memory wizard such that if the sorcery_update method
> is called, we compare the object reference passed in with the object
> reference we have in the container and if it's equal, we just noop.  You
> still need to call ast_sorcery_update to trigger the observers but at least
> you don't have to clone the object anymore.
>

The sorcery objects are immutable so you don't need a lock on the object.
If they become mutable you will need a lock and all the nasty locking
issues that entails.

Richard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20150430/3284aca8/attachment.html>


More information about the asterisk-dev mailing list