[asterisk-dev] [Code Review] Sanely handle AMI connections during startup

Sean Bright sean.bright at gmail.com
Wed Jun 3 17:02:20 CDT 2009


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://reviewboard.digium.com/r/272/
-----------------------------------------------------------

(Updated 2009-06-03 17:02:20.838913)


Review request for Asterisk Developers.


Changes
-------

Updated patch based on Russell's review.  I will move the declaration of ast_process_pending_reloads to _private.h in trunk and the 1.6.x branches.


Summary
-------

During asterisk startup, a lock on the list of modules is obtained by the
primary thread while each module is initialized.  Issue 13778 pointed out a
problem with this approach, however.  Because the AMI is loaded before other
modules, it is possible for a module reload to be issued by a connected client
(via Action: Command), causing a deadlock.

The resolution for 13778 was to move initialization of the manager to happen
after the other modules had already been lodaded.  While this fixed this
particular issue, it caused a problem for users (like FreePBX) who call AMI
scripts via an #exec in a configuration file (See issue 15189).

The solution I have come up with is to defer any reload requests that come in
until after the server is fully booted.  When a call comes in to
ast_module_reload (from wherever) before we are fully booted, the request is
added to a queue of pending requests.  Once we are done booting up, we then
execute these deferred requests in turn.

Note that I have tried to make this a bit more intelligent in that it will not
queue up more than 1 request for the same module to be reloaded, and if a
general reload request comes in ('module reload') the queue is flushed and we
only issue a single deferred reload for the entire system.

As for how this will impact existing installations - Before 13778, a reload
issued before module initialization was completed would result in a deadlock.
After 13778, you simply couldn't connect to the manager during startup (which
causes problems with #exec-that-calls-AMI configuration files).  I believe this
is a good general purposes solution that won't negatively impact existing
installations.


This addresses bugs 13778 and 15189.
    https://issues.asterisk.org/view.php?id=13778
    https://issues.asterisk.org/view.php?id=15189


Diffs (updated)
-----

  /branches/1.4/include/asterisk.h 198953 
  /branches/1.4/main/asterisk.c 198953 
  /branches/1.4/main/loader.c 198953 

Diff: http://reviewboard.digium.com/r/272/diff


Testing
-------

Compiles.  Created simple script to call 'module reload' from an #exec and
another independent script that simply connects on startup and issues a reload.

Phillippe Lindheimer of the FreePBX project (reporter of issue 15189) has also
tested and confirms that this resolves his problem.


Thanks,

Sean




More information about the asterisk-dev mailing list