mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-10-31 14:47:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			392 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			392 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # Note that this test file uses a levelIterTestIter which combines a
 | |
| # point iterator and a range-del iterator, returning both results in a
 | |
| # single key:
 | |
| #
 | |
| #   <point-key>/<tombstone>#<point-seqnum,point-kind>
 | |
| 
 | |
| # Verify that SeekGE, SeekLT, Next, and Prev all pause at table
 | |
| # boundaries in the presence of lower/upper bounds and range
 | |
| # tombstones. Verify that SeekPrefixGE pauses at a table boundary in
 | |
| # the presence of range tombstones.
 | |
| 
 | |
| build
 | |
| a.SET.9:a
 | |
| b.SET.8:b
 | |
| ----
 | |
| 0: a#9,1-b#8,1
 | |
| 
 | |
| build
 | |
| c.SET.7:c
 | |
| d.RANGEDEL.6:e
 | |
| f.SET.5:f
 | |
| ----
 | |
| 0: a#9,1-b#8,1
 | |
| 1: c#7,1-f#5,1
 | |
| 
 | |
| build
 | |
| g.SET.4:g
 | |
| h.SET.3:h
 | |
| ----
 | |
| 0: a#9,1-b#8,1
 | |
| 1: c#7,1-f#5,1
 | |
| 2: g#4,1-h#3,1
 | |
| 
 | |
| iter
 | |
| seek-ge d
 | |
| ----
 | |
