@@ -15197,3 +15197,123 @@ 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+
15212+ testCases := []struct {
15213+ span roachpb.Span
15214+ notOk bool
15215+ }{
15216+ // Full spans not overlapping with unreplicated local RangeID spans.
15217+ {span: s(roachpb.KeyMin, keys.LocalRangeIDPrefix.AsRawKey())},
15218+ {span: s(keys.RangeForceFlushKey(1), keys.RangeLeaseKey(1))},
15219+ {span: s(keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd(), roachpb.KeyMax)},
15220+
15221+ // Full spans overlapping with unreplicated local RangeID spans.
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.RaftTruncatedStateKey(1), roachpb.KeyMax), notOk: true},
15227+
15228+ // Point spans not overlapping with unreplicated local RangeID spans.
15229+ {span: s(roachpb.KeyMin, nil)},
15230+ {span: s(keys.LocalRangeIDPrefix.AsRawKey().Prevish(1), nil)},
15231+ {span: s(keys.RangeForceFlushKey(1), nil)},
15232+ {span: s(keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd(), nil)},
15233+ {span: s(roachpb.KeyMax, nil)},
15234+
15235+ // Point spans overlapping with unreplicated local RangeID spans.
15236+ {span: s(keys.RangeTombstoneKey(1), nil), notOk: true},
15237+ {span: s(keys.RaftTruncatedStateKey(1), nil), notOk: true},
15238+ {span: s(keys.RaftTruncatedStateKey(2), nil), notOk: true},
15239+
15240+ // Tricky spans not overlapping with unreplicated local RangeID spans.
15241+ {span: s(nil, keys.LocalRangeIDPrefix.AsRawKey())},
15242+ {span: s(nil, keys.RangeForceFlushKey(1))},
15243+ {span: s(nil, keys.LocalRangeIDPrefix.AsRawKey().PrefixEnd().Next())},
15244+
15245+ // Tricky spans overlapping with unreplicated local RangeID spans.
15246+ {span: s(nil, keys.RangeTombstoneKey(1).Next()), notOk: true},
15247+ {span: s(nil, keys.RaftTruncatedStateKey(1).Next()), notOk: true},
15248+ {span: s(nil, keys.RaftTruncatedStateKey(2).Next()), notOk: true},
15249+ }
15250+
15251+ for _, tc := range testCases {
15252+ t.Run("", func(t *testing.T) {
15253+ err := overlapsUnreplicatedRangeIDLocalKeys(spanset.TrickySpan(tc.span))
15254+ if tc.notOk {
15255+ require.Errorf(t, err, "expected error for span %s", tc.span)
15256+ } else {
15257+ require.NoErrorf(t, err, "expected no error for span %s", tc.span)
15258+ }
15259+ })
15260+ }
15261+ }
15262+
15263+ // TestOverlapsStoreLocalKeys verifies that the function
15264+ // overlapsStoreLocalKeys() successfully catches any overlap with
15265+ // store local keys.
15266+ func TestOverlapsStoreLocalKeys(t *testing.T) {
15267+ defer leaktest.AfterTest(t)()
15268+ defer log.Scope(t).Close(t)
15269+
15270+ s := func(start, end roachpb.Key) roachpb.Span {
15271+ return roachpb.Span{Key: start, EndKey: end}
15272+ }
15273+
15274+ testCases := []struct {
15275+ span roachpb.Span
15276+ notOK bool
15277+ }{
15278+ // Full spans not overlapping with Store-local span.
15279+ {span: s(roachpb.KeyMin, keys.LocalStorePrefix)},
15280+ {span: s(keys.LocalStoreMax, roachpb.KeyMax)},
15281+
15282+ // Full spans overlapping with Store-local span.
15283+ {span: s(roachpb.KeyMin, roachpb.Key(keys.LocalStorePrefix).Next()), notOK: true},
15284+ {span: s(keys.LocalStorePrefix, keys.LocalStoreMax), notOK: true},
15285+ {span: s(keys.StoreGossipKey(), keys.StoreIdentKey()), notOK: true},
15286+ {span: s(keys.LocalStoreMax.Prevish(1), roachpb.KeyMax), notOK: true},
15287+
15288+ // Point spans not overlapping with Store-local span.
15289+ {span: s(roachpb.KeyMin, nil)},
15290+ {span: s(roachpb.Key(keys.LocalStorePrefix).Prevish(1), nil)},
15291+ {span: s(keys.LocalStoreMax.Next(), nil)},
15292+ {span: s(roachpb.KeyMax, nil)},
15293+
15294+ // Point spans overlapping with Store-local span.
15295+ {span: s(keys.LocalStorePrefix, nil), notOK: true},
15296+ {span: s(keys.StoreGossipKey(), nil), notOK: true},
15297+ {span: s(keys.LocalStoreMax.Prevish(1), nil), notOK: true},
15298+
15299+ // Tricky spans with nil StartKey not overlapping with Store-local span.
15300+ {span: s(nil, keys.LocalStorePrefix)},
15301+ {span: s(nil, keys.LocalStoreMax.Next())},
15302+
15303+ // Tricky spans with nil StartKey overlapping with Store-local span.
15304+ {span: s(nil, roachpb.Key(keys.LocalStorePrefix).Next()), notOK: true},
15305+ {span: s(nil, keys.StoreGossipKey()), notOK: true},
15306+ {span: s(nil, keys.LocalStoreMax), notOK: true},
15307+ }
15308+
15309+ for _, tc := range testCases {
15310+ t.Run("", func(t *testing.T) {
15311+ err := overlapsStoreLocalKeys(spanset.TrickySpan(tc.span))
15312+ if tc.notOK {
15313+ require.Errorf(t, err, "expected error for span %s", tc.span)
15314+ } else {
15315+ require.NoErrorf(t, err, "expected no error for span %s", tc.span)
15316+ }
15317+ })
15318+ }
15319+ }
0 commit comments