From ad37c08f51b80b9a786b932f5491c426fc939999 Mon Sep 17 00:00:00 2001 From: ken Date: Fri, 19 Jul 2024 10:21:21 +0800 Subject: [PATCH] fix bug : leak private connections --- src/Handler.cpp | 2 +- src/List.h | 9 ++++++--- src/Response.cpp | 3 ++- src/Response.h | 4 ++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Handler.cpp b/src/Handler.cpp index b45127b..8c7bcf4 100644 --- a/src/Handler.cpp +++ b/src/Handler.cpp @@ -906,7 +906,7 @@ void Handler::handleResponse(ConnectConnection* s, Request* req, Response* res) default: break; } - if (s && !s->isShared()) { + if (s && !s->isShared() && res->code() != Response::ServerConnectionClose) { if (!c->inTransaction() && !c->inSub(true)) { mConnPool[s->server()->id()]->putPrivateConnection(s); c->detachConnectConnection(); diff --git a/src/List.h b/src/List.h index bb6b555..c91eaa6 100644 --- a/src/List.h +++ b/src/List.h @@ -91,9 +91,12 @@ public: P obj = mHead; if (obj) { Node* n = node((T*)obj); - mHead = n->next(Idx); - if (--mSize == 0) { - mTail = nullptr; + if (mHead == mTail) { + mHead = mTail = nullptr; + mSize = 0; + } else { + mHead = n->next(Idx); + --mSize; } n->reset(Idx); } diff --git a/src/Response.cpp b/src/Response.cpp index 8b699b9..0be7782 100644 --- a/src/Response.cpp +++ b/src/Response.cpp @@ -59,7 +59,8 @@ Response::Response(): Response::Response(GenericCode code): mType(Reply::None), - mInteger(0) + mInteger(0), + mCode(code) { auto r = GenericResponses[code]; mType = r->mType; diff --git a/src/Response.h b/src/Response.h index db75dd6..8b67845 100644 --- a/src/Response.h +++ b/src/Response.h @@ -128,6 +128,9 @@ public: { return mRes; } + GenericCode code() const { + return mCode; + } private: bool getAddr(int& slot, SString& addr, const char* token) const; private: @@ -135,6 +138,7 @@ private: int64_t mInteger; Segment mHead; //for mget Segment mRes; + GenericCode mCode; }; typedef List ResponseList;