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);