[asterisk-dev] bridge_unreal: An alternative approach to Local/Unreal channel optimization

Joshua Colp jcolp at digium.com
Tue Mar 11 10:39:30 CDT 2014


Matthew Jordan wrote:

<snip>

>
> All of these scenarios are currently handled by core_unreal and
> core_local in some fashion. It is, however, very complex code that -
> particularly with Local channel chains - is prone to error. The
> implementation today faces two problems:
> (1) Knowledge of what is on the other side of the bridge is known by the
> bridge, but not by either Local channel half. In order to get that
> knowledge, both Local channel halves must take control of the bridge
> (and all of its participants), then synchronize with each other.
> (2) When multiple Local channels can optimize in a chain, they have to
> communicate with each other (or at least compete with each other) to see
> who optimizes out first. This can change the information that a Local
> channel has about how it can optimize: for example, a Local channel may
> view that it is in a two party bridge with another Local channel,
> attempt to optimize, only to find out later that it is now in a
> multi-party bridge with multiple Real channels.
> (3) When optimization occurs, there can be *no* information in flight on
> the Local channel. This is particularly difficult as the write queue
> exists on the ast_channel struct - which means that the bridging layer
> has to be informed to not write to the channel when the optimization
> occurs. Again, more points of synchronization and locking.
>
> There's a few possible approaches that may simplify the implementation:
>
>   * Use approaches such as Josh's native Local bridge to move logic out
> of core_unreal and core_local into bridge implementations. The bridges
> actually have state now, and *know* who is in the bridge with them. A
> bridge implementation could be written that handles a Local channel +
> one other channel, and it could tell the Local channel when it can optimize.

I ended up toying with a prototype[1] last night which does Local 
channel optimization using this approach.

It implements a native bridge technology which requires at least one 
Local channel to be present in the bridge. Once two channels have joined 
it stores the bridge and peer channel on each Local channel shared 
structure in the bridge. If the shared structure contains information 
about both sides of the Local channel it queues up a task with all of 
the bridges/channels to optimize. The task is executed in a serialized 
fashion using a taskprocessor and moves the respective channels around. 
If there is a chain of Local channels involved then multiple tasks are 
queued. Some may fail due to actions taken before they are executed, but 
another task will have already been queued to optimize once again. This 
happens until the entire chain is collapsed.

[1] http://svn.digium.com/svn/asterisk/team/file/bridge_unreal_optimizer/

-- 
Joshua Colp
Digium, Inc. | Senior Software Developer
445 Jan Davis Drive NW - Huntsville, AL 35806 - US
Check us out at: www.digium.com & www.asterisk.org



More information about the asterisk-dev mailing list