diff --git a/arangod/Cluster/DBServerAgencySync.cpp b/arangod/Cluster/DBServerAgencySync.cpp index d6629fa5e6..ed06b5cf21 100644 --- a/arangod/Cluster/DBServerAgencySync.cpp +++ b/arangod/Cluster/DBServerAgencySync.cpp @@ -164,6 +164,14 @@ DBServerAgencySyncResult DBServerAgencySync::execute() { auto plan = clusterInfo->getPlan(); auto serverId = arangodb::ServerState::instance()->getId(); + if (plan == nullptr) { + // TODO increase log level, except during shutdown? + LOG_TOPIC(DEBUG, Logger::MAINTENANCE) + << "DBServerAgencySync::execute no plan"; + result.errorMessage = "DBServerAgencySync::execute no plan"; + return result; + } + VPackBuilder local; Result glc = getLocalCollections(local); if (!glc.ok()) { @@ -200,6 +208,13 @@ DBServerAgencySyncResult DBServerAgencySync::execute() { } auto current = clusterInfo->getCurrent(); + if (current == nullptr) { + // TODO increase log level, except during shutdown? + LOG_TOPIC(DEBUG, Logger::MAINTENANCE) + << "DBServerAgencySync::execute no current"; + result.errorMessage = "DBServerAgencySync::execute no current"; + return result; + } LOG_TOPIC(TRACE, Logger::MAINTENANCE) << "DBServerAgencySync::phaseTwo - current state: " << current->toJson(); tmp = arangodb::maintenance::phaseTwo( diff --git a/arangod/Cluster/HeartbeatThread.cpp b/arangod/Cluster/HeartbeatThread.cpp index dbeea6fecc..662e9b20f3 100644 --- a/arangod/Cluster/HeartbeatThread.cpp +++ b/arangod/Cluster/HeartbeatThread.cpp @@ -319,20 +319,6 @@ void HeartbeatThread::runDBServer() { return true; }; - auto planAgencyCallback = std::make_shared( - _agency, "Plan/Version", updatePlan, true); - - bool registered = false; - while (!registered) { - registered = - _agencyCallbackRegistry->registerCallback(planAgencyCallback); - if (!registered) { - LOG_TOPIC(ERR, Logger::HEARTBEAT) - << "Couldn't register plan change in agency!"; - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - } - std::function updateCurrent = [=](VPackSlice const& result) { @@ -362,11 +348,25 @@ void HeartbeatThread::runDBServer() { return true; }; + auto planAgencyCallback = std::make_shared( + _agency, "Plan/Version", updatePlan, true); + auto currentAgencyCallback = std::make_shared( _agency, "Current/Version", updateCurrent, true); + bool registered = false; + while (!registered && !isStopping()) { + registered = + _agencyCallbackRegistry->registerCallback(planAgencyCallback); + if (!registered) { + LOG_TOPIC(ERR, Logger::HEARTBEAT) + << "Couldn't register plan change in agency!"; + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + } + registered = false; - while (!registered) { + while (!registered && !isStopping()) { registered = _agencyCallbackRegistry->registerCallback(currentAgencyCallback); if (!registered) { @@ -515,6 +515,7 @@ void HeartbeatThread::runDBServer() { } } + // TODO should these be defered? _agencyCallbackRegistry->unregisterCallback(currentAgencyCallback); _agencyCallbackRegistry->unregisterCallback(planAgencyCallback); }