summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2013-06-19 14:51:55 +0000
committerGordon Sim <gsim@apache.org>2013-06-19 14:51:55 +0000
commit6ac6c07b58ff4a257d61b5587d14ea15d3c0c88d (patch)
treeea39fd66c5d8588b4eadd973d841b75fe899172e /qpid/cpp/src
parent67787e15fce5978e1fa4fbdb27fbea4033f28086 (diff)
downloadqpid-python-6ac6c07b58ff4a257d61b5587d14ea15d3c0c88d.tar.gz
QPID-4935: handle case where peer to sender settles without setting a delivery state
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1494644 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp22
-rw-r--r--qpid/cpp/src/qpid/messaging/amqp/SenderContext.h2
2 files changed, 22 insertions, 2 deletions
diff --git a/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp b/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp
index 1d9889c447..0fa97ab933 100644
--- a/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp
+++ b/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp
@@ -95,8 +95,8 @@ SenderContext::Delivery* SenderContext::send(const qpid::messaging::Message& mes
uint32_t SenderContext::processUnsettled()
{
- //remove accepted messages from front of deque
- while (!deliveries.empty() && deliveries.front().accepted()) {
+ //remove messages from front of deque once peer has confirmed receipt
+ while (!deliveries.empty() && deliveries.front().delivered()) {
deliveries.front().settle();
deliveries.pop_front();
}
@@ -453,10 +453,28 @@ void SenderContext::Delivery::send(pn_link_t* sender)
pn_link_advance(sender);
}
+bool SenderContext::Delivery::delivered()
+{
+ if (pn_delivery_remote_state(token) || pn_delivery_settled(token)) {
+ //TODO: need a better means for signalling outcomes other than accepted
+ if (rejected()) {
+ QPID_LOG(warning, "delivery " << id << " was rejected by peer");
+ } else if (!accepted()) {
+ QPID_LOG(info, "delivery " << id << " was not accepted by peer");
+ }
+ return true;
+ } else {
+ return false;
+ }
+}
bool SenderContext::Delivery::accepted()
{
return pn_delivery_remote_state(token) == PN_ACCEPTED;
}
+bool SenderContext::Delivery::rejected()
+{
+ return pn_delivery_remote_state(token) == PN_REJECTED;
+}
void SenderContext::Delivery::settle()
{
pn_delivery_settle(token);
diff --git a/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h b/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h
index ba563af2dc..81d306bab3 100644
--- a/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h
+++ b/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h
@@ -53,7 +53,9 @@ class SenderContext
Delivery(int32_t id);
void encode(const qpid::messaging::MessageImpl& message, const qpid::messaging::Address&);
void send(pn_link_t*);
+ bool delivered();
bool accepted();
+ bool rejected();
void settle();
private:
int32_t id;