fix bug : leak private connections

This commit is contained in:
ken 2024-07-19 10:21:21 +08:00
parent ca1630a6b4
commit ad37c08f51
4 changed files with 13 additions and 5 deletions

View File

@ -906,7 +906,7 @@ void Handler::handleResponse(ConnectConnection* s, Request* req, Response* res)
default: default:
break; break;
} }
if (s && !s->isShared()) { if (s && !s->isShared() && res->code() != Response::ServerConnectionClose) {
if (!c->inTransaction() && !c->inSub(true)) { if (!c->inTransaction() && !c->inSub(true)) {
mConnPool[s->server()->id()]->putPrivateConnection(s); mConnPool[s->server()->id()]->putPrivateConnection(s);
c->detachConnectConnection(); c->detachConnectConnection();

View File

@ -91,9 +91,12 @@ public:
P obj = mHead; P obj = mHead;
if (obj) { if (obj) {
Node* n = node((T*)obj); Node* n = node((T*)obj);
mHead = n->next(Idx); if (mHead == mTail) {
if (--mSize == 0) { mHead = mTail = nullptr;
mTail = nullptr; mSize = 0;
} else {
mHead = n->next(Idx);
--mSize;
} }
n->reset(Idx); n->reset(Idx);
} }

View File

@ -59,7 +59,8 @@ Response::Response():
Response::Response(GenericCode code): Response::Response(GenericCode code):
mType(Reply::None), mType(Reply::None),
mInteger(0) mInteger(0),
mCode(code)
{ {
auto r = GenericResponses[code]; auto r = GenericResponses[code];
mType = r->mType; mType = r->mType;

View File

@ -128,6 +128,9 @@ public:
{ {
return mRes; return mRes;
} }
GenericCode code() const {
return mCode;
}
private: private:
bool getAddr(int& slot, SString<Const::MaxAddrLen>& addr, const char* token) const; bool getAddr(int& slot, SString<Const::MaxAddrLen>& addr, const char* token) const;
private: private:
@ -135,6 +138,7 @@ private:
int64_t mInteger; int64_t mInteger;
Segment mHead; //for mget Segment mHead; //for mget
Segment mRes; Segment mRes;
GenericCode mCode;
}; };
typedef List<Response> ResponseList; typedef List<Response> ResponseList;