You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Clifford Jansen (Jira)" <ji...@apache.org> on 2025/05/27 06:54:00 UTC
[jira] [Created] (PROTON-2897) Proton graceful AMQP protocol connection close vs immediate socket close
Clifford Jansen created PROTON-2897:
---------------------------------------
Summary: Proton graceful AMQP protocol connection close vs immediate socket close
Key: PROTON-2897
URL: https://issues.apache.org/jira/browse/PROTON-2897
Project: Qpid Proton
Issue Type: Improvement
Components: proton-c
Affects Versions: proton-c-0.40.0
Reporter: Clifford Jansen
Assignee: Clifford Jansen
Attachments: hbhang.c
On a protocol error at the AMQP connection level (such as idle timeout exceeded), the Proton core engine shuts down its virtual input but leaves the output open to make a best efforts processing of pending frames to send to the peer. This includes the connection close frame and associated error condition.
In the normal case, these frames are written into the OS socket and become the responsibility of the OS to handle problems that may arise on the wire. After Proton has sent the last frame, the transport is closed in both directions and the socket can be closed and the PN_TRANSPORT_CLOSED is emitted.
In the less normal (but not abnormal) case, the output to peer may be backed up such that the OS refuses to accept new outgoing protocol frames. In this case, Proton waits for the OS to eventually accept the pending output or tell Proton the socket is dead. It may surprise the application using Proton that this may take many minutes depending on the underlying platform and how it is configured.
This "surprising" behavior could be addressed by several means. Better documentation. Acceptance that the OS decision of when to give up on a socket is appropriate. Introduce a new connection parameter that sets a maximum error-to-transport-closed time.
An example of better documentation would be highlighting how the application could use pn_transport_close_head() to force discarding pending output and cleanup of the connection resources, immediately or at a timed delay. This is demonstrated in the attached sample program.
Sadly, at the moment pn_transport_close_head() is a deprecated API, and there is no alternative functionality yet surfaced for use by the application. The connection_driver for a particular connection cannot be queried from the Proton core or Proactor APIs.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org