@@ -158,7 +158,6 @@ func IterateIDPrefixKeys(
158158 msg protoutil.Message ,
159159 f func (_ roachpb.RangeID ) error ,
160160) error {
161- rangeID := roachpb .RangeID (1 )
162161 // NB: Range-ID local keys have no versions and no intents.
163162 iter , err := reader .NewMVCCIterator (ctx , storage .MVCCKeyIterKind , storage.IterOptions {
164163 UpperBound : keys .LocalRangeIDPrefix .PrefixEnd ().AsRawKey (),
@@ -168,55 +167,35 @@ func IterateIDPrefixKeys(
168167 }
169168 defer iter .Close ()
170169
171- for {
172- bumped := false
173- mvccKey := storage .MakeMVCCMetadataKey (keyFn (rangeID ))
174- iter .SeekGE (mvccKey )
175-
176- if ok , err := iter .Valid (); ! ok {
177- return err
178- }
179-
180- unsafeKey := iter .UnsafeKey ()
170+ for rangeID := roachpb .RangeID (1 ); ; {
171+ rangeIDKey := keyFn (rangeID )
172+ iter .SeekGE (storage .MakeMVCCMetadataKey (rangeIDKey ))
181173
182- if ! bytes .HasPrefix (unsafeKey .Key , keys .LocalRangeIDPrefix ) {
183- // Left the local keyspace, so we're done.
184- return nil
185- }
186-
187- curRangeID , _ , _ , _ , err := keys .DecodeRangeIDKey (unsafeKey .Key )
188- if err != nil {
174+ if ok , err := iter .Valid (); ! ok || err != nil {
189175 return err
190176 }
191177
192- if curRangeID > rangeID {
193- // `bumped` is always `false` here, but let's be explicit.
194- if ! bumped {
195- rangeID = curRangeID
196- bumped = true
197- }
198- mvccKey = storage .MakeMVCCMetadataKey (keyFn (rangeID ))
199- }
200-
201- if ! unsafeKey .Key .Equal (mvccKey .Key ) {
202- if ! bumped {
203- // Don't increment the rangeID if it has already been incremented
204- // above, or we could skip past a value we ought to see.
205- rangeID ++
206- bumped = true // for completeness' sake; continuing below anyway
178+ unsafeKey := iter .UnsafeKey ().Key
179+ if comp := unsafeKey .Compare (rangeIDKey ); comp > 0 { // overshot
180+ curRangeID , _ , _ , _ , err := keys .DecodeRangeIDKey (unsafeKey )
181+ if err != nil {
182+ return err
207183 }
184+ rangeID = max (curRangeID , rangeID + 1 )
208185 continue
186+ } else if comp < 0 { // undershot
187+ return errors .AssertionFailedf ("SeekGE undershot key %s" , rangeIDKey )
209188 }
210189
211- ok , err := storage . MVCCGetProto (
212- ctx , reader , unsafeKey . Key , hlc. Timestamp {}, msg , storage. MVCCGetOptions {})
213- if err != nil {
214- return err
190+ // Found the key. Parse and report the value.
191+ var meta enginepb. MVCCMetadata
192+ if err := iter . ValueProto ( & meta ); err != nil {
193+ return errors . Errorf ( "unable to unmarshal %s into MVCCMetadata" , unsafeKey )
215194 }
216- if ! ok {
217- return errors .Errorf ("unable to unmarshal %s into %T" , unsafeKey .Key , msg )
195+ val := roachpb.Value {RawBytes : meta .RawBytes }
196+ if err := val .GetProto (msg ); err != nil {
197+ return errors .Errorf ("unable to unmarshal %s into %T" , unsafeKey , msg )
218198 }
219-
220199 if err := f (rangeID ); err != nil {
221200 return iterutil .Map (err )
222201 }
0 commit comments