From 1569b57bd761fda1e631fe21958d96e23d2dbb17 Mon Sep 17 00:00:00 2001 From: fortrue Date: Wed, 6 Sep 2017 17:09:16 +0800 Subject: [PATCH] fix server connection leak for list block command --- src/ConnectConnectionPool.cpp | 18 ------------------ src/ConnectConnectionPool.h | 1 - src/Handler.cpp | 22 ++++++++++------------ 3 files changed, 10 insertions(+), 31 deletions(-) diff --git a/src/ConnectConnectionPool.cpp b/src/ConnectConnectionPool.cpp index d87964c..f6db05b 100644 --- a/src/ConnectConnectionPool.cpp +++ b/src/ConnectConnectionPool.cpp @@ -107,24 +107,6 @@ void ConnectConnectionPool::putPrivateConnection(ConnectConnection* s) } } -void ConnectConnectionPool::putTransactionConnection(ConnectConnection* s, bool inWatch, bool inMulti) -{ - if (s->good()) { - if (inMulti) { - RequestPtr req = RequestAlloc::create(Request::DiscardServ); - mHandler->handleRequest(req, s); - logDebug("h %d s %s %d discard req %ld", - mHandler->id(), s->peer(), s->fd(), req->id()); - } else if (inWatch) { - RequestPtr req = RequestAlloc::create(Request::UnwatchServ); - mHandler->handleRequest(req, s); - logDebug("h %d s %s %d unwatch req %ld", - mHandler->id(), s->peer(), s->fd(), req->id()); - } - } - putPrivateConnection(s); -} - bool ConnectConnectionPool::init(ConnectConnection* c) { if (!c->setNonBlock()) { diff --git a/src/ConnectConnectionPool.h b/src/ConnectConnectionPool.h index 94b8228..022fe28 100644 --- a/src/ConnectConnectionPool.h +++ b/src/ConnectConnectionPool.h @@ -24,7 +24,6 @@ public: ConnectConnection* getShareConnection(int db=0); ConnectConnection* getPrivateConnection(int db=0); void putPrivateConnection(ConnectConnection* s); - void putTransactionConnection(ConnectConnection* s, bool inWatch, bool inMulti); void check(); Server* server() const { diff --git a/src/Handler.cpp b/src/Handler.cpp index e43f36b..6afb761 100644 --- a/src/Handler.cpp +++ b/src/Handler.cpp @@ -180,15 +180,9 @@ void Handler::postAcceptConnectionEvent() mEventLoop->delSocket(c); if (auto s = c->connectConnection()) { auto cp = mConnPool[s->server()->id()]; - if (c->inTransaction()) { - cp->putTransactionConnection(s, c->inPendWatch(), c->inPendMulti()); - } else if (c->inSub(true)) { - cp->putPrivateConnection(s); - s->setStatus(Connection::LogicError); - addPostEvent(s, Multiplexor::ErrorEvent); - } else { - cp->putPrivateConnection(s); - } + s->setStatus(Connection::LogicError); + addPostEvent(s, Multiplexor::ErrorEvent); + cp->putPrivateConnection(s); c->detachConnectConnection(); s->detachAcceptConnection(); } @@ -644,6 +638,10 @@ void Handler::postHandleRequest(Request* req, ConnectConnection* s) case Command::Blpop: case Command::Brpop: case Command::Brpoplpush: + c->setBlockRequest(true); + c->attachConnectConnection(s); + s->attachAcceptConnection(c); + break; case Command::Unwatch: case Command::Exec: case Command::Discard: @@ -854,11 +852,11 @@ void Handler::handleResponse(ConnectConnection* s, Request* req, Response* res) default: break; } - if (auto cs = c->connectConnection()) { + if (s && !s->isShared()) { if (!c->inTransaction() && !c->inSub(true)) { - mConnPool[cs->server()->id()]->putPrivateConnection(cs); + mConnPool[s->server()->id()]->putPrivateConnection(s); c->detachConnectConnection(); - cs->detachAcceptConnection(); + s->detachAcceptConnection(); } } }