From f9fa9c626dc16b2b31085a58ab97d3fc953ddd96 Mon Sep 17 00:00:00 2001 From: Oliver Tan Date: Wed, 10 Feb 2021 15:04:53 +1100 Subject: [PATCH] sql: use kv_node_status to determine node liveness for multiregion This was a relic before the decision was made -- node liveness was detected by gossip instead. This changes the code to use SHOW REGIONS FROM CLUSTER, which aggregates from kv_node_status. Release note: None --- pkg/sql/alter_database.go | 2 +- pkg/sql/descriptor.go | 6 +++--- pkg/sql/region_util.go | 24 ++++++++++++++---------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/pkg/sql/alter_database.go b/pkg/sql/alter_database.go index 0f163e37b3dc..31861a80768b 100644 --- a/pkg/sql/alter_database.go +++ b/pkg/sql/alter_database.go @@ -161,7 +161,7 @@ func (n *alterDatabaseAddRegionNode) startExec(params runParams) error { // Add the region to the database descriptor. This function validates that the region // we're adding is an active member of the cluster and isn't already present in the // RegionConfig. - if err := params.p.addRegionToRegionConfig(n.desc, n.n); err != nil { + if err := params.p.addRegionToRegionConfig(params.ctx, n.desc, n.n); err != nil { return err } diff --git a/pkg/sql/descriptor.go b/pkg/sql/descriptor.go index c4e8af9349ce..d3ac262916d5 100644 --- a/pkg/sql/descriptor.go +++ b/pkg/sql/descriptor.go @@ -261,9 +261,9 @@ func validateDatabaseRegionConfig(regionConfig descpb.DatabaseDescriptor_RegionC // addRegionToRegionConfig adds the supplied region to the RegionConfig in the // supplied database descriptor. func (p *planner) addRegionToRegionConfig( - desc *dbdesc.Mutable, regionToAdd *tree.AlterDatabaseAddRegion, + ctx context.Context, desc *dbdesc.Mutable, regionToAdd *tree.AlterDatabaseAddRegion, ) error { - liveRegions, err := p.getLiveClusterRegions() + liveRegions, err := p.getLiveClusterRegions(ctx) if err != nil { return err } @@ -320,7 +320,7 @@ func (p *planner) createRegionConfig( if err != nil { return nil, err } - liveRegions, err := p.getLiveClusterRegions() + liveRegions, err := p.getLiveClusterRegions(ctx) if err != nil { return nil, err } diff --git a/pkg/sql/region_util.go b/pkg/sql/region_util.go index 9a495b88db51..d9253c2a13d8 100644 --- a/pkg/sql/region_util.go +++ b/pkg/sql/region_util.go @@ -52,19 +52,23 @@ func (s *liveClusterRegions) toStrings() []string { // getLiveClusterRegions returns a set of live region names in the cluster. // A region name is deemed active if there is at least one alive node // in the cluster in with locality set to a given region. -func (p *planner) getLiveClusterRegions() (liveClusterRegions, error) { - nodes, err := getAllNodeDescriptors(p) +func (p *planner) getLiveClusterRegions(ctx context.Context) (liveClusterRegions, error) { + rows, err := p.ExtendedEvalContext().ExecCfg.InternalExecutor.QueryEx( + ctx, + "get_live_cluster_regions", + p.txn, + sessiondata.InternalExecutorOverride{ + User: p.SessionData().User(), + }, + "SELECT region FROM [SHOW REGIONS FROM CLUSTER]", + ) if err != nil { return nil, err } - var ret liveClusterRegions = make(map[descpb.RegionName]struct{}) - for _, node := range nodes { - for _, tier := range node.Locality.Tiers { - if tier.Key == "region" { - ret[descpb.RegionName(tier.Value)] = struct{}{} - break - } - } + + var ret liveClusterRegions = make(map[descpb.RegionName]struct{}, len(rows)) + for _, row := range rows { + ret[descpb.RegionName(*row[0].(*tree.DString))] = struct{}{} } return ret, nil }