1
0
Fork 0

Fix heartbeat thread hanging during shutdown (#7709)

This commit is contained in:
Tobias Gödderz 2018-12-20 16:40:42 +01:00 committed by Jan
parent c3e73ba45b
commit 90ec730c07
2 changed files with 31 additions and 15 deletions

View File

@ -164,6 +164,14 @@ DBServerAgencySyncResult DBServerAgencySync::execute() {
auto plan = clusterInfo->getPlan(); auto plan = clusterInfo->getPlan();
auto serverId = arangodb::ServerState::instance()->getId(); 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; VPackBuilder local;
Result glc = getLocalCollections(local); Result glc = getLocalCollections(local);
if (!glc.ok()) { if (!glc.ok()) {
@ -200,6 +208,13 @@ DBServerAgencySyncResult DBServerAgencySync::execute() {
} }
auto current = clusterInfo->getCurrent(); 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(); LOG_TOPIC(TRACE, Logger::MAINTENANCE) << "DBServerAgencySync::phaseTwo - current state: " << current->toJson();
tmp = arangodb::maintenance::phaseTwo( tmp = arangodb::maintenance::phaseTwo(

View File

@ -319,20 +319,6 @@ void HeartbeatThread::runDBServer() {
return true; return true;
}; };
auto planAgencyCallback = std::make_shared<AgencyCallback>(
_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<bool(VPackSlice const& result)> updateCurrent = std::function<bool(VPackSlice const& result)> updateCurrent =
[=](VPackSlice const& result) { [=](VPackSlice const& result) {
@ -362,11 +348,25 @@ void HeartbeatThread::runDBServer() {
return true; return true;
}; };
auto planAgencyCallback = std::make_shared<AgencyCallback>(
_agency, "Plan/Version", updatePlan, true);
auto currentAgencyCallback = std::make_shared<AgencyCallback>( auto currentAgencyCallback = std::make_shared<AgencyCallback>(
_agency, "Current/Version", updateCurrent, true); _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; registered = false;
while (!registered) { while (!registered && !isStopping()) {
registered = registered =
_agencyCallbackRegistry->registerCallback(currentAgencyCallback); _agencyCallbackRegistry->registerCallback(currentAgencyCallback);
if (!registered) { if (!registered) {
@ -515,6 +515,7 @@ void HeartbeatThread::runDBServer() {
} }
} }
// TODO should these be defered?
_agencyCallbackRegistry->unregisterCallback(currentAgencyCallback); _agencyCallbackRegistry->unregisterCallback(currentAgencyCallback);
_agencyCallbackRegistry->unregisterCallback(planAgencyCallback); _agencyCallbackRegistry->unregisterCallback(planAgencyCallback);
} }