[ https://issues.apache.org/jira/browse/PROTON-1862?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16803208#comment-16803208 ]
Andrew Stitcher commented on PROTON-1862: ----------------------------------------- >From looking at the code [~alihadi]'s diagnosis must be wrong. The {{on_connection_open}}/{{on_session_open}} callbacks are *only* called after the server has received the open or attach frames: The underlying Proton-C library generates {{PN_CONNECTION_REMOTE_OPEN}} or {{PN_SESSION_REMOTE_OPEN}} events in response to receiving the incoming frames and the C++ library uses these events to generate the callbacks. What I think is likely happening is that although the connection is open from client to server (which only establishes the timeout the server uses to timeout the client) if you don't explicitly open the connection from server to client in response there is no timeout negotiated in the other direction at all (as the open frame has not been sent and this contains the timeout). By sleeping in the {{on_connection_open}} callback you are preventing the open frame from being sent and hence no timeout gets established at all. Note that if you override {{on_connection_open}}/{{on_session_open}} then you are responsible for opening the connection/session in the opposite direction yourself. This behaviour may have changed in 0.18. as before the reverse open may have happened always, but doing that is not the correct thing to do as it does not allow for failing a connection on a server at the point of opening. In any event sleeping before the timeout is established by sending the outgoing open frame cannot work. Also it may be worth bearing in mind that the event/callback sequence is different on servers from clients: * On a client will get the {{on_connection_open}} callback only after the connection is negotiated in both directions. This because the client itself initiated the connection and the callback is caused by the *remote* open frame which in this case happens in response to the open frame already sent by the client. * On a server the {{on_connection_open}} callback always happens before the connection is open from the server to the client as the *remote* open happens before the server has sent it's own open (which occurs only in response to the client's open). I hope this helps you understand what's going on. > idle timeout not working on linux > ---------------------------------- > > Key: PROTON-1862 > URL: https://issues.apache.org/jira/browse/PROTON-1862 > Project: Qpid Proton > Issue Type: Bug > Components: cpp-binding > Affects Versions: proton-c-0.22.0 > Reporter: Jeremy > Priority: Critical > Labels: reproducer > Attachments: proton_1862_tests.txt, test_case.cpp > > > We faced an issue with the idle timeout on linux. On windows, it seems to > work. > In our proton feature test suite, we test the idle timeout feature by doing a > sleep in the method on_session_open. > This should trigger a connection timeout. It works on windows, and it used to > work with proton v0.16.0 on windows and linux. > Removing the sleep from the on_session_open and putting it in > on_connection_open, yields the same result. > See attached file to reproduce. > Machines: > * Windows machine > ** OS: Windows 7 > ** Compiler: MSVC 2013 Version 12 Update 5 > * Linux machine > ** OS: Red Hat Enterprise Linux Server release 6.4 (Santiago) > ** Compiler: g++491 (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6) -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org