You are viewing a plain text version of this content. The canonical link for it is here.
Posted to proton@qpid.apache.org by "Frank Quinn (JIRA)" <ji...@apache.org> on 2013/09/23 15:03:02 UTC

[jira] [Created] (PROTON-423) Deadlock in messenger recv / send when send called from different threads (proton-c 0.5)

Frank Quinn created PROTON-423:
----------------------------------

             Summary: Deadlock in messenger recv / send when send called from different threads (proton-c 0.5)
                 Key: PROTON-423
                 URL: https://issues.apache.org/jira/browse/PROTON-423
             Project: Qpid Proton
          Issue Type: Bug
          Components: proton-c
    Affects Versions: 0.5
         Environment: Linux x86 / pthread
            Reporter: Frank Quinn
         Attachments: qpid_messenger_deadlock.c

Hi Folks,

If I set a receive block to 1 message and in turn try to send to a destination from multiple messengers on different threads, it seems to cause a deadlock in send / recv. I have attached a small example which recreates this:

This is the output we expect this application to produce:

Starting qpidListenerThread...
Waiting on data to come into pn_messenger_recv...
Data received by pn_messenger_recv...
Message received with subject: 'MESSAGE FROM MAIN THREAD'
Moving back to pn_messenger_recv
Waiting on data to come into pn_messenger_recv...
Starting qpidSenderThread...
Finished with qpidSenderThread...
Data received by pn_messenger_recv...
Message received with subject: 'MESSAGE FROM PTHREAD'
Moving back to pn_messenger_recv
Waiting on data to come into pn_messenger_recv...


This is what actually gets produced (note the second message is never received)

Starting qpidListenerThread...
Waiting on data to come into pn_messenger_recv...
Data received by pn_messenger_recv...
Message received with subject: 'MESSAGE FROM MAIN THREAD'
Moving back to pn_messenger_recv
Waiting on data to come into pn_messenger_recv...
Starting qpidSenderThread...


Which deadlocks with the following backtrace:

(gdb) thread apply all bt

Thread 3 (Thread 0xb77c9b70 (LWP 9431)):
#0  0x00cc8424 in __kernel_vsyscall ()
#1  0x0021cca6 in poll () from /lib/libc.so.6
#2  0x00c0f9fa in pn_driver_wait_2 ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#3  0x00c0fd9f in pn_driver_wait ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#4  0x00c0a4d1 in pn_messenger_tsync ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#5  0x00c0a7bc in pn_messenger_sync ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#6  0x00c0c27a in pn_messenger_recv ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#7  0x08048953 in qpidListenerThread ()
#8  0x00355a49 in start_thread () from /lib/libpthread.so.0
#9  0x00227aee in clone () from /lib/libc.so.6

Thread 2 (Thread 0xb6dc8b70 (LWP 9432)):
#0  0x00cc8424 in __kernel_vsyscall ()
#1  0x0021cca6 in poll () from /lib/libc.so.6
#2  0x00c0f9fa in pn_driver_wait_2 ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#3  0x00c0fd9f in pn_driver_wait ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#4  0x00c0a4d1 in pn_messenger_tsync ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#5  0x00c0a7bc in pn_messenger_sync ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#6  0x00c0c1d5 in pn_messenger_send ()
   from /home/fquinn/lib/qpid-proton-0.5/lib/libqpid-proton.so.2
#7  0x08048a5d in qpidSenderThread ()
#8  0x00355a49 in start_thread () from /lib/libpthread.so.0
#9  0x00227aee in clone () from /lib/libc.so.6

Thread 1 (Thread 0xb77ca990 (LWP 9430)):
#0  0x00cc8424 in __kernel_vsyscall ()
#1  0x0035610d in pthread_join () from /lib/libpthread.so.0
#2  0x08048bc9 in main ()

Note that we know that this can be avoided by using the same messenger across different threads for publishing or by setting a larger receive window, but we expected this to work regardless and our existing implementation depends on it.

Cheers,
Frank


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira