mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-11-04 00:07:52 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			593 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			593 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# Format for define command:
 | 
						|
# Levels are ordered from higher to lower, and each new level starts with an L
 | 
						|
# Each level is defined using an even number of lines where every pair of lines represents
 | 
						|
# a file. The files within a level are ordered from smaller to larger keys.
 | 
						|
# Each file is defined using: the first line specifies the smallest and largest internal
 | 
						|
# keys and the second line the point key-value pairs in the sstable in order. The rangedel
 | 
						|
# key-value pairs should also be in increasing order relative to the other rangedel pairs.
 | 
						|
# The largest file key can take the form of <userkey>.RANGEDEL.72057594037927935, which
 | 
						|
# represents the range deletion sentinel.
 | 
						|
 | 
						|
# The rangedel should not delete any points in any sstable.  The two files were involved in a
 | 
						|
# compaction and then the second file got moved to a lower level.
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.30 e.RANGEDEL.72057594037927935
 | 
						|
a.SET.30:30 c.SET.27:27 a.RANGEDEL.8:f
 | 
						|
L
 | 
						|
e.SET.10 g.SET.20
 | 
						|
e.SET.10:10 g.SET.20:20 e.RANGEDEL.8:f
 | 
						|
----
 | 
						|
1:
 | 
						|
  000000:[a#30,SET-e#inf,RANGEDEL]
 | 
						|
2:
 | 
						|
  000001:[e#10,SET-g#20,SET]
 | 
						|
 | 
						|
# isNextEntryDeleted() should not allow the rangedel to act on the points in the lower sstable
 | 
						|
# that are after it.
 | 
						|
iter
 | 
						|
first
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
stats
 | 
						|
reset-stats
 | 
						|
stats
 | 
						|
----
 | 
						|
a#30,1:30
 | 
						|
c#27,1:27
 | 
						|
e#10,1:10
 | 
						|
g#20,1:20
 | 
						|
.
 | 
						|
{BlockBytes:116 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:5 ValueBytes:8 PointCount:5 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | 
						|
{BlockBytes:0 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | 
						|
 | 
						|
# seekGE() should not allow the rangedel to act on points in the lower sstable that are after it.
 | 
						|
iter
 | 
						|
seek-ge d
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
e#10,1:10
 | 
						|
g#20,1:20
 | 
						|
.
 | 
						|
 | 
						|
# isPrevEntryDeleted() should not allow the rangedel to act on the points in the lower sstable
 | 
						|
# that are after it.
 | 
						|
iter
 | 
						|
last
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
g#20,1:20
 | 
						|
e#10,1:10
 | 
						|
c#27,1:27
 | 
						|
a#30,1:30
 | 
						|
 | 
						|
# seekLT() should not allow the rangedel to act on points in the lower sstable that are after it.
 | 
						|
iter
 | 
						|
seek-lt h
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
g#20,1:20
 | 
						|
e#10,1:10
 | 
						|
c#27,1:27
 | 
						|
a#30,1:30
 | 
						|
 | 
						|
# We keep the rangedel alive by having a point in the higher level past the first point in the
 | 
						|
# lower level. This rangedel hides that first point in the lower level but we should not seek to
 | 
						|
# h and hide the second point.
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.15 f.SET.16
 | 
						|
a.SET.15:15 c.SET.13:13 f.SET.16:16 a.RANGEDEL.12:h
 | 
						|
L
 | 
						|
e.SET.10 g.SET.15
 | 
						|
e.SET.10:10 g.SET.15:15
 | 
						|
----
 | 
						|
1:
 | 
						|
  000002:[a#15,SET-f#16,SET]
 | 
						|
2:
 | 
						|
  000003:[e#10,SET-g#15,SET]
 | 
						|
 | 
						|
iter
 | 
						|
first
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
a#15,1:15
 | 
						|
c#13,1:13
 | 
						|
f#16,1:16
 | 
						|
g#15,1:15
 | 
						|
 | 
						|
iter
 | 
						|
seek-ge d
 | 
						|
next
 | 
						|
----
 | 
						|
f#16,1:16
 | 
						|
g#15,1:15
 | 
						|
 | 
						|
iter
 | 
						|
last
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
g#15,1:15
 | 
						|
f#16,1:16
 | 
						|
c#13,1:13
 | 
						|
a#15,1:15
 | 
						|
 | 
						|
# The rangedel should not delete any points in any sstable.  The two files were involved in an
 | 
						|
# compaction and then the first file got moved to a lower level.
 | 
						|
define
 | 
						|
L
 | 
						|
c.SET.30 f.RANGEDEL.0
 | 
						|
c.SET.30:30 d.SET.27:27 a.RANGEDEL.8:f
 | 
						|
L
 | 
						|
a.SET.10 c.RANGEDEL.72057594037927935
 | 
						|
a.SET.10:10 b.SET.12:12 a.RANGEDEL.8:f
 | 
						|
----
 | 
						|
1:
 | 
						|
  000004:[c#30,SET-f#0,RANGEDEL]
 | 
						|
2:
 | 
						|
  000005:[a#10,SET-c#inf,RANGEDEL]
 | 
						|
 | 
						|
# isNextEntryDeleted() should not allow the rangedel to act on the points in the lower sstable
 | 
						|
# that are before it.
 | 
						|
iter
 | 
						|
first
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
a#10,1:10
 | 
						|
b#12,1:12
 | 
						|
c#30,1:30
 | 
						|
d#27,1:27
 | 
						|
 | 
						|
# seekGE() should not allow the rangedel to act on points in the lower sstable that are before it.
 | 
						|
iter
 | 
						|
seek-ge a
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
a#10,1:10
 | 
						|
b#12,1:12
 | 
						|
c#30,1:30
 | 
						|
d#27,1:27
 | 
						|
 | 
						|
# isPrevEntryDeleted() should not allow the rangedel to act on the points in the lower sstable
 | 
						|
# that are before it.
 | 
						|
iter
 | 
						|
last
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
d#27,1:27
 | 
						|
c#30,1:30
 | 
						|
b#12,1:12
 | 
						|
a#10,1:10
 | 
						|
 | 
						|
# seekLT() should not allow the rangedel to act on points in the lower sstable that are before it.
 | 
						|
iter
 | 
						|
seek-lt e
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
d#27,1:27
 | 
						|
c#30,1:30
 | 
						|
b#12,1:12
 | 
						|
a#10,1:10
 | 
						|
 | 
						|
# We keep the rangedel alive in prev iteration by having a point in the higher level before
 | 
						|
# the last point in the lower level. This rangedel hides that first point in the lower level
 | 
						|
# but we should not seek to a and hide the second point.
 | 
						|
define
 | 
						|
L
 | 
						|
c.SET.15 g.SET.16
 | 
						|
c.SET.15:15 f.SET.13:13 g.SET.16:16 a.RANGEDEL.12:h
 | 
						|
L
 | 
						|
b.SET.14 d.SET.10
 | 
						|
b.SET.14:14 d.SET.10:10
 | 
						|
----
 | 
						|
1:
 | 
						|
  000006:[c#15,SET-g#16,SET]
 | 
						|
2:
 | 
						|
  000007:[b#14,SET-d#10,SET]
 | 
						|
 | 
						|
iter
 | 
						|
last
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
g#16,1:16
 | 
						|
f#13,1:13
 | 
						|
c#15,1:15
 | 
						|
b#14,1:14
 | 
						|
 | 
						|
iter
 | 
						|
seek-lt f
 | 
						|
prev
 | 
						|
----
 | 
						|
c#15,1:15
 | 
						|
b#14,1:14
 | 
						|
 | 
						|
# The rangedel should not delete anything.
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.30 e.RANGEDEL.72057594037927935
 | 
						|
a.SET.30:30 c.SET.27:27 a.RANGEDEL.8:g
 | 
						|
L
 | 
						|
e.SET.10 g.SET.20
 | 
						|
e.SET.10:10 g.SET.20:20 e.RANGEDEL.8:g
 | 
						|
----
 | 
						|
1:
 | 
						|
  000008:[a#30,SET-e#inf,RANGEDEL]
 | 
						|
2:
 | 
						|
  000009:[e#10,SET-g#20,SET]
 | 
						|
 | 
						|
# When doing seek-lt f, the rangedel should not apply to e in the lower sstable. This is the
 | 
						|
# reason we cannot just use largest user key to constrain the rangedel and we need to
 | 
						|
# know whether it is the sentinel key.
 | 
						|
iter
 | 
						|
seek-lt f
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
e#10,1:10
 | 
						|
c#27,1:27
 | 
						|
a#30,1:30
 | 
						|
 | 
						|
iter
 | 
						|
seek-ge e
 | 
						|
next
 | 
						|
----
 | 
						|
e#10,1:10
 | 
						|
g#20,1:20
 | 
						|
 | 
						|
iter
 | 
						|
first
 | 
						|
seek-ge e
 | 
						|
next
 | 
						|
----
 | 
						|
a#30,1:30
 | 
						|
e#10,1:10
 | 
						|
g#20,1:20
 | 
						|
 | 
						|
iter
 | 
						|
first
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
a#30,1:30
 | 
						|
c#27,1:27
 | 
						|
e#10,1:10
 | 
						|
g#20,1:20
 | 
						|
.
 | 
						|
 | 
						|
# Verify that switching directions respects lower/upper bound.
 | 
						|
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.9 d.SET.6
 | 
						|
a.SET.9:9 b.SET.8:8 c.SET.7:7 d.SET.6:6
 | 
						|
----
 | 
						|
1:
 | 
						|
  000010:[a#9,SET-d#6,SET]
 | 
						|
 | 
						|
# Verify the lower bound is respected in switchToMinHeap() when the
 | 
						|
# heap is empty.
 | 
						|
 | 
						|
iter
 | 
						|
set-bounds lower=c
 | 
						|
seek-ge c
 | 
						|
prev
 | 
						|
prev
 | 
						|
next
 | 
						|
----
 | 
						|
c#7,1:7
 | 
						|
.
 | 
						|
.
 | 
						|
c#7,1:7
 | 
						|
 | 
						|
# Verify the upper bound is respected in switchToMaxHeap() when the
 | 
						|
# heap is empty.
 | 
						|
 | 
						|
iter
 | 
						|
set-bounds upper=c
 | 
						|
seek-lt c
 | 
						|
next
 | 
						|
next
 | 
						|
prev
 | 
						|
----
 | 
						|
b#8,1:8
 | 
						|
.
 | 
						|
.
 | 
						|
b#8,1:8
 | 
						|
 | 
						|
# Verify the lower bound is respected in switchToMinHeap() when the
 | 
						|
# heap is not empty.
 | 
						|
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.9 d.SET.6
 | 
						|
a.SET.9:9 b.SET.8:8 c.SET.7:7 d.SET.6:6
 | 
						|
L
 | 
						|
c.SET.5 f.SET.2
 | 
						|
c.SET.5:5 d.SET.4:4 e.SET.3:3 f.SET.2:2
 | 
						|
----
 | 
						|
1:
 | 
						|
  000011:[a#9,SET-d#6,SET]
 | 
						|
2:
 | 
						|
  000012:[c#5,SET-f#2,SET]
 | 
						|
 | 
						|
iter
 | 
						|
set-bounds lower=d
 | 
						|
seek-ge d
 | 
						|
prev
 | 
						|
prev
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
d#6,1:6
 | 
						|
.
 | 
						|
.
 | 
						|
d#6,1:6
 | 
						|
d#4,1:4
 | 
						|
 | 
						|
# Check the behavior of reverse prefix iteration.
 | 
						|
 | 
						|
iter
 | 
						|
seek-prefix-ge d
 | 
						|
prev
 | 
						|
next
 | 
						|
----
 | 
						|
d#6,1:6
 | 
						|
err=pebble: unsupported reverse prefix iteration
 | 
						|
err=pebble: unsupported reverse prefix iteration
 | 
						|
 | 
						|
# Verify the upper bound is respected in switchToMaxHeap() when the
 | 
						|
# heap is not empty.
 | 
						|
 | 
						|
define
 | 
						|
L
 | 
						|
c.SET.9 f.SET.6
 | 
						|
c.SET.9:9 d.SET.8:8 e.SET.7:7 f.SET.6:6
 | 
						|
L
 | 
						|
a.SET.5 d.SET.2
 | 
						|
a.SET.5:5 b.SET.4:4 c.SET.3:3 d.SET.2:2
 | 
						|
----
 | 
						|
1:
 | 
						|
  000013:[c#9,SET-f#6,SET]
 | 
						|
2:
 | 
						|
  000014:[a#5,SET-d#2,SET]
 | 
						|
 | 
						|
iter
 | 
						|
set-bounds upper=d
 | 
						|
seek-lt d
 | 
						|
next
 | 
						|
next
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
c#3,1:3
 | 
						|
.
 | 
						|
.
 | 
						|
c#3,1:3
 | 
						|
c#9,1:9
 | 
						|
 | 
						|
# Verify that the tombstone for the current level is updated correctly
 | 
						|
# when we advance the iterator on the level and step into a new
 | 
						|
# sstable. In the scenario below, the keys "c" and "d" should not show
 | 
						|
# up in the iteration output.
 | 
						|
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.2 a.SET.2
 | 
						|
a.SET.2:2
 | 
						|
c.RANGEDEL.4 e.RANGEDEL.72057594037927935
 | 
						|
c.RANGEDEL.4:e
 | 
						|
f.SET.3 f.SET.3
 | 
						|
f.SET.3:3
 | 
						|
L
 | 
						|
a.SET.0 f.SET.0
 | 
						|
a.SET.0:1 b.SET.0:1 c.SET.0:1 d.SET.0:1 e.SET.0:1 f.SET.0:1
 | 
						|
----
 | 
						|
1:
 | 
						|
  000015:[a#2,SET-a#2,SET]
 | 
						|
  000016:[c#4,RANGEDEL-e#inf,RANGEDEL]
 | 
						|
  000017:[f#3,SET-f#3,SET]
 | 
						|
2:
 | 
						|
  000018:[a#0,SET-f#0,SET]
 | 
						|
 | 
						|
iter
 | 
						|
first
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
a#2,1:2
 | 
						|
a#0,1:1
 | 
						|
b#0,1:1
 | 
						|
e#0,1:1
 | 
						|
f#3,1:3
 | 
						|
f#0,1:1
 | 
						|
.
 | 
						|
.
 | 
						|
 | 
						|
iter
 | 
						|
last
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
prev
 | 
						|
----
 | 
						|
f#0,1:1
 | 
						|
f#3,1:3
 | 
						|
e#0,1:1
 | 
						|
b#0,1:1
 | 
						|
a#0,1:1
 | 
						|
a#2,1:2
 | 
						|
.
 | 
						|
.
 | 
						|
 | 
						|
# Verify the upper bound is respected when switching directions at a RANGEDEL
 | 
						|
# boundary.
 | 
						|
 | 
						|
define
 | 
						|
L
 | 
						|
kq.RANGEDEL.100 p.RANGEDEL.72057594037927935
 | 
						|
kq.RANGEDEL.100:p
 | 
						|
L
 | 
						|
b.SET.90 o.SET.65
 | 
						|
b.SET.90:90 cat.SET.70:70 g.SET.80:80 o.SET.65:65
 | 
						|
L
 | 
						|
a.SET.41 z.RANGEDEL.72057594037927935
 | 
						|
a.SET.41:41 koujdlp.MERGE.37:37 ok.SET.46:46 v.SET.43:43 v.RANGEDEL.19:z
 | 
						|
----
 | 
						|
1:
 | 
						|
  000019:[kq#100,RANGEDEL-p#inf,RANGEDEL]
 | 
						|
2:
 | 
						|
  000020:[b#90,SET-o#65,SET]
 | 
						|
3:
 | 
						|
  000021:[a#41,SET-z#inf,RANGEDEL]
 | 
						|
 | 
						|
iter
 | 
						|
set-bounds upper=n
 | 
						|
seek-ge krgywquurww
 | 
						|
prev
 | 
						|
----
 | 
						|
.
 | 
						|
koujdlp#37,2:37
 | 
						|
 | 
						|
# Verify the lower bound is respected when switching directions at a RANGEDEL
 | 
						|
# boundary.
 | 
						|
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.103 jyk.RANGEDEL.72057594037927935
 | 
						|
a.SET.103:103 imd.SET.793:793 iwoeionch.SET.792:792 c.RANGEDEL.101:jyk
 | 
						|
L
 | 
						|
b.SET.90 o.SET.65
 | 
						|
b.SET.90:90 cat.SET.70:70 g.SET.80:80 o.SET.65:65
 | 
						|
L
 | 
						|
all.SET.0 zk.SET.722
 | 
						|
all.SET.0:0 c.SET.0:0 zk.SET.722:722
 | 
						|
----
 | 
						|
1:
 | 
						|
  000022:[a#103,SET-jyk#inf,RANGEDEL]
 | 
						|
2:
 | 
						|
  000023:[b#90,SET-o#65,SET]
 | 
						|
3:
 | 
						|
  000024:[all#0,SET-zk#722,SET]
 | 
						|
 | 
						|
iter
 | 
						|
set-bounds lower=cz upper=jd
 | 
						|
seek-lt jd
 | 
						|
next
 | 
						|
----
 | 
						|
iwoeionch#792,1:792
 | 
						|
.
 | 
						|
 | 
						|
# Exercise the early stopping behavior for prefix iteration when encountering
 | 
						|
# range deletion tombstones. Keys a, d are not deleted, while the rest are.
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.10 d.SET.10
 | 
						|
a.SET.10:a10 b.SET.10:b10 c.SET.10:c10 d.SET.10:d10 b.RANGEDEL.12:d
 | 
						|
----
 | 
						|
1:
 | 
						|
  000025:[a#10,SET-d#10,SET]
 | 
						|
 | 
						|
iter
 | 
						|
first
 | 
						|
next
 | 
						|
next
 | 
						|
----
 | 
						|
a#10,1:a10
 | 
						|
d#10,1:d10
 | 
						|
.
 | 
						|
 | 
						|
# The seek to c finds d since iteration cannot stop at c as it matches the
 | 
						|
# prefix, and when it steps to d, it finds d is not deleted. Note that
 | 
						|
# mergingIter is an InternalIterator and does not need to guarantee prefix
 | 
						|
# match -- that is job of the higher-level Iterator. So "seek-prefix-ge c" is
 | 
						|
# allowed to return d.
 | 
						|
iter
 | 
						|
seek-prefix-ge a false
 | 
						|
seek-prefix-ge aa true
 | 
						|
seek-prefix-ge b true
 | 
						|
seek-prefix-ge c true
 | 
						|
seek-prefix-ge d true
 | 
						|
----
 | 
						|
a#10,1:a10
 | 
						|
.
 | 
						|
.
 | 
						|
d#10,1:d10
 | 
						|
d#10,1:d10
 | 
						|
 | 
						|
iter
 | 
						|
seek-prefix-ge a false
 | 
						|
next
 | 
						|
seek-prefix-ge b false
 | 
						|
seek-prefix-ge d true
 | 
						|
next
 | 
						|
----
 | 
						|
a#10,1:a10
 | 
						|
.
 | 
						|
.
 | 
						|
d#10,1:d10
 | 
						|
.
 | 
						|
 | 
						|
# Create a sstable which has a range tombstone that covers 4 points in the
 | 
						|
# same sstable. This tests the PointsCoveredByRangeTombstones and PointCount
 | 
						|
# stats.
 | 
						|
define
 | 
						|
L
 | 
						|
a.SET.30 g.RANGEDEL.72057594037927935
 | 
						|
a.SET.30:30 a.RANGEDEL.20:g b.SET.19:19 c.SET.18:18 d.SET.17:17 e.SET.16:16 f.SET.21:21
 | 
						|
----
 | 
						|
1:
 | 
						|
  000026:[a#30,SET-g#inf,RANGEDEL]
 | 
						|
 | 
						|
iter
 | 
						|
first
 | 
						|
stats
 | 
						|
reset-stats
 | 
						|
stats
 | 
						|
next
 | 
						|
stats
 | 
						|
next
 | 
						|
stats
 | 
						|
next
 | 
						|
stats
 | 
						|
----
 | 
						|
a#30,1:30
 | 
						|
{BlockBytes:97 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:1 ValueBytes:2 PointCount:1 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | 
						|
{BlockBytes:0 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | 
						|
f#21,1:21
 | 
						|
{BlockBytes:0 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:5 ValueBytes:10 PointCount:5 PointsCoveredByRangeTombstones:4 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | 
						|
.
 | 
						|
{BlockBytes:0 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:6 ValueBytes:10 PointCount:6 PointsCoveredByRangeTombstones:4 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | 
						|
.
 | 
						|
{BlockBytes:0 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:6 ValueBytes:10 PointCount:6 PointsCoveredByRangeTombstones:4 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 |