Skip to content

Commit 7c7a170

Browse files
committed
kv: deflake TestCheckConsistencyInconsistent
This patch skips invariant checks when iterating through range descriptors from a checkpoint to prevent spurious assertion failures. These assertion failures did not hold because checkpoints are not complete stores, so anything beyond the checkpoints span may not be considered a consistent snapshot. Closes cockroachdb#155680 Epic: none Release note: None
1 parent d86ed05 commit 7c7a170

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

pkg/kv/kvserver/consistency_queue_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,13 +418,14 @@ func TestCheckConsistencyInconsistent(t *testing.T) {
418418

419419
// Find the problematic range in the storage.
420420
var desc *roachpb.RangeDescriptor
421-
require.NoError(t, kvstorage.IterateRangeDescriptorsFromDisk(context.Background(), cpEng,
421+
require.NoError(t, kvstorage.IterateRangeDescriptorsFromCheckpoint(context.Background(), cpEng,
422422
func(rd roachpb.RangeDescriptor) error {
423423
if rd.RangeID == resp.Result[0].RangeID {
424424
desc = &rd
425425
}
426426
return nil
427-
}))
427+
},
428+
))
428429
require.NotNil(t, desc)
429430

430431
// Compute a checksum over the content of the problematic range.

pkg/kv/kvserver/kvstorage/init.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,28 @@ func ReadStoreIdent(ctx context.Context, eng storage.Engine) (roachpb.StoreIdent
245245
// that error.
246246
func IterateRangeDescriptorsFromDisk(
247247
ctx context.Context, reader storage.Reader, fn func(desc roachpb.RangeDescriptor) error,
248+
) error {
249+
return iterateRangeDescriptorsFromDiskHelper(ctx, reader, fn, buildutil.CrdbTestBuild)
250+
}
251+
252+
// IterateRangeDescriptorsFromCheckpoint is like IterateRangeDescriptorsFromDisk
253+
// except it is intended to be used when reading from checkpoints. Checkpoints
254+
// do not correspond to full stores, and as such, certain invariant checks do
255+
// not hold for them.
256+
func IterateRangeDescriptorsFromCheckpoint(
257+
ctx context.Context, reader storage.Reader, fn func(desc roachpb.RangeDescriptor) error,
258+
) error {
259+
return iterateRangeDescriptorsFromDiskHelper(ctx, reader, fn, false /* performInvariantChecks */)
260+
}
261+
262+
// iterateRangeDescriptorsFromDisk performs the actual heavy lifting of reading
263+
// range descriptors from the supplied storage.Reader. The caller may specify
264+
// whether or not invariant checks should be performed.
265+
func iterateRangeDescriptorsFromDiskHelper(
266+
ctx context.Context,
267+
reader storage.Reader,
268+
fn func(desc roachpb.RangeDescriptor) error,
269+
performInvariantChecks bool,
248270
) error {
249271
log.KvExec.Info(ctx, "beginning range descriptor iteration")
250272

@@ -296,8 +318,11 @@ func IterateRangeDescriptorsFromDisk(
296318
iter.SeekGE(storage.MVCCKey{Key: keys.RangeDescriptorKey(keys.MustAddr(startKey))})
297319
} else {
298320
// This case shouldn't happen in practice: we have a key that isn't
299-
// associated with any range descriptor.
300-
if buildutil.CrdbTestBuild {
321+
// associated with any range descriptor. However, when reading from
322+
// checkpoints (incomplete stores), this can happen because checkpoints
323+
// only guarantee to include specific key spans and may have arbitrary
324+
// keys outside those spans.
325+
if performInvariantChecks {
301326
return errors.AssertionFailedf("range local key %s outside of a known range", key.Key)
302327
}
303328
iter.NextKey()

0 commit comments

Comments
 (0)