Skip to content

Commit 8844739

Browse files
committed
kvserver: start meta1 and meta2 as two separate ranges at bootstrap
Previously, we used to start meta1 and meta2 in one range at bootstrap, and rely on load-based splitting to split them if needed. However, in some cases, load-based splitting doesn't work when it decides to split a point in meta1 (meta1 is not allowed to split). This commit changes that by starting meta1 and meta2 as two separate ranges at bootstrap. This way, if meta2 range needs to split more, it can split because it won't collide with meta1. In order to ensure that we get the descriptors correct, I started a cluster (when meta1 and meta2 were on the same range), and manually split them and captured the descriptors: ``` [1] Meta Key: /Meta1/"" Range r1: StartKey: /Min EndKey: /Meta2/"" Replicas: (n1,s1):1 Generation: 1 [2] Meta Key: /Meta1/Max Range r79: StartKey: /Meta2/"" EndKey: /System/NodeLiveness Replicas: (n1,s1):1 Generation: 1 [3] Meta Key: /Meta2/System/NodeLiveness Range r79: StartKey: /Meta2/"" EndKey: /System/NodeLiveness Replicas: (n1,s1):1 Generation: 1 [4] Meta Key: /Meta2/System/NodeLivenessMax Range r2: StartKey: /System/NodeLiveness EndKey: /System/NodeLivenessMax Replicas: (n1,s1):1 Generation: 0 ``` After this commit, the first few ranges are bootstrapped with the following descriptors: ``` [1] Meta Key: /Meta1/"" Range r1: StartKey: /Min EndKey: /Meta2/"" Replicas: (n1,s1):1 Generation: 0 [2] Meta Key: /Meta1/Max Range r2: StartKey: /Meta2/"" EndKey: /System/NodeLiveness Replicas: (n1,s1):1 Generation: 0 [3] Meta Key: /Meta2/System/NodeLiveness Range r2: StartKey: /Meta2/"" EndKey: /System/NodeLiveness Replicas: (n1,s1):1 Generation: 0 [4] Meta Key: /Meta2/System/NodeLivenessMax Range r3: StartKey: /System/NodeLiveness EndKey: /System/NodeLivenessMax Replicas: (n1,s1):1 Generation: 0 ``` Fixes: #119421 Release note: None
1 parent 917f913 commit 8844739

25 files changed

+646
-577
lines changed

pkg/ccl/logictestccl/testdata/logic_test/crdb_internal_tenant

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,12 +251,12 @@ txn_id txn_fingerprint_id query implicit_txn session_id start_time end_tim
251251
query ITTI
252252
SELECT range_id, start_pretty, end_pretty, lease_holder FROM crdb_internal.ranges
253253
----
254-
79 /Tenant/10 /Tenant/11 1
254+
80 /Tenant/10 /Tenant/11 1
255255

256256
query ITT
257257
SELECT range_id, start_pretty, end_pretty FROM crdb_internal.ranges_no_leases
258258
----
259-
79 /Tenant/10 /Tenant/11
259+
80 /Tenant/10 /Tenant/11
260260

261261
query IT
262262
SELECT zone_id, target FROM crdb_internal.zones ORDER BY 1

pkg/ccl/logictestccl/testdata/logic_test/multi_region_remote_access_error

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ skipif config multiregion-9node-3region-3azs-vec-off
471471
query I retry
472472
SELECT DISTINCT range_id FROM [SHOW RANGES FROM TABLE messages_rbr]
473473
----
474-
84
474+
85
475475

476476
# Update does not fail when accessing all rows in messages_rbr because lookup
477477
# join does not error out the lookup table in phase 1.

pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_insert_fast_path

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ query T rowsort
200200
SELECT message FROM [SHOW KV TRACE FOR SESSION]
201201
WHERE message LIKE '%batch%' AND message LIKE '%Scan%'
202202
----
203-
r78: sending batch 4 Scan to (n1,s1):1
203+
r79: sending batch 4 Scan to (n1,s1):1
204204

205205
# Regression test for #115377.
206206
statement ok

pkg/cli/debug_recover_loss_of_quorum_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,11 @@ func TestCollectInfoFromOnlineCluster(t *testing.T) {
153153
require.Equal(t, 2, len(stores), "collected replicas from stores")
154154
require.Equal(t, 2, len(replicas.LocalInfo), "collected info is not split by node")
155155
require.Equal(t, totalRanges*2, totalReplicas, "number of collected replicas")
156-
require.Equal(t, totalRanges, len(replicas.Descriptors),
156+
// The number of range descriptors is counted by iterating over meta2 keys.
157+
// Since meta1 and meta2 ranges are split, the number of range descriptors
158+
// is going to be one less than the number of ranges as meta1 is a range but
159+
// its descriptor isn't stored in meta2.
160+
require.Equal(t, totalRanges-1, len(replicas.Descriptors),
157161
"number of collected descriptors from metadata")
158162
require.Equal(t, clusterversion.Latest.Version(), replicas.Version,
159163
"collected version info from stores")

pkg/config/system.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ func (s *SystemConfig) getZoneEntry(codec keys.SQLCodec, id ObjectID) (zoneEntry
458458
}
459459

460460
var staticSplits = []roachpb.RKey{
461+
roachpb.RKey(keys.Meta2Prefix), // start of meta2 span
461462
roachpb.RKey(keys.NodeLivenessPrefix), // end of meta records / start of node liveness span
462463
roachpb.RKey(keys.NodeLivenessKeyMax), // end of node liveness span
463464
roachpb.RKey(keys.TimeseriesPrefix), // start of timeseries span

pkg/config/system_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -292,19 +292,19 @@ func TestComputeSplitKeySystemRanges(t *testing.T) {
292292
start, end roachpb.RKey
293293
split roachpb.Key
294294
}{
295-
{roachpb.RKeyMin, roachpb.RKeyMax, keys.NodeLivenessPrefix},
296-
{roachpb.RKeyMin, tkey(1), keys.NodeLivenessPrefix},
297-
{roachpb.RKeyMin, roachpb.RKey(keys.TimeseriesPrefix), keys.NodeLivenessPrefix},
298-
{roachpb.RKeyMin, roachpb.RKey(keys.SystemPrefix.Next()), nil},
299-
{roachpb.RKeyMin, roachpb.RKey(keys.SystemPrefix), nil},
300-
{roachpb.RKeyMin, roachpb.RKey(keys.MetaMax), nil},
301-
{roachpb.RKeyMin, roachpb.RKey(keys.Meta2KeyMax), nil},
295+
{roachpb.RKeyMin, roachpb.RKeyMax, keys.Meta2Prefix},
296+
{roachpb.RKeyMin, tkey(1), keys.Meta2Prefix},
297+
{roachpb.RKeyMin, roachpb.RKey(keys.TimeseriesPrefix), keys.Meta2Prefix},
298+
{roachpb.RKeyMin, roachpb.RKey(keys.SystemPrefix.Next()), keys.Meta2Prefix},
299+
{roachpb.RKeyMin, roachpb.RKey(keys.SystemPrefix), keys.Meta2Prefix},
300+
{roachpb.RKeyMin, roachpb.RKey(keys.MetaMax), keys.Meta2Prefix},
301+
{roachpb.RKeyMin, roachpb.RKey(keys.Meta2KeyMax), keys.Meta2Prefix},
302302
{roachpb.RKeyMin, roachpb.RKey(keys.Meta1KeyMax), nil},
303-
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.SystemPrefix), nil},
304-
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.SystemPrefix.Next()), nil},
305-
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.NodeLivenessPrefix), nil},
306-
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.NodeLivenessPrefix.Next()), keys.NodeLivenessPrefix},
307-
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKeyMax, keys.NodeLivenessPrefix},
303+
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.SystemPrefix), keys.Meta2Prefix},
304+
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.SystemPrefix.Next()), keys.Meta2Prefix},
305+
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.NodeLivenessPrefix), keys.Meta2Prefix},
306+
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKey(keys.NodeLivenessPrefix.Next()), keys.Meta2Prefix},
307+
{roachpb.RKey(keys.Meta1KeyMax), roachpb.RKeyMax, keys.Meta2Prefix},
308308
{roachpb.RKey(keys.SystemPrefix), roachpb.RKey(keys.SystemPrefix), nil},
309309
{roachpb.RKey(keys.SystemPrefix), roachpb.RKey(keys.SystemPrefix.Next()), nil},
310310
{roachpb.RKey(keys.SystemPrefix), roachpb.RKeyMax, keys.NodeLivenessPrefix},

pkg/kv/kvprober/kvprober_integration_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,12 @@ func TestPlannerMakesPlansCoveringAllRanges(t *testing.T) {
339339
log.Dev.Infof(ctx, "current rangeID to times would be probed map: %v", rangeIDToTimesWouldBeProbed)
340340

341341
for i := int64(1); i <= numRanges; i++ {
342+
// Range 1 (meta1 range) is not probed by the kvprober planner, as it
343+
// only scans meta2 records, and range 1's descriptor isn't stored in
344+
// meta2.
345+
if i == 1 {
346+
continue
347+
}
342348
// Expect all ranges to eventually be returned by Next n or n+1 times.
343349
// Can't expect all ranges to be returned by Next exactly n times,
344350
// as the order in which the lowest ordinal ranges are returned by

pkg/kv/kvserver/client_split_test.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,15 +1945,19 @@ func runSetupSplitSnapshotRace(
19451945
// are up to date.
19461946
tc.WaitForValues(t, rightKey, []int64{0, 0, 0, 0 /* stopped */, 5, 5})
19471947

1948-
// Scan the meta ranges to resolve all intents
1949-
if _, pErr := kv.SendWrapped(context.Background(), tc.Servers[0].DistSenderI().(kv.Sender),
1950-
&kvpb.ScanRequest{
1948+
// Scan the meta ranges to resolve all intents.
1949+
if err := tc.Server(0).DB().Txn(context.Background(), func(ctx context.Context, txn *kv.Txn) error {
1950+
ba := &kvpb.BatchRequest{}
1951+
ba.Add(&kvpb.ScanRequest{
19511952
RequestHeader: kvpb.RequestHeader{
19521953
Key: keys.MetaMin,
19531954
EndKey: keys.MetaMax,
19541955
},
1955-
}); pErr != nil {
1956-
t.Fatal(pErr)
1956+
})
1957+
_, pErr := txn.Send(ctx, ba)
1958+
return pErr.GoError()
1959+
}); err != nil {
1960+
t.Fatal(err)
19571961
}
19581962

19591963
// Stop the remaining data stores.

pkg/kv/kvserver/loqrecovery/server_integration_test.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,23 @@ func TestReplicaCollection(t *testing.T) {
9191

9292
// Check counters on retrieved replica info.
9393
cnt := getInfoCounters(replicas)
94+
9495
require.Equal(t, liveNodes, cnt.stores, "collected replicas from stores")
9596
require.Equal(t, liveNodes, cnt.nodes, "collected replicas from nodes")
9697
if expectRangeMeta {
97-
require.Equal(t, totalRanges, cnt.descriptors,
98+
// The number of range descriptors is counted by iterating over meta2
99+
// keys. Since meta1 and meta2 ranges are split, the number of range
100+
// descriptors is going to be one less than the number of ranges as meta1
101+
// is a range but its descriptor isn't stored in meta2.
102+
require.Equal(t, totalRanges, cnt.descriptors+1,
98103
"number of collected descriptors from metadata")
99104
}
100105
require.Equal(t, totalRanges*liveNodes, cnt.replicas, "number of collected replicas")
101106
// Check stats counters as well.
102107
require.Equal(t, liveNodes, stats.Nodes, "node counter stats")
103108
require.Equal(t, liveNodes, stats.Stores, "store counter stats")
104109
if expectRangeMeta {
105-
require.Equal(t, totalRanges, stats.Descriptors, "range descriptor counter stats")
110+
require.Equal(t, totalRanges, stats.Descriptors+1, "range descriptor counter stats")
106111
}
107112
require.NotEqual(t, replicas.ClusterID, uuid.UUID{}.String(), "cluster UUID must not be empty")
108113
require.Equal(t, replicas.Version,
@@ -166,14 +171,18 @@ func TestStreamRestart(t *testing.T) {
166171
cnt := getInfoCounters(replicas)
167172
require.Equal(t, liveNodes, cnt.stores, "collected replicas from stores")
168173
require.Equal(t, liveNodes, cnt.nodes, "collected replicas from nodes")
169-
require.Equal(t, totalRanges, cnt.descriptors,
174+
// The number of range descriptors is counted by iterating over meta2
175+
// keys. Since meta1 and meta2 ranges are split, the number of range
176+
// descriptors is going to be one less than the number of ranges as meta1
177+
// is a range but its descriptor isn't stored in meta2.
178+
require.Equal(t, totalRanges, cnt.descriptors+1,
170179
"number of collected descriptors from metadata")
171180
require.Equal(t, totalRanges*liveNodes, cnt.replicas,
172181
"number of collected replicas")
173182
// Check stats counters as well.
174183
require.Equal(t, liveNodes, stats.Nodes, "node counter stats")
175184
require.Equal(t, liveNodes, stats.Stores, "store counter stats")
176-
require.Equal(t, totalRanges, stats.Descriptors, "range descriptor counter stats")
185+
require.Equal(t, totalRanges, stats.Descriptors+1, "range descriptor counter stats")
177186
}
178187

179188
assertReplicas(3)

pkg/kv/kvserver/queue_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ func TestAcceptsUnsplitRanges(t *testing.T) {
721721
},
722722
stopper)
723723

724-
maxWontSplitAddr, err := keys.Addr(keys.SystemPrefix)
724+
maxWontSplitAddr, err := keys.Addr(keys.Meta1KeyMax)
725725
require.NoError(t, err)
726726

727727
minWillSplitAddr, err := keys.Addr(keys.TableDataMin)

0 commit comments

Comments
 (0)