diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..3816533 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Publish And Deploy Demo # 自动部署的名称 +on: + push: + branches: + - main + - master + - dev + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@master + - + name: Setup Make + uses: actions/setup-make@master + - + name: Build + run: | + make + mkdir output + cp src/predixy output/predixy + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b375c79 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.idea +*.o +CMakeCache.txt +CMakeFiles/ +output/ +Makefile +cmake_install.cmake +src/predixy \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0140852 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM alpine + +COPY output/conf /app/conf +COPY output/predixy /app/predixy + +WORKDIR /app + +# RUN cat /configs/default.toml +CMD ./prefixy conf/predixy.conf \ No newline at end of file diff --git a/Makefile b/Makefile index ed82317..8b037d6 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,3 @@ - -.PHONY : default debug clean - make = make plt = $(shell uname) ifeq ($(plt), FreeBSD) @@ -17,3 +14,5 @@ debug: clean: @$(make) -C src -f Makefile clean + +.PHONY : default debug clean diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..7481095 --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +make +mkdir -p output/conf +cp src/predixy output/predixy +cp conf/* output/conf \ No newline at end of file diff --git a/src/ClusterServerPool.cpp b/src/ClusterServerPool.cpp index 35591d2..af1974a 100644 --- a/src/ClusterServerPool.cpp +++ b/src/ClusterServerPool.cpp @@ -86,21 +86,46 @@ void ClusterServerPool::refreshRequest(Handler* h) h->handleRequest(req); } +void ClusterServerPool::removeServer(Server* serv) { + if (nullptr == serv) return; + logNotice("redis cluster delete old server %s %s %s %s %s", + serv->name().data(), + serv->addr().data(), + serv->roleStr(), + serv->masterName().data(), + serv->dcName().data()); + ServerGroup* g = getGroup(serv->name()); + if (serv->group() && serv->group() != g) { + serv->group()->remove(serv); + } + auto mapServ = mServs.find(serv->addr()); + if (mapServ != mServs.end()) + { + mServs.erase(mapServ); + } + delete serv; +} + void ClusterServerPool::handleResponse(Handler* h, ConnectConnection* s, Request* req, Response* res) { ClusterNodesParser p; p.set(res->body()); for (auto serv : mServPool) { serv->setUpdating(true); + logNotice("redis old cluster nodes get node %s %s %s %s", + serv->name().data(), + serv->addr().data(), + serv->roleStr(), + serv->masterName().data()); } while (true) { ClusterNodesParser::Status st = p.parse(); if (st == ClusterNodesParser::Node) { - logDebug("redis cluster update parse node %s %s %s %s", - p.nodeId().data(), - p.addr().data(), - p.flags().data(), - p.master().data()); + logNotice("redis update cluster nodes get node %s %s %s %s", + p.nodeId().data(), + p.addr().data(), + p.flags().data(), + p.master().data()); if (p.addr().empty()) { logWarn("redis cluster nodes get node invalid %s %s %s %s", p.nodeId().data(), @@ -189,9 +214,12 @@ void ClusterServerPool::handleResponse(Handler* h, ConnectConnection* s, Request return; } } - for (auto serv : mServPool) { + for (std::vector::iterator it = mServPool.begin(); it != mServPool.end();) { + auto serv = *it; if (serv->updating()) { serv->setUpdating(false); + it = mServPool.erase(it); //删除不在集群中节点 + removeServer(serv); continue; } if (serv->role() == Server::Master) { @@ -229,6 +257,7 @@ void ClusterServerPool::handleResponse(Handler* h, ConnectConnection* s, Request g->remove(serv); } } + ++it; } } diff --git a/src/ClusterServerPool.h b/src/ClusterServerPool.h index af9e27d..c6536a1 100644 --- a/src/ClusterServerPool.h +++ b/src/ClusterServerPool.h @@ -25,6 +25,7 @@ public: { return mServPool; } + void removeServer(Server* srv); private: Server* getServer(Handler* h, Request* req, const String& key) const; void refreshRequest(Handler* h); diff --git a/src/ConnectConnection.h b/src/ConnectConnection.h index 315acd1..fabe118 100644 --- a/src/ConnectConnection.h +++ b/src/ConnectConnection.h @@ -13,15 +13,23 @@ #include "Request.h" #include "ResponseParser.h" +enum ConnectConnectionListIndex +{ + PostConn = 0, + PrivateConn, + + ConnListSize +}; + class ConnectConnection : public ConnectSocket, public Connection, - public ListNode, + public ListNode, public DequeNode { public: typedef ConnectConnection Value; - typedef ListNode ListNodeType; + typedef ListNode ListNodeType; typedef DequeNode DequeNodeType; typedef Alloc Allocator; public: @@ -96,7 +104,8 @@ private: bool mReadonly; }; -typedef List ConnectConnectionList; +typedef List PostConnectConnectionList; +typedef List PrivateConnectConnectionList; typedef Deque ConnectConnectionDeque; typedef ConnectConnection::Allocator ConnectConnectionAlloc; diff --git a/src/ConnectConnectionPool.h b/src/ConnectConnectionPool.h index 022fe28..71ee1ed 100644 --- a/src/ConnectConnectionPool.h +++ b/src/ConnectConnectionPool.h @@ -71,7 +71,7 @@ private: Server* mServ; int mPendRequests; std::vector mShareConns; - std::vector mPrivateConns; + std::vector mPrivateConns; ServerStats mStats; std::vector mLatencyMonitors; }; diff --git a/src/Handler.h b/src/Handler.h index a2fc55f..1a248e2 100644 --- a/src/Handler.h +++ b/src/Handler.h @@ -120,7 +120,7 @@ private: std::vector mConnPool; AcceptConnectionDeque mAcceptConns; AcceptConnectionList mPostAcceptConns; - ConnectConnectionList mPostConnectConns; + PostConnectConnectionList mPostConnectConns; ConnectConnectionDeque mWaitConnectConns; long mStatsVer; HandlerStats mStats; diff --git a/src/ServerGroup.cpp b/src/ServerGroup.cpp index e5d088c..5e4cb74 100644 --- a/src/ServerGroup.cpp +++ b/src/ServerGroup.cpp @@ -49,14 +49,16 @@ Server* ServerGroup::getServer(Handler* h, Request* req) const Server* serv = nullptr; if (req->requireWrite()) { int cnt = mServs.size(); - for (int i = 0; i < cnt; ++i) { + for (int i = cnt-1; i >= 0; --i) { Server* s = mServs[i]; if (!s->online()) { continue; } if (s->role() == Server::Master) { serv = s; - break; + if (!s->fail()){ + break; + } } } } else if (auto dataCenter = mPool->proxy()->dataCenter()) {