From 54cc026d3471f86a364818b01ae33397ec74e4e3 Mon Sep 17 00:00:00 2001 From: Kaveh Vahedipour Date: Fri, 17 Aug 2018 10:57:45 +0200 Subject: [PATCH] servers should be retrying registration until successful (#5919) --- arangod/Cluster/ClusterFeature.cpp | 41 +++++++++++++++++------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/arangod/Cluster/ClusterFeature.cpp b/arangod/Cluster/ClusterFeature.cpp index a4c9e4f023..cf0de36f47 100644 --- a/arangod/Cluster/ClusterFeature.cpp +++ b/arangod/Cluster/ClusterFeature.cpp @@ -415,26 +415,31 @@ void ClusterFeature::start() { startHeartbeatThread(_agencyCallbackRegistry.get(), _heartbeatInterval, 5, endpoints); - VPackBuilder builder; - try { - VPackObjectBuilder b(&builder); - builder.add("endpoint", VPackValue(_myAddress)); - builder.add("host", VPackValue(ServerState::instance()->getHost())); - builder.add("version", VPackValue(rest::Version::getNumericServerVersion())); - builder.add("engine", VPackValue(EngineSelectorFeature::engineName())); - } catch (...) { - LOG_TOPIC(FATAL, arangodb::Logger::CLUSTER) << "out of memory"; - FATAL_ERROR_EXIT(); - } + while (true) { + VPackBuilder builder; + try { + VPackObjectBuilder b(&builder); + builder.add("endpoint", VPackValue(_myAddress)); + builder.add("host", VPackValue(ServerState::instance()->getHost())); + builder.add("version", VPackValue(rest::Version::getNumericServerVersion())); + builder.add("engine", VPackValue(EngineSelectorFeature::engineName())); + } catch (...) { + LOG_TOPIC(FATAL, arangodb::Logger::CLUSTER) << "out of memory"; + FATAL_ERROR_EXIT(); + } - result.clear(); - result = comm.setValue("Current/ServersRegistered/" + myId, - builder.slice(), 0.0); + result = comm.setValue("Current/ServersRegistered/" + myId, + builder.slice(), 0.0); - if (!result.successful()) { - LOG_TOPIC(FATAL, arangodb::Logger::CLUSTER) << "unable to register server in agency: http code: " - << result.httpCode() << ", body: " << result.body(); - FATAL_ERROR_EXIT(); + if (result.successful()) { + break; + } else { + LOG_TOPIC(WARN, arangodb::Logger::CLUSTER) + << "failed to register server in agency: http code: " + << result.httpCode() << ", body: '" << result.body() << "', retrying ..."; + } + + std::this_thread::sleep_for(std::chrono::seconds(1)); } comm.increment("Current/Version");