diff --git a/arangod/Agency/Node.cpp b/arangod/Agency/Node.cpp index 978829dc5f..1dab13d96b 100644 --- a/arangod/Agency/Node.cpp +++ b/arangod/Agency/Node.cpp @@ -139,6 +139,8 @@ std::string Node::uri() const { /// Move constructor Node::Node(Node&& other) : _node_name(std::move(other._node_name)), + _parent(nullptr), + _store(nullptr), _children(std::move(other._children)), _value(std::move(other._value)), _vecBuf(std::move(other._vecBuf)), diff --git a/arangod/Cluster/ClusterInfo.cpp b/arangod/Cluster/ClusterInfo.cpp index 284aa67ccc..691a0734ba 100644 --- a/arangod/Cluster/ClusterInfo.cpp +++ b/arangod/Cluster/ClusterInfo.cpp @@ -2360,35 +2360,19 @@ void ClusterInfo::loadCurrentDBServers() { std::vector ClusterInfo::getCurrentDBServers() { std::vector result; - int tries = 0; if (!_DBServersProt.isValid) { loadCurrentDBServers(); - tries++; } - while (true) { - { - // return a consistent state of servers - READ_LOCKER(readLocker, _DBServersProt.lock); + // return a consistent state of servers + READ_LOCKER(readLocker, _DBServersProt.lock); - result.reserve(_DBServers.size()); + result.reserve(_DBServers.size()); - for (auto& it : _DBServers) { - result.emplace_back(it.first); - } - - return result; - } - - if (++tries >= 2) { - break; - } - - // loadCurrentDBServers needs the write lock - loadCurrentDBServers(); + for (auto& it : _DBServers) { + result.emplace_back(it.first); } - // note that the result will be empty if we get here return result; } @@ -2560,35 +2544,20 @@ int ClusterInfo::getResponsibleShard(LogicalCollection* collInfo, std::vector ClusterInfo::getCurrentCoordinators() { std::vector result; - int tries = 0; if (!_coordinatorsProt.isValid) { loadCurrentCoordinators(); - tries++; - } - while (true) { - { - // return a consistent state of servers - READ_LOCKER(readLocker, _coordinatorsProt.lock); - - result.reserve(_coordinators.size()); - - for (auto& it : _coordinators) { - result.emplace_back(it.first); - } - - return result; - } - - if (++tries >= 2) { - break; - } - - // loadCurrentCoordinators needs the write lock - loadCurrentCoordinators(); } - // note that the result will be empty if we get here + // return a consistent state of servers + READ_LOCKER(readLocker, _coordinatorsProt.lock); + + result.reserve(_coordinators.size()); + + for (auto& it : _coordinators) { + result.emplace_back(it.first); + } + return result; } diff --git a/arangod/Cluster/ClusterInfo.h b/arangod/Cluster/ClusterInfo.h index 1a0f7f48ea..0f4fa1634b 100644 --- a/arangod/Cluster/ClusterInfo.h +++ b/arangod/Cluster/ClusterInfo.h @@ -186,8 +186,7 @@ class CollectionInfoCurrent { bool getFlag(char const* name, ShardID const& shardID) const { auto it = _vpacks.find(shardID); if (it != _vpacks.end()) { - return arangodb::basics::VelocyPackHelper::getBooleanValue(it->second->slice(), "errorMessage", - ""); + return arangodb::basics::VelocyPackHelper::getBooleanValue(it->second->slice(), name, false); } return false; } diff --git a/arangod/MMFiles/MMFilesLogfileManager.cpp b/arangod/MMFiles/MMFilesLogfileManager.cpp index 4235e01dbc..7124918f7b 100644 --- a/arangod/MMFiles/MMFilesLogfileManager.cpp +++ b/arangod/MMFiles/MMFilesLogfileManager.cpp @@ -173,6 +173,9 @@ void MMFilesLogfileManager::collectOptions(std::shared_ptr optio "--wal.ignore-recovery-errors", "continue recovery even if re-applying operations fails", new BooleanParameter(&_ignoreRecoveryErrors)); + + options->addHiddenOption("--wal.flush-timeout", "flush timeout (in milliseconds)", + new UInt64Parameter(&_flushTimeout)); options->addOption("--wal.logfile-size", "size of each logfile (in bytes)", new UInt32Parameter(&_filesize)); @@ -1259,7 +1262,7 @@ int MMFilesLogfileManager::getWriteableLogfile(uint32_t size, } size_t iterations = 0; - double const end = TRI_microtime() + 15.0; + double const end = TRI_microtime() + (_flushTimeout / 1000.0); while (true) { { @@ -1323,7 +1326,7 @@ int MMFilesLogfileManager::getWriteableLogfile(uint32_t size, } TRI_ASSERT(result == nullptr); - LOG(ERR) << "unable to acquire writeable WAL logfile after 15 s"; + LOG(ERR) << "unable to acquire writeable WAL logfile after " << _flushTimeout << " ms"; return TRI_ERROR_LOCK_TIMEOUT; } diff --git a/arangod/MMFiles/MMFilesLogfileManager.h b/arangod/MMFiles/MMFilesLogfileManager.h index b713d5903f..47ab29d988 100644 --- a/arangod/MMFiles/MMFilesLogfileManager.h +++ b/arangod/MMFiles/MMFilesLogfileManager.h @@ -458,6 +458,7 @@ class MMFilesLogfileManager final : public application_features::ApplicationFeat uint32_t _historicLogfiles = 10; bool _ignoreLogfileErrors = false; bool _ignoreRecoveryErrors = false; + uint64_t _flushTimeout = 15000; uint32_t _filesize = 32 * 1024 * 1024; uint32_t _maxOpenLogfiles = 0; uint32_t _reserveLogfiles = 3; diff --git a/arangod/MMFiles/MMFilesWalSlots.cpp b/arangod/MMFiles/MMFilesWalSlots.cpp index d4324deb61..81e241b3ee 100644 --- a/arangod/MMFiles/MMFilesWalSlots.cpp +++ b/arangod/MMFiles/MMFilesWalSlots.cpp @@ -488,11 +488,12 @@ void MMFilesWalSlots::getActiveTickRange(MMFilesWalLogfile* logfile, TRI_voc_tic /// @brief close a logfile int MMFilesWalSlots::closeLogfile(MMFilesWalSlot::TickType& lastCommittedTick, bool& worked) { - int iterations = 0; bool hasWaited = false; worked = false; - while (++iterations < 1000) { + double const maxWait = 30.0; + double const end = TRI_microtime() + maxWait; + while (true) { { MUTEX_LOCKER(mutexLocker, _lock); @@ -593,6 +594,11 @@ int MMFilesWalSlots::closeLogfile(MMFilesWalSlot::TickType& lastCommittedTick, b if (mustWait) { guard.wait(10 * 1000); } + + if (TRI_microtime() >= end) { + // time's up! + break; + } } return TRI_ERROR_ARANGO_NO_JOURNAL;