You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Ken Giusti (Created) (JIRA)" <ji...@apache.org> on 2012/03/13 16:26:39 UTC

[jira] [Created] (QPID-3896) Broker crash when using auto delete queues in a cluster

Broker crash when using auto delete queues in a cluster
-------------------------------------------------------

                 Key: QPID-3896
                 URL: https://issues.apache.org/jira/browse/QPID-3896
             Project: Qpid
          Issue Type: Bug
          Components: C++ Clustering
    Affects Versions: 0.17
            Reporter: Ken Giusti
            Assignee: Alan Conway
             Fix For: 0.17


I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.

The following client pseudo code can cause the crash:

    loc_sess = [ ];
    # create couple of sessions
    for i in range(in_loops):
      queue_durability = False;
      if (i % 2 == 1):
        queue_durability = True;
      # create new local session[s]
      lsess = self.connection.session(loc_sess_name % i);
      # delete the queue (if needed)
      self.cleanup(in_queue=loc_q_name % i);
      # declare auto-delete queue[s]
      lsess.queue_declare(queue=loc_q_name % i, 
                          auto_delete=True,
                          arguments={"qpid.auto_delete_timeout" : q_timeout},
                          durable=queue_durability);
      
      # check that queue[s] is still available
      result = lsess.queue_query(queue=loc_q_name % i);
      self.assertEqual(loc_q_name % i, result.queue);
    
      # bind queue to exchange amf.fanout
      lsess.exchange_bind(exchange=e_name,
                          queue=loc_q_name % i,
                          binding_key=f_name);

      # append the session to list
      loc_sess.append(lsess);
    
    # send messages to the queues via amq.fanout
    dp = sess.delivery_properties(routing_key=f_name);
    msg_cnt = random.randint(*MSG_CNT_RR);
    print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
    for j in range(msg_cnt):
      sess.message_transfer(destination=e_name,
                            message=qpid.datatypes.Message(dp, msg_layout % j));
    
    # check that queues contain correct message count via QMF
    self.startQmf();
    for i in range(in_loops):
      sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
      self.assertEqual (sq.msgDepth, msg_cnt);

    # receive one (first) message from the queues
    for i in range(in_loops):
      loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
      loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
                               unit=loc_sess[i].credit_unit.message)
      loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
                               unit=loc_sess[i].credit_unit.byte)
      dlq = loc_sess[i].incoming("dlq");

      msg=dlq.get(timeout=1);
      self.assertEqual(msg_layout % 0, msg.body);
      

    # check that queues are present at this point (subscription still alive atm)
    for i in range(in_loops):
      # browse sessions
      result = loc_sess[i].queue_query(queue=loc_q_name % i);
      self.assertEqual(loc_q_name % i, result.queue);
    
      loc_sess[i].close();

    # check that queues are still available (after local sessions JUST closed)
    for i in range(in_loops):
      # browse sessions
      result = sess.queue_query(queue=loc_q_name % i);
      self.assertEqual(loc_q_name % i, result.queue);

    print "sleeping - waiting for queue auto timeout"
    time.sleep(q_timeout+AD_TIMEOUT_TOL);
    
    # check whether queue has been deleted (expected to be deleted)
    for i in range(in_loops):
      result = sess.queue_query(queue=loc_q_name % i);
      self.assert_(not result.queue);

Analysis:

The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.

   

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Updated] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "Ken Giusti (Updated) (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ken Giusti updated QPID-3896:
-----------------------------

    Fix Version/s:     (was: 0.17)
                   0.16
    
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Ken Giusti
>             Fix For: 0.16
>
>         Attachments: qpid-3896.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Commented] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "jiraposter@reviews.apache.org (Commented) (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13233418#comment-13233418 ] 

jiraposter@reviews.apache.org commented on QPID-3896:
-----------------------------------------------------


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/4413/
-----------------------------------------------------------

Review request for qpid and Alan Conway.


Summary
-------

When an auto-delete queue is created, a timer is used to detect when the queue should be deleted.  Since the timer is managed by the queue, the name of the timer is unimportant, and the queue code uses the same name for all timers.

This creates a problem for the clustering code, which must monitor each timer.  This patch changes the queue code to create a timer with a name based on the name of the queue.  This allows the cluster code to correctly distinguish these timers. 


This addresses bug qpid-3896.
    https://issues.apache.org/jira/browse/qpid-3896


Diffs
-----

  /trunk/qpid/cpp/src/qpid/broker/Queue.cpp 1302629 
  /trunk/qpid/cpp/src/qpid/cluster/ClusterTimer.cpp 1302629 

Diff: https://reviews.apache.org/r/4413/diff


Testing
-------

unit


Thanks,

Kenneth


                
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Alan Conway
>             Fix For: 0.17
>
>         Attachments: qpid-3896.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Updated] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "Ken Giusti (Updated) (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ken Giusti updated QPID-3896:
-----------------------------

    Attachment: timer-name.patch

A work-around patch that augments the Queue's auto delete timer with a unique uuid string.  This prevents ClusterTimer::add() from getting different timer tasks with the same name.
                
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Alan Conway
>             Fix For: 0.17
>
>         Attachments: timer-name.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Updated] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "Ken Giusti (Updated) (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ken Giusti updated QPID-3896:
-----------------------------

    Attachment: qpid-3896.patch

Fixup of the previous (invalid) patch - naming must be consistent amoung all members of the cluster, so use the queue's name not a random uuid!

Also, added assertClusterSafe() call, per Alan's suggestion.
                
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Alan Conway
>             Fix For: 0.17
>
>         Attachments: qpid-3896.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Assigned] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "Ken Giusti (Assigned) (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ken Giusti reassigned QPID-3896:
--------------------------------

    Assignee: Ken Giusti  (was: Alan Conway)
    
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Ken Giusti
>             Fix For: 0.17
>
>         Attachments: qpid-3896.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Updated] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "Ken Giusti (Updated) (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ken Giusti updated QPID-3896:
-----------------------------

    Attachment:     (was: timer-name.patch)
    
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Alan Conway
>             Fix For: 0.17
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Commented] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "jiraposter@reviews.apache.org (Commented) (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13233421#comment-13233421 ] 

jiraposter@reviews.apache.org commented on QPID-3896:
-----------------------------------------------------


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/4413/#review6117
-----------------------------------------------------------

Ship it!


- Alan


On 2012-03-20 14:06:07, Kenneth Giusti wrote:
bq.  
bq.  -----------------------------------------------------------
bq.  This is an automatically generated e-mail. To reply, visit:
bq.  https://reviews.apache.org/r/4413/
bq.  -----------------------------------------------------------
bq.  
bq.  (Updated 2012-03-20 14:06:07)
bq.  
bq.  
bq.  Review request for qpid and Alan Conway.
bq.  
bq.  
bq.  Summary
bq.  -------
bq.  
bq.  When an auto-delete queue is created, a timer is used to detect when the queue should be deleted.  Since the timer is managed by the queue, the name of the timer is unimportant, and the queue code uses the same name for all timers.
bq.  
bq.  This creates a problem for the clustering code, which must monitor each timer.  This patch changes the queue code to create a timer with a name based on the name of the queue.  This allows the cluster code to correctly distinguish these timers. 
bq.  
bq.  
bq.  This addresses bug qpid-3896.
bq.      https://issues.apache.org/jira/browse/qpid-3896
bq.  
bq.  
bq.  Diffs
bq.  -----
bq.  
bq.    /trunk/qpid/cpp/src/qpid/broker/Queue.cpp 1302629 
bq.    /trunk/qpid/cpp/src/qpid/cluster/ClusterTimer.cpp 1302629 
bq.  
bq.  Diff: https://reviews.apache.org/r/4413/diff
bq.  
bq.  
bq.  Testing
bq.  -------
bq.  
bq.  unit
bq.  
bq.  
bq.  Thanks,
bq.  
bq.  Kenneth
bq.  
bq.


                
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Alan Conway
>             Fix For: 0.17
>
>         Attachments: qpid-3896.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Resolved] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "Ken Giusti (Resolved) (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ken Giusti resolved QPID-3896.
------------------------------

    Resolution: Fixed
    
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Ken Giusti
>             Fix For: 0.17
>
>         Attachments: qpid-3896.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


