From f29df7d68b07d73907dfc2072d727c737aa70550 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 21 Feb 2018 12:10:30 +0100 Subject: [PATCH] improvements and more tests for replication (#4624) --- arangod/Replication/Syncer.cpp | 9 ++- arangod/Replication/TailingSyncer.cpp | 8 ++- .../replication/replication-ongoing-32.js | 67 +++++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/arangod/Replication/Syncer.cpp b/arangod/Replication/Syncer.cpp index 00eac0daf6..beb1aebf38 100644 --- a/arangod/Replication/Syncer.cpp +++ b/arangod/Replication/Syncer.cpp @@ -660,6 +660,13 @@ Result Syncer::createIndex(VPackSlice const& slice) { return Result(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND, "did not find collection for index"); } + + VPackBuilder s; + s.openObject(); + s.add("objectId", VPackSlice::nullSlice()); + s.close(); + VPackBuilder merged = VPackCollection::merge(indexSlice, s.slice(), + /*mergeValues*/true, /*nullMeansRemove*/true); try { SingleCollectionTransaction trx(transaction::StandaloneContext::Create(vocbase), @@ -674,7 +681,7 @@ Result Syncer::createIndex(VPackSlice const& slice) { auto physical = trx.documentCollection()->getPhysical(); TRI_ASSERT(physical != nullptr); std::shared_ptr idx; - res = physical->restoreIndex(&trx, indexSlice, idx); + res = physical->restoreIndex(&trx, merged.slice(), idx); res = trx.finish(res); return res; diff --git a/arangod/Replication/TailingSyncer.cpp b/arangod/Replication/TailingSyncer.cpp index 90f1372d72..926a807b9c 100644 --- a/arangod/Replication/TailingSyncer.cpp +++ b/arangod/Replication/TailingSyncer.cpp @@ -314,14 +314,18 @@ Result TailingSyncer::processDocument(TRI_replication_operation_e type, // extract "rev" VPackSlice const rev = doc.get(StaticStrings::RevString); - if (!rev.isString()) { + if (!rev.isNone() && !rev.isString()) { + // _rev is an optional attribute return Result(TRI_ERROR_REPLICATION_INVALID_RESPONSE, "invalid document revision format"); } _documentBuilder.clear(); _documentBuilder.openObject(); _documentBuilder.add(StaticStrings::KeyString, key); - _documentBuilder.add(StaticStrings::RevString, rev); + if (rev.isString()) { + // _rev is an optional attribute + _documentBuilder.add(StaticStrings::RevString, rev); + } _documentBuilder.close(); VPackSlice const old = _documentBuilder.slice(); diff --git a/js/server/tests/replication/replication-ongoing-32.js b/js/server/tests/replication/replication-ongoing-32.js index b0f0b72316..b9d3cd75ab 100644 --- a/js/server/tests/replication/replication-ongoing-32.js +++ b/js/server/tests/replication/replication-ongoing-32.js @@ -356,6 +356,73 @@ function BaseTestConfig() { } ); }, + + //////////////////////////////////////////////////////////////////////////////// + /// @brief test insert + //////////////////////////////////////////////////////////////////////////////// + + testInsert: function() { + connectToMaster(); + + compare( + function(state) { + db._create(cn); + }, + + function(state) { + for (let i = 0; i < 1000; ++i) { + db[cn].insert({ _key: "test" + i, value: i }); + } + + state.checksum = collectionChecksum(cn); + state.count = collectionCount(cn); + assertEqual(1000, state.count); + }, + + function(state) { + }, + + function(state) { + assertEqual(state.count, collectionCount(cn)); + assertEqual(state.checksum, collectionChecksum(cn)); + } + ); + }, + + //////////////////////////////////////////////////////////////////////////////// + /// @brief test remove + //////////////////////////////////////////////////////////////////////////////// + + testRemove: function() { + connectToMaster(); + + compare( + function(state) { + db._create(cn); + }, + + function(state) { + for (let i = 0; i < 1000; ++i) { + db[cn].insert({ _key: "test" + i, value: i }); + } + for (let i = 0; i < 100; ++i) { + db[cn].remove("test" + i); + } + + state.checksum = collectionChecksum(cn); + state.count = collectionCount(cn); + assertEqual(900, state.count); + }, + + function(state) { + }, + + function(state) { + assertEqual(state.count, collectionCount(cn)); + assertEqual(state.checksum, collectionChecksum(cn)); + } + ); + }, //////////////////////////////////////////////////////////////////////////////// /// @brief test long transaction, blocking