From 553e8cc73ff51c9850bdb3ddc8c8f4f356738a85 Mon Sep 17 00:00:00 2001 From: Martin Ritchie Date: Fri, 10 Apr 2009 22:09:50 +0000 Subject: QPID-1794 : Moved processing of single message removals to just before the transaction commit rather than before the dequeue. As previously the list of dequeues was being traversed for every dequeue in that transaction batch with nothing to do. So removing this loop should increase performance in large batch cases. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@764078 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/transactionlog/BaseTransactionLog.java | 59 +++++++++++----------- 1 file changed, 29 insertions(+), 30 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/transactionlog/BaseTransactionLog.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/transactionlog/BaseTransactionLog.java index 8d7b22d470..7bf78ad977 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/transactionlog/BaseTransactionLog.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/transactionlog/BaseTransactionLog.java @@ -114,36 +114,6 @@ public class BaseTransactionLog implements TransactionLog { context.dequeueMessage(queue, messageId); - if (context.inTransaction()) - { - - Map> messageMap = context.getDequeueMap(); - - //For each Message ID that is in the map check - Set messageIDs = messageMap.keySet(); - - if (_logger.isInfoEnabled()) - { - _logger.info("Pre-Processing single dequeue of:" + messageIDs); - } - - Iterator iterator = messageIDs.iterator(); - - while (iterator.hasNext()) - { - Long messageID = (Long) iterator.next(); - //If we don't have a gloabl reference for this message then there is only a single enqueue - //can check here to see if this is the last reference? - if (_idToQueues.get(messageID) == null) - { - // Add the removal of the message to this transaction - _delegate.removeMessage(context, messageID); - // Remove this message ID as we have processed it so we don't reprocess after the main commmit - iterator.remove(); - } - } - } - _delegate.dequeueMessage(context, queue, messageId); if (!context.inTransaction()) @@ -172,6 +142,35 @@ public class BaseTransactionLog implements TransactionLog public void commitTran(StoreContext context) throws AMQException { + + Map> messageMap = context.getDequeueMap(); + + //For each Message ID that is in the map check + Set messageIDs = messageMap.keySet(); + + if (_logger.isInfoEnabled()) + { + _logger.info("Pre-Processing single dequeue of:" + messageIDs); + } + + Iterator iterator = messageIDs.iterator(); + + while (iterator.hasNext()) + { + Long messageID = (Long) iterator.next(); + //If we don't have a gloabl reference for this message then there + // is only a single enqueue can check here to see if this is the + // last reference? + if (_idToQueues.get(messageID) == null) + { + // Add the removal of the message to this transaction + _delegate.removeMessage(context, messageID); + // Remove this message ID as we have processed it so we don't + // reprocess after the main commmit + iterator.remove(); + } + } + //Perform real commit of current data _delegate.commitTran(context); -- cgit v1.2.1