diff --git a/pkg/domain/domain_sysvars.go b/pkg/domain/domain_sysvars.go index 01403ae127448..f1c32116fb978 100644 --- a/pkg/domain/domain_sysvars.go +++ b/pkg/domain/domain_sysvars.go @@ -69,6 +69,15 @@ func (do *Domain) setPDClientDynamicOption(name, sVal string) { break } variable.EnableTSOFollowerProxy.Store(val) + case variable.PDEnableFollowerHandleRegion: + val := variable.TiDBOptOn(sVal) + // Note: EnableFollowerHandle is only used for region API now. + // If pd support more APIs in follower, the pd option may be changed. + err := do.updatePDClient(pd.EnableFollowerHandle, val) + if err != nil { + break + } + variable.EnablePDFollowerHandleRegion.Store(val) } } diff --git a/pkg/executor/set_test.go b/pkg/executor/set_test.go index ebb10507d4197..8da41ee078d90 100644 --- a/pkg/executor/set_test.go +++ b/pkg/executor/set_test.go @@ -652,6 +652,12 @@ func TestSetVar(t *testing.T) { tk.MustExec("set global tidb_enable_tso_follower_proxy = 0") tk.MustQuery("select @@tidb_enable_tso_follower_proxy").Check(testkit.Rows("0")) require.Error(t, tk.ExecToErr("set tidb_enable_tso_follower_proxy = 1")) + tk.MustQuery("select @@pd_enable_follower_handle_region").Check(testkit.Rows("0")) + tk.MustExec("set global pd_enable_follower_handle_region = 1") + tk.MustQuery("select @@pd_enable_follower_handle_region").Check(testkit.Rows("1")) + tk.MustExec("set global pd_enable_follower_handle_region = 0") + tk.MustQuery("select @@pd_enable_follower_handle_region").Check(testkit.Rows("0")) + require.Error(t, tk.ExecToErr("set pd_enable_follower_handle_region = 1")) tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("1")) tk.MustExec("set global tidb_enable_historical_stats = 1") diff --git a/pkg/sessionctx/variable/sysvar.go b/pkg/sessionctx/variable/sysvar.go index c161d840dec59..3cbaa178a7059 100644 --- a/pkg/sessionctx/variable/sysvar.go +++ b/pkg/sessionctx/variable/sysvar.go @@ -706,6 +706,12 @@ var defaultSysVars = []*SysVar{ (*SetPDClientDynamicOption.Load())(TiDBEnableTSOFollowerProxy, val) return nil }}, + {Scope: ScopeGlobal, Name: PDEnableFollowerHandleRegion, Value: BoolToOnOff(DefPDEnableFollowerHandleRegion), Type: TypeBool, GetGlobal: func(_ context.Context, sv *SessionVars) (string, error) { + return BoolToOnOff(EnablePDFollowerHandleRegion.Load()), nil + }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + (*SetPDClientDynamicOption.Load())(PDEnableFollowerHandleRegion, val) + return nil + }}, {Scope: ScopeGlobal, Name: TiDBEnableLocalTxn, Value: BoolToOnOff(DefTiDBEnableLocalTxn), Hidden: true, Type: TypeBool, Depended: true, GetGlobal: func(_ context.Context, sv *SessionVars) (string, error) { return BoolToOnOff(EnableLocalTxn.Load()), nil }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { diff --git a/pkg/sessionctx/variable/tidb_vars.go b/pkg/sessionctx/variable/tidb_vars.go index cbbeb71c73e4d..c85e3d5b06278 100644 --- a/pkg/sessionctx/variable/tidb_vars.go +++ b/pkg/sessionctx/variable/tidb_vars.go @@ -722,6 +722,9 @@ const ( // TiDBEnableTSOFollowerProxy indicates whether to enable the TSO Follower Proxy feature of PD client. TiDBEnableTSOFollowerProxy = "tidb_enable_tso_follower_proxy" + // PDEnableFollowerHandleRegion indicates whether to enable the PD Follower handle region API. + PDEnableFollowerHandleRegion = "pd_enable_follower_handle_region" + // TiDBEnableOrderedResultMode indicates if stabilize query results. TiDBEnableOrderedResultMode = "tidb_enable_ordered_result_mode" @@ -1290,6 +1293,7 @@ const ( DefTiDBEnableLocalTxn = false DefTiDBTSOClientBatchMaxWaitTime = 0.0 // 0ms DefTiDBEnableTSOFollowerProxy = false + DefPDEnableFollowerHandleRegion = false DefTiDBEnableOrderedResultMode = false DefTiDBEnablePseudoForOutdatedStats = false DefTiDBRegardNULLAsPoint = true @@ -1476,6 +1480,7 @@ var ( EnableLocalTxn = atomic.NewBool(DefTiDBEnableLocalTxn) MaxTSOBatchWaitInterval = atomic.NewFloat64(DefTiDBTSOClientBatchMaxWaitTime) EnableTSOFollowerProxy = atomic.NewBool(DefTiDBEnableTSOFollowerProxy) + EnablePDFollowerHandleRegion = atomic.NewBool(DefPDEnableFollowerHandleRegion) RestrictedReadOnly = atomic.NewBool(DefTiDBRestrictedReadOnly) VarTiDBSuperReadOnly = atomic.NewBool(DefTiDBSuperReadOnly) PersistAnalyzeOptions = atomic.NewBool(DefTiDBPersistAnalyzeOptions) diff --git a/tests/integrationtest/r/session/vars.result b/tests/integrationtest/r/session/vars.result index bc440927b61d6..2f354c8baadcc 100644 --- a/tests/integrationtest/r/session/vars.result +++ b/tests/integrationtest/r/session/vars.result @@ -62,6 +62,17 @@ set global tidb_enable_tso_follower_proxy = off; select @@tidb_enable_tso_follower_proxy; @@tidb_enable_tso_follower_proxy 0 +select @@pd_enable_follower_handle_region; +@@pd_enable_follower_handle_region +0 +set global pd_enable_follower_handle_region = on; +select @@pd_enable_follower_handle_region; +@@pd_enable_follower_handle_region +1 +set global pd_enable_follower_handle_region = off; +select @@pd_enable_follower_handle_region; +@@pd_enable_follower_handle_region +0 set tidb_tso_client_batch_max_wait_time = 0; Error 1229 (HY000): Variable 'tidb_tso_client_batch_max_wait_time' is a GLOBAL variable and should be set with SET GLOBAL set global tidb_enable_tso_follower_proxy = default; diff --git a/tests/integrationtest/t/session/vars.test b/tests/integrationtest/t/session/vars.test index 86f4518b00795..0f7d4fc12b760 100644 --- a/tests/integrationtest/t/session/vars.test +++ b/tests/integrationtest/t/session/vars.test @@ -35,6 +35,11 @@ set global tidb_enable_tso_follower_proxy = on; select @@tidb_enable_tso_follower_proxy; set global tidb_enable_tso_follower_proxy = off; select @@tidb_enable_tso_follower_proxy; +select @@pd_enable_follower_handle_region; +set global pd_enable_follower_handle_region = on; +select @@pd_enable_follower_handle_region; +set global pd_enable_follower_handle_region = off; +select @@pd_enable_follower_handle_region; -- error 1229 set tidb_tso_client_batch_max_wait_time = 0; set global tidb_enable_tso_follower_proxy = default;