Skip to content

Commit d190c24

Browse files
committed
kvstorage: simplify IterateIDPrefixKeys
Epic: none Release note: none
1 parent b9ab55f commit d190c24

File tree

1 file changed

+19
-40
lines changed

1 file changed

+19
-40
lines changed

pkg/kv/kvserver/kvstorage/init.go

Lines changed: 19 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)