From 45d76cf5014fa2cb6d70646861a7a022967d0912 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 26 Feb 2018 22:40:24 +0900 Subject: [PATCH] nghttpx: Close listening socket on graceful shutdown --- src/shrpx.cc | 7 ++++++- src/shrpx_connection_handler.cc | 2 ++ src/shrpx_connection_handler.h | 1 + src/shrpx_worker_process.cc | 8 +++----- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/shrpx.cc b/src/shrpx.cc index 138fc357..c9010dd6 100644 --- a/src/shrpx.cc +++ b/src/shrpx.cc @@ -573,9 +573,14 @@ void signal_cb(struct ev_loop *loop, ev_signal *w, int revents) { case EXEC_BINARY_SIGNAL: exec_binary(); return; - case GRACEFUL_SHUTDOWN_SIGNAL: + case GRACEFUL_SHUTDOWN_SIGNAL: { + auto &listenerconf = get_config()->conn.listener; + for (auto &addr : listenerconf.addrs) { + close(addr.fd); + } ipc_send(wp, SHRPX_IPC_GRACEFUL_SHUTDOWN); return; + } case RELOAD_SIGNAL: reload_config(wp); return; diff --git a/src/shrpx_connection_handler.cc b/src/shrpx_connection_handler.cc index ca84d53c..19985aaf 100644 --- a/src/shrpx_connection_handler.cc +++ b/src/shrpx_connection_handler.cc @@ -452,6 +452,8 @@ void ConnectionHandler::add_acceptor(std::unique_ptr h) { acceptors_.push_back(std::move(h)); } +void ConnectionHandler::delete_acceptor() { acceptors_.clear(); } + void ConnectionHandler::enable_acceptor() { for (auto &a : acceptors_) { a->enable(); diff --git a/src/shrpx_connection_handler.h b/src/shrpx_connection_handler.h index 56a58581..4c5ce743 100644 --- a/src/shrpx_connection_handler.h +++ b/src/shrpx_connection_handler.h @@ -117,6 +117,7 @@ public: struct ev_loop *get_loop() const; Worker *get_single_worker() const; void add_acceptor(std::unique_ptr h); + void delete_acceptor(); void enable_acceptor(); void disable_acceptor(); void sleep_acceptor(ev_tstamp t); diff --git a/src/shrpx_worker_process.cc b/src/shrpx_worker_process.cc index f760ad7e..647c167d 100644 --- a/src/shrpx_worker_process.cc +++ b/src/shrpx_worker_process.cc @@ -114,12 +114,10 @@ void graceful_shutdown(ConnectionHandler *conn_handler) { conn_handler->set_graceful_shutdown(true); - conn_handler->disable_acceptor(); - - // After disabling accepting new connection, dispatch incoming - // connection in backlog. - + // TODO What happens for the connections not established in the + // kernel? conn_handler->accept_pending_connection(); + conn_handler->delete_acceptor(); conn_handler->graceful_shutdown_worker();