fixed inconsistency bugs for tests<1000
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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]]})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user