[asterisk-dev] [Code Review] 2426: IAX2 defer_full_frames fail to get sent

Alec Davis reviewboard at asterisk.org
Thu Apr 4 04:32:30 CDT 2013


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


Testing before and after proposed fix, which will be to check the iostate == IDLE before sleeping:

in iax2_process_thread()
with;
                } else {
                        ast_log(LOG_WARNING, "ALEC[%d] SLEEP state[%d] actions[%d]\n", thread->threadnum, thread->iostate, thread->actions);
                        ast_cond_wait(&thread->cond, &thread->lock);
                        ast_log(LOG_WARNING, "ALEC[%d] AWAKE state[%d] actions[%d]\n", thread->threadnum, thread->iostate, thread->actions);
                }

just after module load chan_iax2.so
[Apr  4 22:06:29] WARNING[26229]: chan_iax2.c:11915 iax2_process_thread: ALEC[4] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26230]: chan_iax2.c:11915 iax2_process_thread: ALEC[5] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26231]: chan_iax2.c:11915 iax2_process_thread: ALEC[6] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26232]: chan_iax2.c:11915 iax2_process_thread: ALEC[7] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26233]: chan_iax2.c:11915 iax2_process_thread: ALEC[8] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26234]: chan_iax2.c:11915 iax2_process_thread: ALEC[9] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26235]: chan_iax2.c:11915 iax2_process_thread: ALEC[10] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26236]: chan_iax2.c:9768 socket_read: ALEC[1] send on it's way state[1]
[Apr  4 22:06:29] WARNING[26228]: chan_iax2.c:11915 iax2_process_thread: ALEC[3] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26227]: chan_iax2.c:11915 iax2_process_thread: ALEC[2] SLEEP state[0] actions[0]
[Apr  4 22:06:29] WARNING[26226]: chan_iax2.c:11915 iax2_process_thread: ALEC[1] SLEEP state[1] actions[0] << shouldn't be asleep!!!!


with;
                } else if (thread->iostate == IAX_IOSTATE_IDLE){
                        ast_log(LOG_WARNING, "ALEC[%d] SLEEP state[%d] actions[%d]\n", thread->threadnum, thread->iostate, thread->actions);
                        ast_cond_wait(&thread->cond, &thread->lock);
                        ast_log(LOG_WARNING, "ALEC[%d] AWAKE state[%d] actions[%d]\n", thread->threadnum, thread->iostate, thread->actions);
                }


just after module load chan_iax2.so
[Apr  4 22:13:50] WARNING[29135]: chan_iax2.c:11915 iax2_process_thread: ALEC[4] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29136]: chan_iax2.c:11915 iax2_process_thread: ALEC[5] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29137]: chan_iax2.c:11915 iax2_process_thread: ALEC[6] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29138]: chan_iax2.c:11915 iax2_process_thread: ALEC[7] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29139]: chan_iax2.c:11915 iax2_process_thread: ALEC[8] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29140]: chan_iax2.c:11915 iax2_process_thread: ALEC[9] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29141]: chan_iax2.c:11915 iax2_process_thread: ALEC[10] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29142]: chan_iax2.c:9768 socket_read: ALEC[1] send on it's way state[1]
[Apr  4 22:13:50] WARNING[29134]: chan_iax2.c:11915 iax2_process_thread: ALEC[3] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29133]: chan_iax2.c:11915 iax2_process_thread: ALEC[2] SLEEP state[0] actions[0]
[Apr  4 22:13:50] WARNING[29132]: chan_iax2.c:11942 iax2_process_thread: ALEC[1] processing state[2] actions[1] <<< correct
[Apr  4 22:13:50] WARNING[29132]: chan_iax2.c:11915 iax2_process_thread: ALEC[1] SLEEP state[0] actions[1]      <<< correct


- Alec Davis


On April 4, 2013, 7:23 a.m., Alec Davis wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/2426/
> -----------------------------------------------------------
> 
> (Updated April 4, 2013, 7:23 a.m.)
> 
> 
> Review request for Asterisk Developers.
> 
> 
> Bugs: ASTERISK-18827
>     https://issues.asterisk.org/jira/browse/ASTERISK-18827
> 
> 
> Repository: Asterisk
> 
> 
> Description
> -------
> 
> On a slower machine when a full_frame with the same callno is already being processed by another thread the frame is queued onto the other thread.
> However, nothing indicates to the other thread that it now has a frame to process.
> 
> On the bug report, I have debug messages in the patch.
> In theory, the thread that is already processing the callno should pickup the deferred frames, but it doesn't.
> 
> What was also revealed in ASTERISK-18827 using iax_18827.diff2.txt, is that the deferred frames queue increases each time a POKE/PONG is initiated.
> At some stage this will exhaust memory.
> Refer to the line below
> +		ast_log(LOG_WARNING, "ALEC[%d] unhandled frame on thread [%d]\n", from_here->threadnum, to_here->threadnum);
> 
> 
> Diffs
> -----
> 
>   trunk/channels/chan_iax2.c 376441 
> 
> Diff: https://reviewboard.asterisk.org/r/2426/diff/
> 
> 
> Testing
> -------
> 
> Before patch:
> 
> astrid-test*CLI> iax2 show threads
> IAX2 Thread Information
> Idle Threads:
> Thread 2: state=0, update=5, actions=4, func=''
> Thread 3: state=0, update=4, actions=2, func=''
> Thread 4: state=0, update=10, actions=2, func=''
> Thread 5: state=0, update=3, actions=4, func=''
> Thread 6: state=0, update=8, actions=2, func=''
> Thread 7: state=0, update=2, actions=3, func=''
> Thread 8: state=0, update=1, actions=3, func=''
> Thread 9: state=0, update=0, actions=3, func=''
> Thread 10: state=0, update=6, actions=1, func=''
> Active Threads:
> Thread P1: state=1, update=1365045454, actions=0, func='socket_process'
> Dynamic Threads:
> 10 of 10 threads accounted for with 0 dynamic threads
> 
> and iax2 show peers reports link is UNREACHABLE
> 
> 
> After patch:
> iax2 show threads has all idle.
> 
> iax2 show peers (immediately after 'module load chan_iax2.so')
> Name/Username    Host                 Mask             Port          Status      Description
> astrid2/astrid2  192.168.xxx.yyy (S)  255.255.255.255  4569 (T)      OK (1002 ms)
> 1 iax2 peers [1 online, 0 offline, 0 unmonitored]
> 
> 
> Thanks,
> 
> Alec Davis
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20130404/fec8d3b4/attachment-0001.htm>


More information about the asterisk-dev mailing list