found some gc bugs that occur when using deletion lengths

This commit is contained in:
Kevin Jahns 2016-04-25 13:09:52 +02:00
parent 90b7b01e9a
commit 71bf6438e1
3 changed files with 16 additions and 14 deletions

View File

@ -113,6 +113,11 @@ module.exports = function (Y /* :any */) {
garbageCollect() garbageCollect()
} }
} }
queueGarbageCollector (id) {
if (this.y.isConnected()) {
this.gc1.push(id)
}
}
emptyGarbageCollector () { emptyGarbageCollector () {
return new Promise(resolve => { return new Promise(resolve => {
var check = () => { var check = () => {
@ -185,9 +190,7 @@ module.exports = function (Y /* :any */) {
if (gc) { if (gc) {
op.gc = true op.gc = true
yield* this.setOperation(op) yield* this.setOperation(op)
if (this.store.y.connector.isSynced) { this.store.queueGarbageCollector(op.id)
this.store.gc1.push(op.id)
}
return true return true
} }
} }

View File

@ -229,6 +229,9 @@ module.exports = function (Y/* :any */) {
// if right exists, and it is supposed to be gc'd. Remove it from the gc // if right exists, and it is supposed to be gc'd. Remove it from the gc
if (right.gc != null) { if (right.gc != null) {
if (right.content != null && right.content.length > 1) {
right = yield* this.getInsertionCleanEnd(right.id)
}
this.store.removeFromGarbageCollector(right) this.store.removeFromGarbageCollector(right)
} }
yield* this.setOperation(right) yield* this.setOperation(right)

View File

@ -165,9 +165,7 @@ module.exports = function (Y/* :any */) {
if (start.opContent != null) { if (start.opContent != null) {
yield* this.deleteOperation(start.opContent) yield* this.deleteOperation(start.opContent)
} }
if (this.store.y.connector.isSynced) { this.store.queueGarbageCollector(start.id)
this.store.gc1.push(start.id)
}
} }
start = start.right start = start.right
} }
@ -320,6 +318,7 @@ module.exports = function (Y/* :any */) {
yield* this.ds.delete(next.id) yield* this.ds.delete(next.id)
} }
yield* this.ds.put(n) yield* this.ds.put(n)
yield* this.updateState(n.id[0])
} }
/* /*
Mark an operation as deleted. Mark an operation as deleted.
@ -445,7 +444,7 @@ module.exports = function (Y/* :any */) {
} }
} }
yield* this.setOperation(op) yield* this.setOperation(op)
this.store.gc1.push(op.id) this.store.gc1.push(op.id) // this is ok becaues its shortly before sync (otherwise use queueGarbageCollector!)
return return
} }
} }
@ -472,9 +471,7 @@ module.exports = function (Y/* :any */) {
var o = yield* this.getOperation(id) var o = yield* this.getOperation(id)
yield* this.markGarbageCollected(id, (o != null && o.content != null) ? o.content.length : 1) // always mark gc'd yield* this.markGarbageCollected(id, (o != null && o.content != null) ? o.content.length : 1) // always mark gc'd
// if op exists, then clean that mess up.. // if op exists, then clean that mess up..
if (o == null) { if (o != null) {
yield* this.updateState(id[0])
} else if (o != null) {
var deps = [] var deps = []
if (o.opContent != null) { if (o.opContent != null) {
deps.push(o.opContent) deps.push(o.opContent)
@ -491,10 +488,9 @@ module.exports = function (Y/* :any */) {
} }
dep.gc = true dep.gc = true
yield* this.setOperation(dep) yield* this.setOperation(dep)
this.store.gc1.push(dep.id) this.store.queueGarbageCollector(dep.id)
} else { } else {
yield* this.markGarbageCollected(deps[i], 1) yield* this.markGarbageCollected(deps[i], 1)
yield* this.updateState(deps[i][0]) // TODO: unneccessary?
} }
} }
@ -845,7 +841,7 @@ module.exports = function (Y/* :any */) {
yield* this.setOperation(left) yield* this.setOperation(left)
yield* this.setOperation(ins) yield* this.setOperation(ins)
if (left.gc) { if (left.gc) {
this.store.gc1.push(ins.id) this.store.queueGarbageCollector(ins.id)
} }
return ins return ins
} }
@ -873,7 +869,7 @@ module.exports = function (Y/* :any */) {
yield* this.setOperation(right) yield* this.setOperation(right)
yield* this.setOperation(ins) yield* this.setOperation(ins)
if (ins.gc) { if (ins.gc) {
this.store.gc1.push(right.id) this.store.queueGarbageCollector(right.id)
} }
return ins return ins
} }