mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-27 00:55:17 +00:00
1544 lines
15 KiB
Plaintext
1544 lines
15 KiB
Plaintext
# 1 memtable.
|
|
|
|
define
|
|
mem
|
|
a.SET.10:b
|
|
a.SET.12:c
|
|
a.SET.14:d
|
|
b.MERGE.10:b
|
|
b.MERGE.12:c
|
|
b.MERGE.14:d
|
|
b.RANGEDEL.15:c
|
|
b.MERGE.16:e
|
|
c.SET.10:b
|
|
c.SET.12:c
|
|
c.SET.14:d
|
|
----
|
|
mem: 1
|
|
|
|
get seq=11
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:b
|
|
b:b
|
|
c:b
|
|
|
|
get seq=13
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:c
|
|
b:bc
|
|
c:c
|
|
|
|
get seq=15
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b:bcd
|
|
c:d
|
|
|
|
get seq=16
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b: pebble: not found
|
|
c:d
|
|
|
|
get seq=17
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b:e
|
|
c:d
|
|
|
|
get seq=15
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b:bcd
|
|
c:d
|
|
|
|
iter seq=15
|
|
first
|
|
next
|
|
next
|
|
next
|
|
seek-ge a
|
|
seek-ge b
|
|
seek-ge c
|
|
seek-ge d
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
seek-lt a
|
|
seek-lt b
|
|
seek-lt c
|
|
seek-lt d
|
|
----
|
|
a: (d, .)
|
|
b: (bcd, .)
|
|
c: (d, .)
|
|
.
|
|
a: (d, .)
|
|
b: (bcd, .)
|
|
c: (d, .)
|
|
.
|
|
c: (d, .)
|
|
b: (bcd, .)
|
|
a: (d, .)
|
|
.
|
|
.
|
|
a: (d, .)
|
|
b: (bcd, .)
|
|
c: (d, .)
|
|
|
|
iter seq=16
|
|
first
|
|
next
|
|
next
|
|
seek-ge a
|
|
seek-ge b
|
|
seek-ge c
|
|
seek-ge d
|
|
last
|
|
prev
|
|
prev
|
|
seek-lt a
|
|
seek-lt b
|
|
seek-lt c
|
|
seek-lt d
|
|
----
|
|
a: (d, .)
|
|
c: (d, .)
|
|
.
|
|
a: (d, .)
|
|
c: (d, .)
|
|
c: (d, .)
|
|
.
|
|
c: (d, .)
|
|
a: (d, .)
|
|
.
|
|
.
|
|
a: (d, .)
|
|
a: (d, .)
|
|
c: (d, .)
|
|
|
|
# Multiple memtables.
|
|
|
|
define
|
|
mem
|
|
a.SET.10:b
|
|
b.MERGE.10:b
|
|
c.SET.10:b
|
|
mem
|
|
a.SET.12:c
|
|
b.MERGE.12:c
|
|
c.SET.12:c
|
|
mem
|
|
a.SET.14:d
|
|
b.MERGE.14:d
|
|
c.SET.14:d
|
|
mem
|
|
b.RANGEDEL.15:c
|
|
mem
|
|
b.MERGE.16:e
|
|
----
|
|
mem: 5
|
|
|
|
get seq=11
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:b
|
|
b:b
|
|
c:b
|
|
|
|
get seq=13
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:c
|
|
b:bc
|
|
c:c
|
|
|
|
get seq=15
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b:bcd
|
|
c:d
|
|
|
|
get seq=16
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b: pebble: not found
|
|
c:d
|
|
|
|
get seq=17
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b:e
|
|
c:d
|
|
|
|
get seq=15
|
|
a
|
|
b
|
|
c
|
|
----
|
|
a:d
|
|
b:bcd
|
|
c:d
|
|
|
|
iter seq=15
|
|
first
|
|
next
|
|
next
|
|
next
|
|
seek-ge a
|
|
seek-ge b
|
|
seek-ge c
|
|
seek-ge d
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
seek-lt a
|
|
seek-lt b
|
|
seek-lt c
|
|
seek-lt d
|
|
----
|
|
a: (d, .)
|
|
b: (bcd, .)
|
|
c: (d, .)
|
|
.
|
|
a: (d, .)
|
|
b: (bcd, .)
|
|
c: (d, .)
|
|
.
|
|
c: (d, .)
|
|
b: (bcd, .)
|
|
a: (d, .)
|
|
.
|
|
.
|
|
a: (d, .)
|
|
b: (bcd, .)
|
|
c: (d, .)
|
|
|
|
iter seq=16
|
|
first
|
|
next
|
|
next
|
|
seek-ge a
|
|
seek-ge b
|
|
seek-ge c
|
|
seek-ge d
|
|
last
|
|
prev
|
|
prev
|
|
seek-lt a
|
|
seek-lt b
|
|
seek-lt c
|
|
seek-lt d
|
|
----
|
|
a: (d, .)
|
|
c: (d, .)
|
|
.
|
|
a: (d, .)
|
|
c: (d, .)
|
|
c: (d, .)
|
|
.
|
|
c: (d, .)
|
|
a: (d, .)
|
|
.
|
|
.
|
|
a: (d, .)
|
|
a: (d, .)
|
|
c: (d, .)
|
|
|
|
# Overlapping range deletions in the same memtable.
|
|
|
|
define
|
|
mem
|
|
a.SET.10:1
|
|
a.SET.12:2
|
|
a.SET.14:3
|
|
a.SET.16:4
|
|
b.SET.10:1
|
|
b.SET.12:2
|
|
b.SET.14:3
|
|
b.SET.16:4
|
|
c.SET.10:1
|
|
c.SET.12:2
|
|
c.SET.14:3
|
|
c.SET.16:4
|
|
d.SET.10:1
|
|
d.SET.12:2
|
|
d.SET.14:3
|
|
d.SET.16:4
|
|
a.RANGEDEL.11:b
|
|
b.RANGEDEL.13:c
|
|
b.RANGEDEL.11:c
|
|
c.RANGEDEL.15:d
|
|
c.RANGEDEL.13:d
|
|
c.RANGEDEL.11:d
|
|
----
|
|
mem: 1
|
|
|
|
get seq=11
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:1
|
|
b:1
|
|
c:1
|
|
d:1
|
|
|
|
get seq=12
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a: pebble: not found
|
|
b: pebble: not found
|
|
c: pebble: not found
|
|
d:1
|
|
|
|
get seq=14
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:2
|
|
b: pebble: not found
|
|
c: pebble: not found
|
|
d:2
|
|
|
|
get seq=16
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:3
|
|
b:3
|
|
c: pebble: not found
|
|
d:3
|
|
|
|
get seq=18
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:4
|
|
b:4
|
|
c:4
|
|
d:4
|
|
|
|
iter seq=11
|
|
first
|
|
next
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (1, .)
|
|
b: (1, .)
|
|
c: (1, .)
|
|
d: (1, .)
|
|
.
|
|
d: (1, .)
|
|
c: (1, .)
|
|
b: (1, .)
|
|
a: (1, .)
|
|
.
|
|
|
|
iter seq=12
|
|
first
|
|
next
|
|
last
|
|
prev
|
|
----
|
|
d: (1, .)
|
|
.
|
|
d: (1, .)
|
|
.
|
|
|
|
iter seq=14
|
|
first
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
----
|
|
a: (2, .)
|
|
d: (2, .)
|
|
.
|
|
d: (2, .)
|
|
a: (2, .)
|
|
.
|
|
|
|
iter seq=16
|
|
first
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (3, .)
|
|
b: (3, .)
|
|
d: (3, .)
|
|
.
|
|
d: (3, .)
|
|
b: (3, .)
|
|
a: (3, .)
|
|
.
|
|
|
|
iter seq=18
|
|
first
|
|
next
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (4, .)
|
|
b: (4, .)
|
|
c: (4, .)
|
|
d: (4, .)
|
|
.
|
|
d: (4, .)
|
|
c: (4, .)
|
|
b: (4, .)
|
|
a: (4, .)
|
|
.
|
|
|
|
# Overlapping range deletions in different memtables. Note that the
|
|
# range tombstones are not fragmented in this case.
|
|
|
|
define
|
|
mem
|
|
a.SET.10:1
|
|
b.SET.10:1
|
|
c.SET.10:1
|
|
d.SET.10:1
|
|
mem
|
|
a.SET.12:2
|
|
b.SET.12:2
|
|
c.SET.12:2
|
|
d.SET.12:2
|
|
a.RANGEDEL.11:d
|
|
mem
|
|
a.SET.14:3
|
|
b.SET.14:3
|
|
c.SET.14:3
|
|
d.SET.14:3
|
|
b.RANGEDEL.13:d
|
|
mem
|
|
a.SET.16:4
|
|
b.SET.16:4
|
|
c.SET.16:4
|
|
d.SET.16:4
|
|
c.RANGEDEL.13:d
|
|
----
|
|
mem: 4
|
|
|
|
get seq=11
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:1
|
|
b:1
|
|
c:1
|
|
d:1
|
|
|
|
get seq=12
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a: pebble: not found
|
|
b: pebble: not found
|
|
c: pebble: not found
|
|
d:1
|
|
|
|
get seq=14
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:2
|
|
b: pebble: not found
|
|
c: pebble: not found
|
|
d:2
|
|
|
|
get seq=16
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:3
|
|
b:3
|
|
c: pebble: not found
|
|
d:3
|
|
|
|
get seq=18
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:4
|
|
b:4
|
|
c:4
|
|
d:4
|
|
|
|
iter seq=11
|
|
first
|
|
next
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (1, .)
|
|
b: (1, .)
|
|
c: (1, .)
|
|
d: (1, .)
|
|
.
|
|
d: (1, .)
|
|
c: (1, .)
|
|
b: (1, .)
|
|
a: (1, .)
|
|
.
|
|
|
|
iter seq=12
|
|
first
|
|
next
|
|
last
|
|
prev
|
|
----
|
|
d: (1, .)
|
|
.
|
|
d: (1, .)
|
|
.
|
|
|
|
iter seq=14
|
|
first
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
----
|
|
a: (2, .)
|
|
d: (2, .)
|
|
.
|
|
d: (2, .)
|
|
a: (2, .)
|
|
.
|
|
|
|
iter seq=16
|
|
first
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (3, .)
|
|
b: (3, .)
|
|
d: (3, .)
|
|
.
|
|
d: (3, .)
|
|
b: (3, .)
|
|
a: (3, .)
|
|
.
|
|
|
|
iter seq=18
|
|
first
|
|
next
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (4, .)
|
|
b: (4, .)
|
|
c: (4, .)
|
|
d: (4, .)
|
|
.
|
|
d: (4, .)
|
|
c: (4, .)
|
|
b: (4, .)
|
|
a: (4, .)
|
|
.
|
|
|
|
# User-key that spans tables in a level.
|
|
|
|
define
|
|
L1
|
|
a.SET.12:3
|
|
L1
|
|
a.SET.11:2
|
|
L1
|
|
a.SET.10:1
|
|
----
|
|
mem: 1
|
|
1:
|
|
000004:[a#12,SET-a#12,SET]
|
|
000005:[a#11,SET-a#11,SET]
|
|
000006:[a#10,SET-a#10,SET]
|
|
|
|
get seq=10
|
|
a
|
|
----
|
|
a: pebble: not found
|
|
|
|
get seq=11
|
|
a
|
|
----
|
|
a:1
|
|
|
|
get seq=12
|
|
a
|
|
----
|
|
a:2
|
|
|
|
get seq=13
|
|
a
|
|
----
|
|
a:3
|
|
|
|
iter seq=11
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (1, .)
|
|
a: (1, .)
|
|
.
|
|
a: (1, .)
|
|
.
|
|
a: (1, .)
|
|
|
|
iter seq=12
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (2, .)
|
|
a: (2, .)
|
|
.
|
|
a: (2, .)
|
|
.
|
|
a: (2, .)
|
|
|
|
iter seq=13
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (3, .)
|
|
a: (3, .)
|
|
.
|
|
a: (3, .)
|
|
.
|
|
a: (3, .)
|
|
|
|
define
|
|
L1
|
|
a.MERGE.12:3
|
|
L1
|
|
a.MERGE.11:2
|
|
L1
|
|
a.MERGE.10:1
|
|
----
|
|
mem: 1
|
|
1:
|
|
000004:[a#12,MERGE-a#12,MERGE]
|
|
000005:[a#11,MERGE-a#11,MERGE]
|
|
000006:[a#10,MERGE-a#10,MERGE]
|
|
|
|
get seq=10
|
|
a
|
|
----
|
|
a: pebble: not found
|
|
|
|
get seq=11
|
|
a
|
|
----
|
|
a:1
|
|
|
|
get seq=12
|
|
a
|
|
----
|
|
a:12
|
|
|
|
get seq=13
|
|
a
|
|
----
|
|
a:123
|
|
|
|
iter seq=11
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (1, .)
|
|
a: (1, .)
|
|
.
|
|
a: (1, .)
|
|
.
|
|
a: (1, .)
|
|
|
|
iter seq=12
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (12, .)
|
|
a: (12, .)
|
|
.
|
|
a: (12, .)
|
|
.
|
|
a: (12, .)
|
|
|
|
iter seq=13
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (123, .)
|
|
a: (123, .)
|
|
.
|
|
a: (123, .)
|
|
.
|
|
a: (123, .)
|
|
|
|
# User-key spread across multiple levels.
|
|
|
|
define
|
|
mem
|
|
a.MERGE.13:4
|
|
L1
|
|
a.MERGE.12:3
|
|
L2
|
|
a.MERGE.11:2
|
|
L3
|
|
a.MERGE.10:1
|
|
----
|
|
mem: 1
|
|
1:
|
|
000004:[a#12,MERGE-a#12,MERGE]
|
|
2:
|
|
000005:[a#11,MERGE-a#11,MERGE]
|
|
3:
|
|
000006:[a#10,MERGE-a#10,MERGE]
|
|
|
|
get seq=10
|
|
a
|
|
----
|
|
a: pebble: not found
|
|
|
|
get seq=11
|
|
a
|
|
----
|
|
a:1
|
|
|
|
get seq=12
|
|
a
|
|
----
|
|
a:12
|
|
|
|
get seq=13
|
|
a
|
|
----
|
|
a:123
|
|
|
|
get seq=14
|
|
a
|
|
----
|
|
a:1234
|
|
|
|
iter seq=11
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (1, .)
|
|
a: (1, .)
|
|
.
|
|
a: (1, .)
|
|
.
|
|
a: (1, .)
|
|
|
|
iter seq=12
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (12, .)
|
|
a: (12, .)
|
|
.
|
|
a: (12, .)
|
|
.
|
|
a: (12, .)
|
|
|
|
iter seq=13
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (123, .)
|
|
a: (123, .)
|
|
.
|
|
a: (123, .)
|
|
.
|
|
a: (123, .)
|
|
|
|
iter seq=14
|
|
first
|
|
seek-ge a
|
|
seek-ge b
|
|
last
|
|
seek-lt a
|
|
seek-lt b
|
|
----
|
|
a: (1234, .)
|
|
a: (1234, .)
|
|
.
|
|
a: (1234, .)
|
|
.
|
|
a: (1234, .)
|
|
|
|
# Range deletions on multiple levels.
|
|
define
|
|
L0
|
|
a.SET.13:4
|
|
b.SET.13:4
|
|
d.SET.13:4
|
|
c.RANGEDEL.13:d
|
|
L1
|
|
a.SET.12:3
|
|
d.SET.12:3
|
|
b.RANGEDEL.12:d
|
|
L2
|
|
d.SET.11:2
|
|
a.RANGEDEL.11:d
|
|
L3
|
|
a.SET.10:1
|
|
b.SET.10:1
|
|
c.SET.10:1
|
|
d.SET.10:1
|
|
----
|
|
mem: 1
|
|
0.0:
|
|
000004:[a#13,SET-d#13,SET]
|
|
1:
|
|
000005:[a#12,SET-d#12,SET]
|
|
2:
|
|
000006:[a#11,RANGEDEL-d#11,SET]
|
|
3:
|
|
000007:[a#10,SET-d#10,SET]
|
|
|
|
get seq=11
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:1
|
|
b:1
|
|
c:1
|
|
d:1
|
|
|
|
get seq=12
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a: pebble: not found
|
|
b: pebble: not found
|
|
c: pebble: not found
|
|
d:2
|
|
|
|
get seq=13
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:3
|
|
b: pebble: not found
|
|
c: pebble: not found
|
|
d:3
|
|
|
|
get seq=14
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:4
|
|
b:4
|
|
c: pebble: not found
|
|
d:4
|
|
|
|
iter seq=11
|
|
first
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (1, .)
|
|
b: (1, .)
|
|
c: (1, .)
|
|
d: (1, .)
|
|
d: (1, .)
|
|
c: (1, .)
|
|
b: (1, .)
|
|
a: (1, .)
|
|
|
|
iter seq=12
|
|
first
|
|
last
|
|
----
|
|
d: (2, .)
|
|
d: (2, .)
|
|
|
|
iter seq=13
|
|
first
|
|
next
|
|
last
|
|
prev
|
|
----
|
|
a: (3, .)
|
|
d: (3, .)
|
|
d: (3, .)
|
|
a: (3, .)
|
|
|
|
iter seq=14
|
|
first
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
----
|
|
a: (4, .)
|
|
b: (4, .)
|
|
d: (4, .)
|
|
d: (4, .)
|
|
b: (4, .)
|
|
a: (4, .)
|
|
|
|
# Range deletions spanning tables within a level.
|
|
|
|
define
|
|
mem
|
|
a.SET.12:3
|
|
b.SET.12:3
|
|
c.SET.12:3
|
|
d.SET.12:3
|
|
L1
|
|
a.RANGEDEL.11:b
|
|
L1
|
|
b.RANGEDEL.11:c
|
|
L1
|
|
c.RANGEDEL.11:d
|
|
L2
|
|
a.SET.10:1
|
|
b.SET.10:1
|
|
c.SET.10:1
|
|
d.SET.10:1
|
|
----
|
|
mem: 1
|
|
1:
|
|
000004:[a#11,RANGEDEL-b#inf,RANGEDEL]
|
|
000005:[b#11,RANGEDEL-c#inf,RANGEDEL]
|
|
000006:[c#11,RANGEDEL-d#inf,RANGEDEL]
|
|
2:
|
|
000007:[a#10,SET-d#10,SET]
|
|
|
|
get seq=11
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:1
|
|
b:1
|
|
c:1
|
|
d:1
|
|
|
|
get seq=12
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a: pebble: not found
|
|
b: pebble: not found
|
|
c: pebble: not found
|
|
d:1
|
|
|
|
get seq=13
|
|
a
|
|
b
|
|
c
|
|
d
|
|
----
|
|
a:3
|
|
b:3
|
|
c:3
|
|
d:3
|
|
|
|
iter seq=11
|
|
first
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (1, .)
|
|
b: (1, .)
|
|
c: (1, .)
|
|
d: (1, .)
|
|
d: (1, .)
|
|
c: (1, .)
|
|
b: (1, .)
|
|
a: (1, .)
|
|
|
|
iter seq=12
|
|
first
|
|
last
|
|
----
|
|
d: (1, .)
|
|
d: (1, .)
|
|
|
|
iter seq=13
|
|
first
|
|
next
|
|
next
|
|
next
|
|
last
|
|
prev
|
|
prev
|
|
prev
|
|
----
|
|
a: (3, .)
|
|
b: (3, .)
|
|
c: (3, .)
|
|
d: (3, .)
|
|
d: (3, .)
|
|
c: (3, .)
|
|
b: (3, .)
|
|
a: (3, .)
|
|
|
|
# Invalid LSM structure (range deletion at newer level covers newer
|
|
# write at an older level). This LSM structure is not generated
|
|
# naturally, but tested here to show the level-by-level nature of Get.
|
|
|
|
define
|
|
L1
|
|
a.RANGEDEL.10:b
|
|
L2
|
|
a.SET.11:2
|
|
----
|
|
mem: 1
|
|
1:
|
|
000004:[a#10,RANGEDEL-b#inf,RANGEDEL]
|
|
2:
|
|
000005:[a#11,SET-a#11,SET]
|
|
|
|
get seq=12
|
|
a
|
|
----
|
|
a: pebble: not found
|
|
|
|
# A range tombstone straddles two SSTs. One is compacted to a lower level. Its
|
|
# keys that are newer than the range tombstone should not disappear.
|
|
#
|
|
# Uses a snapshot to prevent range tombstone from being elided when it gets
|
|
# compacted to the bottommost level.
|
|
|
|
define target-file-sizes=(100, 1) snapshots=(1)
|
|
L0
|
|
a.RANGEDEL.10:e
|
|
L0
|
|
a.SET.11:v
|
|
L0
|
|
c.SET.12:v
|
|
----
|
|
mem: 1
|
|
0.1:
|
|
000005:[a#11,SET-a#11,SET]
|
|
000006:[c#12,SET-c#12,SET]
|
|
0.0:
|
|
000004:[a#10,RANGEDEL-e#inf,RANGEDEL]
|
|
|
|
compact a-e
|
|
----
|
|
1:
|
|
000007:[a#11,SET-c#inf,RANGEDEL]
|
|
000008:[c#12,SET-e#inf,RANGEDEL]
|
|
|
|
compact d-e
|
|
----
|
|
1:
|
|
000007:[a#11,SET-c#inf,RANGEDEL]
|
|
2:
|
|
000008:[c#12,SET-e#inf,RANGEDEL]
|
|
|
|
iter seq=13
|
|
seek-ge b
|
|
next
|
|
----
|
|
c: (v, .)
|
|
.
|
|
|
|
# Reverse the above test: compact the left file containing the split range
|
|
# tombstone downwards, and iterate from right to left.
|
|
|
|
define target-file-sizes=(100, 1) snapshots=(1)
|
|
L0
|
|
a.RANGEDEL.10:e
|
|
L0
|
|
a.SET.11:v
|
|
L0
|
|
c.SET.12:v
|
|
----
|
|
mem: 1
|
|
0.1:
|
|
000005:[a#11,SET-a#11,SET]
|
|
000006:[c#12,SET-c#12,SET]
|
|
0.0:
|
|
000004:[a#10,RANGEDEL-e#inf,RANGEDEL]
|
|
|
|
compact a-e
|
|
----
|
|
1:
|
|
000007:[a#11,SET-c#inf,RANGEDEL]
|
|
000008:[c#12,SET-e#inf,RANGEDEL]
|
|
|
|
compact a-b
|
|
----
|
|
1:
|
|
000008:[c#12,SET-e#inf,RANGEDEL]
|
|
2:
|
|
000007:[a#11,SET-c#inf,RANGEDEL]
|
|
|
|
iter seq=13
|
|
seek-lt d
|
|
prev
|
|
prev
|
|
----
|
|
c: (v, .)
|
|
a: (v, .)
|
|
.
|
|
|
|
# A range tombstone straddles two sstables. One is compacted two
|
|
# levels lower. The other is compacted one level lower. The one that
|
|
# is compacted one level lower should not see its boundaries expand
|
|
# causing it to delete more keys. A snapshot is used to prevent range
|
|
# tombstone from being elided when it gets compacted to the bottommost
|
|
# level.
|
|
|
|
define target-file-sizes=(100, 1) snapshots=(1)
|
|
L0
|
|
a.RANGEDEL.10:e
|
|
L0
|
|
a.SET.11:v
|
|
L0
|
|
c.SET.12:v
|
|
L2
|
|
d.SET.0:v
|
|
----
|
|
mem: 1
|
|
0.1:
|
|
000005:[a#11,SET-a#11,SET]
|
|
000006:[c#12,SET-c#12,SET]
|
|
0.0:
|
|
000004:[a#10,RANGEDEL-e#inf,RANGEDEL]
|
|
2:
|
|
000007:[d#0,SET-d#0,SET]
|
|
|
|
compact a-b
|
|
----
|
|
1:
|
|
000008:[a#11,SET-c#inf,RANGEDEL]
|
|
000009:[c#12,SET-d#inf,RANGEDEL]
|
|
000010:[d#10,RANGEDEL-e#inf,RANGEDEL]
|
|
2:
|
|
000007:[d#0,SET-d#0,SET]
|
|
|
|
compact d-e
|
|
----
|
|
1:
|
|
000008:[a#11,SET-c#inf,RANGEDEL]
|
|
000009:[c#12,SET-d#inf,RANGEDEL]
|
|
3:
|
|
000011:[d#10,RANGEDEL-e#inf,RANGEDEL]
|
|
|
|
get seq=13
|
|
c
|
|
----
|
|
c:v
|
|
|
|
compact a-b L1
|
|
----
|
|
1:
|
|
000009:[c#12,SET-d#inf,RANGEDEL]
|
|
2:
|
|
000008:[a#11,SET-c#inf,RANGEDEL]
|
|
3:
|
|
000011:[d#10,RANGEDEL-e#inf,RANGEDEL]
|
|
|
|
get seq=13
|
|
c
|
|
----
|
|
c:v
|
|
|
|
# A slight variation on the scenario above where a range tombstone is
|
|
# expanded past the boundaries of its "atomic compaction unit".
|
|
|
|
define target-file-sizes=(100, 1) snapshots=(1)
|
|
L0
|
|
a.RANGEDEL.10:e
|
|
L0
|
|
a.SET.11:v
|
|
L0
|
|
c.SET.12:v
|
|
L0
|
|
f.SET.13:v
|
|
L2
|
|
d.SET.0:v
|
|
----
|
|
mem: 1
|
|
0.1:
|
|
000005:[a#11,SET-a#11,SET]
|
|
000006:[c#12,SET-c#12,SET]
|
|
0.0:
|
|
000004:[a#10,RANGEDEL-e#inf,RANGEDEL]
|
|
000007:[f#13,SET-f#13,SET]
|
|
2:
|
|
000008:[d#0,SET-d#0,SET]
|
|
|
|
compact a-b
|
|
----
|
|
0.0:
|
|
000007:[f#13,SET-f#13,SET]
|
|
1:
|
|
000009:[a#11,SET-c#inf,RANGEDEL]
|
|
000010:[c#12,SET-d#inf,RANGEDEL]
|
|
000011:[d#10,RANGEDEL-e#inf,RANGEDEL]
|
|
2:
|
|
000008:[d#0,SET-d#0,SET]
|
|
|
|
compact d-e
|
|
----
|
|
0.0:
|
|
000007:[f#13,SET-f#13,SET]
|
|
1:
|
|
000009:[a#11,SET-c#inf,RANGEDEL]
|
|
000010:[c#12,SET-d#inf,RANGEDEL]
|
|
3:
|
|
000012:[d#10,RANGEDEL-e#inf,RANGEDEL]
|
|
|
|
get seq=13
|
|
c
|
|
----
|
|
c:v
|
|
|
|
compact f-f L0
|
|
----
|
|
1:
|
|
000009:[a#11,SET-c#inf,RANGEDEL]
|
|
000010:[c#12,SET-d#inf,RANGEDEL]
|
|
000007:[f#13,SET-f#13,SET]
|
|
3:
|
|
000012:[d#10,RANGEDEL-e#inf,RANGEDEL]
|
|
|
|
compact a-f L1
|
|
----
|
|
2:
|
|
000013:[a#11,SET-c#inf,RANGEDEL]
|
|
000014:[c#12,SET-d#inf,RANGEDEL]
|
|
000015:[f#13,SET-f#13,SET]
|
|
3:
|
|
000012:[d#10,RANGEDEL-e#inf,RANGEDEL]
|
|
|
|
get seq=13
|
|
c
|
|
----
|
|
c:v
|
|
|
|
define
|
|
L0
|
|
a.RANGEDEL.12:f
|
|
L0
|
|
a.RANGEDEL.13:c
|
|
c.RANGEDEL.13:f
|
|
L1
|
|
b.RANGEDEL.11:e
|
|
L2
|
|
c.RANGEDEL.10:d
|
|
----
|
|
mem: 1
|
|
0.1:
|
|
000005:[a#13,RANGEDEL-f#inf,RANGEDEL]
|
|
0.0:
|
|
000004:[a#12,RANGEDEL-f#inf,RANGEDEL]
|
|
1:
|
|
000006:[b#11,RANGEDEL-e#inf,RANGEDEL]
|
|
2:
|
|
000007:[c#10,RANGEDEL-d#inf,RANGEDEL]
|
|
|
|
wait-pending-table-stats
|
|
000007
|
|
----
|
|
num-entries: 1
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 0
|
|
|
|
wait-pending-table-stats
|
|
000006
|
|
----
|
|
num-entries: 1
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 836
|
|
|
|
wait-pending-table-stats
|
|
000004
|
|
----
|
|
num-entries: 1
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 1672
|
|
|
|
wait-pending-table-stats
|
|
000005
|
|
----
|
|
num-entries: 2
|
|
num-deletions: 2
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 1672
|
|
|
|
|
|
# Range deletions with varying overlap.
|
|
define
|
|
L0
|
|
a.SET.13:4
|
|
b.SET.13:4
|
|
d.SET.13:4
|
|
c.RANGEDEL.13:d
|
|
L1
|
|
a.SET.12:3
|
|
d.SET.12:3
|
|
b.RANGEDEL.12:d
|
|
L2
|
|
d.SET.11:2
|
|
a.RANGEDEL.11:d
|
|
L3
|
|
a.SET.10:1
|
|
b.SET.10:1
|
|
c.SET.10:1
|
|
d.SET.10:1
|
|
----
|
|
mem: 1
|
|
0.0:
|
|
000004:[a#13,SET-d#13,SET]
|
|
1:
|
|
000005:[a#12,SET-d#12,SET]
|
|
2:
|
|
000006:[a#11,RANGEDEL-d#11,SET]
|
|
3:
|
|
000007:[a#10,SET-d#10,SET]
|
|
|
|
wait-pending-table-stats
|
|
000007
|
|
----
|
|
num-entries: 4
|
|
num-deletions: 0
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 0
|
|
|
|
wait-pending-table-stats
|
|
000006
|
|
----
|
|
num-entries: 2
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 42
|
|
|
|
wait-pending-table-stats
|
|
000005
|
|
----
|
|
num-entries: 3
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 68
|
|
|
|
wait-pending-table-stats
|
|
000004
|
|
----
|
|
num-entries: 4
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 100
|
|
|
|
# Multiple Range deletions in a table.
|
|
define
|
|
L0
|
|
a.RANGEDEL.15:d
|
|
e.RANGEDEL.15:z
|
|
L0
|
|
a.RANGEDEL.14:d
|
|
L0
|
|
e.RANGEDEL.13:z
|
|
L1
|
|
a.SET.11:1
|
|
b.SET.11:1
|
|
c.SET.11:1
|
|
L2
|
|
x.SET.10:2
|
|
----
|
|
mem: 1
|
|
0.1:
|
|
000004:[a#15,RANGEDEL-z#inf,RANGEDEL]
|
|
0.0:
|
|
000005:[a#14,RANGEDEL-d#inf,RANGEDEL]
|
|
000006:[e#13,RANGEDEL-z#inf,RANGEDEL]
|
|
1:
|
|
000007:[a#11,SET-c#11,SET]
|
|
2:
|
|
000008:[x#10,SET-x#10,SET]
|
|
|
|
wait-pending-table-stats
|
|
000005
|
|
----
|
|
num-entries: 1
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 782
|
|
|
|
wait-pending-table-stats
|
|
000006
|
|
----
|
|
num-entries: 1
|
|
num-deletions: 1
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 771
|
|
|
|
wait-pending-table-stats
|
|
000004
|
|
----
|
|
num-entries: 2
|
|
num-deletions: 2
|
|
num-range-key-sets: 0
|
|
point-deletions-bytes-estimate: 0
|
|
range-deletions-bytes-estimate: 1553
|