diff --git a/algo/benchmarks b/algo/benchmarks new file mode 100644 index 0000000000000000000000000000000000000000..357a370873ad5ef0801e376da64d0633c78f1455 --- /dev/null +++ b/algo/benchmarks @@ -0,0 +1,170 @@ +len: 10, compressed: 43, bytes/int: 4.300000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1:size=10:overlap=0.01:-4 50000000 38.1 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1:size=10:overlap=0.01:-4 2000000 669 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1:size=10:overlap=0.01:-4 2000000 692 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1:size=10:overlap=0.01:-4 2000000 927 ns/op + +len: 100, compressed: 208, bytes/int: 2.080000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=10:size=10:overlap=0.01:-4 20000000 88.7 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=10:size=10:overlap=0.01:-4 1000000 1474 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=10:size=10:overlap=0.01:-4 1000000 1396 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=10:size=10:overlap=0.01:-4 1000000 1584 ns/op + +len: 500, compressed: 875, bytes/int: 1.750000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=50:size=10:overlap=0.01:-4 5000000 320 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=50:size=10:overlap=0.01:-4 500000 2763 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=50:size=10:overlap=0.01:-4 500000 2664 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=50:size=10:overlap=0.01:-4 500000 2709 ns/op + +len: 1000, compressed: 1279, bytes/int: 1.279000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=100:size=10:overlap=0.01:-4 10000000 207 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=100:size=10:overlap=0.01:-4 500000 3173 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=100:size=10:overlap=0.01:-4 500000 3012 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=100:size=10:overlap=0.01:-4 500000 2841 ns/op + +len: 5000, compressed: 3115, bytes/int: 0.623000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=500:size=10:overlap=0.01:-4 3000000 491 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=500:size=10:overlap=0.01:-4 1000000 2449 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=500:size=10:overlap=0.01:-4 300000 4256 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=500:size=10:overlap=0.01:-4 1000000 1729 ns/op + +len: 10000, compressed: 3276, bytes/int: 0.327600 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1000:size=10:overlap=0.01:-4 3000000 538 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1000:size=10:overlap=0.01:-4 500000 3378 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1000:size=10:overlap=0.01:-4 200000 8346 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1000:size=10:overlap=0.01:-4 1000000 2036 ns/op + +len: 100000, compressed: 35820, bytes/int: 0.358200 +BenchmarkListIntersectRatio/:IntersectWith:ratio=10000:size=10:overlap=0.01:-4 2000000 645 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=10000:size=10:overlap=0.01:-4 200000 7103 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=10000:size=10:overlap=0.01:-4 20000 66790 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=10000:size=10:overlap=0.01:-4 1000000 2322 ns/op + +len: 1000000, compressed: 210344, bytes/int: 0.210344 +BenchmarkListIntersectRatio/:IntersectWith:ratio=100000:size=10:overlap=0.01:-4 2000000 766 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=100000:size=10:overlap=0.01:-4 30000 46978 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=100000:size=10:overlap=0.01:-4 2000 623066 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=100000:size=10:overlap=0.01:-4 1000000 2434 ns/op + +len: 100, compressed: 224, bytes/int: 2.240000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1:size=100:overlap=0.01:-4 5000000 265 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1:size=100:overlap=0.01:-4 1000000 1642 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1:size=100:overlap=0.01:-4 1000000 1562 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1:size=100:overlap=0.01:-4 300000 4465 ns/op + +len: 1000, compressed: 1919, bytes/int: 1.919000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=10:size=100:overlap=0.01:-4 2000000 918 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=10:size=100:overlap=0.01:-4 500000 3502 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=10:size=100:overlap=0.01:-4 500000 3354 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=10:size=100:overlap=0.01:-4 300000 5892 ns/op + +len: 5000, compressed: 6507, bytes/int: 1.301400 +BenchmarkListIntersectRatio/:IntersectWith:ratio=50:size=100:overlap=0.01:-4 500000 3564 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=50:size=100:overlap=0.01:-4 200000 7430 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=50:size=100:overlap=0.01:-4 200000 6695 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=50:size=100:overlap=0.01:-4 200000 7031 ns/op + +len: 10000, compressed: 9789, bytes/int: 0.978900 +BenchmarkListIntersectRatio/:IntersectWith:ratio=100:size=100:overlap=0.01:-4 500000 2794 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=100:size=100:overlap=0.01:-4 200000 10967 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=100:size=100:overlap=0.01:-4 200000 10408 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=100:size=100:overlap=0.01:-4 200000 8466 ns/op + +len: 50000, compressed: 27064, bytes/int: 0.541280 +BenchmarkListIntersectRatio/:IntersectWith:ratio=500:size=100:overlap=0.01:-4 300000 5327 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=500:size=100:overlap=0.01:-4 100000 20892 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=500:size=100:overlap=0.01:-4 30000 42359 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=500:size=100:overlap=0.01:-4 100000 13843 ns/op + +len: 100000, compressed: 36011, bytes/int: 0.360110 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1000:size=100:overlap=0.01:-4 300000 5785 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1000:size=100:overlap=0.01:-4 50000 24653 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1000:size=100:overlap=0.01:-4 20000 78757 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1000:size=100:overlap=0.01:-4 100000 16175 ns/op + +len: 1000000, compressed: 336000, bytes/int: 0.336000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=10000:size=100:overlap=0.01:-4 200000 8323 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=10000:size=100:overlap=0.01:-4 20000 67559 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=10000:size=100:overlap=0.01:-4 2000 777599 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=10000:size=100:overlap=0.01:-4 100000 21898 ns/op + +len: 1000, compressed: 2727, bytes/int: 2.727000 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1:size=1000:overlap=0.01:-4 500000 2593 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1:size=1000:overlap=0.01:-4 300000 5650 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1:size=1000:overlap=0.01:-4 300000 5489 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1:size=1000:overlap=0.01:-4 50000 39633 ns/op + +len: 10000, compressed: 16971, bytes/int: 1.697100 +BenchmarkListIntersectRatio/:IntersectWith:ratio=10:size=1000:overlap=0.01:-4 100000 14934 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=10:size=1000:overlap=0.01:-4 100000 19053 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=10:size=1000:overlap=0.01:-4 100000 17840 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=10:size=1000:overlap=0.01:-4 30000 55813 ns/op + +len: 50000, compressed: 56091, bytes/int: 1.121820 +BenchmarkListIntersectRatio/:IntersectWith:ratio=50:size=1000:overlap=0.01:-4 50000 39451 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=50:size=1000:overlap=0.01:-4 20000 62504 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=50:size=1000:overlap=0.01:-4 30000 58590 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=50:size=1000:overlap=0.01:-4 20000 96190 ns/op + +len: 100000, compressed: 93473, bytes/int: 0.934730 +BenchmarkListIntersectRatio/:IntersectWith:ratio=100:size=1000:overlap=0.01:-4 30000 47043 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=100:size=1000:overlap=0.01:-4 20000 99033 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=100:size=1000:overlap=0.01:-4 10000 100871 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=100:size=1000:overlap=0.01:-4 10000 131206 ns/op + +len: 500000, compressed: 254331, bytes/int: 0.508662 +BenchmarkListIntersectRatio/:IntersectWith:ratio=500:size=1000:overlap=0.01:-4 10000 129480 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=500:size=1000:overlap=0.01:-4 10000 228660 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=500:size=1000:overlap=0.01:-4 3000 418707 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=500:size=1000:overlap=0.01:-4 10000 203561 ns/op + +len: 1000000, compressed: 402898, bytes/int: 0.402898 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1000:size=1000:overlap=0.01:-4 10000 145888 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1000:size=1000:overlap=0.01:-4 5000 244345 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1000:size=1000:overlap=0.01:-4 2000 807267 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1000:size=1000:overlap=0.01:-4 5000 234922 ns/op + +len: 10000, compressed: 23144, bytes/int: 2.314400 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1:size=10000:overlap=0.01:-4 20000 95952 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1:size=10000:overlap=0.01:-4 10000 103362 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1:size=10000:overlap=0.01:-4 10000 102460 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1:size=10000:overlap=0.01:-4 5000 386213 ns/op + +len: 100000, compressed: 150981, bytes/int: 1.509810 +BenchmarkListIntersectRatio/:IntersectWith:ratio=10:size=10000:overlap=0.01:-4 10000 183513 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=10:size=10000:overlap=0.01:-4 10000 231087 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=10:size=10000:overlap=0.01:-4 10000 225320 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=10:size=10000:overlap=0.01:-4 2000 615168 ns/op + +len: 500000, compressed: 520695, bytes/int: 1.041390 +BenchmarkListIntersectRatio/:IntersectWith:ratio=50:size=10000:overlap=0.01:-4 3000 423944 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=50:size=10000:overlap=0.01:-4 2000 622041 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=50:size=10000:overlap=0.01:-4 3000 591211 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=50:size=10000:overlap=0.01:-4 2000 1081434 ns/op + +len: 1000000, compressed: 859680, bytes/int: 0.859680 +BenchmarkListIntersectRatio/:IntersectWith:ratio=100:size=10000:overlap=0.01:-4 2000 640508 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=100:size=10000:overlap=0.01:-4 2000 1006359 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=100:size=10000:overlap=0.01:-4 2000 1001509 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=100:size=10000:overlap=0.01:-4 1000 1473389 ns/op + +len: 100000, compressed: 223045, bytes/int: 2.230450 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1:size=100000:overlap=0.01:-4 2000 982775 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1:size=100000:overlap=0.01:-4 2000 1040402 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1:size=100000:overlap=0.01:-4 2000 1029087 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1:size=100000:overlap=0.01:-4 500 3859866 ns/op + +len: 1000000, compressed: 1472656, bytes/int: 1.472656 +BenchmarkListIntersectRatio/:IntersectWith:ratio=10:size=100000:overlap=0.01:-4 1000 1938682 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=10:size=100000:overlap=0.01:-4 1000 2344582 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=10:size=100000:overlap=0.01:-4 1000 2249649 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=10:size=100000:overlap=0.01:-4 200 6201335 ns/op + +len: 1000000, compressed: 2585277, bytes/int: 2.585277 +BenchmarkListIntersectRatio/:IntersectWith:ratio=1:size=1000000:overlap=0.01:-4 100 10075901 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLinJump:ratio=1:size=1000000:overlap=0.01:-4 100 10527806 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithLin:ratio=1:size=1000000:overlap=0.01:-4 100 10431302 ns/op +BenchmarkListIntersectRatio/compressed:IntersectWithBin:ratio=1:size=1000000:overlap=0.01:-4 30 38617011 ns/op + +PASS +ok github.com/dgraph-io/dgraph/algo 206.835s diff --git a/algo/uidlist.go b/algo/uidlist.go index c451e5060e116211644b7cdf77d7e6bf308d66a8..8776e17301ecac0f113ec206d8e750644e7e02dc 100644 --- a/algo/uidlist.go +++ b/algo/uidlist.go @@ -51,39 +51,36 @@ func IntersectCompressedWith(u []byte, afterUID uint64, v, o *protos.List) { if n == 0 { n = 1 } + // Select appropriate function based on heuristics. ratio := float64(m) / float64(n) - if ratio < 100 { - IntersectCompressedWithLin(&bi, v.Uids, &dst) - } else if ratio < 500 { - IntersectCompressedWithJump(&bi, v.Uids, &dst) + if ratio < 500 { + IntersectCompressedWithLinJump(&bi, v.Uids, &dst) } else { IntersectCompressedWithBin(&bi, v.Uids, &dst) } o.Uids = dst } -func IntersectCompressedWithLin(bi *bp128.BPackIterator, v []uint64, o *[]uint64) { +func IntersectCompressedWithLinJump(bi *bp128.BPackIterator, v []uint64, o *[]uint64) { m := len(v) k := 0 - for k < m && bi.Valid() { - u := bi.Uids() - _, off := IntersectWithLin(u, v[k:], o) - k += off - bi.Next() - } -} + u := bi.Uids() + _, off := IntersectWithLin(u, v[k:], o) + k += off -func IntersectCompressedWithJump(bi *bp128.BPackIterator, v []uint64, o *[]uint64) { - m := len(v) - k := 0 for k < m && bi.Valid() { + maxId := bi.MaxIntInBlock() + if v[k] > maxId { + bi.SkipNext() + continue + } else { + bi.Next() + } u := bi.Uids() - // Jumps only within a block - _, off := IntersectWithJump(u, v[k:], o) + _, off := IntersectWithLin(u, v[k:], o) k += off - bi.Next() } } diff --git a/bp128/bp128.go b/bp128/bp128.go index 34b4b879c8fdebc000b56a1767a34fee06acdccb..4c6396a8558ed0100a0f0f85985189742f5e9364 100644 --- a/bp128/bp128.go +++ b/bp128/bp128.go @@ -11,6 +11,7 @@ package bp128 import ( "encoding/binary" + "math" "sort" "github.com/dgraph-io/dgraph/x" @@ -182,6 +183,13 @@ func (bp *BPackEncoder) Length() int { return bp.length } +func NumInteges(data []byte) int { + if len(data) == 0 { + return 0 + } + return int(binary.BigEndian.Uint32(data[0:4])) +} + type BPackIterator struct { data []byte metadata []byte @@ -268,7 +276,7 @@ func (pi *BPackIterator) search(afterUid uint64, numBlocks int) { func (pi *BPackIterator) AfterUid(uid uint64) (found bool) { // Current uncompressed block doesn't have uid, search for appropriate // block, uncompress it and store it in pi.out - if pi.out[len(pi.out)-1] < uid { + if len(pi.out) > 0 && pi.out[len(pi.out)-1] < uid { nBlocks := numBlocks(pi.length) pi.search(uid-1, nBlocks) } @@ -332,6 +340,43 @@ func (pi *BPackIterator) Next() { pi.count += BlockSize } +func (pi *BPackIterator) SkipNext() { + if pi.count >= pi.length { + pi.valid = false + pi.out = pi.buf[:0] + return + } + + // Find the bit size of the block + sz := uint8(pi.data[pi.in_offset]) + // If it's varint block,(The last one) + if sz&bitVarint != 0 { + pi.in_offset = len(pi.data) + pi.count = pi.length + return + } + // Calculate size of the block based on bitsize + pi.in_offset += (int(sz)*BlockSize)/8 + 1 + pi.count += BlockSize + // Update seed + i := (pi.count / BlockSize) * 20 + pi.lastSeed[0] = binary.BigEndian.Uint64(pi.metadata[i : i+8]) + pi.lastSeed[1] = binary.BigEndian.Uint64(pi.metadata[i+8 : i+16]) +} + +func (pi *BPackIterator) MaxIntInBlock() uint64 { + nBlocks := numBlocks(pi.length) + currBlock := pi.count / BlockSize + // We find max value through seed value stored in next meta block, so + // if it's a last block, we don't know the max so we return maxuint64 + if currBlock >= nBlocks-1 { + return math.MaxUint64 + } + // MaxInt in current block can be found by seed value of next block + midx := (currBlock + 1) * 20 + return binary.BigEndian.Uint64(pi.metadata[midx+8 : midx+16]) +} + func DeltaUnpack(in []byte, out []uint64) { var bi BPackIterator bi.Init(in, 0) diff --git a/posting/list.go b/posting/list.go index f0e1c2aed18bb8ec320672681a10d38aa44e8ee9..36b14e98c28468a1bbabbc6fa40da5407c8e33dc 100644 --- a/posting/list.go +++ b/posting/list.go @@ -428,8 +428,16 @@ func (l *List) addMutation(ctx context.Context, t *protos.DirectedEdge) (bool, e index = rv.Index gid = rv.Group } - if len(l.mlayer) > 1000 || - (len(l.pending) > 0 && index > l.pending[0]+4000) { + // Calculate 5% of immutable layer + numUids := (bp128.NumInteges(l.plist.Uids) * 5) / 100 + if numUids < 3000 { + numUids = 3000 + } + if len(l.mlayer) > numUids || + // All proposals are kept in before until they are snapshotted, this ensures that + // we don't have too many pending proposals. + // TODO: Come up with a good limit, based on size of proposals + (len(l.pending) > 0 && index > l.pending[0]+10000) { l.syncIfDirty(false) } @@ -489,10 +497,6 @@ func (l *List) addMutation(ctx context.Context, t *protos.DirectedEdge) (bool, e func (l *List) delete(ctx context.Context, attr string) error { l.AssertLock() - if l.plist != emptyList { - l.plist.Uids = l.plist.Uids[:0] - l.plist.Postings = l.plist.Postings[:0] - } l.plist = emptyList l.mlayer = l.mlayer[:0] // Clear the mutation layer. atomic.StoreInt32(&l.deleteAll, 1) @@ -679,8 +683,7 @@ func (l *List) syncIfDirty(delFromCache bool) (committed bool, err error) { data, err = final.Marshal() x.Checkf(err, "Unable to marshal posting list") } else { - data = make([]byte, len(final.Uids)) - copy(data, final.Uids) // Copy Uids, otherwise they may change before write to Badger. + data = final.Uids uidOnlyPosting = true } l.plist = final