qpid-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "jiraposter@reviews.apache.org (Commented) (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (QPID-3896) Broker crash when using auto delete queues in a cluster
Date Tue, 20 Mar 2012 14:09:41 GMT

    [ 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


Mime
View raw message