From d91a6af1a71256931425771c6d2bebc8d37abaf7 Mon Sep 17 00:00:00 2001 From: Andreas Streichardt Date: Tue, 24 Jan 2017 18:51:05 +0100 Subject: [PATCH] Remove singletransaction and fetch collection from vocbase directly --- arangod/V8Server/v8-collection.cpp | 63 +++++++++++--------------- js/server/modules/@arangodb/cluster.js | 2 +- 2 files changed, 27 insertions(+), 38 deletions(-) diff --git a/arangod/V8Server/v8-collection.cpp b/arangod/V8Server/v8-collection.cpp index c082919e08..838e53a546 100644 --- a/arangod/V8Server/v8-collection.cpp +++ b/arangod/V8Server/v8-collection.cpp @@ -956,32 +956,29 @@ static void JS_LeaderResign(v8::FunctionCallbackInfo const& args) { } if (ServerState::instance()->isDBServer()) { - arangodb::LogicalCollection const* collection = + arangodb::LogicalCollection const* v8Collection = TRI_UnwrapClass(args.Holder(), WRP_VOCBASE_COL_TYPE); - if (collection == nullptr) { + if (v8Collection == nullptr) { TRI_V8_THROW_EXCEPTION_INTERNAL("cannot extract collection"); } - TRI_vocbase_t* vocbase = collection->vocbase(); - std::string collectionName = collection->name(); + TRI_vocbase_t* vocbase = v8Collection->vocbase(); if (vocbase == nullptr) { TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_DATABASE_NOT_FOUND); } - auto transactionContext = std::make_shared(vocbase, true); - - SingleCollectionTransaction trx(transactionContext, collectionName, - TRI_TRANSACTION_READ); - int res = trx.begin(); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); + std::string collectionName = v8Collection->name(); + auto collection = vocbase->lookupCollection(collectionName); + if (collection == nullptr) { + TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND); } + // do not reset followers at this time...we are still the only source of truth // to trust... //trx.documentCollection()->followers()->clear(); - trx.documentCollection()->followers()->setLeader(false); + collection->followers()->setLeader(false); } TRI_V8_RETURN_UNDEFINED(); @@ -1003,30 +1000,26 @@ static void JS_AssumeLeadership(v8::FunctionCallbackInfo const& args) } if (ServerState::instance()->isDBServer()) { - arangodb::LogicalCollection const* collection = + arangodb::LogicalCollection const* v8Collection = TRI_UnwrapClass(args.Holder(), WRP_VOCBASE_COL_TYPE); - if (collection == nullptr) { + if (v8Collection == nullptr) { TRI_V8_THROW_EXCEPTION_INTERNAL("cannot extract collection"); } - TRI_vocbase_t* vocbase = collection->vocbase(); - std::string collectionName = collection->name(); + TRI_vocbase_t* vocbase = v8Collection->vocbase(); if (vocbase == nullptr) { TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_DATABASE_NOT_FOUND); } - auto transactionContext = std::make_shared(vocbase, true); - - SingleCollectionTransaction trx(transactionContext, collectionName, - TRI_TRANSACTION_READ); - int res = trx.begin(); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); + std::string collectionName = v8Collection->name(); + auto collection = vocbase->lookupCollection(collectionName); + if (collection == nullptr) { + TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND); } - trx.documentCollection()->followers()->clear(); - trx.documentCollection()->followers()->setLeader(true); + collection->followers()->clear(); + collection->followers()->setLeader(true); } TRI_V8_RETURN_UNDEFINED(); @@ -1094,29 +1087,25 @@ static void JS_GetFollowers(v8::FunctionCallbackInfo const& args) { v8::Handle list = v8::Array::New(isolate); if (ServerState::instance()->isDBServer()) { - arangodb::LogicalCollection const* collection = + arangodb::LogicalCollection const* v8Collection = TRI_UnwrapClass(args.Holder(), WRP_VOCBASE_COL_TYPE); - if (collection == nullptr) { + if (v8Collection == nullptr) { TRI_V8_THROW_EXCEPTION_INTERNAL("cannot extract collection"); } - TRI_vocbase_t* vocbase = collection->vocbase(); - std::string collectionName = collection->name(); + TRI_vocbase_t* vocbase = v8Collection->vocbase(); if (vocbase == nullptr) { TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_DATABASE_NOT_FOUND); } - auto transactionContext = std::make_shared(vocbase, true); - - SingleCollectionTransaction trx(transactionContext, collectionName, - TRI_TRANSACTION_READ); - int res = trx.begin(); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); + std::string collectionName = v8Collection->name(); + auto collection = vocbase->lookupCollection(collectionName); + if (collection == nullptr) { + TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND); } - std::unique_ptr const& followerInfo = trx.documentCollection()->followers(); + std::unique_ptr const& followerInfo = collection->followers(); std::shared_ptr const> followers = followerInfo->get(); uint32_t i = 0; for (auto const& n : *followers) { diff --git a/js/server/modules/@arangodb/cluster.js b/js/server/modules/@arangodb/cluster.js index 0156396edb..6ae2ca4efc 100644 --- a/js/server/modules/@arangodb/cluster.js +++ b/js/server/modules/@arangodb/cluster.js @@ -1244,7 +1244,7 @@ function updateCurrentForDatabases(localErrors, currentDatabases) { if (localDatabases.hasOwnProperty(name)) { if (!currentDatabases.hasOwnProperty(name) || !currentDatabases[name].hasOwnProperty(ourselves) || - currentDatabases[name][ourselves].error == true) { + currentDatabases[name][ourselves].error) { console.debug("adding entry in Current for database '%s'", name); trx = Object.assign(trx, makeAddDatabaseAgencyOperation({error: false, errorNum: 0, name: name, id: localDatabases[name].id,