[jira] [Commented] (QPID-3896) Broker crash when using auto delete queues in a cluster

Posted by "Justin Ross (Commented) (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/QPID-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13235673#comment-13235673 ] 

Justin Ross commented on QPID-3896:
-----------------------------------

Reviewed by Alan.  Approved for 0.16.
                
> Broker crash when using auto delete queues in a cluster
> -------------------------------------------------------
>
>                 Key: QPID-3896
>                 URL: https://issues.apache.org/jira/browse/QPID-3896
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Clustering
>    Affects Versions: 0.17
>            Reporter: Ken Giusti
>            Assignee: Ken Giusti
>             Fix For: 0.17
>
>         Attachments: qpid-3896.patch
>
>
> I can get the broker to crash with a simple configuration involving multiple 'auto delete' queues.
> The following client pseudo code can cause the crash:
>     loc_sess = [ ];
>     # create couple of sessions
>     for i in range(in_loops):
>       queue_durability = False;
>       if (i % 2 == 1):
>         queue_durability = True;
>       # create new local session[s]
>       lsess = self.connection.session(loc_sess_name % i);
>       # delete the queue (if needed)
>       self.cleanup(in_queue=loc_q_name % i);
>       # declare auto-delete queue[s]
>       lsess.queue_declare(queue=loc_q_name % i, 
>                           auto_delete=True,
>                           arguments={"qpid.auto_delete_timeout" : q_timeout},
>                           durable=queue_durability);
>       
>       # check that queue[s] is still available
>       result = lsess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       # bind queue to exchange amf.fanout
>       lsess.exchange_bind(exchange=e_name,
>                           queue=loc_q_name % i,
>                           binding_key=f_name);
>       # append the session to list
>       loc_sess.append(lsess);
>     
>     # send messages to the queues via amq.fanout
>     dp = sess.delivery_properties(routing_key=f_name);
>     msg_cnt = random.randint(*MSG_CNT_RR);
>     print "setup: in_loops:%d, msg_cnt:%d" % (in_loops, msg_cnt);
>     for j in range(msg_cnt):
>       sess.message_transfer(destination=e_name,
>                             message=qpid.datatypes.Message(dp, msg_layout % j));
>     
>     # check that queues contain correct message count via QMF
>     self.startQmf();
>     for i in range(in_loops):
>       sq = self.qmf_session.getObjects(_class="queue", name=loc_q_name % i)[0];
>       self.assertEqual (sq.msgDepth, msg_cnt);
>     # receive one (first) message from the queues
>     for i in range(in_loops):
>       loc_sess[i].message_subscribe(destination="dlq", queue=loc_q_name % i);
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.message)
>       loc_sess[i].message_flow(destination="dlq", value=0xFFFFFFFFL,
>                                unit=loc_sess[i].credit_unit.byte)
>       dlq = loc_sess[i].incoming("dlq");
>       msg=dlq.get(timeout=1);
>       self.assertEqual(msg_layout % 0, msg.body);
>       
>     # check that queues are present at this point (subscription still alive atm)
>     for i in range(in_loops):
>       # browse sessions
>       result = loc_sess[i].queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     
>       loc_sess[i].close();
>     # check that queues are still available (after local sessions JUST closed)
>     for i in range(in_loops):
>       # browse sessions
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assertEqual(loc_q_name % i, result.queue);
>     print "sleeping - waiting for queue auto timeout"
>     time.sleep(q_timeout+AD_TIMEOUT_TOL);
>     
>     # check whether queue has been deleted (expected to be deleted)
>     for i in range(in_loops):
>       result = sess.queue_query(queue=loc_q_name % i);
>       self.assert_(not result.queue);
> Analysis:
> The ClusterTimer is unable to handle storing two timer tasks that have the same name.  The Queue code creates a timer task for each auto delete queue.  These tasks all have the same name "DelayedAutoDeletion".  This causes ClusterTimer::add() to throw an exception as it thinks there are duplicate timer tasks.
>    

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org