-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4381/#review14327
-----------------------------------------------------------
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.
- Matt Jordan
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