Uploaded image for project: 'Qpid'
  1. Qpid
  2. QPID-3575

session exceptions do not properly close connections, causing connections leak

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • 0.10, 0.12, 0.13
    • 0.17
    • JMS AMQP 0-x

    Description

      Description of problem:
      There is a connection leak as described below.

      A session level exception is designed to close the underlying connection (along with the other sessions). However this is not true as there are at least two scenarios leading in an orphaned connection that can't be further used (along with any session created on it) but it can't be deleted.

      Once an exception is raised, the connection, a session created on it or a producer/consumer created on such a session can't be effectivelly used - any usage ends up in an exception like the connection would be closed.

      ---------------
      First scenario:
      If qpid.declare_queues is set to false and an attempt to subscribe to a non-existing queue is made, an exception is raised and subsequent connection.close() method does not close the TCP connection at all.

      Steps to Reproduce:
      1. Start a fresh qpid broker with auth=no - make sure no
      "some.unreal.destination" queue is there
      2. Run attached Java program TestQpidLeak.java
      3. Do not terminate it when a prompt appears in it
      4. Run qpid-stat -c in parallel

      Actual results:
      qpid-stat shows 10 connections made by the client and despite connection.close() has been called for each of them.

      Expected results:
      qpid-stat does not show the 10 connections.

      ---------------
      Second scenario:
      Try to send 500 messages into a queue with max-queue-count 10. Again, a session exception is raised, connection is attempted to be closed but with no impact.

      Steps to Reproduce:
      1. Start a fresh qpid broker with auth=no
      2. qpid-config add queue testQueue --max-queue-count 10
      3. Run attached Java program QueueFull.java
      3. Do not terminate it when a prompt appears in it
      4. Run qpid-stat -c in parallel

      Actual results:
      qpid-stat shows 1 connection made by the client and despite connection.close() has been called.
      Sometimes (using a slightly different Java program that I can't revoke) the invoking of connection.close() method in finally-block does not terminate.

      Expected results:
      qpid-stat does not show the connection from the client.

      Attachments

        1. TestQpidLeak.java
          2 kB
          Pavel Moravec
        2. QueueFull.java
          2 kB
          Pavel Moravec
        3. jira-3575_workaround-patch.patch
          6 kB
          Pavel Moravec

        Activity

          People

            rajith Rajith Muditha Attapattu
            pmoravec Pavel Moravec
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: