summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrond Norbye <trond.norbye@gmail.com>2011-05-05 13:11:00 +0200
committerTrond Norbye <trond.norbye@gmail.com>2011-07-11 16:22:38 +0200
commitc13692d3df1ebe7f1f7a1d18baecd0580405cfe4 (patch)
tree9cd590607909f52cb70b04c11842e56e40c43273
parentc5c3c7d0489edc2ff098eed006c6ea358b33d320 (diff)
downloadmemcached-c13692d3df1ebe7f1f7a1d18baecd0580405cfe4.tar.gz
Clean up notify_io_complete for tap disconnect
-rw-r--r--daemon/thread.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/daemon/thread.c b/daemon/thread.c
index 11d821b..99479a9 100644
--- a/daemon/thread.c
+++ b/daemon/thread.c
@@ -536,7 +536,7 @@ static void libevent_tap_process(int fd, short which, void *arg) {
for (size_t i = 0; i < n_pending_close; ++i) {
conn *ce = pending_close[i];
if (ce->refcount == 1) {
- settings.extensions.logger->log(EXTENSION_LOG_WARNING, NULL,
+ settings.extensions.logger->log(EXTENSION_LOG_DEBUG, NULL,
"OK, time to nuke: %p\n",
(void*)ce);
assert(ce->next == NULL);
@@ -590,19 +590,33 @@ void notify_io_complete(const void *cookie, ENGINE_ERROR_CODE status)
*/
if (status == ENGINE_DISCONNECT && conn->thread == tap_thread) {
LOCK_THREAD(conn->thread);
- if (conn->sfd != INVALID_SOCKET) {
- unregister_event(conn);
- safe_close(conn->sfd);
- conn->sfd = INVALID_SOCKET;
- }
- settings.extensions.logger->log(EXTENSION_LOG_DEBUG, NULL,
- "Immediate close of %p\n",
- conn);
- conn_set_state(conn, conn_immediate_close);
- conn->thread->pending_io = list_remove(conn->thread->pending_io, conn);
- if (number_of_pending(conn, conn->thread->pending_close) == 0) {
- enlist_conn(conn, &conn->thread->pending_close);
+ /** Remove the connection from both of the lists */
+ conn->thread->pending_io = list_remove(conn->thread->pending_io,
+ conn);
+ conn->thread->pending_close = list_remove(conn->thread->pending_close,
+ conn);
+
+
+ if (conn->state == conn_pending_close ||
+ conn->state == conn_immediate_close) {
+ if (conn->refcount == 1) {
+ settings.extensions.logger->log(EXTENSION_LOG_DEBUG, NULL,
+ "Complete shutdown of %p",
+ conn);
+ conn_set_state(conn, conn_immediate_close);
+ enlist_conn(conn, &conn->thread->pending_close);
+ } else {
+ settings.extensions.logger->log(EXTENSION_LOG_DEBUG, NULL,
+ "Keep on waiting for shutdown of %p",
+ conn);
+ }
+ } else {
+ settings.extensions.logger->log(EXTENSION_LOG_DEBUG, NULL,
+ "Engine requested shutdown of %p",
+ conn);
+ conn_set_state(conn, conn_closing);
+ enlist_conn(conn, &conn->thread->pending_io);
}
if (!is_thread_me(conn->thread)) {