define a.SET.1:b ---- iter print-snapshot-pinned first next ---- a#1,1:b (not pinned) . define a.SET.2:c a.SET.1:b ---- iter print-snapshot-pinned first next ---- a#2,1:c (not pinned) . iter print-snapshot-pinned snapshots=0 first next ---- a#2,1:c (not pinned) . iter snapshots=1 first next ---- a#2,1:c . iter print-snapshot-pinned snapshots=2 first next next ---- a#2,1:c (not pinned) a#1,1:b (pinned) . define a.DEL.2: a.SET.1:b ---- iter first next ---- a#2,0: . iter elide-tombstones=true first ---- . iter print-snapshot-pinned elide-tombstones=true snapshots=2 first next next ---- a#2,0: (pinned) a#1,1:b (pinned) . iter print-snapshot-pinned elide-tombstones=true snapshots=1 first next ---- a#2,0: (pinned) . define a.DEL.2: a.SET.1:b b.SET.3:c ---- iter print-snapshot-pinned first next next ---- a#2,0: (not pinned) b#3,1:c (not pinned) . iter snapshots=1 first next next ---- a#2,0: b#3,1:c . iter snapshots=2 first next next next ---- a#2,0: a#1,1:b b#3,1:c . define a.SET.1:a b.SET.2:b c.SET.3:c ---- iter first next next next ---- a#1,1:a b#2,1:b c#3,1:c . define a.MERGE.3:d a.MERGE.2:c a.SET.1:b b.MERGE.2:b b.MERGE.1:a ---- iter first next next ---- a#3,1:bcd[base] b#2,2:ab . iter snapshots=3 print-snapshot-pinned first next next next ---- a#3,2:d (not pinned) a#2,1:bc[base] (pinned) b#2,2:ab (not pinned) . define a.SET.9:b a.DEL.8: a.SET.7:d a.DEL.6: a.SET.5:f ---- iter first next ---- a#9,1:b . iter snapshots=6 first next next ---- a#9,1:b a#5,1:f . iter snapshots=7 first next next ---- a#9,1:b a#6,0: . iter snapshots=8 first next next ---- a#9,1:b a#7,1:d . iter snapshots=9 first next next ---- a#9,1:b a#8,0: . iter snapshots=10 first next ---- a#9,1:b . iter snapshots=(5,6,7,8,9) print-snapshot-pinned first next next next next next ---- a#9,1:b (not pinned) a#8,0: (pinned) a#7,1:d (pinned) a#6,0: (pinned) a#5,1:f (pinned) . define a.INVALID.2:b a.SET.1:c ---- iter first ---- err=invalid internal key kind: INVALID define a.SET.2:b a.INVALID.1:c ---- iter first next ---- a#2,1:b err=invalid internal key kind: INVALID define a.MERGE.2:b a.INVALID.1:c ---- iter first next ---- a#2,2:b err=invalid internal key kind: INVALID define a.INVALID.2:c a.RANGEDEL.1:d ---- iter first tombstones ---- err=invalid internal key kind: INVALID . define a.MERGE.2:b a.MERGE.1:c a.MERGE.0:d ---- iter snapshots=(1,2) print-snapshot-pinned first next next next ---- a#2,2:b (not pinned) a#1,2:c (pinned) a#0,2:d (pinned) . define a.SET.2:b a.RANGEDEL.1:c b.RANGEDEL.4:d b.SET.2:e c.SET.3:f ---- # NB: Range deletions are always marked as 'not pinned' currently. Extending # snapshot-pinning statistics to range deletions and range keys is TODO. iter print-snapshot-pinned first next next next tombstones ---- a#2,1:b (not pinned) a#1,15:c (not pinned) b#4,15:d (not pinned) . a-b#1 b-c#4 c-d#4 . iter snapshots=2 print-snapshot-pinned first next next next tombstones ---- a#2,1:b (not pinned) a#1,15:c (not pinned) b#4,15:d (not pinned) . a-b#1 b-c#4 b-c#1 c-d#4 . iter snapshots=3 print-snapshot-pinned first next next next next tombstones ---- a#2,1:b (not pinned) a#1,15:c (not pinned) b#4,15:d (not pinned) b#2,1:e (pinned) . a-b#1 b-c#4 b-c#1 c-d#4 . iter snapshots=4 print-snapshot-pinned first next next next next next tombstones ---- a#2,1:b (not pinned) a#1,15:c (not pinned) b#4,15:d (not pinned) b#2,1:e (pinned) c#3,1:f (pinned) . a-b#1 b-c#4 b-c#1 c-d#4 . define a.RANGEDEL.3:e b.SET.4:b c.SET.3:c d.SET.2:d e.SET.1:e ---- iter first next next next next tombstones ---- a#3,15:e b#4,1:b c#3,1:c e#1,1:e . a-e#3 . define a.RANGEDEL.3:e b.MERGE.4:b c.MERGE.3:c d.MERGE.2:d e.MERGE.1:e ---- iter first next next next next tombstones ---- a#3,15:e b#4,2:b c#3,2:c e#1,2:e . a-e#3 . define a.RANGEDEL.3:c b.MERGE.5:e b.MERGE.4:d b.MERGE.2:c b.MERGE.1:b d.MERGE.5:c d.MERGE.4:b d.RANGEDEL.3:f d.MERGE.2:e d.MERGE.1:d ---- iter first next next next next tombstones ---- a#3,15:c b#5,1:de[base] d#5,2:bc d#3,15:f . a-c#3 d-f#3 . define a.RANGEDEL.3:d b.RANGEDEL.2:e c.RANGEDEL.1:f ---- iter first next next next tombstones ---- a#3,15:d b#2,15:e c#1,15:f . a-b#3 b-c#3 c-d#3 d-e#2 e-f#1 . iter snapshots=2 first next next next tombstones ---- a#3,15:d b#2,15:e c#1,15:f . a-b#3 b-c#3 c-d#3 c-d#1 d-e#2 d-e#1 e-f#1 . iter snapshots=3 first next next next tombstones ---- a#3,15:d b#2,15:e c#1,15:f . a-b#3 b-c#3 b-c#2 c-d#3 c-d#2 d-e#2 e-f#1 . iter snapshots=(2,3) first next next next tombstones ---- a#3,15:d b#2,15:e c#1,15:f . a-b#3 b-c#3 b-c#2 c-d#3 c-d#2 c-d#1 d-e#2 d-e#1 e-f#1 . define a.RANGEDEL.10:k f.SET.9:f f.SET.8:f ---- iter snapshots=(9,10) first next tombstones f next tombstones ---- a#10,15:k f#9,1:f a-f#10 . f#8,1:f f-k#10 . define f.RANGEDEL.10:k f.SET.9:f f.SET.8:f ---- iter snapshots=(9,10) first next tombstones f next tombstones ---- f#10,15:k f#9,1:f . f#8,1:f f-k#10 . define a.SET.1:a b.RANGEDEL.2:d c.RANGEDEL.3:e d.SET.4:d ---- iter first next next next tombstones c tombstones ---- a#1,1:a b#2,15:d c#3,15:e d#4,1:d b-c#2 . c-d#3 d-e#3 . iter snapshots=3 first next next next tombstones c tombstones ---- a#1,1:a b#2,15:d c#3,15:e d#4,1:d b-c#2 . c-d#3 c-d#2 d-e#3 . define a.SET.1:a b.RANGEDEL.2:d c.SET.4:d ---- iter first next next tombstones c tombstones ---- a#1,1:a b#2,15:d c#4,1:d b-c#2 . c-d#2 . define a.RANGEDEL.2:d a.SET.2:a b.SET.2:b c.SET.2:c ---- iter first next next next next ---- a#2,15:d a#2,1:a b#2,1:b c#2,1:c . define a.SINGLEDEL.1: ---- iter first next ---- a#1,7: . iter elide-tombstones=true first ---- . define a.SINGLEDEL.2: a.SINGLEDEL.1: ---- iter first next ---- a#2,7: . define a.SINGLEDEL.3: a.SINGLEDEL.2: a.SET.1:a ---- iter first ---- . define a.SET.3:a b.SINGLEDEL.2: b.DEL.1: ---- iter first next next ---- a#3,1:a b#2,0: . define a.SINGLEDEL.2: a.DEL.1: ---- iter first next ---- a#2,0: . iter elide-tombstones=true first ---- . define a.SINGLEDEL.2: a.MERGE.1: ---- iter first next ---- a#2,0: . iter elide-tombstones=true first ---- . define a.SINGLEDEL.2: a.SET.1:b ---- iter first ---- . define a.SET.2:b a.SINGLEDEL.1: ---- iter first next ---- a#2,1:b . define a.MERGE.6:b a.SINGLEDEL.5: a.SET.4:a ---- iter first next ---- a#6,18:b[base] . # Non-deterministic use of SINGLEDEL where there are two older SETs that have # not been deleted or single deleted. It is permitted to shadow both. define a.MERGE.6:b a.SINGLEDEL.5: a.SET.4:a a.SET.3:a ---- iter first next ---- a#6,18:b[base] . define a.SINGLEDEL.2: a.SET.1:b b.SET.3:c ---- iter first next ---- b#3,1:c . define a.SINGLEDEL.3: a.SET.2:b a.SET.1:a ---- iter first next ---- a#1,1:a . define a.SINGLEDEL.3: a.MERGE.2:b a.MERGE.1:a ---- iter first next ---- a#3,0: . define a.SINGLEDEL.4: a.SET.3:val a.SINGLEDEL.2: a.SET.1:val ---- iter first ---- . iter snapshots=2 first next next ---- a#2,7: a#1,1:val . define a.SINGLEDEL.4: a.SET.3:val a.DEL.2: a.SET.1:val ---- iter first next ---- a#2,0: . iter snapshots=2 first next next ---- a#2,0: a#1,1:val . iter snapshots=3 first next ---- a#2,0: . iter snapshots=(2,3) first next next ---- a#2,0: a#1,1:val . define a.SINGLEDEL.4: a.SET.3:c a.MERGE.2:b a.SET.1:a ---- iter first next ---- a#2,1:ab[base] . iter snapshots=2 first next next ---- a#2,2:b a#1,1:a . iter snapshots=3 first next ---- a#2,1:ab[base] . iter snapshots=(2,3,4) first next next next next ---- a#4,7: a#3,1:c a#2,2:b a#1,1:a . define a.SINGLEDEL.3: a.RANGEDEL.2:c a.SET.1:val ---- iter first next next tombstones ---- a#3,7: a#2,15:c . a-c#2 . define a.RANGEDEL.3:d a.DEL.2: a.SET.1:a d.DEL.2: ---- iter first next next tombstones ---- a#3,15:d d#2,0: . a-d#3 . iter snapshots=3 first next next next ---- a#3,15:d a#2,0: d#2,0: . iter snapshots=2 first next next next ---- a#3,15:d a#1,1:a d#2,0: . iter snapshots=1 first next next ---- a#3,15:d d#2,0: . define a.MERGE.2:a b.RANGEDEL.1:c ---- iter first tombstones a next next tombstones ---- a#2,2:a . b#1,15:c . b-c#1 . define a.MERGE.2:v2 a.RANGEDEL.1:b a.MERGE.1:v1 ---- iter allow-zero-seqnum=true first next next next tombstones ---- a#2,2:v2 a#1,15:b a#0,2:v1 . a-b#1 . # Verify that we transform merge+del -> set. define a.MERGE.5:5 a.DEL.3: a.MERGE.1:1 ---- iter first next ---- a#5,18:5[base] . iter allow-zero-seqnum=true first next ---- a#0,18:5[base] . iter elide-tombstones=true first next ---- a#5,18:5[base] . iter snapshots=2 first next next ---- a#5,18:5[base] a#1,2:1 . iter snapshots=2 elide-tombstones=true first next next ---- a#5,18:5[base] a#1,2:1 . # Verify that we transform merge+rangedel -> set. This isn't strictly # necessary, but provides consistency with the behavior for merge+del. define a.RANGEDEL.3:c b.MERGE.5:5 b.SET.2:2 b.MERGE.1:1 ---- iter first next next ---- a#3,15:c b#5,1:5[base] . iter allow-zero-seqnum=true first next next ---- a#3,15:c b#0,1:5[base] . iter snapshots=2 first next next ---- a#3,15:c b#5,1:5[base] b#1,2:1 define a.RANGEDEL.3:c b.MERGE.5:5 b.MERGE.2:2 b.MERGE.1:1 ---- iter first next next ---- a#3,15:c b#5,1:5[base] . iter snapshots=2 first next next ---- a#3,15:c b#5,1:5[base] b#1,2:1 # NB: Zero values are skipped by deletable merger. define merger=deletable a.MERGE.4:-2 a.MERGE.3:-1 a.MERGE.2:2 a.MERGE.1:1 b.MERGE.4:-3 b.MERGE.3:3 b.MERGE.2:2 b.MERGE.1:-2 ---- iter first next next ---- . . . # Test that range keys are interleaved, and exposed to the fragmenter. define a.SINGLEDEL.4: a.SET.3:val a.DEL.2: a.SET.1:val c.SET.3:val ---- define-range-keys a-b:{(#3,RANGEKEYSET,@2,foo)} d-e:{(#3,RANGEKEYSET,@2,foo)} ---- iter first next next next next range-keys ---- a#72057594037927935,21: a#2,0: c#3,1:val d#72057594037927935,21: . a-b:{(#3,RANGEKEYSET,@2,foo)} d-e:{(#3,RANGEKEYSET,@2,foo)} .