| f/d-e:{(#6,RANGEDEL)}#5,1:f
 | |
| 
 | |
| iter
 | |
| set-bounds upper=d
 | |
| seek-ge d
 | |
| ----
 | |
| d/d-e:{(#6,RANGEDEL)}#72057594037927935,15:
 | |
| 
 | |
| iter
 | |
| set-bounds upper=d
 | |
| seek-ge c
 | |
| next
 | |
| prev
 | |
| next
 | |
| next
 | |
| ----
 | |
| c/d-e:{(#6,RANGEDEL)}#7,1:c
 | |
| d#72057594037927935,15:
 | |
| c#7,1:c
 | |
| d#72057594037927935,15:
 | |
| .
 | |
| 
 | |
| # There is no point key with d, but since there is a rangedel, levelIter returns
 | |
| # the boundary key using the largest key, f, in the file.
 | |
| iter
 | |
| seek-prefix-ge d
 | |
| ----
 | |
| f/d-e:{(#6,RANGEDEL)}#5,1:
 | |
| 
 | |
| # Tests a sequence of SeekPrefixGE with monotonically increasing keys, some of
 | |
| # which are present and some not (so fail the bloom filter match). The seek to
 | |
| # cc returns a boundary key.
 | |
| iter
 | |
| seek-prefix-ge aa
 | |
| seek-prefix-ge c
 | |
| seek-prefix-ge cc
 | |
| seek-prefix-ge f
 | |
| seek-prefix-ge g
 | |
| seek-prefix-ge gg
 | |
| seek-prefix-ge h
 | |
| ----
 | |
| ./<invalid>#0,0:
 | |
| c/d-e:{(#6,RANGEDEL)}#7,1:c
 | |
| f/d-e:{(#6,RANGEDEL)}#5,1:
 | |
| f/<invalid>#5,1:f
 | |
| g/<invalid>#4,1:g
 | |
| ./<invalid>#0,0:
 | |
| h/<invalid>#3,1:h
 | |
| 
 | |
| # Test that when sequentially iterate through all 3 files, the stats
 | |
| # accumulate as we close a file and switch to the next one. Also, while in the
 | |
| # middle of the first file, a reset-stats propagates to the underlying
 | |
| # iterators, and when done iterating, a reset-stats does reset the local
 | |
| # state.
 | |
| iter
 | |
| seek-ge a
 | |
| stats
 | |
| reset-stats
 | |
| stats
 | |
| next
 | |
| stats
 | |
| next
 | |
| stats
 | |
| next
 | |
| stats
 | |
| next
 | |
| stats
 | |
| next
 | |
| stats
 | |
| next
 | |
| stats
 | |
| reset-stats
 | |
| stats
 | |
| ----
 | |
| a/<invalid>#9,1:a
 | |
| {BlockBytes:56 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 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}}
 | |
| b#8,1:b
 | |
| {BlockBytes:0 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | |
| c#7,1:c
 | |
| {BlockBytes:56 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | |
| f#5,1:f
 | |
| {BlockBytes:56 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | |
| g#4,1:g
 | |
| {BlockBytes:112 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | |
| h#3,1:h
 | |
| {BlockBytes:112 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
 | |
| .
 | |
| {BlockBytes:112 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 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}}
 | |
| 
 | |
| iter
 | |
| set-bounds lower=d
 | |
| seek-lt d
 | |
| ----
 | |
| d/d-e:{(#6,RANGEDEL)}#72057594037927935,15:
 | |
| 
 | |
| iter
 | |
| set-bounds lower=d
 | |
| seek-lt g
 | |
| prev
 | |
| next
 | |
| prev
 | |
| prev
 | |
| ----
 | |
| f/d-e:{(#6,RANGEDEL)}#5,1:f
 | |
| d#72057594037927935,15:
 | |
| f#5,1:f
 | |
| d#72057594037927935,15:
 | |
| .
 | |
| 
 | |
| # Verify that First() in the presence of an upper-bound pauses at the
 | |
| # table containing the upper-bound.
 | |
| 
 | |
| clear
 | |
| ----
 | |
| 
 | |
| build
 | |
| d.RANGEDEL.6:e
 | |
| f.SET.5:f
 | |
| ----
 | |
| 0: d#6,15-f#5,1
 | |
| 
 | |
| iter
 | |
| set-bounds upper=f
 | |
| first
 | |
| ----
 | |
| f#72057594037927935,15:
 | |
| 
 | |
| # Verify that Last() in the presence of a lower-bound pauses at the
 | |
| # table containing the lower-bound.
 | |
| 
 | |
| clear
 | |
| ----
 | |
| 
 | |
| build
 | |
| c.SET.7:c
 | |
| d.RANGEDEL.6:e
 | |
| ----
 | |
| 0: c#7,1-e#72057594037927935,15
 | |
| 
 | |
| iter
 | |
| set-bounds lower=c
 | |
| last
 | |
| ----
 | |
| c#7,1:c
 | |
| 
 | |
| # Verify that a seek to a file with range tombstones as boundaries pauses on
 | |
| # those boundaries.
 | |
| 
 | |
| clear
 | |
| ----
 | |
| 
 | |
| build
 | |
| a.RANGEDEL.5:b
 | |
| c.SET.7:c
 | |
| d.RANGEDEL.6:e
 | |
| ----
 | |
| 0: a#5,15-e#72057594037927935,15
 | |
| 
 | |
| build
 | |
| f.SET.8:f
 | |
| g.SET.9:g
 | |
| ----
 | |
| 0: a#5,15-e#72057594037927935,15
 | |
| 1: f#8,1-g#9,1
 | |
| 
 | |
| iter
 | |
| seek-ge d
 | |
| prev
 | |
| next
 | |
| next
 | |
| ----
 | |
| e/d-e:{(#6,RANGEDEL)}#72057594037927935,15:
 | |
| c#7,1:c
 | |
| e#72057594037927935,15:
 | |
| f#8,1:f
 | |
| 
 | |
| iter
 | |
| seek-lt b
 | |
| next
 | |
| prev
 | |
| prev
 | |
| ----
 | |
| a/a-b:{(#5,RANGEDEL)}#5,15:
 | |
| c#7,1:c
 | |
| a#5,15:
 | |
| .
 | |
| 
 | |
| # Verify that prev when positioned at the largest boundary returns the
 | |
| # last key.
 | |
| 
 | |
| clear
 | |
| ----
 | |
| 
 | |
| build
 | |
| a.SET.1:a
 | |
| b.SET.1:b
 | |
| d.RANGEDEL.2:e
 | |
| ----
 | |
| 0: a#1,1-e#72057594037927935,15
 | |
| 
 | |
| iter
 | |
| seek-lt c
 | |
| seek-ge d
 | |
| prev
 | |
| ----
 | |
| b/<invalid>#1,1:b
 | |
| e/d-e:{(#2,RANGEDEL)}#72057594037927935,15:
 | |
| b#1,1:b
 | |
| 
 | |
| # Verify that next when positioned at the smallest boundary returns
 | |
| # the first key.
 | |
| 
 | |
| clear
 | |
| ----
 | |
| 
 | |
| build
 | |
| a.RANGEDEL.1:b
 | |
| d.SET.2:d
 | |
| e.SET.2:e
 | |
| ----
 | |
| 0: a#1,15-e#2,1
 | |
| 
 | |
| iter
 | |
| seek-ge d
 | |
| seek-lt d
 | |
| next
 | |
| ----
 | |
| d/<invalid>#2,1:d
 | |
| a/a-b:{(#1,RANGEDEL)}#1,15:
 | |
| d#2,1:d
 | |
| 
 | |
| # Verify SeekPrefixGE correctness with trySeekUsingNext=true
 | |
| clear
 | |
| ----
 | |
| 
 | |
| build
 | |
| a.SET.1:a
 | |
| b.SET.2:b
 | |
| c.RANGEDEL.4:e
 | |
| ----
 | |
| 0: a#1,1-e#72057594037927935,15
 | |
| 
 | |
| build
 | |
| e.SET.4:e
 | |
| f.SINGLEDEL.5:
 | |
| f.SET.4:f
 | |
| g.SET.6:g
 | |
| h.SINGLEDEL.7:
 | |
| ----
 | |
| 0: a#1,1-e#72057594037927935,15
 | |
| 1: e#4,1-h#7,7
 | |
| 
 | |
| build
 | |
| h.SET.6:h
 | |
| i.SET.6:i
 | |
| ----
 | |
| 0: a#1,1-e#72057594037927935,15
 | |
| 1: e#4,1-h#7,7
 | |
| 2: h#6,1-i#6,1
 | |
| 
 | |
| build
 | |
| j.SET.7:j
 | |
| ----
 | |
| 0: a#1,1-e#72057594037927935,15
 | |
| 1: e#4,1-h#7,7
 | |
| 2: h#6,1-i#6,1
 | |
| 3: j#7,1-j#7,1
 | |
| 
 | |
| # Seeks to immediately following keys.
 | |
| iter
 | |
| seek-prefix-ge a false
 | |
| seek-prefix-ge a true
 | |
| seek-prefix-ge b true
 | |
| next
 | |
| seek-prefix-ge c false
 | |
| seek-prefix-ge d true
 | |
| seek-prefix-ge f true
 | |
| seek-prefix-ge g true
 | |
| seek-prefix-ge h true
 | |
| seek-prefix-ge i true
 | |
| seek-prefix-ge j true
 | |
| ----
 | |
| a/c-e:{(#4,RANGEDEL)}#1,1:a
 | |
| a/c-e:{(#4,RANGEDEL)}#1,1:a
 | |
| b/c-e:{(#4,RANGEDEL)}#2,1:b
 | |
| e#72057594037927935,15:
 | |
| e/c-e:{(#4,RANGEDEL)}#72057594037927935,15:
 | |
| e/c-e:{(#4,RANGEDEL)}#72057594037927935,15:
 | |
| f/<invalid>#5,7:
 | |
| g/<invalid>#6,1:g
 | |
| h/<invalid>#7,7:
 | |
| i/<invalid>#6,1:i
 | |
| j/<invalid>#7,1:j
 | |
| 
 | |
| # Seeks to keys that are in the next file, so cannot use Next.
 | |
| iter
 | |
| seek-prefix-ge a false
 | |
| seek-prefix-ge e true
 | |
| seek-prefix-ge i true
 | |
| seek-prefix-ge j true
 | |
| ----
 | |
| a/c-e:{(#4,RANGEDEL)}#1,1:a
 | |
| e/<invalid>#4,1:e
 | |
| i/<invalid>#6,1:i
 | |
| j/<invalid>#7,1:j
 | |
| 
 | |
| # Verify that we do not open files that do not have point keys.
 | |
| 
 | |
| clear
 | |
| ----
 | |
| 
 | |
| build
 | |
| a.SET.9:a
 | |
| b.SET.8:b
 | |
| ----
 | |
| 0: a#9,1-b#8,1
 | |
| 
 | |
| build
 | |
| c.SET.7:c
 | |
| d.RANGEDEL.6:e
 | |
| f.SET.5:f
 | |
| ----
 | |
| 0: a#9,1-b#8,1
 | |
| 1: c#7,1-f#5,1
 | |
| 
 | |
| build format=pebblev2
 | |
| g.RANGEKEYDEL.6:h
 | |
| ----
 | |
| 0: a#9,1-b#8,1
 | |
| 1: c#7,1-f#5,1
 | |
| 2: g#6,19-h#72057594037927935,19
 | |
| 
 | |
| build
 | |
| i.SET.4:i
 | |
| j.SET.3:j
 | |
| ----
 | |
| 0: a#9,1-b#8,1
 | |
| 1: c#7,1-f#5,1
 | |
| 2: g#6,19-h#72057594037927935,19
 | |
| 3: i#4,1-j#3,1
 | |
| 
 | |
| iter
 | |
| seek-ge f
 | |
| next
 | |
| ----
 | |
| f/<invalid>#5,1:f
 | |
| i#4,1:i
 | |
| 
 | |
| # The below count should be 2, as we skip over the rangekey-only file.
 | |
| 
 | |
| iters-created
 | |
| ----
 | |
| 2
 | 
