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/09/22 03:18:05 UTC
qpid-dispatch git commit: DISPATCH-522 - Reduce the number of times
the core thread invokes connection activation during times of high traffic
volume.
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 118518516 -> 152185eb9
DISPATCH-522 - Reduce the number of times the core thread invokes connection activation during times of high traffic volume.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/152185eb
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/152185eb
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/152185eb
Branch: refs/heads/master
Commit: 152185eb91d58a924f982191bdf95d954199c47c
Parents: 1185185
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Sep 21 20:16:10 2016 -0700
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Sep 21 20:16:10 2016 -0700
----------------------------------------------------------------------
include/qpid/dispatch/router_core.h | 3 ++-
include/qpid/dispatch/server.h | 3 ++-
src/container.c | 2 +-
src/router_core/connections.c | 13 ++++++++++++-
src/router_core/router_core_private.h | 5 ++++-
src/router_core/router_core_thread.c | 17 +++++++++++++++++
src/router_node.c | 4 ++--
src/server.c | 9 +++++----
8 files changed, 45 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 8eaa7ef..9421481 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -219,8 +219,9 @@ int qdr_connection_process(qdr_connection_t *conn);
*
* @param context The context supplied when the callback was registered
* @param conn The connection object to be activated
+ * @param awaken Iff true, awaken the driver poll loop after the activation
*/
-typedef void (*qdr_connection_activate_t) (void *context, qdr_connection_t *conn);
+typedef void (*qdr_connection_activate_t) (void *context, qdr_connection_t *conn, bool awaken);
/**
******************************************************************************
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/include/qpid/dispatch/server.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/server.h b/include/qpid/dispatch/server.h
index a0ee4b5..9862895 100644
--- a/include/qpid/dispatch/server.h
+++ b/include/qpid/dispatch/server.h
@@ -538,8 +538,9 @@ void qd_connection_set_user(qd_connection_t *conn);
* internal work list and be invoked for processing by a worker thread.
*
* @param conn The connection over which the application wishes to send data
+ * @param awaken Iff true, wakeup the driver poll after the activation
*/
-void qd_server_activate(qd_connection_t *conn);
+void qd_server_activate(qd_connection_t *conn, bool awaken);
/**
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index 92c0e0e..5080258 100644
--- a/src/container.c
+++ b/src/container.c
@@ -933,7 +933,7 @@ void qd_link_activate(qd_link_t *link)
if (!ctx)
return;
- qd_server_activate(ctx);
+ qd_server_activate(ctx, true);
}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 634a07f..1cd054b 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -373,7 +373,10 @@ void qdr_connection_handlers(qdr_core_t *core,
void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn)
{
- core->activate_handler(core->user_context, conn);
+ if (!conn->in_activate_list) {
+ DEQ_INSERT_TAIL_N(ACTIVATE, core->connections_to_activate, conn);
+ conn->in_activate_list = true;
+ }
}
@@ -979,6 +982,14 @@ static void qdr_connection_closed_CT(qdr_core_t *core, qdr_action_t *action, boo
work = DEQ_HEAD(conn->work_list);
}
+ //
+ // If this connection is on the activation list, remove it from the list
+ //
+ if (conn->in_activate_list) {
+ conn->in_activate_list = false;
+ DEQ_REMOVE_N(ACTIVATE, core->connections_to_activate, conn);
+ }
+
DEQ_REMOVE(core->open_connections, conn);
sys_mutex_free(conn->work_lock);
free_qdr_connection_t(conn);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/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 2f55eee..9fa86e9 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -434,9 +434,11 @@ DEQ_DECLARE(qdr_connection_work_t, qdr_connection_work_list_t);
struct qdr_connection_t {
DEQ_LINKS(qdr_connection_t);
+ DEQ_LINKS_N(ACTIVATE, qdr_connection_t);
qdr_core_t *core;
void *user_context;
bool incoming;
+ bool in_activate_list;
qdr_connection_role_t role;
int inter_router_cost;
qdr_conn_identifier_t *conn_id;
@@ -524,7 +526,9 @@ struct qdr_core_t {
qd_timer_t *work_timer;
qdr_connection_list_t open_connections;
+ qdr_connection_list_t connections_to_activate;
qdr_link_list_t open_links;
+
//
// Agent section
//
@@ -587,7 +591,6 @@ struct qdr_core_t {
uint64_t next_identifier;
sys_mutex_t *id_lock;
-
qdr_forwarder_t *forwarders[QD_TREATMENT_LINK_BALANCED + 1];
};
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/src/router_core/router_core_thread.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_thread.c b/src/router_core/router_core_thread.c
index b359602..5cffeb9 100644
--- a/src/router_core/router_core_thread.c
+++ b/src/router_core/router_core_thread.c
@@ -30,6 +30,18 @@
ALLOC_DEFINE(qdr_action_t);
+static void qdr_activate_connections_CT(qdr_core_t *core)
+{
+ qdr_connection_t *conn = DEQ_HEAD(core->connections_to_activate);
+ while (conn) {
+ DEQ_REMOVE_HEAD_N(ACTIVATE, core->connections_to_activate);
+ conn->in_activate_list = false;
+ core->activate_handler(core->user_context, conn, DEQ_IS_EMPTY(core->connections_to_activate));
+ conn = DEQ_HEAD(core->connections_to_activate);
+ }
+}
+
+
void *router_core_thread(void *arg)
{
qdr_core_t *core = (qdr_core_t*) arg;
@@ -72,6 +84,11 @@ void *router_core_thread(void *arg)
free_qdr_action_t(action);
action = DEQ_HEAD(action_list);
}
+
+ //
+ // Activate all connections that were flagged for activation during the above processing
+ //
+ qdr_activate_connections_CT(core);
}
qd_log(core->log, QD_LOG_INFO, "Router Core thread exited");
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 7b46873..9b6b436 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -712,14 +712,14 @@ qd_router_t *qd_router(qd_dispatch_t *qd, qd_router_mode_t mode, const char *are
}
-static void CORE_connection_activate(void *context, qdr_connection_t *conn)
+static void CORE_connection_activate(void *context, qdr_connection_t *conn, bool awaken)
{
//
// IMPORTANT: This is the only core callback that is invoked on the core
// thread itself. It is imperative that this function do nothing
// apart from setting the activation in the server for the connection.
//
- qd_server_activate((qd_connection_t*) qdr_connection_get_context(conn));
+ qd_server_activate((qd_connection_t*) qdr_connection_get_context(conn), awaken);
}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/152185eb/src/server.c
----------------------------------------------------------------------
diff --git a/src/server.c b/src/server.c
index e78978d..47cbac2 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1580,7 +1580,7 @@ void qd_server_resume(qd_dispatch_t *qd)
}
-void qd_server_activate(qd_connection_t *ctx)
+void qd_server_activate(qd_connection_t *ctx, bool awaken)
{
if (!ctx)
return;
@@ -1591,7 +1591,8 @@ void qd_server_activate(qd_connection_t *ctx)
if (!qdpn_connector_closed(ctor)) {
qdpn_connector_activate(ctor, QDPN_CONNECTOR_WRITABLE);
- qdpn_driver_wakeup(ctx->server->driver);
+ if (awaken)
+ qdpn_driver_wakeup(ctx->server->driver);
}
}
@@ -1668,7 +1669,7 @@ void qd_connection_invoke_deferred(qd_connection_t *conn, qd_deferred_t call, vo
DEQ_INSERT_TAIL(conn->deferred_calls, dc);
sys_mutex_unlock(conn->deferred_call_lock);
- qd_server_activate(conn);
+ qd_server_activate(conn, true);
}
@@ -1676,7 +1677,7 @@ void qd_connection_set_event_stall(qd_connection_t *conn, bool stall)
{
conn->event_stall = stall;
if (!stall)
- qd_server_activate(conn);
+ qd_server_activate(conn, true);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org