diff --git a/arangod/V8Server/v8-collection.cpp b/arangod/V8Server/v8-collection.cpp index 9a656037f4..1e80aeb452 100644 --- a/arangod/V8Server/v8-collection.cpp +++ b/arangod/V8Server/v8-collection.cpp @@ -1880,20 +1880,21 @@ static void JS_RevisionVocbaseCol( TRI_V8_THROW_EXCEPTION_INTERNAL("cannot extract collection"); } - TRI_voc_rid_t rid; + TRI_voc_rid_t revisionId; int res; if (ServerState::instance()->isCoordinator()) { - res = GetRevisionCoordinator(collection, rid); + res = GetRevisionCoordinator(collection, revisionId); } else { - res = GetRevision(collection, rid); + res = GetRevision(collection, revisionId); } if (res != TRI_ERROR_NO_ERROR) { TRI_V8_THROW_EXCEPTION(res); } - TRI_V8_RETURN(V8RevisionId(isolate, rid)); + std::string ridString = TRI_RidToString(revisionId); + TRI_V8_RETURN(TRI_V8_STD_STRING(ridString)); TRI_V8_TRY_CATCH_END } diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index bf073aaea1..cf2ddfe4ff 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -377,7 +377,7 @@ static void JS_ChecksumCollection( LogicalCollection* collection = trx.documentCollection(); auto physical = collection->getPhysical(); TRI_ASSERT(physical != nullptr); - std::string const revisionId = std::to_string(physical->revision()); + std::string const revisionId = TRI_RidToString(physical->revision()); uint64_t hash = 0; ManagedDocumentResult mmdr(&trx); diff --git a/arangod/V8Server/v8-util.cpp b/arangod/V8Server/v8-util.cpp index c46f030969..298c56171f 100644 --- a/arangod/V8Server/v8-util.cpp +++ b/arangod/V8Server/v8-util.cpp @@ -52,17 +52,6 @@ v8::Handle V8TickId(v8::Isolate* isolate, TRI_voc_tick_t tick) { return TRI_V8_PAIR_STRING(&buffer[0], static_cast(len)); } -//////////////////////////////////////////////////////////////////////////////// -/// @brief create a v8 revision id value from the internal revision id -//////////////////////////////////////////////////////////////////////////////// - -v8::Handle V8RevisionId(v8::Isolate* isolate, TRI_voc_rid_t rid) { - char buffer[21]; - size_t len = TRI_StringUInt64InPlace(static_cast(rid), &buffer[0]); - - return TRI_V8_PAIR_STRING(&buffer[0], static_cast(len)); -} - //////////////////////////////////////////////////////////////////////////////// /// @brief checks if argument is a document identifier //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/V8Server/v8-vocbaseprivate.h b/arangod/V8Server/v8-vocbaseprivate.h index c9fb8de6ba..38a46f8c5d 100644 --- a/arangod/V8Server/v8-vocbaseprivate.h +++ b/arangod/V8Server/v8-vocbaseprivate.h @@ -61,12 +61,6 @@ extern int32_t const WRP_VOCBASE_COL_TYPE; TRI_V8_THROW_EXCEPTION(TRI_ERROR_TRANSACTION_DISALLOWED_OPERATION); \ } -//////////////////////////////////////////////////////////////////////////////// -/// @brief create a v8 revision id value from the internal revision id -//////////////////////////////////////////////////////////////////////////////// - -v8::Handle V8RevisionId(v8::Isolate* isolate, TRI_voc_rid_t rid); - //////////////////////////////////////////////////////////////////////////////// /// @brief get the vocbase pointer from the current V8 context //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/VocBase/LogicalCollection.cpp b/arangod/VocBase/LogicalCollection.cpp index 2cbcdb4cd5..649f444bec 100644 --- a/arangod/VocBase/LogicalCollection.cpp +++ b/arangod/VocBase/LogicalCollection.cpp @@ -1326,6 +1326,8 @@ void LogicalCollection::open(bool ignoreErrors) { StorageEngine* engine = EngineSelectorFeature::ENGINE; engine->changeCollection(_vocbase, _cid, this, doSync); } + + TRI_UpdateTickServer(_cid); } /// @brief opens an existing collection @@ -1468,7 +1470,6 @@ int LogicalCollection::restoreIndex(Transaction* trx, VPackSlice const& info, } TRI_ASSERT(newIdx != nullptr); - // FIXME New style. Update tick after successful creation of index. TRI_UpdateTickServer(newIdx->id()); TRI_ASSERT(newIdx.get()->type() != Index::IndexType::TRI_IDX_TYPE_PRIMARY_INDEX); diff --git a/js/common/tests/shell/shell-collection-noncluster.js b/js/common/tests/shell/shell-collection-noncluster.js index 65f01069ed..5a68d39ba1 100644 --- a/js/common/tests/shell/shell-collection-noncluster.js +++ b/js/common/tests/shell/shell-collection-noncluster.js @@ -208,7 +208,6 @@ function CollectionSuite () { var r1 = c1.checksum(true); assertTypeOf("string", r1.revision); assertTrue(r1.revision !== ""); - assertTrue(r1.revision.match(/^[0-9]+$/)); assertTypeOf("string", r1.checksum); assertEqual("0", r1.checksum); @@ -218,7 +217,6 @@ function CollectionSuite () { assertNotEqual(r1.revision, r2.revision); assertTypeOf("string", r2.revision); assertTrue(r2.revision !== ""); - assertTrue(r2.revision.match(/^[0-9]+$/)); assertTypeOf("string", r2.checksum); assertNotEqual("0", r2.checksum); @@ -229,7 +227,6 @@ function CollectionSuite () { assertNotEqual(r2.revision, r3.revision); assertTypeOf("string", r3.revision); assertTrue(r3.revision !== ""); - assertTrue(r3.revision.match(/^[0-9]+$/)); assertTypeOf("string", r3.checksum); assertNotEqual("0", r3.checksum); assertNotEqual(r2.checksum, r3.checksum); @@ -279,7 +276,6 @@ function CollectionSuite () { var r1 = c1.checksum(true); assertTypeOf("string", r1.revision); assertTrue(r1.revision !== ""); - assertTrue(r1.revision.match(/^[0-9]+$/)); assertTypeOf("string", r1.checksum); assertEqual("0", r1.checksum); @@ -288,7 +284,6 @@ function CollectionSuite () { assertNotEqual(r1.revision, r2.revision); assertTypeOf("string", r2.revision); assertTrue(r2.revision !== ""); - assertTrue(r2.revision.match(/^[0-9]+$/)); assertTypeOf("string", r2.checksum); assertNotEqual("0", r2.checksum); @@ -298,7 +293,6 @@ function CollectionSuite () { assertNotEqual(r2.revision, r3.revision); assertTypeOf("string", r3.revision); assertTrue(r3.revision !== ""); - assertTrue(r3.revision.match(/^[0-9]+$/)); assertTypeOf("string", r3.checksum); assertNotEqual("0", r3.checksum); assertNotEqual(r2.checksum, r3.checksum); diff --git a/js/common/tests/shell/shell-collection.js b/js/common/tests/shell/shell-collection.js index 0ccba61b29..52c109bf17 100644 --- a/js/common/tests/shell/shell-collection.js +++ b/js/common/tests/shell/shell-collection.js @@ -37,23 +37,76 @@ var ArangoCollection = arangodb.ArangoCollection; var db = arangodb.db; var ERRORS = arangodb.errors; -var compareStringIds = function (l, r) { - var i; - if (l.length !== r.length) { - return l.length - r.length < 0 ? -1 : 1; - } +// copied from lib/Basics/HybridLogicalClock.cpp +var decodeTable = [ + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 0 - 15 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 16 - 31 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, // 32 - 47 + 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, -1, -1, -1, -1, -1, -1, // 48 - 63 + -1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, // 64 - 79 + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, -1, -1, -1, -1, 1, // 80 - 95 + -1, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, // 96 - 111 + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, -1, -1, -1, -1, -1, // 112 - 127 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 128 - 143 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 144 - 159 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 160 - 175 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 176 - 191 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 192 - 207 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 208 - 223 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, // 224 - 239 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 // 240 - 255 +]; - // length is equal - for (i = 0; i < l.length; ++i) { - if (l[i] !== r[i]) { - return l[i] < r[i] ? -1 : 1; +var decode = function(value) { + var result = 0; + if (value !== '0') { + for (var i = 0, n = value.length; i < n; ++i) { + result = (result * 2 * 2 * 2 * 2 * 2 * 2) + decodeTable[value.charCodeAt(i)]; + } + } + return result; +}; + +var compareStringIds = function (l, r) { + if (l.length === r.length) { + // strip common prefix because the accuracy of JS numbers is limited + var prefixLength = 0; + for (var i = 0; i < l.length; ++i) { + if (l[i] !== r[i]) { + break; + } + ++prefixLength; + } + if (prefixLength > 0) { + l = l.substr(prefixLength); + r = r.substr(prefixLength); } } + l = decode(l); + r = decode(r); + if (l !== r) { + return l < r ? -1 : 1; + } return 0; }; - //////////////////////////////////////////////////////////////////////////////// /// @brief test suite: error handling //////////////////////////////////////////////////////////////////////////////// @@ -782,18 +835,15 @@ function CollectionSuite () { var r1 = c1.revision(); assertTypeOf("string", r1); - assertTrue(r1.match(/^[0-9]+$/)); c1.save({ a : 1 }); var r2 = c1.revision(); assertTypeOf("string", r2); - assertTrue(r2.match(/^[0-9]+$/)); assertEqual(1, compareStringIds(r2, r1)); c1.save({ a : 2 }); var r3 = c1.revision(); assertTypeOf("string", r3); - assertTrue(r3.match(/^[0-9]+$/)); assertEqual(1, compareStringIds(r3, r2)); // unload @@ -820,11 +870,8 @@ function CollectionSuite () { var c1 = db._create(cn); var r1 = c1.revision(); - assertTrue(r1.match(/^[0-9]+$/)); - c1.save({ _key: "abc" }); var r2 = c1.revision(); - assertTrue(r2.match(/^[0-9]+$/)); assertEqual(1, compareStringIds(r2, r1)); c1.save({ _key: "123" }); @@ -832,17 +879,14 @@ function CollectionSuite () { c1.save({ _key: "789" }); var r3 = c1.revision(); - assertTrue(r3.match(/^[0-9]+$/)); assertEqual(1, compareStringIds(r3, r2)); c1.remove("123"); var r4 = c1.revision(); - assertTrue(r4.match(/^[0-9]+$/)); assertEqual(1, compareStringIds(r4, r3)); c1.truncate(); var r5 = c1.revision(); - assertTrue(r5.match(/^[0-9]+$/)); assertEqual(1, compareStringIds(r5, r4)); // unload @@ -853,12 +897,10 @@ function CollectionSuite () { // compare rev c1 = db._collection(cn); var r6 = c1.revision(); - assertTrue(r6.match(/^[0-9]+$/)); assertEqual(0, compareStringIds(r6, r5)); for (var i = 0; i < 10; ++i) { c1.save({ _key: "test" + i }); - assertTrue(c1.revision().match(/^[0-9]+$/)); assertEqual(1, compareStringIds(c1.revision(), r6)); r6 = c1.revision(); } @@ -871,7 +913,6 @@ function CollectionSuite () { // compare rev c1 = db._collection(cn); var r7 = c1.revision(); - assertTrue(r7.match(/^[0-9]+$/)); assertEqual(0, compareStringIds(r7, r6)); c1.truncate(); @@ -885,7 +926,6 @@ function CollectionSuite () { // compare rev c1 = db._collection(cn); var r9 = c1.revision(); - assertTrue(r9.match(/^[0-9]+$/)); assertEqual(0, compareStringIds(r9, r8)); db._drop(cn);