diff options
author | Trond Norbye <trond.norbye@gmail.com> | 2011-05-05 13:11:00 +0200 |
---|---|---|
committer | Trond Norbye <trond.norbye@gmail.com> | 2011-07-11 16:22:38 +0200 |
commit | c13692d3df1ebe7f1f7a1d18baecd0580405cfe4 (patch) | |
tree | 9cd590607909f52cb70b04c11842e56e40c43273 | |
parent | c5c3c7d0489edc2ff098eed006c6ea358b33d320 (diff) | |
download | memcached-c13692d3df1ebe7f1f7a1d18baecd0580405cfe4.tar.gz |
Clean up notify_io_complete for tap disconnect
-rw-r--r-- | daemon/thread.c | 40 |
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)) { |