You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2016/03/30 23:34:22 UTC
qpid-dispatch git commit: DISPATCH-179 - Fixed race condition in the
sender-settles-first case. All tests pass.
Repository: qpid-dispatch
Updated Branches:
refs/heads/master a94a7a9b7 -> 25d8513e3
DISPATCH-179 - Fixed race condition in the sender-settles-first case. All tests pass.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/25d8513e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/25d8513e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/25d8513e
Branch: refs/heads/master
Commit: 25d8513e373209e3f8ab4ca83a45c32b1e3d0382
Parents: a94a7a9
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 30 17:32:47 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 30 17:33:50 2016 -0400
----------------------------------------------------------------------
src/router_core/router_core_private.h | 2 +-
src/router_core/transfer.c | 37 +++++++++++++++++-------------
tests/system_tests_two_routers.py | 4 ++--
3 files changed, 24 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/25d8513e/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index 1a61620..fed9f88 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -569,7 +569,7 @@ void qdr_addr_start_inlinks_CT(qdr_core_t *core, qdr_address_t *addr);
void qdr_delivery_push_CT(qdr_core_t *core, qdr_delivery_t *dlv);
void qdr_delivery_free(qdr_delivery_t *delivery);
void qdr_delivery_release_CT(qdr_core_t *core, qdr_delivery_t *delivery);
-void qdr_delivery_remove_unsettled_CT(qdr_core_t *core, qdr_delivery_t *delivery);
+bool qdr_delivery_settled_CT(qdr_core_t *core, qdr_delivery_t *delivery);
void qdr_agent_enqueue_response_CT(qdr_core_t *core, qdr_query_t *query);
void qdr_post_mobile_added_CT(qdr_core_t *core, const char *address_hash);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/25d8513e/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 8b2d574..883801b 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -98,14 +98,16 @@ void qdr_link_process_deliveries(qdr_core_t *core, qdr_link_t *link, int credit)
qdr_connection_t *conn = link->conn;
qdr_delivery_t *dlv;
bool drained = false;
- int offer = -1;
+ int offer = -1;
+ bool settled = false;
while (credit > 0 && !drained) {
sys_mutex_lock(conn->work_lock);
dlv = DEQ_HEAD(link->undelivered);
if (dlv) {
DEQ_REMOVE_HEAD(link->undelivered);
- if (!dlv->settled) {
+ settled = dlv->settled;
+ if (!settled) {
DEQ_INSERT_TAIL(link->unsettled, dlv);
dlv->where = QDR_DELIVERY_IN_UNSETTLED;
} else
@@ -119,8 +121,8 @@ void qdr_link_process_deliveries(qdr_core_t *core, qdr_link_t *link, int credit)
if (dlv) {
link->credit_to_core--;
- core->deliver_handler(core->user_context, link, dlv, dlv->settled);
- if (dlv->settled)
+ core->deliver_handler(core->user_context, link, dlv, settled);
+ if (settled)
qdr_delivery_free(dlv);
}
}
@@ -251,18 +253,18 @@ void qdr_delivery_release_CT(qdr_core_t *core, qdr_delivery_t *delivery)
}
-void qdr_delivery_remove_unsettled_CT(qdr_core_t *core, qdr_delivery_t *dlv)
+bool qdr_delivery_settled_CT(qdr_core_t *core, qdr_delivery_t *dlv)
{
//
// Remove a delivery from its unsettled list. Side effects include issuing
// replacement credit and visiting the link-quiescence algorithm
//
- qdr_link_t *link = dlv->link;
- qdr_connection_t *conn = link ? link->conn : 0;
- bool issue_credit = false;
+ qdr_link_t *link = dlv->link;
+ qdr_connection_t *conn = link ? link->conn : 0;
+ bool moved = false;
if (!link || !conn)
- return;
+ return false;
//
// The lock needs to be acquired only for outgoing links
@@ -273,7 +275,7 @@ void qdr_delivery_remove_unsettled_CT(qdr_core_t *core, qdr_delivery_t *dlv)
if (dlv->where == QDR_DELIVERY_IN_UNSETTLED) {
DEQ_REMOVE(link->unsettled, dlv);
dlv->where = QDR_DELIVERY_NOWHERE;
- issue_credit = true;
+ moved = true;
}
if (link->link_direction == QD_OUTGOING)
@@ -283,8 +285,10 @@ void qdr_delivery_remove_unsettled_CT(qdr_core_t *core, qdr_delivery_t *dlv)
// If this is an incoming link and it is not link-routed, issue
// one replacement credit on the link.
//
- if (issue_credit && link->link_direction == QD_INCOMING && !link->connected_link)
+ if (moved && link->link_direction == QD_INCOMING && !link->connected_link)
qdr_link_issue_credit_CT(core, link, 1);
+
+ return moved;
}
@@ -460,7 +464,6 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
// If settled and there is a peer, the peer shall be settled and unlinked. It shall not
// be freed until the connection-side thread settles the PN delivery.
//
-
if (disp != dlv->disposition) {
//
// Disposition has changed, propagate the change to the peer delivery.
@@ -475,15 +478,17 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
if (settled) {
if (peer) {
peer->settled = true;
- push = true;
peer->peer = 0;
dlv->peer = 0;
- if (peer->link)
- qdr_delivery_remove_unsettled_CT(core, peer);
+ if (peer->link) {
+ bool moved = qdr_delivery_settled_CT(core, peer);
+ if (moved)
+ push = true;
+ }
}
if (dlv->link)
- qdr_delivery_remove_unsettled_CT(core, dlv);
+ qdr_delivery_settled_CT(core, dlv);
qdr_delivery_free(dlv);
}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/25d8513e/tests/system_tests_two_routers.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_two_routers.py b/tests/system_tests_two_routers.py
index f7938e3..8962a7c 100644
--- a/tests/system_tests_two_routers.py
+++ b/tests/system_tests_two_routers.py
@@ -170,7 +170,7 @@ class RouterTest(TestCase):
def test_02c_sender_settles_first(self):
- addr = "amqp:/settled/senderfirst/1"
+ addr = "amqp:/closest.senderfirst.1"
M1 = self.messenger()
M2 = self.messenger()
@@ -183,7 +183,7 @@ class RouterTest(TestCase):
M1.start()
M2.start()
M2.subscribe(addr)
- self.routers[0].wait_address("settled/senderfirst/1", 0, 1)
+ self.routers[0].wait_address("closest.senderfirst.1", 0, 1)
tm = Message()
rm = Message()
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org