mirror of
https://github.com/joyieldInc/predixy.git
synced 2025-12-24 22:46:41 +08:00
fix server connection leak for list block command
This commit is contained in:
parent
017ae6461b
commit
1569b57bd7
@ -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()) {
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user