From b40e5a3d24dfb987068923eca84c5971a92d8264 Mon Sep 17 00:00:00 2001 From: Kaveh Vahedipour Date: Thu, 23 Jun 2016 10:48:26 +0200 Subject: [PATCH] agency test waits exactly for the leader election to have ended --- 3rdParty/rocksdb/rocksdb/table/block.h | 4 ++++ arangod/Agency/Agent.cpp | 2 +- arangod/Agency/RestAgencyHandler.cpp | 2 +- arangod/Cluster/ClusterInfo.cpp | 4 +++- js/client/tests/agency/agency-test.js | 23 ++++++++++++++++++++--- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/3rdParty/rocksdb/rocksdb/table/block.h b/3rdParty/rocksdb/rocksdb/table/block.h index 7c0f02d82a..100232f66b 100644 --- a/3rdParty/rocksdb/rocksdb/table/block.h +++ b/3rdParty/rocksdb/rocksdb/table/block.h @@ -14,6 +14,10 @@ #include #endif +#ifndef malloc_usable_size + extern "C" size_t malloc_usable_size(const void *ptr); +#endif + #include "db/dbformat.h" #include "db/pinned_iterators_manager.h" #include "rocksdb/iterator.h" diff --git a/arangod/Agency/Agent.cpp b/arangod/Agency/Agent.cpp index c0a9677793..28dfc54425 100644 --- a/arangod/Agency/Agent.cpp +++ b/arangod/Agency/Agent.cpp @@ -86,7 +86,7 @@ term_t Agent::term() const { /// Agency size -inline size_t Agent::size() const { +size_t Agent::size() const { return _config.size(); } diff --git a/arangod/Agency/RestAgencyHandler.cpp b/arangod/Agency/RestAgencyHandler.cpp index fb05e3834e..862f698c18 100644 --- a/arangod/Agency/RestAgencyHandler.cpp +++ b/arangod/Agency/RestAgencyHandler.cpp @@ -175,7 +175,7 @@ HttpHandler::status_t RestAgencyHandler::handleWrite() { } if (max_index > 0) { - std::this_thread::sleep_for(duration_t(5)); + std::this_thread::sleep_for(duration_t((_agent->size()-1)*5)); _agent->waitFor(max_index); } } diff --git a/arangod/Cluster/ClusterInfo.cpp b/arangod/Cluster/ClusterInfo.cpp index 92bf894c8b..610fa59064 100644 --- a/arangod/Cluster/ClusterInfo.cpp +++ b/arangod/Cluster/ClusterInfo.cpp @@ -1222,6 +1222,8 @@ int ClusterInfo::setCollectionPropertiesCoordinator( AgencyPrecondition databaseExists( "Plan/Databases/" + databaseName, AgencyPrecondition::EMPTY, false); + AgencyOperation incrementVersion( + "Plan/Version", AgencySimpleOperationType::INCREMENT_OP); res = ac.getValues("Plan/Collections/" + databaseName+"/" + collectionID); @@ -1264,7 +1266,7 @@ int ClusterInfo::setCollectionPropertiesCoordinator( "Plan/Collections/" + databaseName + "/" + collectionID, AgencyValueOperationType::SET, copy.slice()); - AgencyWriteTransaction trans (setColl, databaseExists); + AgencyWriteTransaction trans ({setColl, incrementVersion}, databaseExists); res = ac.sendTransactionWithFailover(trans); diff --git a/js/client/tests/agency/agency-test.js b/js/client/tests/agency/agency-test.js index 889154b197..9e2ee08fd8 100644 --- a/js/client/tests/agency/agency-test.js +++ b/js/client/tests/agency/agency-test.js @@ -41,12 +41,30 @@ function agencyTestSuite () { //////////////////////////////////////////////////////////////////////////////// /// @brief the agency servers //////////////////////////////////////////////////////////////////////////////// - + var agencyServers = ARGUMENTS[0].split(" "); var whoseTurn = 0; - + var nagents = agencyServers.length; var request = require("@arangodb/request"); + // Wait for multi-host agency to have elected a leader + if (agencyServers.length > 1) { + while (true) { + var res = request({url: agencyServers[whoseTurn] + "/_api/agency/config", + method: "GET", followRedirects: true, body: "", + headers: {"Content-Type": "application/json"}}); + wait(1); + res.bodyParsed = JSON.parse(res.body); + require("internal").print("Leadership election going on ... "); + if (res.bodyParsed.leaderId >= 0 && res.bodyParsed.leaderId < nagents) { + whoseTurn = res.bodyParsed.leaderId; + require("internal").print("Agents elected " + res.bodyParsed.leaderId + + " leader in term " + res.bodyParsed.term + "."); + break; + } + } + } + function readAgency(list) { // We simply try all agency servers in turn until one gives us an HTTP // response: @@ -100,7 +118,6 @@ function agencyTestSuite () { //////////////////////////////////////////////////////////////////////////////// testSingleTopLevel : function () { - wait(2); assertEqual(readAndCheck([["/x"]]), [{}]); writeAndCheck([[{x:12}]]); assertEqual(readAndCheck([["/x"]]), [{x:12}]);