Skip to content

Commit

Permalink
sql: repartition regional by row tables on region add
Browse files Browse the repository at this point in the history
This patch adds functionality to repartition REGIONAL BY ROW tables when
a new region is added to the database. An index can only be partitioned
using an enum value if it is PUBLIC. Thus we only modify partition
descriptors once all transitioning enum members have done so. This
happens in the type schema changer, in a separate txn to the one that
finalized the promotion. Once all indexes of the table have been
repartitioned, the zone configurations are also updated to apply to the
new partitions.

Release note (sql change): ALTER DATABASE ... ADD REGION now
repartitions REGIONAL BY ROW tables and updates the zone configs on
the newly created partitions as well.
  • Loading branch information
arulajmani committed Feb 15, 2021
1 parent ac0f819 commit 18952af
Show file tree
Hide file tree
Showing 4 changed files with 441 additions and 6 deletions.
292 changes: 292 additions & 0 deletions pkg/ccl/logictestccl/testdata/logic_test/alter_table_locality
Original file line number Diff line number Diff line change
Expand Up @@ -1810,3 +1810,295 @@ TABLE rbt_table_gc_ttl ALTER TABLE rbt_table_gc_ttl CONFIGURE ZONE USING
constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]'

statement ok
CREATE DATABASE add_regions WITH PRIMARY REGION "ca-central-1";
USE add_regions

statement ok
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW

