From 704c746c0d97bdc53dd1d02f3edf67a24a92bcc8 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 30 Mar 2017 17:02:54 +0200 Subject: [PATCH] fix toArray() --- arangod/RocksDBEngine/RocksDBCollection.cpp | 5 +++++ .../RocksDBEngine/RocksDBTransactionState.h | 1 + arangod/StorageEngine/TransactionState.h | 1 + arangod/Utils/OperationCursor.h | 9 +++++++++ arangod/V8Server/v8-query.cpp | 19 +++++++++---------- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/arangod/RocksDBEngine/RocksDBCollection.cpp b/arangod/RocksDBEngine/RocksDBCollection.cpp index 6b842d282f..e8c6b335b8 100644 --- a/arangod/RocksDBEngine/RocksDBCollection.cpp +++ b/arangod/RocksDBEngine/RocksDBCollection.cpp @@ -757,6 +757,7 @@ int RocksDBCollection::insertDocument(arangodb::transaction::Methods* trx, bool& waitForSync) { // Coordinator doesn't know index internals TRI_ASSERT(!ServerState::instance()->isCoordinator()); + TRI_ASSERT(trx->state()->isRunning()); RocksDBKey key(RocksDBKey::Document(_objectId, revisionId)); RocksDBValue value(RocksDBValue::Document(doc)); @@ -817,6 +818,7 @@ int RocksDBCollection::removeDocument(arangodb::transaction::Methods* trx, bool& waitForSync) { // Coordinator doesn't know index internals TRI_ASSERT(!ServerState::instance()->isCoordinator()); + TRI_ASSERT(trx->state()->isRunning()); auto key = RocksDBKey::Document(_objectId, revisionId); @@ -882,6 +884,7 @@ int RocksDBCollection::updateDocument(transaction::Methods* trx, VPackSlice const& newDoc, bool& waitForSync) { // Coordinator doesn't know index internals + TRI_ASSERT(trx->state()->isRunning()); TRI_ASSERT(!ServerState::instance()->isCoordinator()); rocksdb::Transaction* rtrx = rocksTransaction(trx); @@ -920,6 +923,8 @@ Result RocksDBCollection::lookupDocumentToken(transaction::Methods* trx, arangodb::Result RocksDBCollection::lookupRevisionVPack( TRI_voc_rid_t revisionId, transaction::Methods* trx, arangodb::ManagedDocumentResult& mdr) { + TRI_ASSERT(trx->state()->isRunning()); + auto key = RocksDBKey::Document(_objectId, revisionId); std::string value; TRI_ASSERT(value.data()); diff --git a/arangod/RocksDBEngine/RocksDBTransactionState.h b/arangod/RocksDBEngine/RocksDBTransactionState.h index 7d72f5a604..17d2084ad8 100644 --- a/arangod/RocksDBEngine/RocksDBTransactionState.h +++ b/arangod/RocksDBEngine/RocksDBTransactionState.h @@ -88,6 +88,7 @@ class RocksDBTransactionState final : public TransactionState { int addOperation(TRI_voc_rid_t, RocksDBDocumentOperation&, RocksDBWalMarker const* marker, bool&); rocksdb::Transaction* rocksTransaction() { + TRI_ASSERT(_rocksTransaction != nullptr); return _rocksTransaction.get(); } diff --git a/arangod/StorageEngine/TransactionState.h b/arangod/StorageEngine/TransactionState.h index dccd787417..cba4274626 100644 --- a/arangod/StorageEngine/TransactionState.h +++ b/arangod/StorageEngine/TransactionState.h @@ -68,6 +68,7 @@ class TransactionState { TRI_vocbase_t* vocbase() const { return _vocbase; } TRI_voc_tid_t id() const { return _id; } transaction::Status status() const { return _status; } + bool isRunning() const { return _status == transaction::Status::RUNNING; } int increaseNesting() { return ++_nestingLevel; } int decreaseNesting() { diff --git a/arangod/Utils/OperationCursor.h b/arangod/Utils/OperationCursor.h index 9a5f925d11..6efd915e6c 100644 --- a/arangod/Utils/OperationCursor.h +++ b/arangod/Utils/OperationCursor.h @@ -104,6 +104,15 @@ struct OperationCursor { bool getMore( std::function const& callback, uint64_t batchSize); + +////////////////////////////////////////////////////////////////////////////// +/// @brief convenience function to retrieve all results +////////////////////////////////////////////////////////////////////////////// + + void getAll( + std::function const& callback) { + while (getMore(callback, 1000)) {} + } ////////////////////////////////////////////////////////////////////////////// /// @brief Skip the next toSkip many elements. diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index f0fff93193..09d46e5cf1 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -234,16 +234,11 @@ static void JS_AllQuery(v8::FunctionCallbackInfo const& args) { } OperationResult countResult = trx.count(collectionName, true); - res = trx.finish(countResult.code); if (countResult.failed()) { TRI_V8_THROW_EXCEPTION(countResult.code); } - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } - VPackSlice count = countResult.slice(); TRI_ASSERT(count.isNumber()); @@ -259,15 +254,19 @@ static void JS_AllQuery(v8::FunctionCallbackInfo const& args) { ManagedDocumentResult mmdr; VPackBuilder resultBuilder; resultBuilder.openArray(); - auto cb = [&resultBuilder, &mmdr, &trx, &collection](DocumentIdentifierToken const& tkn) { + + opCursor->getAll([&resultBuilder, &mmdr, &trx, &collection](DocumentIdentifierToken const& tkn) { if (collection->readDocument(&trx, tkn, mmdr)) { resultBuilder.add(VPackSlice(mmdr.vpack())); } - }; - while (opCursor->getMore(cb, 1000)) { - // Noop all done in cb - } + }); + resultBuilder.close(); + + res = trx.finish(countResult.code); + if (res != TRI_ERROR_NO_ERROR) { + TRI_V8_THROW_EXCEPTION(res); + } VPackSlice docs = resultBuilder.slice(); TRI_ASSERT(docs.isArray());