summaryrefslogtreecommitdiff
path: root/qpid/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
commita4618a24e5b3dd910ba2025336b327879b7844cd (patch)
tree1c6b60337da93a88e645531077057969ac3373eb /qpid/cpp/src
parent432918433d1b04e94864c09949dda59bc1454271 (diff)
downloadqpid-python-a4618a24e5b3dd910ba2025336b327879b7844cd.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@1171078 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/qpid/broker/DeliveryRecord.h2
-rw-r--r--qpid/cpp/src/qpid/broker/SemanticState.cpp4
2 files changed, 5 insertions, 1 deletions
diff --git a/qpid/cpp/src/qpid/broker/DeliveryRecord.h b/qpid/cpp/src/qpid/broker/DeliveryRecord.h
index d388ba94be..19ab37ac17 100644
--- a/qpid/cpp/src/qpid/broker/DeliveryRecord.h
+++ b/qpid/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/qpid/cpp/src/qpid/broker/SemanticState.cpp b/qpid/cpp/src/qpid/broker/SemanticState.cpp
index 37d981d6c4..c2215a99a2 100644
--- a/qpid/cpp/src/qpid/broker/SemanticState.cpp
+++ b/qpid/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;