[asterisk-dev] Contacts, Contact Status and Sorcery

George Joseph george.joseph at fairview5.com
Thu Apr 30 16:36:14 CDT 2015


On Thu, Apr 30, 2015 at 3:03 PM, Joshua Colp <jcolp at digium.com> wrote:

> George Joseph wrote:
>
>>
>>
>> On Thu, Apr 30, 2015 at 2:01 PM, Joshua Colp <jcolp at digium.com
>> <mailto:jcolp at digium.com>> wrote:
>>
>>     George Joseph wrote:
>>
>>
>> <snip>

>
>>     What if contacts are stored in an external database? Your proposal
>>     would also have them going there as well. This would require an
>>     explanation for deployers to know what is going on exactly and what
>>     they are. As well this means there would be a period of time where
>>     the permanent contacts would not be present if other instances are
>>     sharing the same database and one restarts.
>>
>>
>> They can't be today can they?  The dynamic ones are explicitly mapped to
>> astdb and the permanent ones are explicitly placed in the aor based
>> container.  Can you even use sorcery.conf to map contacts somewhere else
>> given that they're just strings in an aor?
>>
>
> You sure can.
>
>
Who would even know they can do that besides you? :)


> <snip>
>
>
>>     A contact is updated when the registration is refreshed, you have to
>>     persist that out to disk or if a restart occurs it'll be expired.
>>
>>
>> Yes, so for dynamic contacts, the expiration would be written with the
>> normal update and for status and rtt changes, with update_temp.
>>
>
> I experimented with doing this when sorcery was originally, partitioning
> an object to exist in multiple places. It was not easy to get it right.
>

I've done this a number of times for large OLTP systems where there's data
you want in a scratchpad that may nor may not ever be persisted.   If it's
implemented at the correct layer, it becomes invisible.


>
>
>>
>>         For permanent contacts, we do the same except we call
>>         ast_sorcery_create_temp and ast_sorcery_delete_temp so they
>>         never get
>>         persisted to astdb.
>>
>>
>>     So. This is what I was originally trying to express when you did the
>>     wizard work, you've just gone about it in a different manner. I
>>     think this is a rather specialized addition that could be done in a
>>     better way.
>>
>>     Right now sorcery wizards can't be programmatically added. They just
>>     can't. You have to do it from the sorcery.conf configuration file.
>>
>>
>> Not true.  ast_sorcery_apply_wizard_mapping allows yo to add a wizard to
>> any object type at run time.  That's what the config_wizard does.  When
>> the object type registers, it adds a memory wizard to the object type's
>> wizard list.  The config wizard then manipulates the memory wizard.
>>
>
> It adds a wizard but does not return a handle to it. It also doesn't allow
> you to specify where to place it. It's always at the end.
>

You don't need a handle, you have the wizard itself.  Correct on the order.


>
>>
>>     What if they could be?
>>     What if you could add a wizard that's marked as caching (so it's
>>     only queried) but still have a handle to it to create/update/destroy?
>>
>>
>> You just described res_pjsip_config_wizard exactly.
>>
>
> Yes, except without having a direct handle and more control over things
> you had to do it in an indirect manner.
>
>
>>
>>     Wrap that up in a higher level API like you want above and you
>>     extend sorcery in a way that's useful in multiple ways.
>>
>>
>> Put the whole mutability thing aside for a minute.  I guess what I'm
>> suggesting that the default sorcery behavior could be an automatic
>> read/write cache in front of every sorcery wizard.  You can then control
>> whether how writes are handled (if at all) by options you give when you
>> register the object type, and options you give on CRUD calls.
>>
>
> I'm not a fan of automatic anything or complicating the sorcery core any
> further. Higher level stuff built on top which has to be explicitly done by
> users, yes.
>

I think that's true in some cases but in others, you don't want "users"
doing it 50 different ways where something carefully crafted at a lower
level will do the trick.


>
>
>> For my contact scenario, I'd say writable cache and a writable back end
>> (astdb by default).  When writing a new dynamic contact or updating the
>> expiration, I'd say write-through.  When updating status, I'd say
>> cache-only.   For permanent contacts, it would always be cache-only.
>>
>
> So - stepping back and implementation details aside. What do we need? In
> an ideal world how would the implementation work?
>
>
Fair question.

I want to CUD objects and decide whether the results of the operation
should be temporary or persistent at the time I perform the operation.  I
don't want to have to create my own wizard some other specific
implementation each time I need this capability.

I want to dynamically create an object and not have to worry that the
underlying wizard was res_sorcery_config and therefore doesn't support
create.

I want to update an object and call ast_sorcery_update without having to
clone it.   It's my job to assess locking requirements.  It's sorcery's job
to determine whether the object needs to be cloned.  A "get_for_update"
might help there.  It could either lock it before giving it to you  or
clone it before giving it to you.

I think that sums it up.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20150430/8aa893f5/attachment.html>


More information about the asterisk-dev mailing list