From c95dae3c33cae4aeee438ccf8adebe845b75e6e5 Mon Sep 17 00:00:00 2001 From: Kevin Jahns <kevin.jahns@rwth-aachen.de> Date: Tue, 6 Oct 2015 14:22:52 +0200 Subject: [PATCH] fixed inconsistency bugs for tests<1000 --- src/Helper.spec.js | 2 +- src/OperationStore.js | 2 +- src/OperationStores/Memory.js | 34 ++++++++++++------ src/OperationStores/Memory.spec.js | 56 ++++++++++++++++++++++++++++++ src/Types/Array.spec.js | 4 +-- src/Types/Map.spec.js | 4 +-- 6 files changed, 86 insertions(+), 16 deletions(-) diff --git a/src/Helper.spec.js b/src/Helper.spec.js index cda3b4b0..c3655e53 100644 --- a/src/Helper.spec.js +++ b/src/Helper.spec.js @@ -36,7 +36,7 @@ function wait (t) { return new Promise(function (resolve) { setTimeout(function () { resolve() - }, t * 5) + }, t) }) } g.wait = wait diff --git a/src/OperationStore.js b/src/OperationStore.js index df532a63..3464bd60 100644 --- a/src/OperationStore.js +++ b/src/OperationStore.js @@ -207,7 +207,7 @@ class AbstractTransaction { yield* this.setOperation(parent) } yield* this.removeOperation(o.id) // actually remove it from the os - yield* this.ds.markGarbageCollected(o.id) + this.ds.markGarbageCollected(o.id) } } Y.AbstractTransaction = AbstractTransaction diff --git a/src/OperationStores/Memory.js b/src/OperationStores/Memory.js index 983790c6..cf3c869e 100644 --- a/src/OperationStores/Memory.js +++ b/src/OperationStores/Memory.js @@ -4,6 +4,8 @@ class DeleteStore extends Y.utils.RBTree { constructor () { super() + // TODO: debugggg + this.mem = [] } isDeleted (id) { var n = this.findNodeWithUpperBound(id) @@ -14,8 +16,10 @@ class DeleteStore extends Y.utils.RBTree { returns the delete node */ - * markGarbageCollected (id) { + markGarbageCollected (id) { + this.mem.push({"gc": id}) var n = this.markDeleted(id) + this.mem.pop() if (!n.val.gc) { if (n.val.id[1] < id[1]) { // un-extend left @@ -30,16 +34,24 @@ class DeleteStore extends Y.utils.RBTree { } // set gc'd n.val.gc = true - - // can extend left? var prev = n.prev() - if (prev != null && prev.val.gc) { + var next = n.next() + // can extend left? + if ( + prev != null && + prev.val.gc && + Y.utils.compareIds([prev.val.id[0], prev.val.id[1] + prev.val.len], n.val.id) + ) { prev.val.len += n.val.len super.delete(n.val.id) + n = prev } // can extend right? - var next = n.next() - if (next != null && next.val.gc) { + if ( + next != null && + next.val.gc && + Y.utils.compareIds([n.val.id[0], n.val.id[1] + n.val.len], next.val.id) + ) { n.val.len += next.val.len super.delete(next.val.id) } @@ -52,12 +64,13 @@ class DeleteStore extends Y.utils.RBTree { returns the delete node */ markDeleted (id) { + this.mem.push({"del": id}) var n = this.findNodeWithUpperBound(id) if (n != null && n.val.id[0] === id[0]) { if (n.val.id[1] <= id[1] && id[1] < n.val.id[1] + n.val.len) { // already deleted return n - } else if (n.val.id[1] + n.val.len === id[1]) { + } else if (n.val.id[1] + n.val.len === id[1] && !n.val.gc) { // can extend existing deletion n.val.len++ } else { @@ -70,9 +83,10 @@ class DeleteStore extends Y.utils.RBTree { } // can extend right? var next = n.next() - if (next !== null && - Y.utils.compareIds([n.val.id[0], n.val.id[1] + n.val.len], next.val.id) && - next.val.gc === false + if ( + next !== null && + Y.utils.compareIds([n.val.id[0], n.val.id[1] + n.val.len], next.val.id) && + !next.val.gc ) { n.val.len = n.val.len + next.val.len super.delete(next.val.id) diff --git a/src/OperationStores/Memory.spec.js b/src/OperationStores/Memory.spec.js index 0a38c5e3..43e88b49 100644 --- a/src/OperationStores/Memory.spec.js +++ b/src/OperationStores/Memory.spec.js @@ -25,5 +25,61 @@ describe('Memory', function () { ds.markDeleted(['0', 2]) expect(ds.toDeleteSet()).toEqual({'0': [[2, 3, false]]}) }) + it('Debug #1', function () { + ds.markDeleted(['166', 0]) + ds.markDeleted(['166', 2]) + ds.markDeleted(['166', 0]) + ds.markDeleted(['166', 2]) + ds.markGarbageCollected(['166', 2]) + ds.markDeleted(['166', 1]) + ds.markDeleted(['166', 3]) + ds.markGarbageCollected(['166', 3]) + ds.markDeleted(['166', 0]) + expect(ds.toDeleteSet()).toEqual({'166': [[0, 2, false], [2, 2, true]]}) + }) + it('Debug #2', function () { + ds.markDeleted(['293', 0]) + ds.markDeleted(['291', 2]) + ds.markDeleted(['291', 2]) + ds.markGarbageCollected(['293', 0]) + ds.markDeleted(['293', 1]) + ds.markGarbageCollected(['291', 2]) + expect(ds.toDeleteSet()).toEqual({'291': [[2, 1, true]], '293': [[0, 1, true], [1, 1, false]]}) + }) + it('Debug #2', function () { + ds.markDeleted(['581', 0]) + ds.markDeleted(['581', 1]) + ds.markDeleted(['580', 0]) + ds.markDeleted(['580', 0]) + ds.markGarbageCollected(['581', 0]) + ds.markDeleted(['581', 2]) + ds.markDeleted(['580', 1]) + ds.markDeleted(['580', 2]) + ds.markDeleted(['580', 1]) + ds.markDeleted(['580', 2]) + ds.markGarbageCollected(['581', 2]) + ds.markGarbageCollected(['581', 1]) + ds.markGarbageCollected(['580', 1]) + expect(ds.toDeleteSet()).toEqual({'580': [[0, 1, false], [1, 1, true], [2, 1, false]], '581': [[0, 3, true]]}) + }) + it('Debug #2', function () { + ds.markDeleted(['544', 0]) + ds.markDeleted(['543', 2]) + ds.markDeleted(['544', 0]) + ds.markDeleted(['543', 2]) + ds.markGarbageCollected(['544', 0]) + ds.markDeleted(['545', 1]) + ds.markDeleted(['543', 4]) + ds.markDeleted(['543', 3]) + ds.markDeleted(['544', 1]) + ds.markDeleted(['544', 2]) + ds.markDeleted(['544', 1]) + ds.markDeleted(['544', 2]) + ds.markGarbageCollected(['543', 2]) + ds.markGarbageCollected(['543', 4]) + ds.markGarbageCollected(['544', 2]) + ds.markGarbageCollected(['543', 3]) + expect(ds.toDeleteSet()).toEqual({'543': [[2, 3, true]], '544': [[0, 1, true], [1, 1, false], [2, 1, true]], '545': [[1, 1, false]]}) + }) }) }) diff --git a/src/Types/Array.spec.js b/src/Types/Array.spec.js index 7d2bf6a1..90e10862 100644 --- a/src/Types/Array.spec.js +++ b/src/Types/Array.spec.js @@ -1,8 +1,8 @@ /* global createUsers, wait, Y, compareAllUsers, getRandomNumber, applyRandomTransactions, async, garbageCollectAllUsers, describeManyTimes */ /* eslint-env browser,jasmine */ -var numberOfYArrayTests = 10 -var repeatArrayTests = 300 +var numberOfYArrayTests = 1000 +var repeatArrayTests = 5 describe('Array Type', function () { var y1, y2, y3, yconfig1, yconfig2, yconfig3, flushAll diff --git a/src/Types/Map.spec.js b/src/Types/Map.spec.js index 22b173c8..a6496e8f 100644 --- a/src/Types/Map.spec.js +++ b/src/Types/Map.spec.js @@ -1,8 +1,8 @@ /* global createUsers, Y, compareAllUsers, getRandomNumber, applyRandomTransactions, async, describeManyTimes */ /* eslint-env browser,jasmine */ -var numberOfYMapTests = 70 -var repeatMapTeasts = 1 +var numberOfYMapTests = 100 +var repeatMapTeasts = 10 describe('Map Type', function () { var y1, y2, y3, y4, flushAll -- GitLab