Skip to content

Commit

Permalink
Merge #85704 #86844
Browse files Browse the repository at this point in the history
85704: opt: session setting to enforce queries access only home region rows r=msirek a=msirek

Fixes #86228

This commit adds a new session setting, `enforce_home_region`, which
causes queries to error out if they need to talk to regions other than
the gateway region to answer the query.

A home region specifies the region(s) from which consistent reads from a
set of rows in a table can be served locally. The home region for a set 
of rows in a multiregion table is determined differently depending on 
the type of multiregion table involved:
| Locality | Home Region |
| -------- | ----------- |
| REGIONAL BY ROW | Home region determined by crdb_region column value |
| REGIONAL BY TABLE | All rows share a single home region |
| GLOBAL | Any region can act as the home region |

When `enforce_home_region` is true, and a query has no home region
(for example, reading from different home regions in a REGIONAL BY ROW
table), error code 42899 (`QueryHasNoHomeRegion`) is returned.
When `enforce_home_region` is true, and a query's home region differs
from the gateway region, error code 42898
(`QueryNotRunningInHomeRegion`) is returned.
The error message, in some instances, provides a useful tip on possible
steps to take to allow the query to run entirely in the gateway region,
e.g.,
```
Query is not running in its home region. Try running the query from region 'ap-southeast-2'.

Query has no home region. Query has no home region.                                                                                
                          Try adding a filter on table.crdb_region and/or on key column (table.id)   
                          
Query has no home region. Try accessing only tables in multi-region databases with ZONE survivability.

Query has no home region. The home region 'us-east-1' of table 'messages_rbt'                                                                                          
                          does not match the home region 'ap-southeast-2' of lookup table 'messages_rbr'.     
```
Support for this new session mode is being added in 3 phases.
This commit consists of phase 1, which include only simple static checks
during query compilation for the following allowed cases:
- A scan of a table with `LOCALITY REGIONAL BY TABLE` with primary  
region matching the gateway region
- A scan of a table with `LOCALITY GLOBAL`
- A scan of a table with `LOCALITY REGIONAL BY ROW` using only local
constraints (e.g. crdb_region = 'ca-central-1')
- A scan of a table with `LOCALITY REGIONAL BY ROW` using
locality-optimized search.
- A locality-optimized lookup join with a `LOCALITY REGIONAL BY ROW` table.

Only tables in multiregion databases with ZONE survivability may be
scanned without error because with REGION survivability, ranges in a
down region may be served non-local to the gateway region, so are not
guaranteed to have low latency.

Note that locality-optimized search and locality-optimized join are not
guaranteed to scan no remote rows, but are still allowed. 

Release note (sql change): A new session setting, enforce_home_region,
is added, which when true causes queries which have no home region or
which may scan rows via a database connection outside of the query's 
home region to error out. Also, only tables in multiregion databases                             
with ZONE survivability may be scanned without error when this setting 
is true because with REGION survivability, ranges in a down region may 
be served non-local to the gateway region, so are not guaranteed to have 
low latency.

Release justification: Low risk feature

86844: kvserver: fix replicate queue metrics tracking bug r=AlexTalks a=AlexTalks

In #85844, tracking replicate queue success and error metrics by
allocator action was introduced, however this change inadvertently
included a bug due to missing the `RemoveDead(Non)Voter` allocator
action case, in combination with a panic on unexpected actions. This
change fixes the missing case as well as the panic.

Fixes #86544, fixes #86374, fixes #86107.

Release justification: Bug fix
Release note: None

Co-authored-by: Mark Sirek <sirek@cockroachlabs.com>
Co-authored-by: Alex Sarkesian <sarkesian@cockroachlabs.com>
  • Loading branch information
3 people committed Aug 26, 2022
3 parents 2eb9603 + 1540ea8 + cbbdbcb commit 82e2a30
Show file tree
Hide file tree
Showing 49 changed files with 2,096 additions and 256 deletions.
10 changes: 2 additions & 8 deletions pkg/ccl/logictestccl/testdata/logic_test/as_of
Original file line number Diff line number Diff line change
Expand Up @@ -179,16 +179,10 @@ EXPLAIN (OPT, MEMO) SELECT * FROM t AS OF SYSTEM TIME with_max_staleness('1ms')
----
memo (optimized, ~8KB, required=[presentation: info:6] [distribution: test])
├── G1: (explain G2 [presentation: i:1,j:2,k:3] [distribution: test])
│ ├── [presentation: info:6] [distribution: test]
│ │ ├── best: (explain G2="[presentation: i:1,j:2,k:3] [distribution: test]" [presentation: i:1,j:2,k:3] [distribution: test])
│ │ └── cost: 5.18
│ └── []
│ ├── best: (explain G2="[presentation: i:1,j:2,k:3]" [presentation: i:1,j:2,k:3] [distribution: test])
│ └── [presentation: info:6] [distribution: test]
│ ├── best: (explain G2="[presentation: i:1,j:2,k:3] [distribution: test]" [presentation: i:1,j:2,k:3] [distribution: test])
│ └── cost: 5.18
├── G2: (select G3 G4) (select G5 G6)
│ ├── [presentation: i:1,j:2,k:3]
│ │ ├── best: (select G5 G6)
│ │ └── cost: 5.16
│ ├── [presentation: i:1,j:2,k:3] [distribution: test]
│ │ ├── best: (select G5="[distribution: test]" G6)
│ │ └── cost: 5.16
Expand Down
Loading

0 comments on commit 82e2a30

Please sign in to comment.