[
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: [email protected]
For additional commands, e-mail: [email protected]