1.fix multi-keys request leader self reference

2.adjust alloc implement
This commit is contained in:
fortrue 2018-05-16 09:56:43 +08:00
parent bbbe798629
commit 7fda4b77c1
9 changed files with 37 additions and 29 deletions

View File

@ -29,6 +29,7 @@ public:
typedef AcceptConnection Value; typedef AcceptConnection Value;
typedef ListNode<AcceptConnection, SharePtr<AcceptConnection>> ListNodeType; typedef ListNode<AcceptConnection, SharePtr<AcceptConnection>> ListNodeType;
typedef DequeNode<AcceptConnection, SharePtr<AcceptConnection>> DequeNodeType; typedef DequeNode<AcceptConnection, SharePtr<AcceptConnection>> DequeNodeType;
typedef Alloc<AcceptConnection, Const::AcceptConnectionAllocCacheSize> Allocator;
public: public:
AcceptConnection(int fd, sockaddr* addr, socklen_t len); AcceptConnection(int fd, sockaddr* addr, socklen_t len);
~AcceptConnection(); ~AcceptConnection();
@ -97,6 +98,6 @@ private:
typedef List<AcceptConnection> AcceptConnectionList; typedef List<AcceptConnection> AcceptConnectionList;
typedef Deque<AcceptConnection> AcceptConnectionDeque; typedef Deque<AcceptConnection> AcceptConnectionDeque;
typedef Alloc<AcceptConnection, Const::AcceptConnectionAllocCacheSize> AcceptConnectionAlloc; typedef AcceptConnection::Allocator AcceptConnectionAlloc;
#endif #endif

View File

