@@ -15197,3 +15197,128 @@ func TestLeaderlessWatcherInit(t *testing.T) {
1519715197 t.Fatalf("expected LeaderlessWatcher channel to be closed")
1519815198 }
1519915199}
15200+
15201+ // TestOverlapsUnreplicatedRangeIDLocalKeys verifies that the function
15202+ // overlapsUnreplicatedRangeIDLocalKeys() successfully catches any overlap with
15203+ // unreplicated rangeID local keys.
15204+ func TestOverlapsUnreplicatedRangeIDLocalKeys(t *testing.T) {
15205+ defer leaktest.AfterTest(t)()
15206+ defer log.Scope(t).Close(t)
15207+
15208+ s := func(start, end roachpb.Key) roachpb.Span {
15209+ return roachpb.Span{Key: start, EndKey: end}
15210+ }
15211+ testCases := []struct {
15212+ span roachpb.Span
15213+ notOk bool
15214+ }{
15215+ // Full spans not overlapping with unreplicated local RangeID spans.
15216+ {span: s(roachpb.KeyMin, keys.LocalRangeIDPrefix.AsRawKey())},
15217+ {span: s(keys.RangeForceFlushKey(1), keys.RangeLeaseKey(1))},
15218+ {span: s(keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd(), roachpb.KeyMax)},
15219+
15220+ // Full spans overlapping with unreplicated local RangeID spans.
15221+ {span: s(roachpb.KeyMin, keys.MakeRangeIDUnreplicatedPrefix(1)), notOk: true}, // partial overlap
15222+ {span: s(roachpb.KeyMin, keys.RaftTruncatedStateKey(1)), notOk: true},
15223+ {span: s(keys.LocalRangeIDPrefix.AsRawKey(), keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd()),
15224+ notOk: true},
15225+ {span: s(keys.RaftTruncatedStateKey(1), keys.RaftTruncatedStateKey(2)), notOk: true},
15226+ {span: s(keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd(), roachpb.KeyMax), notOk: true}, // partial overlap
15227+ {span: s(keys.MakeRangeIDUnreplicatedPrefix(1),
15228+ keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd()), notOk: true},
15229+ {span: s(keys.RaftTruncatedStateKey(1), roachpb.KeyMax), notOk: true},
15230+
15231+ // Point spans not overlapping with unreplicated local RangeID spans.
15232+ {span: s(roachpb.KeyMin, nil)},
15233+ {span: s(keys.LocalRangeIDPrefix.AsRawKey().Prevish(1), nil)},
15234+ {span: s(keys.MakeRangeIDUnreplicatedPrefix(1).Prevish(1), nil)},
15235+ {span: s(keys.RangeForceFlushKey(1), nil)},
15236+ {span: s(keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd(), nil)},
15237+ {span: s(keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd(), nil)},
15238+ {span: s(roachpb.KeyMax, nil)},
15239+
15240+ // Point spans overlapping with unreplicated local RangeID spans.
15241+ {span: s(keys.MakeRangeIDUnreplicatedPrefix(1), nil), notOk: true},
15242+ {span: s(keys.RangeTombstoneKey(1), nil), notOk: true},
15243+ {span: s(keys.RaftTruncatedStateKey(1), nil), notOk: true},
15244+ {span: s(keys.RaftTruncatedStateKey(2), nil), notOk: true},
15245+ {span: s(keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd().Prevish(1), nil), notOk: true},
15246+
15247+ // Tricky spans not overlapping with unreplicated local RangeID spans.
15248+ {span: s(nil, keys.LocalRangeIDPrefix.AsRawKey())},
15249+ {span: s(nil, keys.MakeRangeIDUnreplicatedPrefix(1))},
15250+ {span: s(nil, keys.RangeForceFlushKey(1))},
15251+ {span: s(nil, keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd().Next())},
15252+ {span: s(nil, keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd().Next())},
15253+
15254+ // Tricky spans overlapping with unreplicated local RangeID spans.
15255+ {span: s(nil, keys.MakeRangeIDUnreplicatedPrefix(1).Next()), notOk: true},
15256+ {span: s(nil, keys.RangeTombstoneKey(1).Next()), notOk: true},
15257+ {span: s(nil, keys.RaftTruncatedStateKey(1).Next()), notOk: true},
15258+ {span: s(nil, keys.RaftTruncatedStateKey(2).Next()), notOk: true},
15259+ {span: s(nil, keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd()), notOk: true},
15260+ {span: s(nil, keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd()), notOk: true}, // can't decode RangeID.
15261+ }
15262+
15263+ for _, tc := range testCases {
15264+ t.Run("", func(t *testing.T) {
15265+ err := overlapsUnreplicatedRangeIDLocalKeys(spanset.TrickySpan(tc.span))
15266+ require.Equal(t, tc.notOk, err != nil, tc.span)
15267+ })
15268+ }
15269+ }
15270+
15271+ // TestOverlapsStoreLocalKeys verifies that the function
15272+ // overlapsStoreLocalKeys() successfully catches any overlap with
15273+ // store local keys.
15274+ func TestOverlapsStoreLocalKeys(t *testing.T) {
15275+ defer leaktest.AfterTest(t)()
15276+ defer log.Scope(t).Close(t)
15277+
15278+ s := func(start, end roachpb.Key) roachpb.Span {
15279+ return roachpb.Span{Key: start, EndKey: end}
15280+ }
15281+
15282+ testCases := []struct {
15283+ span roachpb.Span
15284+ notOK bool
15285+ }{
15286+ // Full spans not overlapping with Store-local span.
15287+ {span: s(roachpb.KeyMin, keys.LocalStorePrefix)},
15288+ {span: s(keys.LocalStoreMax, roachpb.KeyMax)},
15289+
15290+ // Full spans overlapping with Store-local span.
15291+ {span: s(roachpb.KeyMin, roachpb.Key(keys.LocalStorePrefix).Next()), notOK: true},
15292+ {span: s(keys.LocalStorePrefix, keys.LocalStoreMax), notOK: true},
15293+ {span: s(keys.StoreGossipKey(), keys.StoreIdentKey()), notOK: true},
15294+ {span: s(keys.LocalStoreMax.Prevish(1), roachpb.KeyMax), notOK: true},
15295+
15296+ // Point spans not overlapping with Store-local span.
15297+ {span: s(roachpb.KeyMin, nil)},
15298+ {span: s(roachpb.Key(keys.LocalStorePrefix).Prevish(1), nil)},
15299+ {span: s(keys.LocalStoreMax, nil)},
15300+ {span: s(keys.LocalStoreMax.Next(), nil)},
15301+ {span: s(roachpb.KeyMax, nil)},
15302+
15303+ // Point spans overlapping with Store-local span.
15304+ {span: s(keys.LocalStorePrefix, nil), notOK: true},
15305+ {span: s(keys.StoreGossipKey(), nil), notOK: true},
15306+ {span: s(keys.LocalStoreMax.Prevish(1), nil), notOK: true},
15307+
15308+ // Tricky spans with nil StartKey not overlapping with Store-local span.
15309+ {span: s(nil, keys.LocalStorePrefix)},
15310+ {span: s(nil, keys.LocalStoreMax.Next())},
15311+
15312+ // Tricky spans with nil StartKey overlapping with Store-local span.
15313+ {span: s(nil, roachpb.Key(keys.LocalStorePrefix).Next()), notOK: true},
15314+ {span: s(nil, keys.StoreGossipKey()), notOK: true},
15315+ {span: s(nil, keys.LocalStoreMax), notOK: true},
15316+ }
15317+
15318+ for _, tc := range testCases {
15319+ t.Run("", func(t *testing.T) {
15320+ err := overlapsStoreLocalKeys(spanset.TrickySpan(tc.span))
15321+ require.Equal(t, tc.notOK, err != nil, tc.span)
15322+ })
15323+ }
15324+ }
0 commit comments