[ https://issues.apache.org/jira/browse/PROTON-1000?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14901368#comment-14901368 ]
Pavel Moravec commented on PROTON-1000: --------------------------------------- I think I have reproducer based on Proton Reactor (derived from what gofer does): {code} #!/usr/bin/python from time import sleep from uuid import uuid4 from proton import ConnectionException from proton import SSLDomain, SSLException from proton.utils import BlockingConnection import fileinput domain = None conn = BlockingConnection("proton+amqp://localhost:5672", ssl_domain=domain, heartbeat=5) rec = conn.create_receiver("some_address", name=str(uuid4()), dynamic=False, options=None) try: sleep(9) snd = conn.create_sender("another_address", name=str(uuid4())) except ConnectionException: try: conn.close() except Exception, e: print e pass _in = raw_input("Check for CLOSE_WAIT before pressing Enter: ") {code} Execute that code and on prompt, check thatf the python process has CLOSE_WAIT connection. Backtrace of the caught exception "e" is: {code} File "proton-1000.py", line 24, in <module> conn.close() File "/usr/lib64/python2.7/site-packages/proton/utils.py", line 219, in close msg="Closing connection") File "/usr/lib64/python2.7/site-packages/proton/utils.py", line 231, in wait self.container.process() File "/usr/lib64/python2.7/site-packages/proton/reactor.py", line 143, in process self._check_errors() File "/usr/lib64/python2.7/site-packages/proton/__init__.py", line 3737, in dispatch ev.dispatch(self.handler) File "/usr/lib64/python2.7/site-packages/proton/__init__.py", line 3662, in dispatch result = dispatch(handler, type.method, self) File "/usr/lib64/python2.7/site-packages/proton/__init__.py", line 3551, in dispatch return m(*args) File "/usr/lib64/python2.7/site-packages/proton/utils.py", line 257, in on_transport_tail_closed self.on_transport_closed(event) File "/usr/lib64/python2.7/site-packages/proton/utils.py", line 261, in on_transport_closed raise ConnectionException("Connection %s disconnected" % self.url); {code} Worth playing with SSL as well where I noticed little bit different behaviour - adding SSL stuff to the reproducer should be trivial, though. > Connection leak on heartbeat-timeouted connections > -------------------------------------------------- > > Key: PROTON-1000 > URL: https://issues.apache.org/jira/browse/PROTON-1000 > Project: Qpid Proton > Issue Type: Bug > Components: python-binding > Affects Versions: 0.9 > Reporter: Pavel Moravec > Assignee: Gordon Sim > > Using gofer/katello-agent that uses BlockingConnection from Proton Reactor > with heartbeats set up, if some connection timeouts due to the heartbeats, > Proton does not close the TCP connection. That causes TCP connection leak, > despite gofer properly called BlockingConnection.close() and forgot any > reference to that class instance. > Checking tcpdump, Proton simply ignores the timeouted connections - it does > not respond anyhow to the communication partner whatever it sends (in some > scenarios it sends some AMQP performative that Proton was assumed to respond, > in other scenario the communication peer dropped the TCP connection by > sending FIN+ACK packet but Proton didn't send FIN packet back - the only > stuff seen in tcpdump is ACKing on TCP layer made by OS, not by Proton). And > Proton ignores an attempt of Proton reactor to close the > connection/container, raising: > Sep 21 15:02:35 my-capsule goferd: File > "/usr/lib64/python2.7/site-packages/proton/utils.py", line 263, in > on_transport_closed > Sep 21 15:02:35 my-capsule goferd: raise ConnectionException("Connection %s > disconnected" % self.url); > Sep 21 15:02:35 my-capsule goferd: ConnectionException: Connection > amqps://satellite.example.com:5647 disconnected > for SSL connections, and raising: > Sep 21 14:56:28 my-capsule goferd: File > "/usr/lib64/python2.7/site-packages/proton/utils.py", line 259, in > on_transport_tail_closed > Sep 21 14:56:28 my-capsule goferd: self.on_transport_closed(event) > Sep 21 14:56:28 my-capsule goferd: File > "/usr/lib64/python2.7/site-packages/proton/utils.py", line 263, in > on_transport_closed > Sep 21 14:56:28 my-capsule goferd: raise ConnectionException("Connection %s > disconnected" % self.url); > Sep 21 14:56:28 my-capsule goferd: ConnectionException: Connection > amqps://satellite.example.com:5647 disconnected > (some difference between SSL and nonSSL could come from the fact that in my > case the server part - qdrouterd / Qpid Dispatch Router - sends FIN+ACK > packet for nonSSL connection, while it does not send anything for SSL > connection and continue for sending empty AMQP frames due to heartbeats > enabled forever) -- This message was sent by Atlassian JIRA (v6.3.4#6332)