@@ -524,11 +524,9 @@ func (m *mergingIter) nextEntry(l *mergingIterLevel, succKey []byte) error {
524524 // P2. Care is taken to avoid ever advancing the iterator beyond the current
525525 // prefix. If nextEntry is ever invoked while we're already beyond the
526526 // current prefix, we're violating the invariant.
527- if invariants .Enabled && m .prefix != nil {
528- if p := m .split .Prefix (l .iterKV .K .UserKey ); ! bytes .Equal (m .prefix , p ) {
529- m .logger .Fatalf ("mergingIter: prefix violation: nexting beyond prefix %q; existing heap root %q\n %s" ,
530- m .prefix , l .iterKV , debug .Stack ())
531- }
527+ if invariants .Enabled && m .prefix != nil && ! m .split .HasPrefix (m .prefix , l .iterKV .K .UserKey ) {
528+ m .logger .Fatalf ("mergingIter: prefix violation: nexting beyond prefix %q; existing heap root %q\n %s" ,
529+ m .prefix , l .iterKV , debug .Stack ())
532530 }
533531
534532 oldTopLevel := l .index
@@ -905,6 +903,10 @@ func (m *mergingIter) findPrevEntry() *base.InternalKV {
905903//
906904// If an error occurs, seekGE returns the error without setting m.err.
907905func (m * mergingIter ) seekGE (key []byte , level int , flags base.SeekGEFlags ) error {
906+ if invariants .Enabled && m .lower != nil && m .heap .cmp (key , m .lower ) < 0 {
907+ m .logger .Fatalf ("mergingIter: lower bound violation: %s < %s\n %s" , key , m .lower , debug .Stack ())
908+ }
909+
908910 // When seeking, we can use tombstones to adjust the key we seek to on each
909911 // level. Consider the series of range tombstones:
910912 //
@@ -957,15 +959,11 @@ func (m *mergingIter) seekGE(key []byte, level int, flags base.SeekGEFlags) erro
957959 }
958960
959961 for ; level < len (m .levels ); level ++ {
960- if invariants .Enabled && m .lower != nil && m .heap .cmp (key , m .lower ) < 0 {
961- m .logger .Fatalf ("mergingIter: lower bound violation: %s < %s\n %s" , key , m .lower , debug .Stack ())
962- }
963-
964962 l := & m .levels [level ]
965963 if m .prefix != nil {
966964 l .iterKV = l .iter .SeekPrefixGE (m .prefix , key , flags )
967965 if l .iterKV != nil {
968- if ! bytes . Equal (m .prefix , m . split . Prefix ( l .iterKV .K .UserKey ) ) {
966+ if ! m . split . HasPrefix (m .prefix , l .iterKV .K .UserKey ) {
969967 // Prevent keys without a matching prefix from being added to the heap by setting
970968 // iterKey and iterValue to their zero values before calling initMinHeap.
971969 l .iterKV = nil
@@ -999,7 +997,21 @@ func (m *mergingIter) seekGE(key []byte, level int, flags base.SeekGEFlags) erro
999997 // Based on the containment condition tombstone.End > key, so
1000998 // the assignment to key results in a monotonically
1001999 // non-decreasing key across iterations of this loop.
1002- //
1000+ if m .prefix != nil && ! m .split .HasPrefix (m .prefix , l .tombstone .End ) {
1001+ // Any keys with m.prefix on subsequent levels are under the tombstone.
1002+ // We still need to perform the seeks, in case the next seek uses
1003+ // the TrySeekUsingNext flag.
1004+ for level ++ ; level < len (m .levels ); level ++ {
1005+ l := & m .levels [level ]
1006+ if kv := l .iter .SeekPrefixGE (m .prefix , key , flags ); kv == nil {
1007+ if err := l .iter .Error (); err != nil {
1008+ return err
1009+ }
1010+ }
1011+ l .iterKV = nil
1012+ }
1013+ break
1014+ }
10031015 // The adjustment of key here can only move it to a larger key.
10041016 // Since the caller of seekGE guaranteed that the original key
10051017 // was greater than or equal to m.lower, the new key will
@@ -1037,17 +1049,18 @@ func (m *mergingIter) SeekPrefixGE(prefix, key []byte, flags base.SeekGEFlags) *
10371049func (m * mergingIter ) SeekPrefixGEStrict (
10381050 prefix , key []byte , flags base.SeekGEFlags ,
10391051) * base.InternalKV {
1052+ if invariants .Enabled && ! m .split .HasPrefix (prefix , key ) {
1053+ panic (fmt .Sprintf ("invalid prefix %q for key %q" , prefix , key ))
1054+ }
10401055 m .prefix = prefix
10411056 m .err = m .seekGE (key , 0 /* start level */ , flags )
10421057 if m .err != nil {
10431058 return nil
10441059 }
10451060
10461061 iterKV := m .findNextEntry ()
1047- if invariants .Enabled && iterKV != nil {
1048- if ! bytes .Equal (m .prefix , m .split .Prefix (iterKV .K .UserKey )) {
1049- m .logger .Fatalf ("mergingIter: prefix violation: returning key %q without prefix %q\n " , iterKV , m .prefix )
1050- }
1062+ if invariants .Enabled && iterKV != nil && ! m .split .HasPrefix (m .prefix , iterKV .K .UserKey ) {
1063+ m .logger .Fatalf ("mergingIter: prefix violation: returning key %q without prefix %q\n " , iterKV , m .prefix )
10511064 }
10521065 return iterKV
10531066}
0 commit comments