statement ok
CREATE TABLE regional_by_row_as (
pk INT PRIMARY KEY,
i INT,
cr crdb_internal_region NOT NULL DEFAULT 'ca-central-1',
INDEX(i),
FAMILY (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS "cr";

query TT
SHOW CREATE TABLE regional_by_row
----
regional_by_row CREATE TABLE public.regional_by_row (
pk INT8 NOT NULL,
i INT8 NULL,
crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (pk ASC),
INDEX regional_by_row_i_idx (i ASC),
FAMILY fam_0_pk_i_crdb_region (pk, i, crdb_region)
) LOCALITY REGIONAL BY ROW;
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]'


query TT
SHOW CREATE TABLE regional_by_row_as
----
regional_by_row_as CREATE TABLE public.regional_by_row_as (
pk INT8 NOT NULL,
i INT8 NULL,
cr public.crdb_internal_region NOT NULL DEFAULT 'ca-central-1':::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (pk ASC),
INDEX regional_by_row_as_i_idx (i ASC),
FAMILY fam_0_cr_pk_i (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS cr;
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]'

statement ok
ALTER DATABASE add_regions ADD REGION "us-east-1"

query TT
SHOW CREATE TABLE regional_by_row
----
regional_by_row CREATE TABLE public.regional_by_row (
pk INT8 NOT NULL,
i INT8 NULL,
crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (crdb_region ASC, pk ASC),
INDEX regional_by_row_i_idx (crdb_region ASC, i ASC),
FAMILY fam_0_pk_i_crdb_region (pk, i, crdb_region)
) LOCALITY REGIONAL BY ROW;
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW CREATE TABLE regional_by_row_as
----
regional_by_row_as CREATE TABLE public.regional_by_row_as (
pk INT8 NOT NULL,
i INT8 NULL,
cr public.crdb_internal_region NOT NULL DEFAULT 'ca-central-1':::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (cr ASC, pk ASC),
INDEX regional_by_row_as_i_idx (cr ASC, i ASC),
FAMILY fam_0_cr_pk_i (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS cr;
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]'

statement ok
ALTER DATABASE add_regions ADD REGION "ap-southeast-2"

query TT
SHOW CREATE TABLE regional_by_row
----
regional_by_row CREATE TABLE public.regional_by_row (
pk INT8 NOT NULL,
i INT8 NULL,
crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (crdb_region ASC, pk ASC),
INDEX regional_by_row_i_idx (crdb_region ASC, i ASC),
FAMILY fam_0_pk_i_crdb_region (pk, i, crdb_region)
) LOCALITY REGIONAL BY ROW;
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW CREATE TABLE regional_by_row_as
----
regional_by_row_as CREATE TABLE public.regional_by_row_as (
pk INT8 NOT NULL,
i INT8 NULL,
cr public.crdb_internal_region NOT NULL DEFAULT 'ca-central-1':::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (cr ASC, pk ASC),
INDEX regional_by_row_as_i_idx (cr ASC, i ASC),
FAMILY fam_0_cr_pk_i (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS cr;
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]', lease_preferences = '[[+region=ca-central-1]]'; ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row_as@primary CONFIGURE ZONE USING num_voters = 3, voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]'

statement ok
CREATE DATABASE add_regions_in_txn WITH PRIMARY REGION "ca-central-1";
USE add_regions_in_txn

statement ok
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW

statement ok
CREATE TABLE regional_by_row_as (
pk INT PRIMARY KEY,
i INT,
cr crdb_internal_region NOT NULL DEFAULT 'ca-central-1',
INDEX(i),
FAMILY (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS "cr";

statement ok
BEGIN;
ALTER DATABASE add_regions_in_txn ADD REGION "us-east-1";
ALTER DATABASE add_regions_in_txn ADD REGION "ap-southeast-2";
COMMIT;


query TT
SHOW CREATE TABLE regional_by_row
----
regional_by_row CREATE TABLE public.regional_by_row (
pk INT8 NOT NULL,
i INT8 NULL,
crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (crdb_region ASC, pk ASC),
INDEX regional_by_row_i_idx (crdb_region ASC, i ASC),
FAMILY fam_0_pk_i_crdb_region (pk, i, crdb_region)
) LOCALITY REGIONAL BY ROW;
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions_in_txn.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions_in_txn.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions_in_txn.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions_in_txn.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions_in_txn.public.regional_by_row@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions_in_txn.public.regional_by_row@regional_by_row_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW CREATE TABLE regional_by_row_as
----
regional_by_row_as CREATE TABLE public.regional_by_row_as (
pk INT8 NOT NULL,
i INT8 NULL,
cr public.crdb_internal_region NOT NULL DEFAULT 'ca-central-1':::public.crdb_internal_region,
CONSTRAINT "primary" PRIMARY KEY (cr ASC, pk ASC),
INDEX regional_by_row_as_i_idx (cr ASC, i ASC),
FAMILY fam_0_cr_pk_i (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS cr;
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions_in_txn.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ap-southeast-2" OF INDEX add_regions_in_txn.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ap-southeast-2]',
lease_preferences = '[[+region=ap-southeast-2]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions_in_txn.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "ca-central-1" OF INDEX add_regions_in_txn.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=ca-central-1]',
lease_preferences = '[[+region=ca-central-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions_in_txn.public.regional_by_row_as@primary CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]';
ALTER PARTITION "us-east-1" OF INDEX add_regions_in_txn.public.regional_by_row_as@regional_by_row_as_i_idx CONFIGURE ZONE USING
num_voters = 3,
voter_constraints = '[+region=us-east-1]',
lease_preferences = '[[+region=us-east-1]]'
1 change: 1 addition & 0 deletions pkg/sql/catalog/descriptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ type TableDescriptor interface {
IsLocalityRegionalByTable() bool
IsLocalityGlobal() bool
GetRegionalByTableRegion() (descpb.RegionName, error)
GetRegionalByRowTableRegionColumnName() (tree.Name, error)
}

// Index is an interface around the index descriptor types.
Expand Down
13 changes: 13 additions & 0 deletions pkg/sql/catalog/tabledesc/structured.go
Original file line number Diff line number Diff line change
Expand Up @@ -4022,6 +4022,19 @@ func (desc *wrapper) GetRegionalByTableRegion() (descpb.RegionName, error) {
return *region, nil
}

// GetRegionalByRowTableRegionColumnName returns the region column name of a
// REGIONAL BY ROW table.
func (desc *wrapper) GetRegionalByRowTableRegionColumnName() (tree.Name, error) {
if !desc.IsLocalityRegionalByRow() {
return "", errors.New("is not REGIONAL BY ROW")
}
colName := desc.LocalityConfig.GetRegionalByRow().As
if colName == nil {
return tree.RegionalByRowRegionDefaultColName, nil
}
return tree.Name(*colName), nil
}

// GetMultiRegionEnumDependency returns true if the given table has an "implicit"
// dependency on the multi-region enum. An implicit dependency exists for
// REGIONAL BY TABLE table's which are homed in an explicit region
Expand Down
Loading

0 comments on commit 18952af

Please sign in to comment.