@@ -15197,3 +15197,224 @@ 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+ testCases := []struct {
15208+ name string
15209+ span roachpb.Span
15210+ expectErr bool
15211+ }{
15212+ {
15213+ name: "point start key before unreplicated rangeID local span",
15214+ span: roachpb.Span{Key: keys.MakeRangeIDUnreplicatedPrefix(1).
15215+ Prevish(roachpb.PrevishKeyLength), EndKey: nil},
15216+ expectErr: false,
15217+ },
15218+ {
15219+ name: "point start key within unreplicated rangeID local span",
15220+ span: roachpb.Span{Key: keys.RaftTruncatedStateKey(1), EndKey: nil},
15221+ expectErr: true,
15222+ },
15223+ {
15224+ name: "point start key at unreplicated rangeID local span end",
15225+ span: roachpb.Span{Key: keys.MakeRangeIDUnreplicatedPrefix(1).
15226+ PrefixEnd(), EndKey: nil},
15227+ expectErr: false,
15228+ },
15229+ {
15230+ name: "point end key before unreplicated rangeID local span",
15231+ span: roachpb.Span{Key: nil, EndKey: keys.MakeRangeIDUnreplicatedPrefix(1)},
15232+ expectErr: false,
15233+ },
15234+ {
15235+ name: "point end key within unreplicated rangeID local span",
15236+ span: roachpb.Span{Key: nil, EndKey: keys.RaftTruncatedStateKey(1)},
15237+ expectErr: true,
15238+ },
15239+ {
15240+ name: "point end key at unreplicated rangeID local span end",
15241+ span: roachpb.Span{Key: nil, EndKey: keys.MakeRangeIDUnreplicatedPrefix(1).
15242+ PrefixEnd()},
15243+ expectErr: true,
15244+ },
15245+ {
15246+ name: "point end key after unreplicated rangeID local span",
15247+ span: roachpb.Span{Key: nil, EndKey: keys.MakeRangeIDUnreplicatedPrefix(1).
15248+ PrefixEnd().Next()},
15249+ expectErr: false,
15250+ },
15251+ {
15252+ name: "span fully before unreplicated rangeID local span",
15253+ span: roachpb.Span{Key: roachpb.KeyMin, EndKey: keys.MakeRangeIDUnreplicatedPrefix(0)},
15254+ expectErr: false,
15255+ },
15256+ {
15257+ name: "span fully after unreplicated rangeID local span",
15258+ span: roachpb.Span{Key: keys.LocalRangePrefix, EndKey: roachpb.KeyMax},
15259+ expectErr: false,
15260+ },
15261+ {
15262+ name: "span fully overlaps unreplicated rangeID local span",
15263+ span: roachpb.Span{Key: roachpb.KeyMin, EndKey: roachpb.KeyMax},
15264+ expectErr: true,
15265+ },
15266+ {
15267+ name: "span partially overlaps with start of unreplicated rangeID local span",
15268+ span: roachpb.Span{Key: roachpb.KeyMin, EndKey: keys.RaftTruncatedStateKey(1)},
15269+ expectErr: true,
15270+ },
15271+ {
15272+ name: "span partially overlaps with end of unreplicated rangeID local span",
15273+ span: roachpb.Span{Key: keys.RaftTruncatedStateKey(1), EndKey: roachpb.KeyMax},
15274+ expectErr: true,
15275+ },
15276+ {
15277+ name: "span within with unreplicated rangeID local span",
15278+ span: roachpb.Span{Key: keys.RaftTruncatedStateKey(1),
15279+ EndKey: keys.RangeLastReplicaGCTimestampKey(1)},
15280+ expectErr: true,
15281+ },
15282+ {
15283+ name: "span overlaps with multiple unreplicated range local span",
15284+ span: roachpb.Span{Key: keys.RaftTruncatedStateKey(1),
15285+ EndKey: keys.RaftTruncatedStateKey(3)},
15286+ expectErr: true,
15287+ },
15288+ {
15289+ name: "span from end of unreplicated RangeID, to next replicated RangeID",
15290+ span: roachpb.Span{Key: keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd(),
15291+ EndKey: keys.RangeVersionKey(2)},
15292+ expectErr: false,
15293+ },
15294+ {
15295+ name: "span from end of unreplicated RangeID, to next unreplicated RangeID",
15296+ span: roachpb.Span{Key: keys.MakeRangeIDUnreplicatedPrefix(1).PrefixEnd(),
15297+ EndKey: keys.RangeLastReplicaGCTimestampKey(2)},
15298+ expectErr: true,
15299+ },
15300+ {
15301+ name: "point end key at keys.MakeRangeIDUnreplicatedPrefix(0) with nil start",
15302+ span: roachpb.Span{Key: nil,
15303+ EndKey: keys.MakeRangeIDUnreplicatedPrefix(0)},
15304+ expectErr: false,
15305+ },
15306+ {
15307+ name: "point end key at keys.LocalRangePrefix with nil start",
15308+ span: roachpb.Span{Key: nil,
15309+ EndKey: keys.LocalRangePrefix},
15310+ expectErr: true,
15311+ },
15312+ }
15313+
15314+ for _, tc := range testCases {
15315+ t.Run(tc.name, func(t *testing.T) {
15316+ err := overlapsUnreplicatedRangeIDLocalKeys(tc.span)
15317+ if tc.expectErr {
15318+ require.Errorf(t, err, "expected error for span %s", tc.span)
15319+ } else {
15320+ require.NoErrorf(t, err, "expected no error for span %s", tc.span)
15321+ }
15322+ })
15323+ }
15324+ }
15325+
15326+ // TestOverlapsStoreLocalKeys verifies that the function
15327+ // overlapsStoreLocalKeys() successfully catches any overlap with
15328+ // store local keys.
15329+ func TestOverlapsStoreLocalKeys(t *testing.T) {
15330+ defer leaktest.AfterTest(t)()
15331+ defer log.Scope(t).Close(t)
15332+ testCases := []struct {
15333+ name string
15334+ span roachpb.Span
15335+ expectErr bool
15336+ }{
15337+ {
15338+ name: "point start key before store local span",
15339+ span: roachpb.Span{Key: roachpb.Key(keys.LocalStorePrefix).
15340+ Prevish(roachpb.PrevishKeyLength), EndKey: nil},
15341+ expectErr: false,
15342+ },
15343+ {
15344+ name: "point start key at store local span start",
15345+ span: roachpb.Span{Key: keys.LocalStorePrefix, EndKey: nil},
15346+ expectErr: true,
15347+ },
15348+ {
15349+ name: "point start key within store local span",
15350+ span: roachpb.Span{Key: keys.StoreIdentKey(), EndKey: nil},
15351+ expectErr: true,
15352+ },
15353+ {
15354+ name: "point start key at store local span end",
15355+ span: roachpb.Span{Key: keys.LocalStoreMax, EndKey: nil},
15356+ expectErr: false,
15357+ },
15358+ {
15359+ name: "point end key before store local span",
15360+ span: roachpb.Span{Key: nil, EndKey: keys.LocalStorePrefix},
15361+ expectErr: false,
15362+ },
15363+ {
15364+ name: "point end key at store local span start",
15365+ span: roachpb.Span{Key: nil, EndKey: roachpb.Key(keys.LocalStorePrefix).Next()},
15366+ expectErr: true,
15367+ },
15368+ {
15369+ name: "point end key within store local span",
15370+ span: roachpb.Span{Key: nil, EndKey: keys.StoreIdentKey()},
15371+ expectErr: true,
15372+ },
15373+ {
15374+ name: "point end key at store local span end",
15375+ span: roachpb.Span{Key: nil, EndKey: keys.LocalStoreMax},
15376+ expectErr: true,
15377+ },
15378+ {
15379+ name: "span fully before store local span",
15380+ span: roachpb.Span{Key: roachpb.KeyMin, EndKey: keys.LocalStorePrefix},
15381+ expectErr: false,
15382+ },
15383+ {
15384+ name: "span fully after store local span",
15385+ span: roachpb.Span{Key: keys.LocalStoreMax, EndKey: roachpb.KeyMax},
15386+ expectErr: false,
15387+ },
15388+ {
15389+ name: "span fully overlaps store local span",
15390+ span: roachpb.Span{Key: roachpb.KeyMin, EndKey: roachpb.KeyMax},
15391+ expectErr: true,
15392+ },
15393+ {
15394+ name: "span partially overlaps with start of store local span",
15395+ span: roachpb.Span{Key: roachpb.KeyMin, EndKey: keys.StoreIdentKey()},
15396+ expectErr: true,
15397+ },
15398+ {
15399+ name: "span partially overlaps with end of store local span",
15400+ span: roachpb.Span{Key: keys.StoreIdentKey(), EndKey: roachpb.KeyMax},
15401+ expectErr: true,
15402+ },
15403+ {
15404+ name: "span within store local span",
15405+ span: roachpb.Span{Key: keys.StoreGossipKey(), EndKey: keys.StoreIdentKey()},
15406+ expectErr: true,
15407+ },
15408+ }
15409+
15410+ for _, tc := range testCases {
15411+ t.Run(tc.name, func(t *testing.T) {
15412+ err := overlapsStoreLocalKeys(tc.span)
15413+ if tc.expectErr {
15414+ require.Errorf(t, err, "expected error for span %s", tc.span)
15415+ } else {
15416+ require.NoErrorf(t, err, "expected no error for span %s", tc.span)
15417+ }
15418+ })
15419+ }
15420+ }
0 commit comments