From bea6fb6b469a384a07bf8bc230e4fb100eec4a77 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 3 Mar 2023 18:46:50 +0000 Subject: [PATCH] server: move settingswatcher initialization to the start Previously, the settingswatcher was one of the last services initialized during sql server start up. Now, it is one of the first services to start up. The settings do not have a well defined value until after settingwatcher initializes. Some settings, like cluster version, must have valid values during initialization. Part of #94843 --- pkg/server/server_sql.go | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/pkg/server/server_sql.go b/pkg/server/server_sql.go index 0fdc9c4efd9e..097fb2e02bca 100644 --- a/pkg/server/server_sql.go +++ b/pkg/server/server_sql.go @@ -520,6 +520,19 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*SQLServer, error) { // SQL pod server. _, isMixedSQLAndKVNode := cfg.nodeIDContainer.OptionalNodeID() + var settingsWatcher *settingswatcher.SettingsWatcher + if codec.ForSystemTenant() { + settingsWatcher = settingswatcher.New( + cfg.clock, codec, cfg.Settings, cfg.rangeFeedFactory, cfg.stopper, cfg.settingsStorage, + ) + } else { + // Create the tenant settings watcher, using the tenant connector as the + // overrides monitor. + settingsWatcher = settingswatcher.NewWithOverrides( + cfg.clock, codec, cfg.Settings, cfg.rangeFeedFactory, cfg.stopper, cfg.tenantConnect, cfg.settingsStorage, + ) + } + sqllivenessKnobs, _ := cfg.TestingKnobs.SQLLivenessKnobs.(*sqlliveness.TestingKnobs) var sessionEventsConsumer slinstance.SessionEventListener if !isMixedSQLAndKVNode { @@ -1297,19 +1310,6 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*SQLServer, error) { vmoduleSetting.SetOnChange(&cfg.Settings.SV, fn) fn(ctx) - var settingsWatcher *settingswatcher.SettingsWatcher - if codec.ForSystemTenant() { - settingsWatcher = settingswatcher.New( - cfg.clock, codec, cfg.Settings, cfg.rangeFeedFactory, cfg.stopper, cfg.settingsStorage, - ) - } else { - // Create the tenant settings watcher, using the tenant connector as the - // overrides monitor. - settingsWatcher = settingswatcher.NewWithOverrides( - cfg.clock, codec, cfg.Settings, cfg.rangeFeedFactory, cfg.stopper, cfg.tenantConnect, cfg.settingsStorage, - ) - } - return &SQLServer{ ambientCtx: cfg.BaseConfig.AmbientCtx, stopper: cfg.stopper, @@ -1365,6 +1365,13 @@ func (s *SQLServer) preStart( } } + // Initialize the settings watcher early in sql server startup. Settings + // values are meaningless before the watcher is initialized and most sub + // systems depend on system settings. + if err := s.settingsWatcher.Start(ctx); err != nil { + return errors.Wrap(err, "initializing settings") + } + // Load the multi-region enum by reading the system database's descriptor. // This also serves as a simple check to see if a tenant exist (i.e. by // checking whether the system db has been bootstrapped). @@ -1499,11 +1506,8 @@ func (s *SQLServer) preStart( bootstrapVersion = roachpb.Version{Major: 20, Minor: 1, Internal: 1} } - if err := s.settingsWatcher.Start(ctx); err != nil { - return errors.Wrap(err, "initializing settings") - } if err := s.systemConfigWatcher.Start(ctx, s.stopper); err != nil { - return errors.Wrap(err, "initializing settings") + return errors.Wrap(err, "initializing system config watcher") } clusterVersionMetrics := clusterversion.MakeMetricsAndRegisterOnVersionChangeCallback(&s.cfg.Settings.SV)