> On Jan. 27, 2015, 7:53 p.m., Matt Jordan wrote:
> > Given this problem description:
> >
> > {quote}
> > Performing a CLI "module reload" command when there are new pjsip.conf
> > registration objects defined frequently failed to load them correctly.
> > What happens is a race condtion between res_pjsip pushing its reload into
> > an asynchronous task processor task and the thread that does the rest of
> > the reloads when it gets to reloading the res_pjsip_outbound_registration
> > module.
> > {quote}
> >
> > I'm not sure why any change other than this one is necessary:
> >
> > {quote}
> > * Made res_pjsip.c reload_module() use ast_sip_push_task_synchronous()
> > instead of ast_sip_push_task() to eliminate two threads processing config
> > reloads at the same time.
> > {quote}
> >
> > That doesn't mean that these changes aren't correct or necessary, just that
> > the issue description doesn't really explain everything that was modified
> > in this patch. I'll infer what I can from the change below, but some
> > clarification here on what all is being fixed would be appreciated.
> >
> > {quote}
> > * Made get_registrations() not replace the global current_states container.
> > You could never add/remove objects in the container without the
> > possibility of the container being replaced out from under you by
> > get_registrations().
> > {quote}
> >
> > I'm assuming this was changed due to the CLI/AMI commands altering the
> > state of the outbound registrations while they are in the process of
> > displaying them. I definitely agree with that change, but it isn't clear
> > from the issue description that this change is occurring for that reason.
> > (In fact, really, it's a completely separate issue from what is being
> > solved here.)
> >
> > {quote}
> > * Added a registration loaded sorcery instance observer to purge any dead
> > registration objects. The sorcery instance observer (struct
> > ast_sorcery_instance_observer) must be used because the callback happens
> > immediately during the load process. The external observers callbacks
> > (struct ast_sorcery_observer) are pushed to a different thread.
> > {quote}
> >
> > This I don't understand, although I freely admit that's because my
> > sorcery-foo is weak. You'll need to explain why this change was needed.
> >
> > {quote}
> > * Added some global current_states NULL pointer checks in case the
> > container dissapears because of unload_module().
> > {quote}
> >
> > Yup, that makes sense and is a nice cleanup in addition to what was done in
> > this patch.
> >
> > {quote}
> > * Made sorcery's instance loaded observer callback (struct
> > ast_sorcery_instance_observer) guaranteed to be called before any external
> > observers (struct ast_sorcery_observer) will be called.
> > {quote}
> >
> > This worries me a lot. Making changes to a core API that a lot of modules
> > depend on feels like it is way out of scope for this issue. Why is this
> > necessary?
> >
> > {quote}
> > * Moved the check for non-reloadable objects to before the sorcery instance
> > loading callbacks happen to short circuit the attempt to reload
> > non-reloadable types earlier and so the non-reloadable type message can
> > only happens once for each non-reloadable type. Previously the sorcery
> > instance loading/loaded callbacks would always happen, the individual
> > wizard loading would be prevented, and the non-reloadable type message
> > would happen for each associated wizard.
> > {quote}
> >
> > This feels confusing enough that it worries me in the same fashion as
> > moving the callbacks. Again, this feels out of scope for this issue.
* The get_registrations() change is due to the CLI/AMI commands altering the
state of the registrations state container while they are in the process of
displaying them. That interferes with loading the registration type objects.
* The added sorcery instance observer does the dead registrations purge after
the config load that the get_registrations() function can no longer perform.
The sorcery.c changes could be kicked out of this patch. They only do two
things: 1) Short circuit unnecessary work for the non-reloadable types. 2)
Ensure that the struct ast_sorcery_instance_observer.object_type_loaded
callbacks happen in a predictable order. The instance observer I added only
works with an internal container to the outgoing registrations so it isn't
critical for that to be complete before the type observers run.
I'll rework the descriptions.
- rmudgett
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4381/#review14327
-----------------------------------------------------------
On Jan. 27, 2015, 6:46 p.m., rmudgett wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/4381/
> -----------------------------------------------------------
>
> (Updated Jan. 27, 2015, 6:46 p.m.)
>
>
> Review request for Asterisk Developers.
>
>
> Bugs: ASTERISK-24729
> https://issues.asterisk.org/jira/browse/ASTERISK-24729
>
>
> Repository: Asterisk
>
>
> Description
> -------
>
> Performing a CLI "module reload" command when there are new pjsip.conf
> registration objects defined frequently failed to load them correctly. What
> happens is a race condtion between res_pjsip pushing its reload into an
> asynchronous task processor task and the thread that does the rest of the
> reloads when it gets to reloading the res_pjsip_outbound_registration module.
>
> * Made res_pjsip.c reload_module() use ast_sip_push_task_synchronous()
> instead of ast_sip_push_task() to eliminate two threads processing config
> reloads at the same time.
>
> * Made get_registrations() not replace the global current_states container.
> You could never add/remove objects in the container without the possibility
> of the container being replaced out from under you by get_registrations().
>
> * Added a registration loaded sorcery instance observer to purge any dead
> registration objects. The sorcery instance observer (struct
> ast_sorcery_instance_observer) must be used because the callback happens
> immediately during the load process. The external observers callbacks
> (struct ast_sorcery_observer) are pushed to a different thread.
>
> * Added some global current_states NULL pointer checks in case the container
> dissapears because of unload_module().
>
> * Made sorcery's instance loaded observer callback (struct
> ast_sorcery_instance_observer) guaranteed to be called before any external
> observers (struct ast_sorcery_observer) will be called.
>
> * Moved the check for non-reloadable objects to before the sorcery instance
> loading callbacks happen to short circuit the attempt to reload
> non-reloadable types earlier and so the non-reloadable type message can only
> happens once for each non-reloadable type. Previously the sorcery instance
> loading/loaded callbacks would always happen, the individual wizard loading
> would be prevented, and the non-reloadable type message would happen for each
> associated wizard.
>
>
> Diffs
> -----
>
> /branches/13/res/res_pjsip_outbound_registration.c 431239
> /branches/13/res/res_pjsip.c 431239
> /branches/13/main/sorcery.c 431239
>
> Diff: https://reviewboard.asterisk.org/r/4381/diff/
>
>
> Testing
> -------
>
> Manually reloaded pjsip.conf with and without the registration type object
> define. Without the patch, CLI "pjsip show registrations" frequently showed
> an empty list when there should have been an object displayed. With the
> patch it no longer fails to load.
>
> The test_config, test_sorcery, and test_sorcery_astdb unit tests still pass.
>
>
> Thanks,
>
> rmudgett
>
>
--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
http://lists.digium.com/mailman/listinfo/asterisk-dev