Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

opt: session setting to enforce queries access only home region rows #85704

Merged
merged 1 commit into from
Aug 26, 2022

Commits on Aug 26, 2022

  1. opt: session setting to enforce queries access only home region rows

    Fixes cockroachdb#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.
    
    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 is not guaranteed to scan no remote
    rows, but is still allowed. Locality-optimized join is disallowed when
    `enforce_home_region` is true.
    
    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
    Mark Sirek committed Aug 26, 2022
    Configuration menu
    Copy the full SHA
    1540ea8 View commit details
    Browse the repository at this point in the history