diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ec708cd --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,42 @@ +name: Publish And Deploy Demo # 自动部署的名称 +on: + push: + master: # 当我们提交代码为tag 是以'v'开头的时候才会触发自动部署到服务端 如 git push tag v0.1.0 + +jobs: + build-and-deploy: + runs-on: ubuntu-latest # 运行环境,告诉它运行在什么环境 + steps: # 步骤 + + # 第一步:下载源码(CI/CD拉取代码到自己的本地) + - name: Checkout + uses: actions/checkout@master + + # 第二步:打包构建 + - name: Build + uses: actions/setup-make@master + - run: make # 安装第三方包 + + # 第三步:发布 Release + - name: Create Release # 创建Release,可以在仓库看到一个个版本 + id: create_release + uses: actions/create-release@master + env: + GITHUB_TOKEN: ${{ secrets.TOKEN }} # 之前GitHub添加的Token + with: + tag_name: ${{ github.ref }} # (tag)标签名称 + release_name: Release ${{ github.ref }} + draft: false # 是否是草稿 + prerelease: false # 是否是预发布 + + # 第四步:上传构建结果到 Release(把打包的tgz上传到Release) + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@master + env: + GITHUB_TOKEN: ${{ secrets.TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} # 上传地址,通过创建Release获取到的 + asset_path: ./release.tgz # 要上传文件 + asset_name: release.tgz # 上传后的文件名 + asset_content_type: application/x-tgz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ 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/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()) {