mirror of https://gitee.com/bigwinds/arangodb
Fix heartbeat thread hanging during shutdown (#7709)
This commit is contained in:
parent
c3e73ba45b
commit
90ec730c07
|
@ -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(
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue