diff options
author | Gordon Sim <gsim@apache.org> | 2011-09-15 12:36:56 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2011-09-15 12:36:56 +0000 |
commit | dd96a8d7cd57bf6e92f6aa46f22bc3f0820d9d60 (patch) | |
tree | 85819c81ddf1217cf9b6ce8f98dad090e2d8133b /cpp/src | |
parent | ca63176da28dd4b045bd8a0d5cfc43f235d01a23 (diff) | |
download | qpid-python-dd96a8d7cd57bf6e92f6aa46f22bc3f0820d9d60.tar.gz |
QPID-3487: Ensure delivery records for cancelled subscriptions are correctly cleaned up
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1171078 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/broker/DeliveryRecord.h | 2 | ||||
-rw-r--r-- | cpp/src/qpid/broker/SemanticState.cpp | 4 |
2 files changed, 5 insertions, 1 deletions
diff --git a/cpp/src/qpid/broker/DeliveryRecord.h b/cpp/src/qpid/broker/DeliveryRecord.h index d388ba94be..19ab37ac17 100644 --- a/cpp/src/qpid/broker/DeliveryRecord.h +++ b/cpp/src/qpid/broker/DeliveryRecord.h @@ -90,7 +90,7 @@ class DeliveryRecord bool isAcquired() const { return acquired; } bool isComplete() const { return completed; } - bool isRedundant() const { return ended && (!windowing || completed); } + bool isRedundant() const { return ended && (!windowing || completed || cancelled); } bool isCancelled() const { return cancelled; } bool isAccepted() const { return !acceptExpected; } bool isEnded() const { return ended; } diff --git a/cpp/src/qpid/broker/SemanticState.cpp b/cpp/src/qpid/broker/SemanticState.cpp index 37d981d6c4..c2215a99a2 100644 --- a/cpp/src/qpid/broker/SemanticState.cpp +++ b/cpp/src/qpid/broker/SemanticState.cpp @@ -125,6 +125,10 @@ bool SemanticState::cancel(const string& tag) //should cancel all unacked messages for this consumer so that //they are not redelivered on recovery for_each(unacked.begin(), unacked.end(), boost::bind(&DeliveryRecord::cancel, _1, tag)); + //can also remove any records that are now redundant + DeliveryRecords::iterator removed = + remove_if(unacked.begin(), unacked.end(), bind(&DeliveryRecord::isRedundant, _1)); + unacked.erase(removed, unacked.end()); return true; } else { return false; |