From aa5e02c82d701a54a8c7faca0694f5a528123d16 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 19 Feb 2018 18:44:08 +0100 Subject: [PATCH] make syncer more compatible and ignore revs if not present --- arangod/Replication/TailingSyncer.cpp | 8 ++- .../replication/replication-ongoing-32.js | 67 +++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/arangod/Replication/TailingSyncer.cpp b/arangod/Replication/TailingSyncer.cpp index 507f624d52..aabf05a08c 100644 --- a/arangod/Replication/TailingSyncer.cpp +++ b/arangod/Replication/TailingSyncer.cpp @@ -313,14 +313,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