mirror of https://gitee.com/bigwinds/arangodb
auto-flush more exotic column families from time to time
This commit is contained in:
parent
9117a2b14f
commit
ed1651ce40
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include "RocksDBBackgroundThread.h"
|
#include "RocksDBBackgroundThread.h"
|
||||||
#include "Basics/ConditionLocker.h"
|
#include "Basics/ConditionLocker.h"
|
||||||
|
#include "Random/RandomGenerator.h"
|
||||||
#include "Replication/ReplicationClients.h"
|
#include "Replication/ReplicationClients.h"
|
||||||
#include "RestServer/DatabaseFeature.h"
|
#include "RestServer/DatabaseFeature.h"
|
||||||
#include "RocksDBEngine/RocksDBCommon.h"
|
#include "RocksDBEngine/RocksDBCommon.h"
|
||||||
|
@ -33,7 +34,17 @@
|
||||||
using namespace arangodb;
|
using namespace arangodb;
|
||||||
|
|
||||||
RocksDBBackgroundThread::RocksDBBackgroundThread(RocksDBEngine& eng, double interval)
|
RocksDBBackgroundThread::RocksDBBackgroundThread(RocksDBEngine& eng, double interval)
|
||||||
: Thread(eng.server(), "RocksDBThread"), _engine(eng), _interval(interval) {}
|
: Thread(eng.server(), "RocksDBThread"),
|
||||||
|
_engine(eng),
|
||||||
|
_interval(interval),
|
||||||
|
_nextFlushTime(TRI_microtime() + 10.0 * 60.0 + RandomGenerator::interval(uint32_t(120))) {
|
||||||
|
// initial column family flush is around 10 minutes after startup, with a bit of
|
||||||
|
// random delay. The random delay is used to prevent all servers from flushing their
|
||||||
|
// data at the very same time. The 10 minute offset is used to prevent
|
||||||
|
// long startup delays, and also to prevent many repeated flushes in case there are
|
||||||
|
// startup errors and thus restarts. after the initial flush shortly after the
|
||||||
|
// server start, we will only flush every few hours to reduce ongoing I/O burden
|
||||||
|
}
|
||||||
|
|
||||||
RocksDBBackgroundThread::~RocksDBBackgroundThread() { shutdown(); }
|
RocksDBBackgroundThread::~RocksDBBackgroundThread() { shutdown(); }
|
||||||
|
|
||||||
|
@ -101,13 +112,22 @@ void RocksDBBackgroundThread::run() {
|
||||||
// will not have a chance to reconnect to a restarted master in
|
// will not have a chance to reconnect to a restarted master in
|
||||||
// time so the master may purge WAL files that replication slaves
|
// time so the master may purge WAL files that replication slaves
|
||||||
// would still like to peek into
|
// would still like to peek into
|
||||||
if (TRI_microtime() >= startTime + _engine.pruneWaitTimeInitial()) {
|
double const now = TRI_microtime();
|
||||||
|
if (now >= startTime + _engine.pruneWaitTimeInitial()) {
|
||||||
// determine which WAL files can be pruned
|
// determine which WAL files can be pruned
|
||||||
_engine.determinePrunableWalFiles(minTick);
|
_engine.determinePrunableWalFiles(minTick);
|
||||||
// and then prune them when they expired
|
// and then prune them when they expired
|
||||||
_engine.pruneWalFiles();
|
_engine.pruneWalFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// flush column families every now and then, to prevent data from
|
||||||
|
// exotic column column families to reside only in memtables and thus
|
||||||
|
// block WAL file collection
|
||||||
|
if (now >= _nextFlushTime) {
|
||||||
|
_engine.flushColumnFamilies(false);
|
||||||
|
// flush at most every 12 hours
|
||||||
|
_nextFlushTime = now + 12.0 * 60.0 * 60.0;
|
||||||
|
}
|
||||||
} catch (std::exception const& ex) {
|
} catch (std::exception const& ex) {
|
||||||
LOG_TOPIC("8236f", WARN, Logger::ENGINES)
|
LOG_TOPIC("8236f", WARN, Logger::ENGINES)
|
||||||
<< "caught exception in rocksdb background thread: " << ex.what();
|
<< "caught exception in rocksdb background thread: " << ex.what();
|
||||||
|
|
|
@ -33,19 +33,13 @@ class RocksDBEngine;
|
||||||
|
|
||||||
class RocksDBBackgroundThread final : public Thread {
|
class RocksDBBackgroundThread final : public Thread {
|
||||||
public:
|
public:
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief engine pointer
|
/// @brief engine pointer
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
RocksDBEngine& _engine;
|
RocksDBEngine& _engine;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief interval in which we will run
|
/// @brief interval in which we will run
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
double const _interval;
|
double const _interval;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief condition variable for heartbeat
|
/// @brief condition variable for heartbeat
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
arangodb::basics::ConditionVariable _condition;
|
arangodb::basics::ConditionVariable _condition;
|
||||||
|
|
||||||
RocksDBBackgroundThread(RocksDBEngine& eng, double interval);
|
RocksDBBackgroundThread(RocksDBEngine& eng, double interval);
|
||||||
|
@ -55,6 +49,13 @@ class RocksDBBackgroundThread final : public Thread {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void run() override;
|
void run() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// @brief next time point for flushing column families
|
||||||
|
/// note that we need to flush column families every now and then
|
||||||
|
/// to prevent data from exotic column families to only reside in
|
||||||
|
/// memtables and block WAL file collection
|
||||||
|
double _nextFlushTime;
|
||||||
};
|
};
|
||||||
} // namespace arangodb
|
} // namespace arangodb
|
||||||
|
|
||||||
|
|
|
@ -2432,6 +2432,21 @@ void RocksDBEngine::releaseTick(TRI_voc_tick_t tick) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RocksDBEngine::flushColumnFamilies(bool wait) {
|
||||||
|
// we are intentionally not flushing cfs "document" and "primary", as these
|
||||||
|
// are expected to be written to every now and then by statistics etc.
|
||||||
|
LOG_TOPIC("9354c", DEBUG, Logger::ENGINES) << "flushing column families";
|
||||||
|
|
||||||
|
rocksdb::FlushOptions options;
|
||||||
|
options.wait = wait;
|
||||||
|
|
||||||
|
_db->Flush(options, RocksDBColumnFamily::definitions());
|
||||||
|
_db->Flush(options, RocksDBColumnFamily::edge());
|
||||||
|
_db->Flush(options, RocksDBColumnFamily::vpack());
|
||||||
|
_db->Flush(options, RocksDBColumnFamily::geo());
|
||||||
|
_db->Flush(options, RocksDBColumnFamily::fulltext());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace arangodb
|
} // namespace arangodb
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -395,6 +395,9 @@ public:
|
||||||
/// note: returns a nullptr if automatic syncing is turned off!
|
/// note: returns a nullptr if automatic syncing is turned off!
|
||||||
RocksDBSyncThread* syncThread() const { return _syncThread.get(); }
|
RocksDBSyncThread* syncThread() const { return _syncThread.get(); }
|
||||||
|
|
||||||
|
/// @brief flushes most of the column families
|
||||||
|
void flushColumnFamilies(bool wait);
|
||||||
|
|
||||||
static arangodb::Result registerRecoveryHelper(std::shared_ptr<RocksDBRecoveryHelper> helper);
|
static arangodb::Result registerRecoveryHelper(std::shared_ptr<RocksDBRecoveryHelper> helper);
|
||||||
static std::vector<std::shared_ptr<RocksDBRecoveryHelper>> const& recoveryHelpers();
|
static std::vector<std::shared_ptr<RocksDBRecoveryHelper>> const& recoveryHelpers();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue