mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-10-31 21:47:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			280 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			280 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # Test a lazy-combined iteration edge case. Consider the LSM:
 | |
| #
 | |
| #   L5:  000003:[bar.DEL.3, foo.RANGEKEYSET.4]
 | |
| #   L6:  000001:[bar.SET.1] 000002:[bax.RANGEKEYSET.2]
 | |
| #
 | |
| # A call to First() seeks the levels to files L5.000003 and L6.000001.
 | |
| # The L5 levelIter observes that L5.000003 contains the range key with
 | |
| # start key `foo`, and triggers a switch to combined iteration, setting
 | |
| # `combinedIterState.key` = `foo`. While switching to combined iteration, the
 | |
| # iterator must recognize that `foo` > `bar`, and there may yet exist range keys
 | |
| # that begin before `foo` (in this case `bax`).
 | |
| 
 | |
| reset
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| set bar bar
 | |
| ----
 | |
| committed 1 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| range-key-set bax zoo @1 foo
 | |
| ----
 | |
| committed 1 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| del bar
 | |
| range-key-set foo zoo @2 bar
 | |
| ----
 | |
| committed 2 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| lsm
 | |
| ----
 | |
| 0.1:
 | |
|   000009:[bar#12,DEL-zoo#inf,RANGEKEYSET]
 | |
| 0.0:
 | |
|   000005:[bar#10,SET-bar#10,SET]
 | |
|   000007:[bax#11,RANGEKEYSET-zoo#inf,RANGEKEYSET]
 | |
| 
 | |
| # Assert that First correctly finds [bax,zoo), despite the discovery of
 | |
| # [foo,zoo) triggering the switch to combined iteration.
 | |
| 
 | |
| combined-iter
 | |
| first
 | |
| next
 | |
| ----
 | |
| bax: (., [bax-foo) @1=foo UPDATED)
 | |
| foo: (., [foo-zoo) @2=bar, @1=foo UPDATED)
 | |
| 
 | |
| # Test seeking into the middle of a range key during lazy-combined iteration.
 | |
| # The iterator should surface Key() = the seek key.
 | |
| 
 | |
| combined-iter
 | |
| seek-ge bop
 | |
| ----
 | |
| bop: (., [bax-foo) @1=foo UPDATED)
 | |
| 
 | |
| combined-iter
 | |
| last
 | |
| ----
 | |
| foo: (., [foo-zoo) @2=bar, @1=foo UPDATED)
 | |
| 
 | |
| # Test a lazy combined iterator that must next/prev through fileMetdata when
 | |
| # skipping through a RANGEDEL.
 | |
| #
 | |
| # L5
 | |
| #     b-----------------------y RANGEDEL
 | |
| # L6
 | |
| #  [a]   [[d,e)@1]  [[l,m)@1]   [z]
 | |
| #
 | |
| # A SeekGE(k) must surface [l,m)@1 and a SeekLT(k) must surface [d,e)@1.
 | |
| 
 | |
| reset
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| set a a
 | |
| ----
 | |
| committed 1 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| set z z
 | |
| ----
 | |
| committed 1 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| range-key-set d e @1 foo
 | |
| ----
 | |
| committed 1 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| range-key-set l m @1 foo
 | |
| ----
 | |
| committed 1 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| del-range b y
 | |
| ----
 | |
| committed 1 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| lsm
 | |
| ----
 | |
| 0.1:
 | |
|   000013:[b#14,RANGEDEL-y#inf,RANGEDEL]
 | |
| 0.0:
 | |
|   000005:[a#10,SET-a#10,SET]
 | |
|   000009:[d#12,RANGEKEYSET-e#inf,RANGEKEYSET]
 | |
|   000011:[l#13,RANGEKEYSET-m#inf,RANGEKEYSET]
 | |
|   000007:[z#11,SET-z#11,SET]
 | |
| 
 | |
| combined-iter
 | |
| seek-ge k
 | |
| next
 | |
| ----
 | |
| l: (., [l-m) @1=foo UPDATED)
 | |
| z: (z, . UPDATED)
 | |
| 
 | |
| combined-iter
 | |
| seek-lt k
 | |
| prev
 | |
| ----
 | |
| d: (., [d-e) @1=foo UPDATED)
 | |
| a: (a, . UPDATED)
 | |
| 
 | |
| 
 | |
| reset
 | |
| ----
 | |
| 
 | |
| batch commit
 | |
| set a a
 | |
| set b b
 | |
| set c c
 | |
| set e e
 | |
| range-key-del a f
 | |
| range-key-unset a f @5
 | |
| ----
 | |
| committed 6 keys
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| wait-table-stats
 | |
| ----
 | |
| 
 | |
| # The lazy iterator shouldn't switch to combined iteration when it encounters a
 | |
| # file that is known to only contain RANGEKEYDELs and RANGEKEYUNSETs.
 | |
| 
 | |
| combined-iter
 | |
| is-using-combined
 | |
| seek-ge a
 | |
| seek-ge b
 | |
| is-using-combined
 | |
| ----
 | |
| using lazy iterator
 | |
| a: (a, .)
 | |
| b: (b, .)
 | |
| using lazy iterator
 | |
| 
 | |
| # Write a range key to the memtable. The combined iterator should be forced to
 | |
| # use non-lazy iteration.
 | |
| 
 | |
| batch commit
 | |
| range-key-set m z @5 foo
 | |
| set s s
 | |
| ----
 | |
| committed 2 keys
 | |
| 
 | |
| combined-iter
 | |
| is-using-combined
 | |
| seek-ge a
 | |
| is-using-combined
 | |
| seek-ge n
 | |
| is-using-combined
 | |
| ----
 | |
| using combined (non-lazy) iterator
 | |
| a: (a, .)
 | |
| using combined (non-lazy) iterator
 | |
| n: (., [m-z) @5=foo UPDATED)
 | |
| using combined (non-lazy) iterator
 | |
| 
 | |
| flush
 | |
| ----
 | |
| 
 | |
| # Now that the range key is flushed, a switch to combined iteration should only
 | |
| # happen once the sstable containing the set is encountered.
 | |
| 
 | |
| combined-iter
 | |
| is-using-combined
 | |
| seek-ge a
 | |
| is-using-combined
 | |
| seek-ge n
 | |
| is-using-combined
 | |
| ----
 | |
| using lazy iterator
 | |
| a: (a, .)
 | |
| using lazy iterator
 | |
| n: (., [m-z) @5=foo UPDATED)
 | |
| using combined (non-lazy) iterator
 | |
| 
 | |
| # Regression tests for #2210 metamorphic test failure.
 | |
| #
 | |
| # Lazy-combined iteration depends on individual point level iterators triggering
 | |
| # a switch to combined iteration when they observe a file containing relevant
 | |
| # range keys. Previously, this switch did not happen if the observed range
 | |
| # keys all lied outside the current iteration prefix.
 | |
| #
 | |
| # This made it possible for a level to become positioned beyond the file
 | |
| # containing range keys, without ever triggering the switch to combined
 | |
| # iteration. A subsequent seek that made use of the TrySeekUsingNext
 | |
| # optimization would never observe the file containing range keys, and omit the
 | |
| # range keys.
 | |
| 
 | |
| define
 | |
| L6
 | |
|   bax.DEL.9:
 | |
| L6
 | |
|   rangekey:c-d:{(#0,RANGEKEYSET,@1,foo)}
 | |
| L6
 | |
|   d@2.SET.2:v
 | |
| ----
 | |
| 6:
 | |
|   000004:[bax#9,DEL-bax#9,DEL]
 | |
|   000005:[c#0,RANGEKEYSET-d#inf,RANGEKEYSET]
 | |
|   000006:[d@2#2,SET-d@2#2,SET]
 | |
| 
 | |
| combined-iter
 | |
| seek-prefix-ge bax
 | |
| seek-prefix-ge cat
 | |
| ----
 | |
| .
 | |
| cat: (., [cat-"cat\x00") @1=foo UPDATED)
 | |
| 
 | |
| # Another regression test for the #2210 metamorphic test failure, this one using
 | |
| # a MERGE key to force the Iterator to step the internal iterator beyond the
 | |
| # range key file.
 | |
| 
 | |
| define
 | |
| L6
 | |
|   bax.MERGE.9:v
 | |
| L6
 | |
|   rangekey:c-d:{(#0,RANGEKEYSET,@1,foo)}
 | |
| L6
 | |
|   d@2.SET.2:v
 | |
| ----
 | |
| 6:
 | |
|   000004:[bax#9,MERGE-bax#9,MERGE]
 | |
|   000005:[c#0,RANGEKEYSET-d#inf,RANGEKEYSET]
 | |
|   000006:[d@2#2,SET-d@2#2,SET]
 | |
| 
 | |
| combined-iter
 | |
| seek-prefix-ge bax
 | |
| seek-prefix-ge cat
 | |
| ----
 | |
| bax: (v, .)
 | |
| cat: (., [cat-"cat\x00") @1=foo UPDATED)
 | 