@ -76,7 +76,7 @@ public:
} }
UsedMemory += allocSize<T>(); UsedMemory += allocSize<T>();
if (MaxMemory == 0 || UsedMemory <= MaxMemory) { if (MaxMemory == 0 || UsedMemory <= MaxMemory) {
void* p = ::operator new(allocSize<T>()); void* p = ::operator new(allocSize<T>(), std::nothrow);
if (p) { if (p) {
try { try {
obj = new (p) T(args...); obj = new (p) T(args...);
@ -145,7 +145,7 @@ public:
{ {
int n = --mCnt; int n = --mCnt;
if (n == 0) { if (n == 0) {
Alloc<T>::destroy(static_cast<T*>(this)); T::Allocator::destroy(static_cast<T*>(this));
} else if (n < 0) { } else if (n < 0) {
logError("unref object %p with cnt %d", this, n); logError("unref object %p with cnt %d", this, n);
abort(); abort();

View File

@ -23,6 +23,7 @@ class Buffer :
public RefCntObj<Buffer> public RefCntObj<Buffer>
{ {
public: public:
typedef Alloc<Buffer, Const::BufferAllocCacheSize> Allocator;
static const int MaxBufFmtAppendLen = 8192; static const int MaxBufFmtAppendLen = 8192;
public: public:
Buffer& operator=(const Buffer&); Buffer& operator=(const Buffer&);
@ -92,12 +93,13 @@ private:
}; };
typedef List<Buffer> BufferList; typedef List<Buffer> BufferList;
typedef Buffer::Allocator BufferAlloc;
template<> template<>
inline int allocSize<Buffer>() inline int allocSize<Buffer>()
{ {
return Buffer::getSize() + sizeof(Buffer); return Buffer::getSize() + sizeof(Buffer);
} }
typedef Alloc<Buffer, Const::BufferAllocCacheSize> BufferAlloc;
struct BufferPos struct BufferPos
{ {

View File

@ -32,8 +32,8 @@ namespace Const
static const int MaxCmdLen = 32; static const int MaxCmdLen = 32;
static const int MaxKeyLen = 512; static const int MaxKeyLen = 512;
static const int BufferAllocCacheSize = 64; static const int BufferAllocCacheSize = 64;
static const int RequestAllocCacheSize = 32; static const int RequestAllocCacheSize = 128;
static const int ResponseAllocCacheSize = 32; static const int ResponseAllocCacheSize = 128;
static const int AcceptConnectionAllocCacheSize = 32; static const int AcceptConnectionAllocCacheSize = 32;
static const int ConnectConnectionAllocCacheSize = 4; static const int ConnectConnectionAllocCacheSize = 4;
}; };

View File

@ -23,6 +23,7 @@ public:
typedef ConnectConnection Value; typedef ConnectConnection Value;
typedef ListNode<ConnectConnection> ListNodeType; typedef ListNode<ConnectConnection> ListNodeType;
typedef DequeNode<ConnectConnection> DequeNodeType; typedef DequeNode<ConnectConnection> DequeNodeType;
typedef Alloc<ConnectConnection, Const::ConnectConnectionAllocCacheSize> Allocator;
public: public:
ConnectConnection(Server* s, bool shared); ConnectConnection(Server* s, bool shared);
~ConnectConnection(); ~ConnectConnection();
@ -97,6 +98,6 @@ private:
typedef List<ConnectConnection> ConnectConnectionList; typedef List<ConnectConnection> ConnectConnectionList;
typedef Deque<ConnectConnection> ConnectConnectionDeque; typedef Deque<ConnectConnection> ConnectConnectionDeque;
typedef Alloc<ConnectConnection, Const::ConnectConnectionAllocCacheSize> ConnectConnectionAlloc; typedef ConnectConnection::Allocator ConnectConnectionAlloc;
#endif #endif

View File

@ -27,7 +27,7 @@ BufferPtr Connection::getBuffer(Handler* h, bool allowNew)
} }
} }
if (!mBuf || mBuf->full()) { if (!mBuf || mBuf->full()) {
BufferPtr buf = Alloc<Buffer>::create(); BufferPtr buf = BufferAlloc::create();
if (mBuf) { if (mBuf) {
mBuf->concat(buf); mBuf->concat(buf);
} }

View File

@ -98,6 +98,7 @@ Request::Request(GenericCode code):
Request::~Request() Request::~Request()
{ {
clear();
} }
void Request::clear() void Request::clear()
@ -155,13 +156,14 @@ void Request::set(const RequestParser& p, Request* leader)
} }
mHead = r->mReq; mHead = r->mReq;
mReq = p.request(); mReq = p.request();
mLeader = leader;
if (leader == this) { if (leader == this) {
if (mType == Command::Mset || mType == Command::Msetnx) { if (mType == Command::Mset || mType == Command::Msetnx) {
mFollowers = (p.argNum() - 1) >> 1; mFollowers = (p.argNum() - 1) >> 1;
} else { } else {
mFollowers = p.argNum() - 1; mFollowers = p.argNum() - 1;
} }
} else {
mLeader = leader;
} }
} else { } else {
mReq = p.request(); mReq = p.request();
@ -338,49 +340,49 @@ int Request::fill(IOVec* vecs, int len)
void Request::setResponse(Response* res) void Request::setResponse(Response* res)
{ {
mDone = true; mDone = true;
if (mLeader) { if (Request* ld = leader()) {
mLeader->mFollowersDone += 1; ld->mFollowersDone += 1;
switch (mType) { switch (mType) {
case Command::Mget: case Command::Mget:
mRes = res; mRes = res;
break; break;
case Command::Mset: case Command::Mset:
if (Response* leaderRes = mLeader->getResponse()) { if (Response* leaderRes = ld->getResponse()) {
if (res->isError() && !leaderRes->isError()) { if (res->isError() && !leaderRes->isError()) {
mLeader->mRes = res; ld->mRes = res;
} }
} else { } else {
mLeader->mRes = res; ld->mRes = res;
} }
break; break;
case Command::Msetnx: case Command::Msetnx:
if (Response* leaderRes = mLeader->getResponse()) { if (Response* leaderRes = ld->getResponse()) {
if (!leaderRes->isError() && if (!leaderRes->isError() &&
(res->isError() || res->integer() == 0)) { (res->isError() || res->integer() == 0)) {
mLeader->mRes = res; ld->mRes = res;
} }
} else { } else {
mLeader->mRes = res; ld->mRes = res;
} }
break; break;
case Command::Touch: case Command::Touch:
case Command::Exists: case Command::Exists:
case Command::Del: case Command::Del:
case Command::Unlink: case Command::Unlink:
if (!mLeader->mRes) { if (!ld->mRes) {
mLeader->mRes = res; ld->mRes = res;
} }
if (mLeader->isDone()) { if (ld->isDone()) {
mLeader->mRes->set(mLeader->mRes->integer()); ld->mRes->set(ld->mRes->integer());
} }
break; break;
case Command::ScriptLoad: case Command::ScriptLoad:
if (Response* leaderRes = mLeader->getResponse()) { if (Response* leaderRes = ld->getResponse()) {
if (leaderRes->isString() && !res->isString()) { if (leaderRes->isString() && !res->isString()) {
mLeader->mRes = res; ld->mRes = res;
} }
} else { } else {
mLeader->mRes = res; ld->mRes = res;
} }
break; break;
default: default:
@ -395,7 +397,7 @@ void Request::setResponse(Response* res)
bool Request::isDone() const bool Request::isDone() const
{ {
if (mLeader == this) { if (isLeader()) {
switch (mType) { switch (mType) {
case Command::Mget: case Command::Mget:
case Command::Psubscribe: case Command::Psubscribe:

View File

@ -25,6 +25,7 @@ class Request :
public: public:
typedef Request Value; typedef Request Value;
typedef ListNode<Request, SharePtr<Request>, RequestListIndex::Size> ListNodeType; typedef ListNode<Request, SharePtr<Request>, RequestListIndex::Size> ListNodeType;
typedef Alloc<Request, Const::RequestAllocCacheSize> Allocator;
static const int MaxRedirectLimit = 3; static const int MaxRedirectLimit = 3;
enum GenericCode enum GenericCode
{ {
@ -119,11 +120,11 @@ public:
} }
Request* leader() const Request* leader() const
{ {
return mLeader; return isLeader() ? const_cast<Request*>(this) : (Request*)mLeader;
} }
bool isLeader() const bool isLeader() const
{ {
return mLeader == this; return mFollowers > 0;
} }
bool isDelivered() const bool isDelivered() const
{ {
@ -181,6 +182,6 @@ private:
typedef List<Request, RequestListIndex::Recv> RecvRequestList; typedef List<Request, RequestListIndex::Recv> RecvRequestList;
typedef List<Request, RequestListIndex::Send> SendRequestList; typedef List<Request, RequestListIndex::Send> SendRequestList;
typedef Alloc<Request, Const::RequestAllocCacheSize> RequestAlloc; typedef Request::Allocator RequestAlloc;
#endif #endif

View File

@ -18,6 +18,7 @@ class Response :
public: public:
typedef Response Value; typedef Response Value;
typedef ListNode<Response, SharePtr<Response>> ListNodeType; typedef ListNode<Response, SharePtr<Response>> ListNodeType;
typedef Alloc<Response, Const::ResponseAllocCacheSize> Allocator;
enum GenericCode enum GenericCode
{ {
Pong, Pong,
@ -137,6 +138,6 @@ private:
}; };
typedef List<Response> ResponseList; typedef List<Response> ResponseList;
typedef Alloc<Response, Const::ResponseAllocCacheSize> ResponseAlloc; typedef Response::Allocator ResponseAlloc;
#endif #endif