summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2011-09-15 12:36:56 +0000
committerGordon Sim <gsim@apache.org>2011-09-15 12:36:56 +0000
commitdd96a8d7cd57bf6e92f6aa46f22bc3f0820d9d60 (patch)
tree85819c81ddf1217cf9b6ce8f98dad090e2d8133b /cpp/src
parentca63176da28dd4b045bd8a0d5cfc43f235d01a23 (diff)
downloadqpid-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.h2
-rw-r--r--cpp/src/qpid/broker/SemanticState.cpp4
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;