From dfa2d31410a7ae02f6dbbce6c8077077359e8445 Mon Sep 17 00:00:00 2001 From: Kaveh Vahedipour Date: Fri, 10 Jun 2016 19:28:06 +0200 Subject: [PATCH] we can shrink cluster --- arangod/Agency/Supervision.cpp | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/arangod/Agency/Supervision.cpp b/arangod/Agency/Supervision.cpp index bec2b40761..2aa857e368 100644 --- a/arangod/Agency/Supervision.cpp +++ b/arangod/Agency/Supervision.cpp @@ -74,6 +74,13 @@ std::vector Supervision::checkDBServers() { Node::Children const serversRegistered = _snapshot(currentServersRegisteredPrefix).children(); + std::vector todelete; + for (auto const& machine : _snapshot(healthPrefix).children()) { + if (machine.first.substr(0,2) == "DB") { + todelete.push_back(machine.first); + } + } + for (auto const& machine : machinesPlanned) { bool good = false; @@ -83,6 +90,9 @@ std::vector Supervision::checkDBServers() { serverID = machine.first; heartbeatTime = _snapshot(syncPrefix + serverID + "/time").toJson(); heartbeatStatus = _snapshot(syncPrefix + serverID + "/status").toJson(); + + todelete.erase( + std::remove(todelete.begin(), todelete.end(), serverID), todelete.end()); try { // Existing lastHeartbeatTime = @@ -149,6 +159,20 @@ std::vector Supervision::checkDBServers() { } + if (!todelete.empty()) { + query_t del = std::make_shared(); + del->openArray(); + del->openArray(); + del->openObject(); + for (auto const& srv : todelete) { + del->add(_agencyPrefix + healthPrefix + srv, VPackValue(VPackValueType::Object)); + del->add("op", VPackValue("delete")); + del->close(); + } + del->close(); del->close(); del->close(); + _agent->write(del); + } + return ret; } @@ -159,6 +183,14 @@ std::vector Supervision::checkCoordinators() { Node::Children const serversRegistered = _snapshot(currentServersRegisteredPrefix).children(); + + std::vector todelete; + for (auto const& machine : _snapshot(healthPrefix).children()) { + if (machine.first.substr(0,2) == "Co") { + todelete.push_back(machine.first); + } + } + for (auto const& machine : machinesPlanned) { bool good = false; @@ -169,6 +201,9 @@ std::vector Supervision::checkCoordinators() { heartbeatTime = _snapshot(syncPrefix + serverID + "/time").toJson(); heartbeatStatus = _snapshot(syncPrefix + serverID + "/status").toJson(); + todelete.erase( + std::remove(todelete.begin(), todelete.end(), serverID), todelete.end()); + try { // Existing lastHeartbeatTime = _snapshot(healthPrefix + serverID + "/LastHeartbeatSent").toJson(); @@ -232,7 +267,22 @@ std::vector Supervision::checkCoordinators() { } + if (!todelete.empty()) { + query_t del = std::make_shared(); + del->openArray(); + del->openArray(); + del->openObject(); + for (auto const& srv : todelete) { + del->add(_agencyPrefix + healthPrefix + srv, VPackValue(VPackValueType::Object)); + del->add("op", VPackValue("delete")); + del->close(); + } + del->close(); del->close(); del->close(); + _agent->write(del); + } + return ret; + } bool Supervision::updateSnapshot() {