[reSIProcate] IntrruptableThread dead-lock
Kennard White
kennard_white at logitech.com
Sun Nov 21 21:21:28 CST 2010
Hi Scott,
Here is patch for select interruptor. I think it is a good safety patch in
general, even if this specific issue may have a better fix.
The specific issue here is in DnsResult::lookup() where the async handler
gets invoked. I doubt this is invoked from non-SipStack thread, but I guess
it could be.
Kennard
On Sun, Nov 21, 2010 at 8:05 AM, Scott Godin <sgodin at sipspectrum.com> wrote:
> The non-blocking solution sounds reasonable to me.
>
> >Is there a better (or complementary) way to address this? In particular,
> does the asyncHandler need to be invoked within DnsStub? When is DnsStub
> invoked outside the SipStack thread?
>
> The following DnsStub fns are typically invoked by applications outside of
> the stack thread:
> void clearDnsCache();
> void logDnsCache();
> void setEnumSuffixes(const std::vector<Data>& suffixes);
>
> Scott
>
> On Sun, Nov 21, 2010 at 1:19 AM, Kennard White <kennard_white at logitech.com
> > wrote:
>
>> Hi,
>>
>> There is an interesting dead-lock case with InterruptableStackThread under
>> linux. The interrupter can be invoked from within the SipStack thread itself
>> (one particular case is DnsResult -- see stack trace below). Under heavy
>> load the pipe can "fill-up" and the write blocks, causing dead-lock (e.g.,
>> the same thread that drains the pipe is blocked writing to the pipe).
>>
>> For now, I've made the writes to the pipe non-blocking -- looks like equiv
>> change has already been made on the Windows side. That seems to solve the
>> problem.
>>
>> Is there a better (or complementary) way to address this? In particular,
>> does the asyncHandler need to be invoked within DnsStub? When is DnsStub
>> invoked outside the SipStack thread?
>>
>> One caveat: this occurs with epoll, and it is possible that it is some
>> side effect of how I changed the call structure. But I more likely I think
>> it is just the increase amount of activity allowed by using epoll enables
>> the pipe to fill up and expose this bug.
>>
>> Thanks,
>> Kennard
>>
>> (gdb) where
>> #0 0x00007ffff798204b in write () from /lib/libpthread.so.0
>> #1 0x00000000004838a6 in resip::SelectInterruptor::interrupt (this=<value
>> optimized out>) at SelectInterruptor.cxx:91
>> #2 resip::SelectInterruptor::handleProcessNotification (this=<value
>> optimized out>) at SelectInterruptor.cxx:51
>> #3 0x00000000004efb82 in resip::DnsResult::lookupInternal
>> (this=0x7fffe8837740, uri=<value optimized out>) at DnsResult.cxx:345
>> #4 0x00000000004f0042 in resip::DnsResult::lookup (this=0x7fffe8837740,
>> uri=..., enumSuffixes=...) at DnsResult.cxx:224
>> #5 0x00000000004b96d9 in resip::TransportSelector::dnsResolve
>> (this=0x7ffff7fc0d30, result=0x7fffe8837740, msg=0x7fffec7f9ce0)
>> at TransportSelector.cxx:375
>> #6 0x00000000004af5e5 in resip::TransactionState::sendToWire
>> (this=0x7fffe879d220, msg=0x7fffec7f9ce0, resend=false)
>> at TransactionState.cxx:2073
>> #7 0x00000000004b2818 in resip::TransactionState::processClientNonInvite
>> (this=0x7fffe879d220, msg=<value optimized out>)
>> at TransactionState.cxx:710
>> #8 0x00000000004b3e9b in resip::TransactionState::processSipMessageAsNew
>> (sip=0x7fffec7f9ce0, controller=..., tid=...)
>> at TransactionState.cxx:298
>> #9 0x00000000004b49c6 in resip::TransactionState::process
>> (controller=...) at TransactionState.cxx:579
>> #10 0x00000000004a4140 in resip::TransactionController::processEverything
>> (this=0x7ffff7fc0c48, fdset=<value optimized out>)
>> at TransactionController.cxx:107
>> #11 0x0000000000497cfd in resip::SipStack::process (this=0x7ffff7f9d010,
>> fdset=...) at SipStack.cxx:589
>> #12 0x000000000049c194 in resip::InterruptableStackThread::thread
>> (this=0x842de0) at InterruptableStackThread.cxx:41
>> #13 0x000000000053249f in threadIfThreadWrapper (threadParm=0x6) at
>> ThreadIf.cxx:51
>> #14 0x00007ffff797aa04 in start_thread () from /lib/libpthread.so.0
>> #15 0x00007ffff6b26d4d in clone () from /lib/libc.so.6
>> #16 0x0000000000000000 in ?? ()
>>
>>
>>
>> _______________________________________________
>> resiprocate-devel mailing list
>> resiprocate-devel at resiprocate.org
>> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20101121/a61dff9f/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: resip-selintr-nonblock.patch
Type: application/octet-stream
Size: 1279 bytes
Desc: not available
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20101121/a61dff9f/attachment.obj>
More information about the resiprocate-devel
mailing list