fixed inconsistency bugs for tests<1000

This commit is contained in:
Kevin Jahns 2015-10-06 14:22:52 +02:00
parent 82e2254302
commit c95dae3c33
6 changed files with 86 additions and 16 deletions

View File

@ -36,7 +36,7 @@ function wait (t) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve()
}, t * 5)
}, t)
})
}
g.wait = wait

View File

@ -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

View File

@ -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 &&
if (
next !== null &&
Y.utils.compareIds([n.val.id[0], n.val.id[1] + n.val.len], next.val.id) &&
next.val.gc === false
!next.val.gc
) {
n.val.len = n.val.len + next.val.len
super.delete(next.val.id)

View File

@ -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]]})
})
})
})

View File

@ -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

View File

@ -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