From 7fda4b77c1e6db8276a3a516cdd76ded8d0be3f7 Mon Sep 17 00:00:00 2001 From: fortrue Date: Wed, 16 May 2018 09:56:43 +0800 Subject: [PATCH] 1.fix multi-keys request leader self reference 2.adjust alloc implement --- src/AcceptConnection.h | 3 ++- src/Alloc.h | 4 ++-- src/Buffer.h | 4 +++- src/Common.h | 4 ++-- src/ConnectConnection.h | 3 ++- src/Connection.cpp | 2 +- src/Request.cpp | 36 +++++++++++++++++++----------------- src/Request.h | 7 ++++--- src/Response.h | 3 ++- 9 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/AcceptConnection.h b/src/AcceptConnection.h index bcc800f..f2754ad 100644 --- a/src/AcceptConnection.h +++ b/src/AcceptConnection.h @@ -29,6 +29,7 @@ public: typedef AcceptConnection Value; typedef ListNode> ListNodeType; typedef DequeNode> DequeNodeType; + typedef Alloc Allocator; public: AcceptConnection(int fd, sockaddr* addr, socklen_t len); ~AcceptConnection(); @@ -97,6 +98,6 @@ private: typedef List AcceptConnectionList; typedef Deque AcceptConnectionDeque; -typedef Alloc AcceptConnectionAlloc; +typedef AcceptConnection::Allocator AcceptConnectionAlloc; #endif diff --git a/src/Alloc.h b/src/Alloc.h index 41cce3d..3797ac7 100644 --- a/src/Alloc.h +++ b/src/Alloc.h @@ -76,7 +76,7 @@ public: } UsedMemory += allocSize(); if (MaxMemory == 0 || UsedMemory <= MaxMemory) { - void* p = ::operator new(allocSize()); + void* p = ::operator new(allocSize(), std::nothrow); if (p) { try { obj = new (p) T(args...); @@ -145,7 +145,7 @@ public: { int n = --mCnt; if (n == 0) { - Alloc::destroy(static_cast(this)); + T::Allocator::destroy(static_cast(this)); } else if (n < 0) { logError("unref object %p with cnt %d", this, n); abort(); diff --git a/src/Buffer.h b/src/Buffer.h index b7b9a09..acb3d14 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -23,6 +23,7 @@ class Buffer : public RefCntObj { public: + typedef Alloc Allocator; static const int MaxBufFmtAppendLen = 8192; public: Buffer& operator=(const Buffer&); @@ -92,12 +93,13 @@ private: }; typedef List BufferList; +typedef Buffer::Allocator BufferAlloc; + template<> inline int allocSize() { return Buffer::getSize() + sizeof(Buffer); } -typedef Alloc BufferAlloc; struct BufferPos { diff --git a/src/Common.h b/src/Common.h index 07e3e52..b7f15ab 100644 --- a/src/Common.h +++ b/src/Common.h @@ -32,8 +32,8 @@ namespace Const static const int MaxCmdLen = 32; static const int MaxKeyLen = 512; static const int BufferAllocCacheSize = 64; - static const int RequestAllocCacheSize = 32; - static const int ResponseAllocCacheSize = 32; + static const int RequestAllocCacheSize = 128; + static const int ResponseAllocCacheSize = 128; static const int AcceptConnectionAllocCacheSize = 32; static const int ConnectConnectionAllocCacheSize = 4; }; diff --git a/src/ConnectConnection.h b/src/ConnectConnection.h index 44b6482..315acd1 100644 --- a/src/ConnectConnection.h +++ b/src/ConnectConnection.h @@ -23,6 +23,7 @@ public: typedef ConnectConnection Value; typedef ListNode ListNodeType; typedef DequeNode DequeNodeType; + typedef Alloc Allocator; public: ConnectConnection(Server* s, bool shared); ~ConnectConnection(); @@ -97,6 +98,6 @@ private: typedef List ConnectConnectionList; typedef Deque ConnectConnectionDeque; -typedef Alloc ConnectConnectionAlloc; +typedef ConnectConnection::Allocator ConnectConnectionAlloc; #endif diff --git a/src/Connection.cpp b/src/Connection.cpp index 40c6de2..38409dc 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -27,7 +27,7 @@ BufferPtr Connection::getBuffer(Handler* h, bool allowNew) } } if (!mBuf || mBuf->full()) { - BufferPtr buf = Alloc::create(); + BufferPtr buf = BufferAlloc::create(); if (mBuf) { mBuf->concat(buf); } diff --git a/src/Request.cpp b/src/Request.cpp index ec03b40..842242f 100644 --- a/src/Request.cpp +++ b/src/Request.cpp @@ -98,6 +98,7 @@ Request::Request(GenericCode code): Request::~Request() { + clear(); } void Request::clear() @@ -155,13 +156,14 @@ void Request::set(const RequestParser& p, Request* leader) } mHead = r->mReq; mReq = p.request(); - mLeader = leader; if (leader == this) { if (mType == Command::Mset || mType == Command::Msetnx) { mFollowers = (p.argNum() - 1) >> 1; } else { mFollowers = p.argNum() - 1; } + } else { + mLeader = leader; } } else { mReq = p.request(); @@ -338,49 +340,49 @@ int Request::fill(IOVec* vecs, int len) void Request::setResponse(Response* res) { mDone = true; - if (mLeader) { - mLeader->mFollowersDone += 1; + if (Request* ld = leader()) { + ld->mFollowersDone += 1; switch (mType) { case Command::Mget: mRes = res; break; case Command::Mset: - if (Response* leaderRes = mLeader->getResponse()) { + if (Response* leaderRes = ld->getResponse()) { if (res->isError() && !leaderRes->isError()) { - mLeader->mRes = res; + ld->mRes = res; } } else { - mLeader->mRes = res; + ld->mRes = res; } break; case Command::Msetnx: - if (Response* leaderRes = mLeader->getResponse()) { + if (Response* leaderRes = ld->getResponse()) { if (!leaderRes->isError() && (res->isError() || res->integer() == 0)) { - mLeader->mRes = res; + ld->mRes = res; } } else { - mLeader->mRes = res; + ld->mRes = res; } break; case Command::Touch: case Command::Exists: case Command::Del: case Command::Unlink: - if (!mLeader->mRes) { - mLeader->mRes = res; + if (!ld->mRes) { + ld->mRes = res; } - if (mLeader->isDone()) { - mLeader->mRes->set(mLeader->mRes->integer()); + if (ld->isDone()) { + ld->mRes->set(ld->mRes->integer()); } break; case Command::ScriptLoad: - if (Response* leaderRes = mLeader->getResponse()) { + if (Response* leaderRes = ld->getResponse()) { if (leaderRes->isString() && !res->isString()) { - mLeader->mRes = res; + ld->mRes = res; } } else { - mLeader->mRes = res; + ld->mRes = res; } break; default: @@ -395,7 +397,7 @@ void Request::setResponse(Response* res) bool Request::isDone() const { - if (mLeader == this) { + if (isLeader()) { switch (mType) { case Command::Mget: case Command::Psubscribe: diff --git a/src/Request.h b/src/Request.h index 4d8e431..1f04102 100644 --- a/src/Request.h +++ b/src/Request.h @@ -25,6 +25,7 @@ class Request : public: typedef Request Value; typedef ListNode, RequestListIndex::Size> ListNodeType; + typedef Alloc Allocator; static const int MaxRedirectLimit = 3; enum GenericCode { @@ -119,11 +120,11 @@ public: } Request* leader() const { - return mLeader; + return isLeader() ? const_cast(this) : (Request*)mLeader; } bool isLeader() const { - return mLeader == this; + return mFollowers > 0; } bool isDelivered() const { @@ -181,6 +182,6 @@ private: typedef List RecvRequestList; typedef List SendRequestList; -typedef Alloc RequestAlloc; +typedef Request::Allocator RequestAlloc; #endif diff --git a/src/Response.h b/src/Response.h index 7634492..db75dd6 100644 --- a/src/Response.h +++ b/src/Response.h @@ -18,6 +18,7 @@ class Response : public: typedef Response Value; typedef ListNode> ListNodeType; + typedef Alloc Allocator; enum GenericCode { Pong, @@ -137,6 +138,6 @@ private: }; typedef List ResponseList; -typedef Alloc ResponseAlloc; +typedef Response::Allocator ResponseAlloc; #endif