-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/3108/#review10525
-----------------------------------------------------------

Ship it!


Ship It!

- Mark Michelson


On Jan. 7, 2014, 6:33 p.m., Matt Jordan wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/3108/
> -----------------------------------------------------------
> 
> (Updated Jan. 7, 2014, 6:33 p.m.)
> 
> 
> Review request for Asterisk Developers.
> 
> 
> Bugs: AST-1258
>     https://issues.asterisk.org/jira/browse/AST-1258
> 
> 
> Repository: Asterisk
> 
> 
> Description
> -------
> 
> Say we have three users who are joining a ConfBridge: two wait marked (WM) 
> users and a marked (M) user. Say the WM users join the conference and wait 
> for awhile being entertained. The M user then joins, and the ConfBridge 
> starts. Internally, this is represented by state transitions that also keep 
> track of the number of active and waiting users. In this case, the ConfBridge 
> state goes through the following:
> 
> 1. WM1 joins       EMPTY -> INACTIVE (active: 0; waiting: 1)
> 2. WM2 joins       INACTIVE (active: 0; waiting: 2)
> 3. M1 joins        INACTIVE -> MULTI_MARKED (active: 3; waiting: 0)
> 
> Now say someone - perhaps an overzealous sys admin - jumps onto Asterisk and 
> starts booting users left and right. They even have a script! They issue the 
> CLI kick user command so fast that we immediately kick M1 first, followed by 
> WM1 and WM2. Ideally, this would do the following:
> 
> 4. M1 leaves       MULTI_MARKED -> INACTIVE (active: 0; waiting: 2)
> 5. WM2 leaves      INACTIVE (waiting: 1)
> 6. WM1 leaves      INACTIVE (waiting: 0)
> 
> When we transition states, the ConfBridge *must* be locked. This prevents the 
> user counts from getting jumbled and the state transitions from being 
> perturbed. However, MULTI_MARKED has a race condition: in order to play a 
> prompt to the bridge notifying the WM users that the leader has left the 
> conference, it unlocks the conference. This allows the WM user(s) to leave 
> prior to the M1 user from completely leaving/transitioning the conference. 
> More often than not, this causes a crash as ConfBridge enters into some very 
> invalid states.
> 
> This patch fixes this by doing the following:
> 
> (1) It prevents a user from getting kicked more than once. This isn't 
> strictly necessary, but is a good idea - we already keep track of whether or 
> not a user has been kicked, and kicking them multiple times is risky.
> (2) It removes the race condition by deferring the "leader has left" playback 
> until after the conference state has transitioned. If someone sneaks in and 
> leaves at that time; no harm, no foul.
> 
> 
> Diffs
> -----
> 
>   /branches/11/apps/confbridge/conf_state_multi_marked.c 404856 
>   /branches/11/apps/app_confbridge.c 404856 
> 
> Diff: https://reviewboard.asterisk.org/r/3108/diff/
> 
> 
> Testing
> -------
> 
> An automated test was written that reproduced the scenario. Without the 
> patch: Explosions. With the patch: Asterisk allowed the users to be kicked 
> without terminating itself.
> 
> Note that the tests will be posted under a separate review.
> 
> 
> Thanks,
> 
> Matt Jordan
> 
>

-- 
_____________________________________________________________________
-- 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

Reply via email to