several DS fixes (logging works now)

This commit is contained in:
Kevin Jahns 2017-10-26 16:22:35 +02:00
parent e8170a09a7
commit e6b5e258fb
7 changed files with 34 additions and 41 deletions

View File

@ -70,6 +70,7 @@ export function readDeleteSet (y, decoder) {
if (dvLength > 0) {
let pos = 0
let d = dv[pos]
let deletions = []
y.ds.iterate(new ID(user, 0), new ID(user, Number.MAX_VALUE), function (n) {
// cases:
// 1. d deletes something to the right of n
@ -91,16 +92,16 @@ export function readDeleteSet (y, decoder) {
// delete maximum the len of d
// else delete as much as possible
diff = Math.min(n._id.clock - d[0], d[1])
deleteItemRange(y, user, d[0], diff)
// deletions.push([user, d[0], diff, d[2]])
// deleteItemRange(y, user, d[0], diff)
deletions.push([user, d[0], diff])
} else {
// 3)
diff = n._id.clock + n.len - d[0] // never null (see 1)
if (d[2] && !n.gc) {
// d marks as gc'd but n does not
// then delete either way
deleteItemRange(y, user, d[0], Math.min(diff, d[1]))
// deletions.push([user, d[0], Math.min(diff, d[1]), d[2]])
// deleteItemRange(y, user, d[0], Math.min(diff, d[1]))
deletions.push([user, d[0], Math.min(diff, d[1])])
}
}
if (d[1] <= diff) {
@ -112,6 +113,12 @@ export function readDeleteSet (y, decoder) {
}
}
})
// TODO: It would be more performant to apply the deletes in the above loop
// Adapt the Tree implementation to support delete while iterating
for (let i = deletions.length - 1; i >= 0; i--) {
const del = deletions[i]
deleteItemRange(y, del[0], del[1], del[2])
}
// for the rest.. just apply it
for (; pos < dv.length; pos++) {
d = dv[pos]

View File

@ -9,7 +9,7 @@ export function stringifySyncStep2 (y, decoder, strBuilder) {
for (let i = 0; i < len; i++) {
let user = decoder.readVarUint()
strBuilder.push(` User: ${user}: `)
let len2 = decoder.readVarUint()
let len2 = decoder.readUint32()
for (let j = 0; j < len2; j++) {
let from = decoder.readVarUint()
let to = decoder.readVarUint()

View File

@ -240,7 +240,7 @@ export default class Item {
if (info & 0b100) {
encoder.writeID(this._right_origin._id)
}
if (~info & 0b101) {
if ((info & 0b101) === 0) {
// neither origin nor right is defined
encoder.writeID(this._parent._id)
}
@ -280,7 +280,7 @@ export default class Item {
}
}
// read parent
if (~info & 0b101) {
if ((info & 0b101) === 0) {
// neither origin nor right is defined
const parentID = decoder.readID()
// parent does not change, so we don't have to search for it again
@ -297,6 +297,8 @@ export default class Item {
this._parent = this._origin._parent
} else if (this._right_origin !== null) {
this._parent = this._right_origin._parent
} else if (missing.length === 0) {
debugger
}
}
if (info & 0b1000) {

View File

@ -103,15 +103,17 @@ export default class YArray extends Type {
let item = this._start
let count = 0
while (item !== null && length > 0) {
if (count <= pos && pos < count + item._length) {
const diffDel = pos - count
item = item._splitAt(this._y, diffDel)
item._splitAt(this._y, length)
length -= item._length
item._delete(this._y)
}
if (!item._deleted) {
count += item._length
if (count <= pos && pos < count + item._length) {
const diffDel = pos - count
item = item._splitAt(this._y, diffDel)
item._splitAt(this._y, length)
length -= item._length
item._delete(this._y)
count += diffDel
} else {
count += item._length
}
}
item = item._right
}

View File

@ -273,7 +273,7 @@ export default class Tree {
var child = d.left || d.right
if (child === null) {
isFakeChild = true
child = new N({id: 0})
child = new N(null)
child.blacken()
d.right = child
} else {

View File

@ -228,7 +228,7 @@ var arrayTransactions = [
var pos = chance.integer({ min: 0, max: yarray.length })
yarray.insert(pos, content)
},
function insertTypeArray (t, user, chance) {
/*function insertTypeArray (t, user, chance) {
const yarray = user.get('array', Y.Array)
var pos = chance.integer({ min: 0, max: yarray.length })
yarray.insert(pos, [Y.Array])
@ -243,7 +243,7 @@ var arrayTransactions = [
map.set('someprop', 42)
map.set('someprop', 43)
map.set('someprop', 44)
},
},*/
function _delete (t, user, chance) {
const yarray = user.get('array', Y.Array)
var length = yarray.length
@ -296,19 +296,19 @@ test('y-array: Random tests (47)', async function randomArray47 (t) {
await applyRandomTests(t, arrayTransactions, 47)
})
test('y-array: Random tests (200)', async function randomArray200 (t) {
test('y-array: Random tests (300)', async function randomArray300 (t) {
await applyRandomTests(t, arrayTransactions, 200)
})
test('y-array: Random tests (300)', async function randomArray300 (t) {
test('y-array: Random tests (500)', async function randomArray500 (t) {
await applyRandomTests(t, arrayTransactions, 300)
})
test('y-array: Random tests (400)', async function randomArray400 (t) {
test('y-array: Random tests (600)', async function randomArray600 (t) {
await applyRandomTests(t, arrayTransactions, 400)
})
test('y-array: Random tests (500)', async function randomArray500 (t) {
test('y-array: Random tests (700)', async function randomArray700 (t) {
await applyRandomTests(t, arrayTransactions, 500)
})
@ -316,6 +316,6 @@ test('y-array: Random tests (1000)', async function randomArray1000 (t) {
await applyRandomTests(t, arrayTransactions, 1000)
})
test('y-array: Random tests (2000)', async function randomArray2000 (t) {
test('y-array: Random tests (1800)', async function randomArray1800 (t) {
await applyRandomTests(t, arrayTransactions, 2000)
})

View File

@ -96,24 +96,6 @@ export async function compareUsers (t, users) {
var userMapValues = users.map(u => u.get('map', Y.Map).toJSON())
var userXmlValues = users.map(u => u.get('xml', Y.Xml).toString())
// disconnect all except user 0
await Promise.all(users.slice(1).map(async u =>
u.disconnect()
))
if (users[0].connector.testRoom == null) {
await wait(100)
}
// reconnect all
await Promise.all(users.map(u => u.reconnect()))
if (users[0].connector.testRoom == null) {
await wait(100)
}
await users[0].connector.testRoom.flushAll(users)
await Promise.all(users.map(u =>
new Promise(function (resolve) {
u.connector.whenSynced(resolve)
})
))
var data = users.map(u => {
defragmentItemContent(u)
var data = {}