From 582d3e5fd18d3056eadb2ab8b76f331b36f037c2 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 26 Jul 2017 21:49:41 +0200 Subject: [PATCH] only sync RocksDB WAL in MMFiles engine when there is a reason to do so (#2863) --- arangod/MMFiles/MMFilesTransactionState.cpp | 18 ++++++++++++++++-- arangod/StorageEngine/TransactionState.cpp | 10 ++++++++++ arangod/StorageEngine/TransactionState.h | 3 +++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/arangod/MMFiles/MMFilesTransactionState.cpp b/arangod/MMFiles/MMFilesTransactionState.cpp index befd8b6b6c..ebc4c761a1 100644 --- a/arangod/MMFiles/MMFilesTransactionState.cpp +++ b/arangod/MMFiles/MMFilesTransactionState.cpp @@ -478,8 +478,22 @@ int MMFilesTransactionState::writeCommitMarker() { TRI_IF_FAILURE("TransactionWriteCommitMarkerNoRocksSync") { return TRI_ERROR_NO_ERROR; } if (_options.waitForSync) { - // also sync RocksDB WAL - MMFilesPersistentIndexFeature::syncWal(); + // also sync RocksDB WAL if required + bool hasPersistentIndex = false; + allCollections([&hasPersistentIndex](TransactionCollection* collection) { + auto c = static_cast(collection); + if (c->canAccess(AccessMode::Type::WRITE) && + c->collection()->getPhysical()->hasIndexOfType(arangodb::Index::TRI_IDX_TYPE_PERSISTENT_INDEX)) { + hasPersistentIndex = true; + // abort iteration + return false; + } + + return true; + }); + if (hasPersistentIndex) { + MMFilesPersistentIndexFeature::syncWal(); + } } TRI_IF_FAILURE("TransactionWriteCommitMarkerThrow") { diff --git a/arangod/StorageEngine/TransactionState.cpp b/arangod/StorageEngine/TransactionState.cpp index 932a792c5d..194abf29df 100644 --- a/arangod/StorageEngine/TransactionState.cpp +++ b/arangod/StorageEngine/TransactionState.cpp @@ -198,6 +198,16 @@ int TransactionState::addCollection(TRI_voc_cid_t cid, Result TransactionState::ensureCollections(int nestingLevel) { return useCollections(nestingLevel); } + +/// @brief run a callback on all collections +void TransactionState::allCollections(std::function const& cb) { + for (auto& trxCollection : _collections) { + if (!cb(trxCollection)) { + // abort early + return; + } + } +} /// @brief use all participating collections of a transaction Result TransactionState::useCollections(int nestingLevel) { diff --git a/arangod/StorageEngine/TransactionState.h b/arangod/StorageEngine/TransactionState.h index a1bd898493..cbca9c39a8 100644 --- a/arangod/StorageEngine/TransactionState.h +++ b/arangod/StorageEngine/TransactionState.h @@ -123,6 +123,9 @@ class TransactionState { /// @brief use all participating collections of a transaction Result useCollections(int nestingLevel); + /// @brief run a callback on all collections + void allCollections(std::function const& cb); + /// @brief release collection locks for a transaction int unuseCollections(int nestingLevel);