diff --git a/pkg/cmd/roachtest/tests/lease_preferences.go b/pkg/cmd/roachtest/tests/lease_preferences.go index 0c4fa710ae67..53d969b24b21 100644 --- a/pkg/cmd/roachtest/tests/lease_preferences.go +++ b/pkg/cmd/roachtest/tests/lease_preferences.go @@ -176,6 +176,7 @@ func runLeasePreferences( // https://github.com/cockroachdb/cockroach/issues/105274 settings := install.MakeClusterSettings() settings.ClusterSettings["server.span_stats.span_batch_limit"] = "4096" + settings.ClusterSettings["kv.enqueue_in_replicate_queue_on_span_config_update.enabled"] = "true" startNodes := func(nodes ...int) { for _, node := range nodes { diff --git a/pkg/kv/kvserver/client_protectedts_test.go b/pkg/kv/kvserver/client_protectedts_test.go index a76965347732..62b5f7cac415 100644 --- a/pkg/kv/kvserver/client_protectedts_test.go +++ b/pkg/kv/kvserver/client_protectedts_test.go @@ -73,6 +73,9 @@ func TestProtectedTimestamps(t *testing.T) { _, err = conn.Exec("SET CLUSTER SETTING kv.closed_timestamp.target_duration = '100ms'") // speeds up the test require.NoError(t, err) + _, err = conn.Exec("SET CLUSTER SETTING kv.enqueue_in_replicate_queue_on_span_config_update.enabled = true") // speeds up the test + require.NoError(t, err) + const tableRangeMaxBytes = 1 << 18 _, err = conn.Exec("ALTER TABLE foo CONFIGURE ZONE USING "+ "gc.ttlseconds = 1, range_max_bytes = $1, range_min_bytes = 1<<10;", tableRangeMaxBytes) diff --git a/pkg/kv/kvserver/replicate_queue.go b/pkg/kv/kvserver/replicate_queue.go index fcf8c441b956..9ca60867e98f 100644 --- a/pkg/kv/kvserver/replicate_queue.go +++ b/pkg/kv/kvserver/replicate_queue.go @@ -80,6 +80,17 @@ var MinLeaseTransferInterval = settings.RegisterDurationSetting( settings.NonNegativeDuration, ) +// EnqueueInReplicateQueueOnSpanConfigUpdateEnabled controls whether replicas +// are enqueued into the replicate queue, following a span config update which +// affects the replica. +var EnqueueInReplicateQueueOnSpanConfigUpdateEnabled = settings.RegisterBoolSetting( + settings.SystemOnly, + "kv.enqueue_in_replicate_queue_on_span_config_update.enabled", + "controls whether replicas are enqueued into the replicate queue for "+ + "processing, when a span config update occurs, which affects the replica", + false, +) + var ( metaReplicateQueueAddReplicaCount = metric.Metadata{ Name: "queue.replicate.addreplica", diff --git a/pkg/kv/kvserver/store.go b/pkg/kv/kvserver/store.go index 7c34e508b78d..31865a36d628 100644 --- a/pkg/kv/kvserver/store.go +++ b/pkg/kv/kvserver/store.go @@ -2381,6 +2381,12 @@ func (s *Store) onSpanConfigUpdate(ctx context.Context, updated roachpb.Span) { now := s.cfg.Clock.NowAsClockTimestamp() + // The replicate queue has a relatively more expensive queue check + // (shouldQueue), because it scales with the number of stores, and + // performs more checks. + enqueueToReplicateQueueEnabled := EnqueueInReplicateQueueOnSpanConfigUpdateEnabled.Get( + &s.GetStoreConfig().Settings.SV) + s.mu.RLock() defer s.mu.RUnlock() if err := s.mu.replicasByKey.VisitKeyRange(ctx, sp.Key, sp.EndKey, AscendingKeyOrder, @@ -2439,9 +2445,12 @@ func (s *Store) onSpanConfigUpdate(ctx context.Context, updated roachpb.Span) { s.mergeQueue.Async(replCtx, "span config update", true /* wait */, func(ctx context.Context, h queueHelper) { h.MaybeAdd(ctx, repl, now) }) - s.replicateQueue.Async(replCtx, "span config update", true /* wait */, func(ctx context.Context, h queueHelper) { - h.MaybeAdd(ctx, repl, now) - }) + + if enqueueToReplicateQueueEnabled { + s.replicateQueue.Async(replCtx, "span config update", true /* wait */, func(ctx context.Context, h queueHelper) { + h.MaybeAdd(ctx, repl, now) + }) + } return nil // more }, ); err != nil {