You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2019/10/02 21:33:13 UTC
[qpid-dispatch] branch master updated: DISPATCH-1418: use proper
outcome for deliveries to unavailable addresses
This is an automated email from the ASF dual-hosted git repository.
kgiusti pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/master by this push:
new fc9c438 DISPATCH-1418: use proper outcome for deliveries to unavailable addresses
fc9c438 is described below
commit fc9c4380d796656ad964e04bb389d3223d94b1c5
Author: Kenneth Giusti <kg...@apache.org>
AuthorDate: Wed Oct 2 15:06:23 2019 -0400
DISPATCH-1418: use proper outcome for deliveries to unavailable addresses
Use the configured address treatment if available. Otherwise use the
router default treatment.
This closes #579
---
src/router_core/transfer.c | 74 +++++++++++++++++++++++----------------
tests/system_tests_router_mesh.py | 5 ++-
2 files changed, 45 insertions(+), 34 deletions(-)
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 17067c4..6ee2624 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -477,43 +477,55 @@ static void qdr_link_forward_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery
}
link->total_deliveries++;
- }
- //
- // There is no address that we can send this delivery to, which means the addr was not found in our hash table. This
- // can be because there were no receivers or because the address was not defined in the config file.
- //
- else if (core->qd->default_treatment == QD_TREATMENT_UNAVAILABLE) {
+ } else {
//
- // If the treatment for these addresses is set to be unavailable, we
- // stop trying to forward it. If the link is a locally attached client
- // we reject the message if the link is not anonymous as per the
- // documentation of the router's defaultTreatment=unavailable. We
- // simply release it for other link types as the message did have a
- // destination at some point (it was forwarded to this router after
- // all) - the loss of the destination may be temporary.
+ // There is no address that we can send this delivery to, which means
+ // the addr was not found in our hash table. This can be because there
+ // were no receivers or because the address was not defined in the
+ // config file.
//
- if (link->link_type == QD_LINK_ENDPOINT) {
- dlv->error = qdr_error(QD_AMQP_COND_NOT_FOUND, "Deliveries cannot be sent to an unavailable address");
- qdr_delivery_reject_CT(core, dlv);
- if (qdr_link_is_anonymous(link)) {
- qdr_link_issue_credit_CT(core, link, 1, false);
+
+ qd_address_treatment_t trt = core->qd->default_treatment;
+ if (dlv->to_addr) {
+ qdr_address_config_t *ignore = 0;
+ trt = qdr_treatment_for_address_hash_with_default_CT(core,
+ dlv->to_addr,
+ trt,
+ &ignore);
+ }
+
+ if (trt == QD_TREATMENT_UNAVAILABLE) {
+ //
+ // The treatment for these addresses is set to be unavailable, we
+ // stop trying to forward it. If the link is a locally attached client
+ // we reject the message if the link is not anonymous as per the
+ // documentation of the router's defaultTreatment=unavailable. We
+ // simply release it for other link types as the message did have a
+ // destination at some point (it was forwarded to this router after
+ // all) - the loss of the destination may be temporary.
+ //
+ if (link->link_type == QD_LINK_ENDPOINT) {
+ dlv->error = qdr_error(QD_AMQP_COND_NOT_FOUND, "Deliveries cannot be sent to an unavailable address");
+ qdr_delivery_reject_CT(core, dlv);
+ if (qdr_link_is_anonymous(link)) {
+ qdr_link_issue_credit_CT(core, link, 1, false);
+ } else {
+ // cannot forward on this targeted link. withhold credit and drain
+ qdr_link_issue_credit_CT(core, link, 0, true);
+ }
} else {
- // cannot forward on this targeted link. withhold credit and drain
- qdr_link_issue_credit_CT(core, link, 0, true);
+ qdr_delivery_release_CT(core, dlv);
+ qdr_link_issue_credit_CT(core, link, 1, false);
}
- } else {
- qdr_delivery_release_CT(core, dlv);
- qdr_link_issue_credit_CT(core, link, 1, false);
+ //
+ // We will not detach this link because this could be anonymous sender. We don't know
+ // which address the sender will be sending to next
+ // If this was not an anonymous sender, the initial attach would have been rejected if the target address was unavailable.
+ //
+ qdr_delivery_decref_CT(core, dlv, "qdr_link_forward_CT - removed from action (treatment unavailable)");
+ return;
}
-
- //
- // We will not detach this link because this could be anonymous sender. We don't know
- // which address the sender will be sending to next
- // If this was not an anonymous sender, the initial attach would have been rejected if the target address was unavailable.
- //
- qdr_delivery_decref_CT(core, dlv, "qdr_link_forward_CT - removed from action (treatment unavailable)");
- return;
}
//
diff --git a/tests/system_tests_router_mesh.py b/tests/system_tests_router_mesh.py
index fad0600..60b2408 100644
--- a/tests/system_tests_router_mesh.py
+++ b/tests/system_tests_router_mesh.py
@@ -206,9 +206,8 @@ class ThreeRouterTest(TestCase):
message=message)
ats.wait()
self.assertEqual(0, ats.accepted)
- # BUG DISPATCH-1418: shold be released!
- # self.assertEqual(1, ats.released)
- self.assertEqual(1, ats.rejected)
+ self.assertEqual(1, ats.released)
+ self.assertEqual(0, ats.rejected)
if __name__ == '__main__':
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org