From e711b72ccdc0f3dfdd75ec3183cdd59eb319eadd Mon Sep 17 00:00:00 2001
From: Radu Berinde
Date: Fri, 19 Feb 2021 15:21:34 -0500
Subject: [PATCH 1/6] sql: add parse_timestamp builtin
Add a new builtin function that can be used to parse timestamp
strings. This is like a cast, but it does not accept relative
timestamps so it can be immutable.
Only immutable expressions are allowed in computed column expressions
or partial index predicates; unlike casts, the new function can be
used in such expressions.
Fixes #60578.
Release notes (sql change): A new parse_timestamp function can be used
to parse absolute timestamp strings in computed column expressions or
partial index predicates.
---
docs/generated/sql/functions.md | 2 +
.../logictest/testdata/logic_test/datetime | 53 +++++++++++++++++++
pkg/sql/sem/builtins/builtins.go | 25 +++++++++
3 files changed, 80 insertions(+)
diff --git a/docs/generated/sql/functions.md b/docs/generated/sql/functions.md
index 529a7dcc8745..64a9a64c0bfb 100644
--- a/docs/generated/sql/functions.md
+++ b/docs/generated/sql/functions.md
@@ -2371,6 +2371,8 @@ to recreate a database.’
quote_ident(val: string) → string | Return val suitably quoted to serve as identifier in a SQL statement.
diff --git a/pkg/sql/logictest/testdata/logic_test/datetime b/pkg/sql/logictest/testdata/logic_test/datetime
index 5764c2e07f68..a5359b7393ac 100644
--- a/pkg/sql/logictest/testdata/logic_test/datetime
+++ b/pkg/sql/logictest/testdata/logic_test/datetime
@@ -1703,3 +1703,56 @@ query TT
SELECT 'infinity'::timestamp, '-infinity'::timestamptz
----
294276-12-31 23:59:59.999999 +0000 +0000 -4713-11-24 00:00:00 +0000 +0000
+
+query T
+SELECT parse_timestamp('2020-01-02 01:02:03')
+----
+2020-01-02 01:02:03 +0000 +0000
+
+query error could not parse
+SELECT parse_timestamp('foo')
+
+query error parse_timestamp\(\): relative timestamps are not supported
+SELECT parse_timestamp('now')
+
+query error parse_timestamp\(\): relative timestamps are not supported
+SELECT parse_timestamp('tomorrow')
+
+# Verify that parse_timestamp can be used in computed column expressions.
+statement ok
+CREATE TABLE timestamps (s STRING, ts TIMESTAMP AS (parse_timestamp(s)) STORED)
+
+query error parse_timestamp\(\): relative timestamps are not supported
+INSERT INTO timestamps VALUES ('tomorrow')
+
+statement ok
+INSERT INTO timestamps VALUES ('2020-01-02 01:02:03'), ('2015-08-25 04:45:45.53453+01:00'), (NULL)
+
+query TT colnames
+SELECT * FROM timestamps ORDER BY s
+----
+s ts
+NULL NULL
+2015-08-25 04:45:45.53453+01:00 2015-08-25 04:45:45.53453 +0000 +0000
+2020-01-02 01:02:03 2020-01-02 01:02:03 +0000 +0000
+
+statement ok
+SET TIME ZONE 'America/New_York'
+
+# Insert the same values again (stored columns are computed on insert).
+statement ok
+INSERT INTO timestamps VALUES ('2020-01-02 01:02:03'), ('2015-08-25 04:45:45.53453+01:00'), (NULL)
+
+query TT colnames
+SELECT * FROM timestamps ORDER BY s
+----
+s ts
+NULL NULL
+NULL NULL
+2015-08-25 04:45:45.53453+01:00 2015-08-25 04:45:45.53453 +0000 +0000
+2015-08-25 04:45:45.53453+01:00 2015-08-25 04:45:45.53453 +0000 +0000
+2020-01-02 01:02:03 2020-01-02 01:02:03 +0000 +0000
+2020-01-02 01:02:03 2020-01-02 01:02:03 +0000 +0000
+
+statement ok
+RESET TIME ZONE
diff --git a/pkg/sql/sem/builtins/builtins.go b/pkg/sql/sem/builtins/builtins.go
index b25ea2527c24..ca74ee73b01e 100644
--- a/pkg/sql/sem/builtins/builtins.go
+++ b/pkg/sql/sem/builtins/builtins.go
@@ -2734,6 +2734,31 @@ may increase either contention or retry errors, or both.`,
},
),
+ // parse_timestamp converts strings to timestamps. It is useful in expressions
+ // where casts (which are not immutable) cannot be used, like computed column
+ // expressions or partial index predicates. Only absolute timestamps that do
+ // not depend on the current context are supported (relative timestamps like
+ // 'now' are not supported).
+ "parse_timestamp": makeBuiltin(defProps(),
+ tree.Overload{
+ Types: tree.ArgTypes{{"string", types.String}},
+ ReturnType: tree.FixedReturnType(types.Timestamp),
+ Fn: func(ctx *tree.EvalContext, args tree.Datums) (tree.Datum, error) {
+ arg := string(tree.MustBeDString(args[0]))
+ ts, dependsOnContext, err := tree.ParseDTimestamp(ctx, arg, time.Microsecond)
+ if err != nil {
+ return nil, err
+ }
+ if dependsOnContext {
+ return nil, pgerror.Newf(pgcode.InvalidParameterValue, "relative timestamps are not supported")
+ }
+ return ts, nil
+ },
+ Info: "Convert a string containing an absolute timestamp to the corresponding timestamp.",
+ Volatility: tree.VolatilityImmutable,
+ },
+ ),
+
// Array functions.
"string_to_array": makeBuiltin(arrayPropsNullableArgs(),
From 96787138a576f1fc05dd51304dce5fa5aa2393b1 Mon Sep 17 00:00:00 2001
From: Rebecca Taft
Date: Fri, 19 Feb 2021 14:28:38 -0700
Subject: [PATCH 2/6] opt: add partition info to the opt catalog
Prior to this commit, the opt catalog did not include zone information
or prefixes specific to each partition of an index. This commit adds this
information since it will be necessary to support locality optimized
search in a future commit.
Informs #55185
Release note: None
---
.../testdata/logic_test/partitioning | 83 ++++++--
.../testdata/logic_test/partitioning_implicit | 67 +++++++
.../testdata/logic_test/regional_by_row | 188 ++++++++++++++++++
pkg/config/zonepb/zone.go | 10 +
pkg/sql/opt/cat/index.go | 100 ++++++----
pkg/sql/opt/cat/utils.go | 19 +-
pkg/sql/opt/cat/zone.go | 30 ++-
pkg/sql/opt/testutils/testcat/create_table.go | 93 ++++++++-
.../opt/testutils/testcat/set_zone_config.go | 39 ++++
pkg/sql/opt/testutils/testcat/test_catalog.go | 105 ++++------
pkg/sql/opt/testutils/testcat/testdata/table | 44 ++--
pkg/sql/opt/testutils/testcat/testdata/zone | 75 +++++++
pkg/sql/opt/xform/select_funcs.go | 5 +-
pkg/sql/opt_catalog.go | 143 +++++++++----
14 files changed, 808 insertions(+), 193 deletions(-)
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/partitioning b/pkg/ccl/logictestccl/testdata/logic_test/partitioning
index 55b6a9eb132b..f00f24460521 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/partitioning
+++ b/pkg/ccl/logictestccl/testdata/logic_test/partitioning
@@ -428,9 +428,13 @@ TABLE ok1
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1)
- └── (2)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (2)
scan ok1
statement ok
@@ -472,9 +476,13 @@ TABLE ok2
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1)
- └── (2)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (2)
scan ok2
statement ok
@@ -516,8 +524,13 @@ TABLE ok3
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- └── (1)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── ()
scan ok3
statement ok
@@ -563,10 +576,19 @@ TABLE ok4
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1, 1)
- ├── (1)
- └── (2, 3)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1, 1)
+ ├── p2
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── p3
+ │ └── partition by list prefixes
+ │ └── (2, 3)
+ └── p4
+ └── partition by list prefixes
+ └── ()
scan ok4
statement ok
@@ -603,9 +625,16 @@ TABLE ok5
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1)
- └── (2)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── p2
+ │ └── partition by list prefixes
+ │ └── (2)
+ └── p3
+ └── partition by list prefixes
+ └── ()
scan ok5
query TT
@@ -897,9 +926,13 @@ TABLE ok11
├── a int not null
├── b int not null
├── c int not null
- └── partition by list prefixes
- ├── (1)
- └── (6)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (6)
scan ok11
statement ok
@@ -943,10 +976,16 @@ TABLE ok12
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (NULL)
- ├── (1)
- └── (2)
+ └── partitions
+ ├── pu
+ │ └── partition by list prefixes
+ │ └── (NULL)
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (2)
scan ok12
# Verify that creating a partition that includes NULL does not change the
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
index c1cdf2d3a50e..e1f6f4951732 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
+++ b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
@@ -149,6 +149,73 @@ CREATE TABLE public.t (
)
-- Warning: Partitioned table with no zone configurations.
+query T
+EXPLAIN (OPT, CATALOG) SELECT * FROM t
+----
+TABLE t
+ ├── pk int not null
+ ├── a int not null
+ ├── b int
+ ├── c int
+ ├── d int
+ ├── j jsonb
+ ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
+ ├── tableoid oid [hidden] [system]
+ ├── j_inverted_key bytes not null [virtual-inverted]
+ ├── FAMILY fam_0_pk_a_b_c_d_j (pk, a, b, c, d, j)
+ ├── PRIMARY INDEX primary
+ │ ├── a int not null (implicit)
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── pk_implicit
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── INDEX t_b_idx
+ │ ├── a int not null (implicit)
+ │ ├── b int
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── b_implicit
+ │ └── partition by list prefixes
+ │ └── (2)
+ ├── UNIQUE INDEX t_c_key
+ │ ├── a int not null (implicit)
+ │ ├── c int
+ │ ├── pk int not null (storing)
+ │ └── partitions
+ │ └── c_implicit
+ │ └── partition by list prefixes
+ │ └── (3)
+ ├── INDEX t_a_b_c_idx
+ │ ├── d int (implicit)
+ │ ├── a int not null
+ │ ├── b int
+ │ ├── c int
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── a_b_c_implicit
+ │ └── partition by list prefixes
+ │ └── (4)
+ ├── INVERTED INDEX t_j_idx
+ │ ├── a int not null (implicit)
+ │ ├── j_inverted_key bytes not null [virtual-inverted]
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── j_implicit
+ │ └── partition by list prefixes
+ │ └── (5)
+ ├── INDEX new_idx
+ │ ├── a int not null (implicit)
+ │ ├── d int
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── d_implicit
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── UNIQUE WITHOUT INDEX (pk)
+ └── UNIQUE WITHOUT INDEX (c)
+scan t
+
statement ok
INSERT INTO t VALUES (1, 2, 3, 4, 5)
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
index 0155bef99665..e26f53629c79 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
+++ b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
@@ -151,6 +151,194 @@ ALTER PARTITION "us-east-1" OF INDEX multi_region_test_db.public.regional_by_row
voter_constraints = '{+region=us-east-1: 2}',
lease_preferences = '[[+region=us-east-1]]'
+query T
+EXPLAIN (OPT, CATALOG) SELECT * FROM regional_by_row_table
+----
+TABLE regional_by_row_table
+ ├── pk int not null
+ ├── pk2 int not null
+ ├── a int not null
+ ├── b int not null
+ ├── j jsonb
+ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden]
+ ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
+ ├── tableoid oid [hidden] [system]
+ ├── j_inverted_key bytes not null [virtual-inverted]
+ ├── FAMILY fam_0_pk_pk2_a_b_j_crdb_region (pk, pk2, a, b, j, crdb_region)
+ ├── CHECK (crdb_region IN (b'\x40':::@100054, b'\x80':::@100054, b'\xc0':::@100054))
+ ├── PRIMARY INDEX primary
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── pk int not null
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── INDEX regional_by_row_table_a_idx
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── a int not null
+ │ ├── pk int not null
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── UNIQUE INDEX regional_by_row_table_b_key
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── b int not null
+ │ ├── pk int not null (storing)
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── INVERTED INDEX regional_by_row_table_j_idx
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── j_inverted_key bytes not null [virtual-inverted]
+ │ ├── pk int not null
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── UNIQUE WITHOUT INDEX (pk)
+ └── UNIQUE WITHOUT INDEX (b)
+scan regional_by_row_table
+ └── check constraint expressions
+ └── crdb_region IN ('ap-southeast-2', 'ca-central-1', 'us-east-1')
+
query TTB colnames
SELECT index_name, column_name, implicit FROM crdb_internal.index_columns
WHERE descriptor_name = 'regional_by_row_table' AND column_type = 'key'
diff --git a/pkg/config/zonepb/zone.go b/pkg/config/zonepb/zone.go
index 98c45fae0ed6..4d8e60533166 100644
--- a/pkg/config/zonepb/zone.go
+++ b/pkg/config/zonepb/zone.go
@@ -784,6 +784,16 @@ func (z *ZoneConfig) ReplicaConstraints(i int) cat.ReplicaConstraints {
return &z.Constraints[i]
}
+// VoterConstraintsCount is part of the cat.Zone interface.
+func (z *ZoneConfig) VoterConstraintsCount() int {
+ return len(z.VoterConstraints)
+}
+
+// VoterConstraint is part of the cat.Zone interface.
+func (z *ZoneConfig) VoterConstraint(i int) cat.ReplicaConstraints {
+ return &z.VoterConstraints[i]
+}
+
// LeasePreferenceCount is part of the cat.Zone interface.
func (z *ZoneConfig) LeasePreferenceCount() int {
return len(z.LeasePreferences)
diff --git a/pkg/sql/opt/cat/index.go b/pkg/sql/opt/cat/index.go
index fce64a26a8cf..0c167c436170 100644
--- a/pkg/sql/opt/cat/index.go
+++ b/pkg/sql/opt/cat/index.go
@@ -155,40 +155,6 @@ type Index interface {
// Span returns the KV span associated with the index.
Span() roachpb.Span
- // PartitionByListPrefixes returns values that correspond to PARTITION BY LIST
- // values. Specifically, it returns a list of tuples where each tuple contains
- // values for a prefix of index columns (indicating a region of the index).
- // Each tuple corresponds to a configured partition or subpartition.
- //
- // Note: this function decodes and allocates datums; use sparingly.
- //
- // Example:
- //
- // CREATE INDEX idx ON t(region,subregion,val) PARTITION BY LIST (region,subregion) (
- // PARTITION westcoast VALUES IN (('us', 'seattle'), ('us', 'cali')),
- // PARTITION us VALUES IN (('us', DEFAULT)),
- // PARTITION eu VALUES IN (('eu', DEFAULT)),
- // PARTITION default VALUES IN (DEFAULT)
- // );
- //
- // PartitionByListPrefixes() returns
- // ('us', 'seattle'),
- // ('us', 'cali'),
- // ('us'),
- // ('eu').
- //
- // The intended use of this function is for index skip scans. Each tuple
- // corresponds to a region of the index that we can constrain further. In the
- // example above: if we have a val=1 filter, instead of a full index scan we
- // can skip most of the data under /us/cali and /us/seattle by scanning spans:
- // [ - /us/cali )
- // [ /us/cali/1 - /us/cali/1 ]
- // [ /us/cali\x00 - /us/seattle )
- // [ /us/seattle/1 - /us/seattle/1 ]
- // [ /us/seattle\x00 - ]
- //
- PartitionByListPrefixes() []tree.Datums
-
// ImplicitPartitioningColumnCount returns the number of implicit partitioning
// columns at the front of the index. For example, consider the following
// table:
@@ -257,6 +223,14 @@ type Index interface {
// Version returns the IndexDescriptorVersion of the index.
Version() descpb.IndexDescriptorVersion
+
+ // PartitionCount returns the number of PARTITION BY LIST partitions defined
+ // on this index.
+ PartitionCount() int
+
+ // Partition returns the ith PARTITION BY LIST partition within the index
+ // definition, where i < PartitionCount.
+ Partition(i int) Partition
}
// IndexColumn describes a single column that is part of an index definition.
@@ -275,3 +249,61 @@ type IndexColumn struct {
func IsMutationIndex(table Table, ord IndexOrdinal) bool {
return ord >= table.IndexCount()
}
+
+// Partition is an interface to a PARTITION BY LIST partition of an index. The
+// intended use is to support planning of scans or lookup joins that will use
+// locality optimized search. Locality optimized search can be planned when the
+// maximum number of rows returned by a scan or lookup join is known, but the
+// specific region in which the rows are located is unknown. In this case, the
+// optimizer will plan a scan or lookup join in which local nodes (i.e., nodes
+// in the gateway region) are searched for matching rows before remote nodes, in
+// the hope that the execution engine can avoid visiting remote nodes.
+type Partition interface {
+ // Name is the name of this partition.
+ Name() string
+
+ // Zone returns the zone which constrains placement of this partition's
+ // replicas. If this partition does not have an associated zone, the returned
+ // zone is empty, but non-nil.
+ Zone() Zone
+
+ // PartitionByListPrefixes returns the values of this partition. Specifically,
+ // it returns a list of tuples where each tuple contains values for a prefix
+ // of index columns (indicating the region of the index covered by this
+ // partition).
+ //
+ // Example:
+ //
+ // CREATE INDEX idx ON t(region,subregion,val) PARTITION BY LIST (region,subregion) (
+ // PARTITION westcoast VALUES IN (('us', 'seattle'), ('us', 'cali')),
+ // PARTITION us VALUES IN (('us', DEFAULT)),
+ // PARTITION eu VALUES IN (('eu', DEFAULT)),
+ // PARTITION default VALUES IN (DEFAULT)
+ // );
+ //
+ // If this is the westcoast partition, PartitionByListPrefixes() returns
+ // ('us', 'seattle'),
+ // ('us', 'cali')
+ //
+ // If this is the us partition, PartitionByListPrefixes() cuts off the DEFAULT
+ // value and just returns
+ // ('us')
+ //
+ // Finally, if this is the default partition, PartitionByListPrefixes()
+ // returns an empty slice.
+ //
+ // In addition to supporting locality optimized search as described above,
+ // this function can be used to support index skip scans. To support index
+ // skip scans, we collect the PartitionByListPrefixes for all partitions in
+ // the index. Each tuple corresponds to a region of the index that we can
+ // constrain further. In the example above: if we have a val=1 filter, instead
+ // of a full index scan we can skip most of the data under /us/cali and
+ // /us/seattle by scanning spans:
+ // [ - /us/cali )
+ // [ /us/cali/1 - /us/cali/1 ]
+ // [ /us/cali\x00 - /us/seattle )
+ // [ /us/seattle/1 - /us/seattle/1 ]
+ // [ /us/seattle\x00 - ]
+ //
+ PartitionByListPrefixes() []tree.Datums
+}
diff --git a/pkg/sql/opt/cat/utils.go b/pkg/sql/opt/cat/utils.go
index de8daed70b0a..bdef6921a8d0 100644
--- a/pkg/sql/opt/cat/utils.go
+++ b/pkg/sql/opt/cat/utils.go
@@ -218,16 +218,25 @@ func formatCatalogIndex(tab Table, ord int, tp treeprinter.Node) {
fmt.Fprintf(&buf, " (storing)")
}
+ if i < idx.ImplicitPartitioningColumnCount() {
+ fmt.Fprintf(&buf, " (implicit)")
+ }
+
child.Child(buf.String())
}
FormatZone(idx.Zone(), child)
- partPrefixes := idx.PartitionByListPrefixes()
- if len(partPrefixes) != 0 {
- c := child.Child("partition by list prefixes")
- for i := range partPrefixes {
- c.Child(partPrefixes[i].String())
+ if n := idx.PartitionCount(); n > 0 {
+ c := child.Child("partitions")
+ for i := 0; i < n; i++ {
+ p := idx.Partition(i)
+ part := c.Child(p.Name())
+ prefixes := part.Child("partition by list prefixes")
+ for _, datums := range p.PartitionByListPrefixes() {
+ prefixes.Child(datums.String())
+ }
+ FormatZone(p.Zone(), part)
}
}
if n := idx.InterleaveAncestorCount(); n > 0 {
diff --git a/pkg/sql/opt/cat/zone.go b/pkg/sql/opt/cat/zone.go
index 06d4f3e2a829..95fcfab40924 100644
--- a/pkg/sql/opt/cat/zone.go
+++ b/pkg/sql/opt/cat/zone.go
@@ -24,14 +24,22 @@ type Zone interface {
// ReplicaConstraintsCount returns the number of replica constraint sets that
// are part of this zone.
//
- // TODO(aayush): Go through the callers of the methods here and decide the
- // right semantics for handling the new `voter_constraints` attribute.
+ // TODO(aayush/rytaft): Go through the callers of the methods here and decide
+ // the right semantics for handling the new `voter_constraints` attribute.
ReplicaConstraintsCount() int
// ReplicaConstraints returns the ith set of replica constraints in the zone,
// where i < ReplicaConstraintsCount.
ReplicaConstraints(i int) ReplicaConstraints
+ // VoterConstraintsCount returns the number of voter replica constraint sets
+ // that are part of this zone.
+ VoterConstraintsCount() int
+
+ // VoterConstraint returns the ith set of voter replica constraints in the
+ // zone, where i < VoterConstraintsCount.
+ VoterConstraint(i int) ReplicaConstraints
+
// LeasePreferenceCount returns the number of lease preferences that are part
// of this zone.
LeasePreferenceCount() int
@@ -90,7 +98,8 @@ type Constraint interface {
// FormatZone nicely formats a catalog zone using a treeprinter for debugging
// and testing.
func FormatZone(zone Zone, tp treeprinter.Node) {
- if zone.ReplicaConstraintsCount() == 0 && zone.LeasePreferenceCount() == 0 {
+ if zone.ReplicaConstraintsCount() == 0 && zone.VoterConstraintsCount() == 0 &&
+ zone.LeasePreferenceCount() == 0 {
return
}
zoneChild := tp.Childf("ZONE")
@@ -110,6 +119,21 @@ func FormatZone(zone Zone, tp treeprinter.Node) {
}
}
+ voterChild := zoneChild
+ if zone.VoterConstraintsCount() > 1 {
+ voterChild = voterChild.Childf("voter replica constraints")
+ }
+ for i, n := 0, zone.VoterConstraintsCount(); i < n; i++ {
+ voterConstraint := zone.VoterConstraint(i)
+ constraintStr := formatConstraintSet(voterConstraint)
+ if zone.VoterConstraintsCount() > 1 {
+ numReplicas := voterConstraint.ReplicaCount()
+ replicaChild.Childf("%d voter replicas: %s", numReplicas, constraintStr)
+ } else {
+ replicaChild.Childf("voter constraints: %s", constraintStr)
+ }
+ }
+
leaseChild := zoneChild
if zone.LeasePreferenceCount() > 1 {
leaseChild = leaseChild.Childf("lease preferences")
diff --git a/pkg/sql/opt/testutils/testcat/create_table.go b/pkg/sql/opt/testutils/testcat/create_table.go
index 1953df5b2e21..9d0c07c39af1 100644
--- a/pkg/sql/opt/testutils/testcat/create_table.go
+++ b/pkg/sql/opt/testutils/testcat/create_table.go
@@ -12,6 +12,7 @@ package testcat
import (
"bytes"
+ "context"
"fmt"
"reflect"
"sort"
@@ -19,6 +20,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/config/zonepb"
"github.com/cockroachdb/cockroach/pkg/geo/geoindex"
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/colinfo"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb"
"github.com/cockroachdb/cockroach/pkg/sql/opt/cat"
@@ -153,6 +155,11 @@ func (tc *Catalog) CreateTable(stmt *tree.CreateTable) *Table {
)
tab.Columns = append(tab.Columns, mvcc)
+ // Cache the partitioning statement for the primary index.
+ if stmt.PartitionByTable != nil {
+ tab.partitionBy = stmt.PartitionByTable.PartitionBy
+ }
+
// Add the primary index.
if hasPrimaryIndex {
for _, def := range stmt.Defs {
@@ -172,9 +179,6 @@ func (tc *Catalog) CreateTable(stmt *tree.CreateTable) *Table {
} else {
tab.addPrimaryColumnIndex("rowid")
}
- if stmt.PartitionByTable != nil {
- tab.Indexes[0].partitionBy = stmt.PartitionByTable.PartitionBy
- }
// Add check constraints.
for _, def := range stmt.Defs {
@@ -603,10 +607,6 @@ func (tt *Table) addIndexWithVersion(
version: version,
}
- if def.PartitionByIndex != nil {
- idx.partitionBy = def.PartitionByIndex.PartitionBy
- }
-
// Look for name suffixes indicating this is a mutation index.
if name, ok := extractWriteOnlyIndex(def); ok {
idx.IdxName = name
@@ -663,6 +663,44 @@ func (tt *Table) addIndexWithVersion(
}
}
+ // Add partitions.
+ var partitionBy *tree.PartitionBy
+ if def.PartitionByIndex != nil {
+ partitionBy = def.PartitionByIndex.PartitionBy
+ } else if typ == primaryIndex {
+ partitionBy = tt.partitionBy
+ }
+ if partitionBy != nil {
+ ctx := context.Background()
+ semaCtx := tree.MakeSemaContext()
+ evalCtx := tree.MakeTestingEvalContext(cluster.MakeTestingClusterSettings())
+
+ if len(partitionBy.List) > 0 {
+ idx.partitions = make([]Partition, len(partitionBy.List))
+ for i := range partitionBy.Fields {
+ if i >= len(idx.Columns) || partitionBy.Fields[i] != idx.Columns[i].ColName() {
+ panic("partition by columns must be a prefix of the index columns")
+ }
+ }
+ for i := range partitionBy.List {
+ p := &partitionBy.List[i]
+ idx.partitions[i] = Partition{
+ name: string(p.Name),
+ zone: &zonepb.ZoneConfig{},
+ datums: make([]tree.Datums, 0, len(p.Exprs)),
+ }
+
+ // Get the partition values.
+ for _, e := range p.Exprs {
+ d := idx.partitionByListExprToDatums(ctx, &evalCtx, &semaCtx, e)
+ if d != nil {
+ idx.partitions[i].datums = append(idx.partitions[i].datums, d)
+ }
+ }
+ }
+ }
+ }
+
if typ == primaryIndex {
var pkOrdinals util.FastIntSet
for _, c := range idx.Columns {
@@ -946,6 +984,47 @@ func (tt *Table) addPrimaryColumnIndex(colName string) {
tt.addIndex(&def, primaryIndex)
}
+// partitionByListExprToDatums converts an expression from a PARTITION BY LIST
+// clause to a list of datums.
+func (ti *Index) partitionByListExprToDatums(
+ ctx context.Context, evalCtx *tree.EvalContext, semaCtx *tree.SemaContext, e tree.Expr,
+) tree.Datums {
+ var vals []tree.Expr
+ switch t := e.(type) {
+ case *tree.Tuple:
+ vals = t.Exprs
+ default:
+ vals = []tree.Expr{e}
+ }
+
+ // Cut off at DEFAULT, if present.
+ for i := range vals {
+ if _, ok := vals[i].(tree.DefaultVal); ok {
+ vals = vals[:i]
+ }
+ }
+ if len(vals) == 0 {
+ return nil
+ }
+ d := make(tree.Datums, len(vals))
+ for i := range vals {
+ c := tree.CastExpr{Expr: vals[i], Type: ti.Columns[i].DatumType()}
+ cTyped, err := c.TypeCheck(ctx, semaCtx, types.Any)
+ if err != nil {
+ panic(err)
+ }
+ d[i], err = cTyped.Eval(evalCtx)
+ if err != nil {
+ panic(err)
+ }
+ }
+
+ // TODO(radu): split into multiple prefixes if Subpartition is also by list.
+ // Note that this functionality should be kept in sync with the real catalog
+ // implementation (opt_catalog.go).
+ return d
+}
+
func extractInaccessibleColumn(def *tree.ColumnTableDef) (name tree.Name, ok bool) {
if !strings.HasSuffix(string(def.Name), ":inaccessible") {
return "", false
diff --git a/pkg/sql/opt/testutils/testcat/set_zone_config.go b/pkg/sql/opt/testutils/testcat/set_zone_config.go
index 986e59cbb859..adccbf28cb34 100644
--- a/pkg/sql/opt/testutils/testcat/set_zone_config.go
+++ b/pkg/sql/opt/testutils/testcat/set_zone_config.go
@@ -26,6 +26,37 @@ func (tc *Catalog) SetZoneConfig(stmt *tree.SetZoneConfig) *zonepb.ZoneConfig {
tc.qualifyTableName(&tabName)
tab := tc.Table(&tabName)
+ // Handle the case of a zone config targeting a partition.
+ if stmt.TargetsPartition() {
+ partitionName := string(stmt.Partition)
+ var index *Index
+ if stmt.TableOrIndex.Index == "" {
+ // This partition is in the primary index.
+ index = tab.Indexes[0]
+ } else {
+ // This partition is in a secondary index.
+ for _, idx := range tab.Indexes {
+ if idx.IdxName == string(stmt.TableOrIndex.Index) {
+ index = idx
+ break
+ }
+ }
+ }
+ if index == nil {
+ panic(fmt.Errorf("\"%q\" is not an index", stmt.TableOrIndex.Index))
+ }
+
+ for i := range index.partitions {
+ if index.partitions[i].name == partitionName {
+ index.partitions[i].zone = makeZoneConfig(stmt.Options)
+ return index.partitions[i].zone
+ }
+ }
+ panic(fmt.Errorf("\"%q\" is not a partition", stmt.Partition))
+ }
+
+ // The zone config must target an entire index.
+
// Handle special case of primary index.
if stmt.TableOrIndex.Index == "" {
tab.Indexes[0].IdxZone = makeZoneConfig(stmt.Options)
@@ -55,6 +86,14 @@ func makeZoneConfig(options tree.KVOptions) *zonepb.ZoneConfig {
}
zone.Constraints = constraintsList.Constraints
+ case "voter_constraints":
+ constraintsList := &zonepb.ConstraintsList{}
+ value := options[i].Value.(*tree.StrVal).RawString()
+ if err := yaml.UnmarshalStrict([]byte(value), constraintsList); err != nil {
+ panic(err)
+ }
+ zone.VoterConstraints = constraintsList.Constraints
+
case "lease_preferences":
value := options[i].Value.(*tree.StrVal).RawString()
if err := yaml.UnmarshalStrict([]byte(value), &zone.LeasePreferences); err != nil {
diff --git a/pkg/sql/opt/testutils/testcat/test_catalog.go b/pkg/sql/opt/testutils/testcat/test_catalog.go
index 84d53fb65e3a..1ae7acd7f8a5 100644
--- a/pkg/sql/opt/testutils/testcat/test_catalog.go
+++ b/pkg/sql/opt/testutils/testcat/test_catalog.go
@@ -597,6 +597,10 @@ type Table struct {
inboundFKs []ForeignKeyConstraint
uniqueConstraints []UniqueConstraint
+
+ // partitionBy is the partitioning clause that corresponds to the primary
+ // index. Used to initialize the partitioning for the primary index.
+ partitionBy *tree.PartitionBy
}
var _ cat.Table = &Table{}
@@ -781,9 +785,9 @@ type Index struct {
// table is a back reference to the table this index is on.
table *Table
- // partitionBy is the partitioning clause that corresponds to this index. Used
- // to implement PartitionByListPrefixes.
- partitionBy *tree.PartitionBy
+ // partitions stores zone information and datums for PARTITION BY LIST
+ // partitions.
+ partitions []Partition
// predicate is the partial index predicate expression, if it exists.
predicate string
@@ -883,67 +887,6 @@ func (ti *Index) Predicate() (string, bool) {
return ti.predicate, ti.predicate != ""
}
-// PartitionByListPrefixes is part of the cat.Index interface.
-func (ti *Index) PartitionByListPrefixes() []tree.Datums {
- ctx := context.Background()
- p := ti.partitionBy
- if p == nil {
- return nil
- }
- if len(p.List) == 0 {
- return nil
- }
- var res []tree.Datums
- semaCtx := tree.MakeSemaContext()
- evalCtx := tree.MakeTestingEvalContext(cluster.MakeTestingClusterSettings())
- for i := range p.Fields {
- if i >= len(ti.Columns) || p.Fields[i] != ti.Columns[i].ColName() {
- panic("partition by columns must be a prefix of the index columns")
- }
- }
- for i := range p.List {
- // Exprs contains a list of values.
- for _, e := range p.List[i].Exprs {
- var vals []tree.Expr
- switch t := e.(type) {
- case *tree.Tuple:
- vals = t.Exprs
- default:
- vals = []tree.Expr{e}
- }
-
- // Cut off at DEFAULT, if present.
- for i := range vals {
- if _, ok := vals[i].(tree.DefaultVal); ok {
- vals = vals[:i]
- }
- }
- if len(vals) == 0 {
- continue
- }
- d := make(tree.Datums, len(vals))
- for i := range vals {
- c := tree.CastExpr{Expr: vals[i], Type: ti.Columns[i].DatumType()}
- cTyped, err := c.TypeCheck(ctx, &semaCtx, types.Any)
- if err != nil {
- panic(err)
- }
- d[i], err = cTyped.Eval(&evalCtx)
- if err != nil {
- panic(err)
- }
- }
-
- // TODO(radu): split into multiple prefixes if Subpartition is also by list.
- // Note that this functionality should be kept in sync with the real catalog
- // implementation (opt_catalog.go).
-
- res = append(res, d)
- }
- }
- return res
-}
-
// ImplicitPartitioningColumnCount is part of the cat.Index interface.
func (ti *Index) ImplicitPartitioningColumnCount() int {
return 0
@@ -979,6 +922,40 @@ func (ti *Index) Version() descpb.IndexDescriptorVersion {
return ti.version
}
+// PartitionCount is part of the cat.Index interface.
+func (ti *Index) PartitionCount() int {
+ return len(ti.partitions)
+}
+
+// Partition is part of the cat.Index interface.
+func (ti *Index) Partition(i int) cat.Partition {
+ return &ti.partitions[i]
+}
+
+// Partition implements the cat.Partition interface for testing purposes.
+type Partition struct {
+ name string
+ zone *zonepb.ZoneConfig
+ datums []tree.Datums
+}
+
+var _ cat.Partition = &Partition{}
+
+// Name is part of the cat.Partition interface.
+func (p *Partition) Name() string {
+ return p.name
+}
+
+// Zone is part of the cat.Partition interface.
+func (p *Partition) Zone() cat.Zone {
+ return p.zone
+}
+
+// PartitionByListPrefixes is part of the cat.Partition interface.
+func (p *Partition) PartitionByListPrefixes() []tree.Datums {
+ return p.datums
+}
+
// TableStat implements the cat.TableStatistic interface for testing purposes.
type TableStat struct {
js stats.JSONStatistic
diff --git a/pkg/sql/opt/testutils/testcat/testdata/table b/pkg/sql/opt/testutils/testcat/testdata/table
index 58a93711d6ad..c5e4c609789b 100644
--- a/pkg/sql/opt/testutils/testcat/testdata/table
+++ b/pkg/sql/opt/testutils/testcat/testdata/table
@@ -110,11 +110,17 @@ TABLE part1
├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
└── PRIMARY INDEX primary
├── a int not null
- └── partition by list prefixes
- ├── (1)
- ├── (3)
- ├── (4)
- └── (5)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── p2
+ │ └── partition by list prefixes
+ │ ├── (3)
+ │ ├── (4)
+ │ └── (5)
+ └── p3
+ └── partition by list prefixes
exec-ddl
CREATE TABLE part2 (
@@ -145,19 +151,29 @@ TABLE part2
│ ├── a string not null
│ ├── b string not null
│ ├── c int not null
- │ └── partition by list prefixes
- │ ├── ('foo', 'bar')
- │ ├── ('foo', 'baz')
- │ ├── ('qux', 'qux')
- │ └── ('waldo')
+ │ └── partitions
+ │ ├── p1
+ │ │ └── partition by list prefixes
+ │ │ ├── ('foo', 'bar')
+ │ │ ├── ('foo', 'baz')
+ │ │ └── ('qux', 'qux')
+ │ ├── p2
+ │ │ └── partition by list prefixes
+ │ │ └── ('waldo')
+ │ └── p3
+ │ └── partition by list prefixes
└── INDEX secondary
├── c int not null
├── a string not null
├── b string not null
- └── partition by list prefixes
- ├── (1)
- ├── (3)
- └── (4)
+ └── partitions
+ ├── pi1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── pi2
+ └── partition by list prefixes
+ ├── (3)
+ └── (4)
exec-ddl
CREATE TABLE inv (
diff --git a/pkg/sql/opt/testutils/testcat/testdata/zone b/pkg/sql/opt/testutils/testcat/testdata/zone
index 4015e32d9ef5..3315e06176aa 100644
--- a/pkg/sql/opt/testutils/testcat/testdata/zone
+++ b/pkg/sql/opt/testutils/testcat/testdata/zone
@@ -175,3 +175,78 @@ TABLE abc
├── a int not null (storing)
└── ZONE
└── constraints: [+dc=west]
+
+exec-ddl
+CREATE TABLE abc_part (
+ r STRING NOT NULL CHECK (r IN ('east', 'west')),
+ a INT PRIMARY KEY,
+ b INT,
+ c STRING,
+ UNIQUE WITHOUT INDEX (b, c),
+ UNIQUE INDEX bc_idx (r, b, c) PARTITION BY LIST (r) (
+ PARTITION east VALUES IN (('east')),
+ PARTITION west VALUES IN (('west'))
+ ),
+ INDEX b_idx (r, b) PARTITION BY LIST (r) (
+ PARTITION east VALUES IN (('east')),
+ PARTITION west VALUES IN (('west'))
+ )
+)
+----
+
+exec-ddl
+ALTER PARTITION "east" OF INDEX abc_part@bc_idx CONFIGURE ZONE USING
+ num_voters = 5,
+ voter_constraints = '{+region=east: 2}',
+ lease_preferences = '[[+region=east]]'
+----
+
+exec-ddl
+ALTER PARTITION "west" OF INDEX abc_part@bc_idx CONFIGURE ZONE USING
+ num_voters = 5,
+ voter_constraints = '{+region=west: 2}',
+ lease_preferences = '[[+region=west]]';
+----
+
+exec-ddl
+SHOW CREATE abc_part
+----
+TABLE abc_part
+ ├── r string not null
+ ├── a int not null
+ ├── b int
+ ├── c string
+ ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
+ ├── CHECK (r IN ('east', 'west'))
+ ├── PRIMARY INDEX primary
+ │ └── a int not null
+ ├── UNIQUE INDEX bc_idx
+ │ ├── r string not null
+ │ ├── b int
+ │ ├── c string
+ │ ├── a int not null (storing)
+ │ └── partitions
+ │ ├── east
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('east')
+ │ │ └── ZONE
+ │ │ ├── voter constraints: [+region=east]
+ │ │ └── lease preference: [+region=east]
+ │ └── west
+ │ ├── partition by list prefixes
+ │ │ └── ('west')
+ │ └── ZONE
+ │ ├── voter constraints: [+region=west]
+ │ └── lease preference: [+region=west]
+ ├── INDEX b_idx
+ │ ├── r string not null
+ │ ├── b int
+ │ ├── a int not null
+ │ └── partitions
+ │ ├── east
+ │ │ └── partition by list prefixes
+ │ │ └── ('east')
+ │ └── west
+ │ └── partition by list prefixes
+ │ └── ('west')
+ └── UNIQUE WITHOUT INDEX (b, c)
diff --git a/pkg/sql/opt/xform/select_funcs.go b/pkg/sql/opt/xform/select_funcs.go
index 93904be665b9..3619932aec84 100644
--- a/pkg/sql/opt/xform/select_funcs.go
+++ b/pkg/sql/opt/xform/select_funcs.go
@@ -636,7 +636,10 @@ func (c *CustomFuncs) partitionValuesFilters(
) (partitionFilter, inBetweenFilter memo.FiltersExpr) {
// Find all the partition values
- partitionValues := index.PartitionByListPrefixes()
+ partitionValues := make([]tree.Datums, 0, index.PartitionCount())
+ for i, n := 0, index.PartitionCount(); i < n; i++ {
+ partitionValues = append(partitionValues, index.Partition(i).PartitionByListPrefixes()...)
+ }
if len(partitionValues) == 0 {
return partitionFilter, inBetweenFilter
}
diff --git a/pkg/sql/opt_catalog.go b/pkg/sql/opt_catalog.go
index 9c10354fbfb2..ce2848793681 100644
--- a/pkg/sql/opt_catalog.go
+++ b/pkg/sql/opt_catalog.go
@@ -738,16 +738,25 @@ func newOptTable(
idxDesc = secondaryIndexes[i-1].IndexDesc()
}
- // If there is a subzone that applies to the entire index, use that,
- // else use the table zone. Skip subzones that apply to partitions,
- // since they apply only to a subset of the index.
+ // If there is a subzone that applies to the entire index, use that, else
+ // use the table zone. Save subzones that apply to partitions, since we will
+ // use those later when initializing partitions in the index.
idxZone := tblZone
+ partZones := make(map[string]*zonepb.ZoneConfig)
for j := range tblZone.Subzones {
subzone := &tblZone.Subzones[j]
- if subzone.IndexID == uint32(idxDesc.ID) && subzone.PartitionName == "" {
- copyZone := subzone.Config
- copyZone.InheritFromParent(tblZone)
- idxZone = ©Zone
+ if subzone.IndexID == uint32(idxDesc.ID) {
+ if subzone.PartitionName == "" {
+ // Subzone applies to the whole index.
+ copyZone := subzone.Config
+ copyZone.InheritFromParent(tblZone)
+ idxZone = ©Zone
+ } else {
+ // Subzone applies to a partition.
+ copyZone := subzone.Config
+ copyZone.InheritFromParent(tblZone)
+ partZones[subzone.PartitionName] = ©Zone
+ }
}
}
if idxDesc.Type == descpb.IndexDescriptor_INVERTED {
@@ -770,9 +779,9 @@ func newOptTable(
false, /* nullable */
invertedSourceColOrdinal,
)
- ot.indexes[i].init(ot, i, idxDesc, idxZone, virtualColOrd)
+ ot.indexes[i].init(ot, i, idxDesc, idxZone, partZones, virtualColOrd)
} else {
- ot.indexes[i].init(ot, i, idxDesc, idxZone, -1 /* virtualColOrd */)
+ ot.indexes[i].init(ot, i, idxDesc, idxZone, partZones, -1 /* virtualColOrd */)
}
// Add unique constraints for implicitly partitioned unique indexes.
@@ -1108,6 +1117,10 @@ type optIndex struct {
numKeyCols int
numLaxKeyCols int
+ // partitions stores zone information and datums for PARTITION BY LIST
+ // partitions.
+ partitions []optPartition
+
// invertedVirtualColOrd is used if this is an inverted index; it stores the
// ordinal of the virtual column created to refer to the key of this index.
// It is -1 if this is not an inverted index.
@@ -1123,6 +1136,7 @@ func (oi *optIndex) init(
indexOrdinal int,
desc *descpb.IndexDescriptor,
zone *zonepb.ZoneConfig,
+ partZones map[string]*zonepb.ZoneConfig,
invertedVirtualColOrd int,
) {
oi.tab = tab
@@ -1152,6 +1166,38 @@ func (oi *optIndex) init(
oi.numCols = len(desc.ColumnIDs) + len(desc.ExtraColumnIDs) + len(desc.StoreColumnIDs)
}
+ // Collect information about the partitions.
+ oi.partitions = make([]optPartition, len(desc.Partitioning.List))
+ for i := range desc.Partitioning.List {
+ p := &desc.Partitioning.List[i]
+ oi.partitions[i] = optPartition{
+ name: p.Name,
+ zone: &zonepb.ZoneConfig{},
+ datums: make([]tree.Datums, 0, len(p.Values)),
+ }
+
+ // Get the zone.
+ if zone, ok := partZones[p.Name]; ok {
+ oi.partitions[i].zone = zone
+ }
+
+ // Get the partition values.
+ var a rowenc.DatumAlloc
+ for _, valueEncBuf := range p.Values {
+ t, _, err := rowenc.DecodePartitionTuple(
+ &a, oi.tab.codec, oi.tab.desc, oi.desc, &oi.desc.Partitioning,
+ valueEncBuf, nil, /* prefixDatums */
+ )
+ if err != nil {
+ panic(errors.NewAssertionErrorWithWrappedErrf(err, "while decoding partition tuple"))
+ }
+ oi.partitions[i].datums = append(oi.partitions[i].datums, t.Datums)
+ // TODO(radu): split into multiple prefixes if Subpartition is also by list.
+ // Note that this functionality should be kept in sync with the test catalog
+ // implementation (test_catalog.go).
+ }
+ }
+
if desc.Unique {
notNull := true
for _, id := range desc.ColumnIDs {
@@ -1296,35 +1342,6 @@ func (oi *optIndex) Ordinal() int {
return oi.indexOrdinal
}
-// PartitionByListPrefixes is part of the cat.Index interface.
-func (oi *optIndex) PartitionByListPrefixes() []tree.Datums {
- list := oi.desc.Partitioning.List
- if len(list) == 0 {
- return nil
- }
- res := make([]tree.Datums, 0, len(list))
- var a rowenc.DatumAlloc
- for i := range list {
- for _, valueEncBuf := range list[i].Values {
- t, _, err := rowenc.DecodePartitionTuple(
- &a, oi.tab.codec, oi.tab.desc, oi.desc, &oi.desc.Partitioning,
- valueEncBuf, nil, /* prefixDatums */
- )
- if err != nil {
- panic(errors.NewAssertionErrorWithWrappedErrf(err, "while decoding partition tuple"))
- }
- // Ignore the DEFAULT case, where there is nothing to return.
- if len(t.Datums) > 0 {
- res = append(res, t.Datums)
- }
- // TODO(radu): split into multiple prefixes if Subpartition is also by list.
- // Note that this functionality should be kept in sync with the test catalog
- // implementation (test_catalog.go).
- }
- }
- return res
-}
-
// ImplicitPartitioningColumnCount is part of the cat.Index interface.
func (oi *optIndex) ImplicitPartitioningColumnCount() int {
return int(oi.desc.Partitioning.NumImplicitColumns)
@@ -1362,6 +1379,41 @@ func (oi *optIndex) Version() descpb.IndexDescriptorVersion {
return oi.desc.Version
}
+// PartitionCount is part of the cat.Index interface.
+func (oi *optIndex) PartitionCount() int {
+ return len(oi.partitions)
+}
+
+// Partition is part of the cat.Index interface.
+func (oi *optIndex) Partition(i int) cat.Partition {
+ return &oi.partitions[i]
+}
+
+// optPartition implements cat.Partition and represents a PARTITION BY LIST
+// partition of an index.
+type optPartition struct {
+ name string
+ zone *zonepb.ZoneConfig
+ datums []tree.Datums
+}
+
+var _ cat.Partition = &optPartition{}
+
+// Name is part of the cat.Partition interface.
+func (op *optPartition) Name() string {
+ return op.name
+}
+
+// Zone is part of the cat.Partition interface.
+func (op *optPartition) Zone() cat.Zone {
+ return op.zone
+}
+
+// PartitionByListPrefixes is part of the cat.Partition interface.
+func (op *optPartition) PartitionByListPrefixes() []tree.Datums {
+ return op.datums
+}
+
type optTableStat struct {
stat *stats.TableStatistic
columnOrdinals []int
@@ -2042,11 +2094,6 @@ func (oi *optVirtualIndex) Ordinal() int {
return oi.indexOrdinal
}
-// PartitionByListPrefixes is part of the cat.Index interface.
-func (oi *optVirtualIndex) PartitionByListPrefixes() []tree.Datums {
- return nil
-}
-
// ImplicitPartitioningColumnCount is part of the cat.Index interface.
func (oi *optVirtualIndex) ImplicitPartitioningColumnCount() int {
return 0
@@ -2082,6 +2129,16 @@ func (oi *optVirtualIndex) Version() descpb.IndexDescriptorVersion {
return 0
}
+// PartitionCount is part of the cat.Index interface.
+func (oi *optVirtualIndex) PartitionCount() int {
+ return 0
+}
+
+// Partition is part of the cat.Index interface.
+func (oi *optVirtualIndex) Partition(i int) cat.Partition {
+ return nil
+}
+
// optVirtualFamily is a dummy implementation of cat.Family for the only family
// reported by a virtual table.
type optVirtualFamily struct {
From ce35e3a850a823aa6266b0e9bda474692a818301 Mon Sep 17 00:00:00 2001
From: Andy Yang
Date: Fri, 19 Feb 2021 00:20:50 -0500
Subject: [PATCH 3/6] geo: replace GEOS with new WKT parser for EWKT parsing
Previously, the `parseEWKT` function used GEOS to parse WKT strings.
This was inadequate because GEOS has issues with parsing Z and M
dimensions. To address this, a new WKT parser was implemented with
goyacc and this patch integrates it into CockroachDB.
Release note: None
---
pkg/geo/BUILD.bazel | 2 +-
pkg/geo/geogfn/covers_test.go | 2 +-
pkg/geo/geomfn/remove_repeated_points_test.go | 2 +-
pkg/geo/geos/geos.go | 13 ----------
pkg/geo/parse.go | 13 +++++++---
pkg/geo/parse_test.go | 13 ++++++----
pkg/geo/wkt/lex.go | 20 ++++++++++++--
pkg/geo/wkt/wkt_test.go | 26 +++++++++++++++++++
.../logictest/testdata/logic_test/geospatial | 6 ++---
pkg/testutils/lint/lint_test.go | 2 +-
10 files changed, 68 insertions(+), 31 deletions(-)
diff --git a/pkg/geo/BUILD.bazel b/pkg/geo/BUILD.bazel
index 8e55194ac302..dad724e36f22 100644
--- a/pkg/geo/BUILD.bazel
+++ b/pkg/geo/BUILD.bazel
@@ -20,7 +20,7 @@ go_library(
"//pkg/geo/geographiclib",
"//pkg/geo/geopb",
"//pkg/geo/geoprojbase",
- "//pkg/geo/geos",
+ "//pkg/geo/wkt",
"//pkg/util",
"//pkg/util/errorutil/unimplemented",
"//pkg/util/protoutil",
diff --git a/pkg/geo/geogfn/covers_test.go b/pkg/geo/geogfn/covers_test.go
index 220b20804535..f7d90e06bb4b 100644
--- a/pkg/geo/geogfn/covers_test.go
+++ b/pkg/geo/geogfn/covers_test.go
@@ -351,7 +351,7 @@ func TestCovers(t *testing.T) {
{
"multiple MULTIPOLYGONs required to cover MULTIPOINTS",
"MULTIPOLYGON(((0.0 0.0, 1.0 0.0, 1.0 1.0, 0.0 1.0, 0.0 0.0)), ((1.0 0.0, 2.0 0.0, 2.0 1.0, 1.0 1.0, 1.0 0.0)))",
- "MULTIPOINT((0.5 0.5), (1.5 0.5))'",
+ "MULTIPOINT((0.5 0.5), (1.5 0.5))",
true,
},
{
diff --git a/pkg/geo/geomfn/remove_repeated_points_test.go b/pkg/geo/geomfn/remove_repeated_points_test.go
index e5e970d5adf6..ef3a5fe5643b 100644
--- a/pkg/geo/geomfn/remove_repeated_points_test.go
+++ b/pkg/geo/geomfn/remove_repeated_points_test.go
@@ -44,7 +44,7 @@ func TestRemoveRepeatedPoints(t *testing.T) {
"MULTILINESTRING ((1 2, 3 4, 1 2), EMPTY, (1 2, 3 4))",
},
{
- "MULTILINESTRING ((1 2, 1 2, 3 4), (1 2, 3 4, 3 4), (1 2, 1 2, 1 2, 1 2)))",
+ "MULTILINESTRING ((1 2, 1 2, 3 4), (1 2, 3 4, 3 4), (1 2, 1 2, 1 2, 1 2))",
"MULTILINESTRING ((1 2, 3 4), (1 2, 3 4), (1 2, 1 2))",
},
{"POLYGON EMPTY", "POLYGON EMPTY"},
diff --git a/pkg/geo/geos/geos.go b/pkg/geo/geos/geos.go
index fd433e4665c8..aa55190d969c 100644
--- a/pkg/geo/geos/geos.go
+++ b/pkg/geo/geos/geos.go
@@ -266,19 +266,6 @@ func statusToError(s C.CR_GEOS_Status) error {
return &Error{msg: string(cStringToSafeGoBytes(s))}
}
-// WKTToEWKB parses a WKT into WKB using the GEOS library.
-func WKTToEWKB(wkt geopb.WKT, srid geopb.SRID) (geopb.EWKB, error) {
- g, err := ensureInitInternal()
- if err != nil {
- return nil, err
- }
- var cEWKB C.CR_GEOS_String
- if err := statusToError(C.CR_GEOS_WKTToEWKB(g, goToCSlice([]byte(wkt)), C.int(srid), &cEWKB)); err != nil {
- return nil, err
- }
- return cStringToSafeGoBytes(cEWKB), nil
-}
-
// BufferParamsJoinStyle maps to the GEOSBufJoinStyles enum in geos_c.h.in.
type BufferParamsJoinStyle int
diff --git a/pkg/geo/parse.go b/pkg/geo/parse.go
index 7493ad1aadba..6b0677357c4c 100644
--- a/pkg/geo/parse.go
+++ b/pkg/geo/parse.go
@@ -16,7 +16,7 @@ import (
"strings"
"github.com/cockroachdb/cockroach/pkg/geo/geopb"
- "github.com/cockroachdb/cockroach/pkg/geo/geos"
+ "github.com/cockroachdb/cockroach/pkg/geo/wkt"
"github.com/cockroachdb/cockroach/pkg/util"
"github.com/cockroachdb/errors"
"github.com/pierrre/geohash"
@@ -168,9 +168,14 @@ func parseEWKT(
}
}
- ewkb, err := geos.WKTToEWKB(geopb.WKT(str), srid)
- if err != nil {
- return geopb.SpatialObject{}, err
+ geom, wktUnmarshalErr := wkt.Unmarshal(string(str))
+ if wktUnmarshalErr != nil {
+ return geopb.SpatialObject{}, wktUnmarshalErr
+ }
+ AdjustGeomTSRID(geom, srid)
+ ewkb, ewkbMarshalErr := ewkb.Marshal(geom, DefaultEWKBEncodingFormat)
+ if ewkbMarshalErr != nil {
+ return geopb.SpatialObject{}, ewkbMarshalErr
}
return parseEWKBRaw(soType, ewkb)
}
diff --git a/pkg/geo/parse_test.go b/pkg/geo/parse_test.go
index fb840a947ab8..8ce0c8b74e61 100644
--- a/pkg/geo/parse_test.go
+++ b/pkg/geo/parse_test.go
@@ -246,9 +246,8 @@ func TestParseEWKT(t *testing.T) {
expectedErr string
}{
{"POINT Z (1 2 3)", "unimplemented: dimension XYZ is not currently supported"},
- // GEOS assumes all M coordinates as Z coordinates, so the error message is not great here.
- {"POINT M (1 2 3)", "unimplemented: dimension XYZ is not currently supported"},
- {"POINT ZM (1 2 3 4)", "unimplemented: dimension XYZ is not currently supported"},
+ {"POINT M (1 2 3)", "unimplemented: dimension XYM is not currently supported"},
+ {"POINT ZM (1 2 3 4)", "unimplemented: dimension XYZM is not currently supported"},
}
for _, tc := range errorTestCases {
t.Run(string(tc.wkt), func(t *testing.T) {
@@ -372,7 +371,9 @@ func TestParseGeometry(t *testing.T) {
{
"invalid",
Geometry{},
- "geos error: ParseException: Unknown type: 'INVALID'",
+ `lex error: invalid keyword at pos 0
+invalid
+^`,
},
{
"",
@@ -586,7 +587,9 @@ func TestParseGeography(t *testing.T) {
{
"invalid",
Geography{},
- "geos error: ParseException: Unknown type: 'INVALID'",
+ `lex error: invalid keyword at pos 0
+invalid
+^`,
},
{
"",
diff --git a/pkg/geo/wkt/lex.go b/pkg/geo/wkt/lex.go
index 30448e36c52a..b5563f304003 100644
--- a/pkg/geo/wkt/lex.go
+++ b/pkg/geo/wkt/lex.go
@@ -24,6 +24,7 @@ const eof = 0
// LexError is an error that occurs during lexing.
type LexError struct {
+ // TODO(ayang): refactor these two errors into one error type
expectedTokType string
pos int
str string
@@ -216,7 +217,7 @@ func (l *wktLex) Lex(yylval *wktSymType) int {
default:
if unicode.IsLetter(c) {
return l.keyword()
- } else if isNumRune(c) {
+ } else if isValidFirstNumRune(c) {
return l.num(yylval)
} else {
l.next()
@@ -511,10 +512,25 @@ func (l *wktLex) setError(err error) {
}
}
+// isValidFirstNumRune returns whether a rune is valid as the first rune in a number (coordinate).
+func isValidFirstNumRune(r rune) bool {
+ switch r {
+ // PostGIS doesn't seem to accept numbers with a leading '+'.
+ case '+':
+ return false
+ // Scientific notation number must have a number before the e.
+ // Checking this case explicitly helps disambiguate between a number and a keyword.
+ case 'e', 'E':
+ return false
+ default:
+ return isNumRune(r)
+ }
+}
+
// isNumRune returns whether a rune could potentially be a part of a number (coordinate).
func isNumRune(r rune) bool {
switch r {
- case '-', '.':
+ case '-', '.', 'e', 'E', '+':
return true
default:
return unicode.IsDigit(r)
diff --git a/pkg/geo/wkt/wkt_test.go b/pkg/geo/wkt/wkt_test.go
index d686210b9805..d40fd50c2064 100644
--- a/pkg/geo/wkt/wkt_test.go
+++ b/pkg/geo/wkt/wkt_test.go
@@ -29,6 +29,11 @@ func TestUnmarshal(t *testing.T) {
equivInputs: []string{"POINT(0 1)", "POINT (0 1)", "point(0 1)", "point ( 0 1 )"},
expected: geom.NewPointFlat(geom.XY, []float64{0, 1}),
},
+ {
+ desc: "parse 2D point with scientific notation",
+ equivInputs: []string{"POINT(1e-2 2e3)", "POINT(0.1e-1 2e3)", "POINT(0.01e-0 2e+3)", "POINT(0.01 2000)"},
+ expected: geom.NewPointFlat(geom.XY, []float64{1e-2, 2e3}),
+ },
{
desc: "parse 2D+M point",
equivInputs: []string{"POINT M (-2 0 0.5)", "POINTM(-2 0 0.5)", "POINTM(-2 0 .5)"},
@@ -620,6 +625,27 @@ DOT(0 0)
expectedErrStr: `lex error: invalid number at pos 8
POINT(2 2.3.7)
^`,
+ },
+ {
+ desc: "invalid scientific notation number missing number before the e",
+ input: "POINT(e-1 2)",
+ expectedErrStr: `lex error: invalid keyword at pos 6
+POINT(e-1 2)
+ ^`,
+ },
+ {
+ desc: "invalid scientific notation number with non-integer power",
+ input: "POINT(5e-1.5 2)",
+ expectedErrStr: `lex error: invalid number at pos 6
+POINT(5e-1.5 2)
+ ^`,
+ },
+ {
+ desc: "invalid number with a + at the start (PostGIS does not allow this)",
+ input: "POINT(+1 2)",
+ expectedErrStr: `lex error: invalid character at pos 6
+POINT(+1 2)
+ ^`,
},
{
desc: "invalid keyword when extraneous spaces are present in ZM",
diff --git a/pkg/sql/logictest/testdata/logic_test/geospatial b/pkg/sql/logictest/testdata/logic_test/geospatial
index 63671c1eacdd..6b917c57f7db 100644
--- a/pkg/sql/logictest/testdata/logic_test/geospatial
+++ b/pkg/sql/logictest/testdata/logic_test/geospatial
@@ -4998,10 +4998,10 @@ false false 97 false false
# Test for 2+ string arguments for Geometry where one side of the arguments
# raises an error.
-statement error Unknown type: 'ABC'
+statement error pq: st_intersects\(\): lex error: invalid keyword at pos 0\nabc\n\^
SELECT ST_Intersects('abc'::string, 'POINT(1 0)'::string)
-statement error Unknown type: 'ABC'
+statement error pq: st_intersects\(\): lex error: invalid keyword at pos 0\nabc\n\^
SELECT ST_Intersects('POINT(1 0)'::string, 'abc'::string)
query T
@@ -5258,7 +5258,7 @@ SELECT
ST_AsText(ST_LineMerge(g::geometry))
FROM ( VALUES
('MULTILINESTRING ((1 2, 3 4), (3 4, 5 6))'),
- ('MULTILINESTRING ((1 2, 3 4), (5 6, 7 8)))'),
+ ('MULTILINESTRING ((1 2, 3 4), (5 6, 7 8))'),
('POINT (1 2)')
)
t(g)
diff --git a/pkg/testutils/lint/lint_test.go b/pkg/testutils/lint/lint_test.go
index cb345f554f3a..c6d21826dd80 100644
--- a/pkg/testutils/lint/lint_test.go
+++ b/pkg/testutils/lint/lint_test.go
@@ -1020,7 +1020,7 @@ func TestLint(t *testing.T) {
if err := stream.ForEach(stream.Sequence(
filter,
- stream.GrepNot(`(json|jsonpb|yaml|xml|protoutil|toml|Codec|ewkb|wkb)\.Unmarshal\(`),
+ stream.GrepNot(`(json|jsonpb|yaml|xml|protoutil|toml|Codec|ewkb|wkb|wkt)\.Unmarshal\(`),
), func(s string) {
t.Errorf("\n%s <- forbidden; use 'protoutil.Unmarshal' instead", s)
}); err != nil {
From 0668efbf891e36e77e14d24cf5837fac0c51a5f1 Mon Sep 17 00:00:00 2001
From: Andrei Matei
Date: Thu, 28 Jan 2021 19:56:19 -0500
Subject: [PATCH 4/6] kvserver: introduce a Raft-based transport for closedts
This patch introduces a replacement for the existing closed timestamp
mechanism / transport. The new mechanism is gated by a cluster version.
Raft commands now carry increasing closed timestamps generated by the
propBuf by using the recent request Tracker for synchronizing with
in-flight requests (i.e. not closing timestamps below them).
Raft commands get a closed ts field, and the range state gets the field
as well.
The propBuf pays attention to the range's closed timestamp policy for
deciding whether to close lagging or leading timestamps.
Fixes #57395, #57396
Touches #57405
Release note: None
---
pkg/clusterversion/cockroach_versions.go | 7 +
pkg/clusterversion/key_string.go | 5 +-
pkg/kv/kvserver/BUILD.bazel | 2 +
pkg/kv/kvserver/below_raft_protos_test.go | 7 +-
pkg/kv/kvserver/client_replica_test.go | 2 +-
.../kvserver/closedts/tracker/heap_tracker.go | 7 +
.../closedts/tracker/lockfree_tracker.go | 9 +
pkg/kv/kvserver/closedts/tracker/tracker.go | 5 +
pkg/kv/kvserver/kvserverpb/proposer_kv.go | 20 +-
pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go | 427 ++++++++++++-----
pkg/kv/kvserver/kvserverpb/proposer_kv.proto | 23 +
pkg/kv/kvserver/kvserverpb/state.pb.go | 230 +++++----
pkg/kv/kvserver/kvserverpb/state.proto | 8 +
pkg/kv/kvserver/replica.go | 4 +
pkg/kv/kvserver/replica_application_result.go | 12 +-
.../replica_application_state_machine.go | 49 +-
pkg/kv/kvserver/replica_follower_read.go | 6 +
pkg/kv/kvserver/replica_init.go | 4 +-
pkg/kv/kvserver/replica_proposal.go | 29 +-
pkg/kv/kvserver/replica_proposal_buf.go | 331 ++++++++++++-
pkg/kv/kvserver/replica_proposal_buf_test.go | 447 ++++++++++++++++--
pkg/kv/kvserver/replica_raft.go | 32 +-
pkg/kv/kvserver/replica_rangefeed_test.go | 1 +
pkg/kv/kvserver/replica_test.go | 53 ++-
pkg/kv/kvserver/replica_write.go | 21 +-
pkg/kv/kvserver/stateloader/stateloader.go | 32 +-
pkg/kv/kvserver/store_split.go | 13 +-
pkg/kv/kvserver/testing_knobs.go | 3 +
pkg/roachpb/batch.go | 2 +-
pkg/storage/enginepb/mvcc3.go | 5 +
pkg/storage/enginepb/mvcc3.pb.go | 314 +++++++-----
pkg/storage/enginepb/mvcc3.proto | 13 +
pkg/util/hlc/timestamp.go | 13 +
33 files changed, 1718 insertions(+), 418 deletions(-)
diff --git a/pkg/clusterversion/cockroach_versions.go b/pkg/clusterversion/cockroach_versions.go
index 0a769a31522d..acd7ccd8fd86 100644
--- a/pkg/clusterversion/cockroach_versions.go
+++ b/pkg/clusterversion/cockroach_versions.go
@@ -252,6 +252,9 @@ const (
// database, such as adding REGIONS to a DATABASE or setting the LOCALITY
// on a TABLE.
MultiRegionFeatures
+ // ClosedTimestampsRaftTransport enables the Raft transport for closed
+ // timestamps and disables the previous per-node transport.
+ ClosedTimestampsRaftTransport
// Step (1): Add new versions here.
)
@@ -426,6 +429,10 @@ var versionsSingleton = keyedVersions([]keyedVersion{
Key: MultiRegionFeatures,
Version: roachpb.Version{Major: 20, Minor: 2, Internal: 34},
},
+ {
+ Key: ClosedTimestampsRaftTransport,
+ Version: roachpb.Version{Major: 20, Minor: 2, Internal: 36},
+ },
// Step (2): Add new versions here.
})
diff --git a/pkg/clusterversion/key_string.go b/pkg/clusterversion/key_string.go
index 1ff13fc74478..ad864ce4c6ca 100644
--- a/pkg/clusterversion/key_string.go
+++ b/pkg/clusterversion/key_string.go
@@ -45,11 +45,12 @@ func _() {
_ = x[SequencesRegclass-34]
_ = x[ImplicitColumnPartitioning-35]
_ = x[MultiRegionFeatures-36]
+ _ = x[ClosedTimestampsRaftTransport-37]
}
-const _Key_name = "NamespaceTableWithSchemasStart20_2GeospatialTypeEnumsRangefeedLeasesAlterColumnTypeGeneralAlterSystemJobsAddCreatedByColumnsAddScheduledJobsTableUserDefinedSchemasNoOriginFKIndexesNodeMembershipStatusMinPasswordLengthAbortSpanBytesAlterSystemJobsAddSqllivenessColumnsAddNewSystemSqllivenessTableMaterializedViewsBox2DTypeUpdateScheduledJobsSchemaCreateLoginPrivilegeHBAForNonTLSV20_2Start21_1EmptyArraysInInvertedIndexesUniqueWithoutIndexConstraintsVirtualComputedColumnsCPutInlineReplicaVersionsreplacedTruncatedAndRangeAppliedStateMigrationreplacedPostTruncatedAndRangeAppliedStateMigrationNewSchemaChangerLongRunningMigrationsTruncatedAndRangeAppliedStateMigrationPostTruncatedAndRangeAppliedStateMigrationSeparatedIntentsTracingVerbosityIndependentSemanticsSequencesRegclassImplicitColumnPartitioningMultiRegionFeatures"
+const _Key_name = "NamespaceTableWithSchemasStart20_2GeospatialTypeEnumsRangefeedLeasesAlterColumnTypeGeneralAlterSystemJobsAddCreatedByColumnsAddScheduledJobsTableUserDefinedSchemasNoOriginFKIndexesNodeMembershipStatusMinPasswordLengthAbortSpanBytesAlterSystemJobsAddSqllivenessColumnsAddNewSystemSqllivenessTableMaterializedViewsBox2DTypeUpdateScheduledJobsSchemaCreateLoginPrivilegeHBAForNonTLSV20_2Start21_1EmptyArraysInInvertedIndexesUniqueWithoutIndexConstraintsVirtualComputedColumnsCPutInlineReplicaVersionsreplacedTruncatedAndRangeAppliedStateMigrationreplacedPostTruncatedAndRangeAppliedStateMigrationNewSchemaChangerLongRunningMigrationsTruncatedAndRangeAppliedStateMigrationPostTruncatedAndRangeAppliedStateMigrationSeparatedIntentsTracingVerbosityIndependentSemanticsSequencesRegclassImplicitColumnPartitioningMultiRegionFeaturesClosedTimestampsRaftTransport"
-var _Key_index = [...]uint16{0, 25, 34, 48, 53, 68, 90, 124, 145, 163, 180, 200, 217, 231, 295, 312, 321, 346, 366, 378, 383, 392, 420, 449, 471, 481, 496, 542, 592, 608, 629, 667, 709, 725, 761, 778, 804, 823}
+var _Key_index = [...]uint16{0, 25, 34, 48, 53, 68, 90, 124, 145, 163, 180, 200, 217, 231, 295, 312, 321, 346, 366, 378, 383, 392, 420, 449, 471, 481, 496, 542, 592, 608, 629, 667, 709, 725, 761, 778, 804, 823, 852}
func (i Key) String() string {
if i < 0 || i >= Key(len(_Key_index)-1) {
diff --git a/pkg/kv/kvserver/BUILD.bazel b/pkg/kv/kvserver/BUILD.bazel
index 402d71680912..ca306e3d1fc1 100644
--- a/pkg/kv/kvserver/BUILD.bazel
+++ b/pkg/kv/kvserver/BUILD.bazel
@@ -117,6 +117,7 @@ go_library(
"//pkg/kv/kvserver/closedts/container",
"//pkg/kv/kvserver/closedts/ctpb",
"//pkg/kv/kvserver/closedts/storage",
+ "//pkg/kv/kvserver/closedts/tracker",
"//pkg/kv/kvserver/concurrency",
"//pkg/kv/kvserver/constraint",
"//pkg/kv/kvserver/gc",
@@ -299,6 +300,7 @@ go_test(
"//pkg/kv/kvserver/batcheval/result",
"//pkg/kv/kvserver/closedts",
"//pkg/kv/kvserver/closedts/ctpb",
+ "//pkg/kv/kvserver/closedts/tracker",
"//pkg/kv/kvserver/concurrency",
"//pkg/kv/kvserver/concurrency/lock",
"//pkg/kv/kvserver/constraint",
diff --git a/pkg/kv/kvserver/below_raft_protos_test.go b/pkg/kv/kvserver/below_raft_protos_test.go
index a3e04b28ea0e..00652ba4853e 100644
--- a/pkg/kv/kvserver/below_raft_protos_test.go
+++ b/pkg/kv/kvserver/below_raft_protos_test.go
@@ -77,13 +77,8 @@ var belowRaftGoldenProtos = map[reflect.Type]fixture{
populatedConstructor: func(r *rand.Rand) protoutil.Message {
return enginepb.NewPopulatedRangeAppliedState(r, false)
},
- // The populatedSum has changed from 10390885694280604642 to
- // 7958815789228166749, as of 21.1, due to the addition of the
- // SeparatedIntentCount field in MVCCStats. This field will not actually
- // be populated until all nodes are on 21.1, so there isn't a risk of
- // divergence.
emptySum: 615555020845646359,
- populatedSum: 7958815789228166749,
+ populatedSum: 3253881774919630461,
},
reflect.TypeOf(&raftpb.HardState{}): {
populatedConstructor: func(r *rand.Rand) protoutil.Message {
diff --git a/pkg/kv/kvserver/client_replica_test.go b/pkg/kv/kvserver/client_replica_test.go
index 50836e8ec237..d453d9fbee53 100644
--- a/pkg/kv/kvserver/client_replica_test.go
+++ b/pkg/kv/kvserver/client_replica_test.go
@@ -3332,7 +3332,7 @@ func TestProposalOverhead(t *testing.T) {
// overhead is that users ranges do not have rangefeeds on by default whereas
// system ranges do.
const (
- expectedUserOverhead uint32 = 42
+ expectedUserOverhead uint32 = 45
)
t.Run("user-key overhead", func(t *testing.T) {
userKey := tc.ScratchRange(t)
diff --git a/pkg/kv/kvserver/closedts/tracker/heap_tracker.go b/pkg/kv/kvserver/closedts/tracker/heap_tracker.go
index 620bd05462a6..a78a90caea83 100644
--- a/pkg/kv/kvserver/closedts/tracker/heap_tracker.go
+++ b/pkg/kv/kvserver/closedts/tracker/heap_tracker.go
@@ -124,3 +124,10 @@ func (h *heapTracker) LowerBound(ctx context.Context) hlc.Timestamp {
}
return h.mu.rs[0].ts
}
+
+// Count is part of the Tracker interface.
+func (h *heapTracker) Count() int {
+ h.mu.Lock()
+ defer h.mu.Unlock()
+ return h.mu.rs.Len()
+}
diff --git a/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go b/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go
index b9cd8bced181..86cdb0ff9c57 100644
--- a/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go
+++ b/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go
@@ -16,6 +16,7 @@ import (
"sync/atomic"
"github.com/cockroachdb/cockroach/pkg/util/hlc"
+ "github.com/cockroachdb/cockroach/pkg/util/log"
"github.com/cockroachdb/cockroach/pkg/util/timeutil"
)
@@ -169,6 +170,9 @@ func (t *lockfreeTracker) Untrack(ctx context.Context, tok RemovalToken) {
b := tok.(lockfreeToken).b
// Note that atomic ops are not required here, as we hold the exclusive lock.
b.refcnt--
+ if b.refcnt < 0 {
+ log.Fatalf(ctx, "negative bucket refcount: %d", b.refcnt)
+ }
if b.refcnt == 0 {
// Reset the bucket, so that future Track() calls can create a new one.
b.ts = 0
@@ -198,6 +202,11 @@ func (t *lockfreeTracker) LowerBound(ctx context.Context) hlc.Timestamp {
}
}
+// Count is part of the Tracker interface.
+func (t *lockfreeTracker) Count() int {
+ return int(t.b1.refcnt) + int(t.b2.refcnt)
+}
+
// bucket represent a Tracker bucket: a data structure that coalesces a number
// of timestamps, keeping track only of their count and minimum.
//
diff --git a/pkg/kv/kvserver/closedts/tracker/tracker.go b/pkg/kv/kvserver/closedts/tracker/tracker.go
index 4fc41d429bff..e00f1b41af7f 100644
--- a/pkg/kv/kvserver/closedts/tracker/tracker.go
+++ b/pkg/kv/kvserver/closedts/tracker/tracker.go
@@ -85,6 +85,11 @@ type Tracker interface {
// make is that, if no synthethic timestamp is inserted into the tracked set
// for a while, eventually the LowerBound value will not be synthetic.
LowerBound(context.Context) hlc.Timestamp
+
+ // Count returns the current size of the tracked set.
+ //
+ // Count cannot be called concurrently with other methods.
+ Count() int
}
// RemovalToken represents the result of Track: a token to be later used with
diff --git a/pkg/kv/kvserver/kvserverpb/proposer_kv.go b/pkg/kv/kvserver/kvserverpb/proposer_kv.go
index 04a4000420e2..14fc1ca2d064 100644
--- a/pkg/kv/kvserver/kvserverpb/proposer_kv.go
+++ b/pkg/kv/kvserver/kvserverpb/proposer_kv.go
@@ -10,18 +10,36 @@
package kvserverpb
-import "math"
+import (
+ "math"
+
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
+)
var maxRaftCommandFooterSize = (&RaftCommandFooter{
MaxLeaseIndex: math.MaxUint64,
}).Size()
+var maxClosedTimestampFooterSize = (&ClosedTimestampFooter{
+ ClosedTimestamp: hlc.Timestamp{
+ WallTime: math.MaxInt64,
+ Logical: math.MaxInt32,
+ Synthetic: true,
+ },
+}).Size()
+
// MaxRaftCommandFooterSize returns the maximum possible size of an
// encoded RaftCommandFooter proto.
func MaxRaftCommandFooterSize() int {
return maxRaftCommandFooterSize
}
+// MaxClosedTimestampFooterSize returns the maximmum possible size of an encoded
+// ClosedTimestampFooter.
+func MaxClosedTimestampFooterSize() int {
+ return maxClosedTimestampFooterSize
+}
+
// IsZero returns whether all fields are set to their zero value.
func (r ReplicatedEvalResult) IsZero() bool {
return r == ReplicatedEvalResult{}
diff --git a/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go b/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go
index 8b43941018d9..ae64003650e3 100644
--- a/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go
+++ b/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go
@@ -48,7 +48,7 @@ func (m *Split) Reset() { *m = Split{} }
func (m *Split) String() string { return proto.CompactTextString(m) }
func (*Split) ProtoMessage() {}
func (*Split) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{0}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{0}
}
func (m *Split) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -83,7 +83,7 @@ func (m *Merge) Reset() { *m = Merge{} }
func (m *Merge) String() string { return proto.CompactTextString(m) }
func (*Merge) ProtoMessage() {}
func (*Merge) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{1}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{1}
}
func (m *Merge) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -117,7 +117,7 @@ type ChangeReplicas struct {
func (m *ChangeReplicas) Reset() { *m = ChangeReplicas{} }
func (*ChangeReplicas) ProtoMessage() {}
func (*ChangeReplicas) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{2}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{2}
}
func (m *ChangeReplicas) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -169,7 +169,7 @@ func (m *ComputeChecksum) Reset() { *m = ComputeChecksum{} }
func (m *ComputeChecksum) String() string { return proto.CompactTextString(m) }
func (*ComputeChecksum) ProtoMessage() {}
func (*ComputeChecksum) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{3}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{3}
}
func (m *ComputeChecksum) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -206,7 +206,7 @@ func (m *Compaction) Reset() { *m = Compaction{} }
func (m *Compaction) String() string { return proto.CompactTextString(m) }
func (*Compaction) ProtoMessage() {}
func (*Compaction) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{4}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{4}
}
func (m *Compaction) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -243,7 +243,7 @@ func (m *SuggestedCompaction) Reset() { *m = SuggestedCompaction{} }
func (m *SuggestedCompaction) String() string { return proto.CompactTextString(m) }
func (*SuggestedCompaction) ProtoMessage() {}
func (*SuggestedCompaction) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{5}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{5}
}
func (m *SuggestedCompaction) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -305,7 +305,7 @@ func (m *ReplicatedEvalResult) Reset() { *m = ReplicatedEvalResult{} }
func (m *ReplicatedEvalResult) String() string { return proto.CompactTextString(m) }
func (*ReplicatedEvalResult) ProtoMessage() {}
func (*ReplicatedEvalResult) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{6}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{6}
}
func (m *ReplicatedEvalResult) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -349,7 +349,7 @@ func (m *ReplicatedEvalResult_AddSSTable) Reset() { *m = ReplicatedEvalR
func (m *ReplicatedEvalResult_AddSSTable) String() string { return proto.CompactTextString(m) }
func (*ReplicatedEvalResult_AddSSTable) ProtoMessage() {}
func (*ReplicatedEvalResult_AddSSTable) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{6, 0}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{6, 0}
}
func (m *ReplicatedEvalResult_AddSSTable) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -386,7 +386,7 @@ func (m *WriteBatch) Reset() { *m = WriteBatch{} }
func (m *WriteBatch) String() string { return proto.CompactTextString(m) }
func (*WriteBatch) ProtoMessage() {}
func (*WriteBatch) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{7}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{7}
}
func (m *WriteBatch) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -423,7 +423,7 @@ func (m *LogicalOpLog) Reset() { *m = LogicalOpLog{} }
func (m *LogicalOpLog) String() string { return proto.CompactTextString(m) }
func (*LogicalOpLog) ProtoMessage() {}
func (*LogicalOpLog) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{8}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{8}
}
func (m *LogicalOpLog) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -505,7 +505,22 @@ type RaftCommand struct {
// been added after it, and on removal, the assignment counters must be
// updated accordingly. Managing retry of proposals becomes trickier as
// well as that uproots whatever ordering was originally envisioned.
+ //
+ // This field is set through RaftCommandFooter hackery.
MaxLeaseIndex uint64 `protobuf:"varint,4,opt,name=max_lease_index,json=maxLeaseIndex,proto3" json:"max_lease_index,omitempty"`
+ // The closed timestamp carried by this command. Once a follower is told to
+ // apply this command, it knows that there will be no further writes at
+ // timestamps <= closed_timestamp. Note that the command itself might
+ // represent a write at a lower timestamp, so the closed timestamp can only be
+ // used after this command is applied.
+ //
+ // The field can be zero, which is to be interpreted as no closed timestamp
+ // update. Some commands (lease requests) implicitly carry a closed timestamp
+ // in a command-specific way. If the value is not zero, the value is greater
+ // or equal to that of the previous commands (and all before it).
+ //
+ // This field is set through ClosedTimestampFooter hackery.
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,17,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
// replicated_eval_result is a set of structured information that instructs
// replicated state changes to the part of a Range's replicated state machine
// that exists outside of RocksDB.
@@ -529,7 +544,7 @@ func (m *RaftCommand) Reset() { *m = RaftCommand{} }
func (m *RaftCommand) String() string { return proto.CompactTextString(m) }
func (*RaftCommand) ProtoMessage() {}
func (*RaftCommand) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{9}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{9}
}
func (m *RaftCommand) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -568,7 +583,7 @@ func (m *RaftCommandFooter) Reset() { *m = RaftCommandFooter{} }
func (m *RaftCommandFooter) String() string { return proto.CompactTextString(m) }
func (*RaftCommandFooter) ProtoMessage() {}
func (*RaftCommandFooter) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{10}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{10}
}
func (m *RaftCommandFooter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -593,6 +608,42 @@ func (m *RaftCommandFooter) XXX_DiscardUnknown() {
var xxx_messageInfo_RaftCommandFooter proto.InternalMessageInfo
+// ClosedTimestampFooter is similar to RaftCommandFooter, allowing the proposal
+// buffer to fill in the closed_timestamp field after most of the proto has been
+// marshaled already.
+type ClosedTimestampFooter struct {
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,17,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
+}
+
+func (m *ClosedTimestampFooter) Reset() { *m = ClosedTimestampFooter{} }
+func (m *ClosedTimestampFooter) String() string { return proto.CompactTextString(m) }
+func (*ClosedTimestampFooter) ProtoMessage() {}
+func (*ClosedTimestampFooter) Descriptor() ([]byte, []int) {
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{11}
+}
+func (m *ClosedTimestampFooter) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ClosedTimestampFooter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ b = b[:cap(b)]
+ n, err := m.MarshalTo(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+}
+func (dst *ClosedTimestampFooter) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ClosedTimestampFooter.Merge(dst, src)
+}
+func (m *ClosedTimestampFooter) XXX_Size() int {
+ return m.Size()
+}
+func (m *ClosedTimestampFooter) XXX_DiscardUnknown() {
+ xxx_messageInfo_ClosedTimestampFooter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClosedTimestampFooter proto.InternalMessageInfo
+
func init() {
proto.RegisterType((*Split)(nil), "cockroach.kv.kvserver.storagepb.Split")
proto.RegisterType((*Merge)(nil), "cockroach.kv.kvserver.storagepb.Merge")
@@ -607,6 +658,7 @@ func init() {
proto.RegisterType((*RaftCommand)(nil), "cockroach.kv.kvserver.storagepb.RaftCommand")
proto.RegisterMapType((map[string]string)(nil), "cockroach.kv.kvserver.storagepb.RaftCommand.TraceDataEntry")
proto.RegisterType((*RaftCommandFooter)(nil), "cockroach.kv.kvserver.storagepb.RaftCommandFooter")
+ proto.RegisterType((*ClosedTimestampFooter)(nil), "cockroach.kv.kvserver.storagepb.ClosedTimestampFooter")
}
func (this *Split) Equal(that interface{}) bool {
if that == nil {
@@ -1314,6 +1366,16 @@ func (m *RaftCommand) MarshalTo(dAtA []byte) (int, error) {
i += copy(dAtA[i:], v)
}
}
+ dAtA[i] = 0x8a
+ i++
+ dAtA[i] = 0x1
+ i++
+ i = encodeVarintProposerKv(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n21, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n21
return i, nil
}
@@ -1340,6 +1402,34 @@ func (m *RaftCommandFooter) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
+func (m *ClosedTimestampFooter) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalTo(dAtA)
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *ClosedTimestampFooter) MarshalTo(dAtA []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ dAtA[i] = 0x8a
+ i++
+ dAtA[i] = 0x1
+ i++
+ i = encodeVarintProposerKv(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n22, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n22
+ return i, nil
+}
+
func encodeVarintProposerKv(dAtA []byte, offset int, v uint64) int {
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
@@ -1576,6 +1666,8 @@ func (m *RaftCommand) Size() (n int) {
n += mapEntrySize + 2 + sovProposerKv(uint64(mapEntrySize))
}
}
+ l = m.ClosedTimestamp.Size()
+ n += 2 + l + sovProposerKv(uint64(l))
return n
}
@@ -1591,6 +1683,17 @@ func (m *RaftCommandFooter) Size() (n int) {
return n
}
+func (m *ClosedTimestampFooter) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = m.ClosedTimestamp.Size()
+ n += 2 + l + sovProposerKv(uint64(l))
+ return n
+}
+
func sovProposerKv(x uint64) (n int) {
for {
n++
@@ -3282,6 +3385,36 @@ func (m *RaftCommand) Unmarshal(dAtA []byte) error {
}
m.TraceData[mapkey] = mapvalue
iNdEx = postIndex
+ case 17:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowProposerKv
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthProposerKv
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipProposerKv(dAtA[iNdEx:])
@@ -3372,6 +3505,86 @@ func (m *RaftCommandFooter) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *ClosedTimestampFooter) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowProposerKv
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: ClosedTimestampFooter: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ClosedTimestampFooter: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 17:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowProposerKv
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthProposerKv
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipProposerKv(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthProposerKv
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func skipProposerKv(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
@@ -3478,98 +3691,100 @@ var (
)
func init() {
- proto.RegisterFile("kv/kvserver/kvserverpb/proposer_kv.proto", fileDescriptor_proposer_kv_0c8837b323bf7b92)
-}
-
-var fileDescriptor_proposer_kv_0c8837b323bf7b92 = []byte{
- // 1424 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0x4f, 0x6f, 0xdb, 0x46,
- 0x16, 0xb7, 0x2c, 0xc9, 0xa6, 0x9e, 0x6c, 0x89, 0x9e, 0x38, 0x09, 0xd7, 0xbb, 0x2b, 0x19, 0xda,
- 0x6c, 0xe0, 0xdd, 0xcd, 0x52, 0x81, 0xbd, 0x0b, 0x14, 0x49, 0x50, 0xc4, 0x92, 0x93, 0xc6, 0x8a,
- 0xed, 0x26, 0x23, 0x27, 0x2d, 0xd2, 0x03, 0x31, 0x22, 0x27, 0x14, 0x2b, 0x8a, 0x64, 0x86, 0x23,
- 0x25, 0xfe, 0x14, 0x6d, 0x81, 0x1e, 0x7a, 0x6a, 0x73, 0xec, 0xd7, 0xe8, 0x2d, 0x97, 0x02, 0x39,
- 0x06, 0x3d, 0x08, 0x8d, 0x73, 0xe9, 0x67, 0xc8, 0xa9, 0x98, 0xe1, 0x50, 0x92, 0x0b, 0xa7, 0x56,
- 0xda, 0xdb, 0xf0, 0xcd, 0xbc, 0xdf, 0x7b, 0xf3, 0xfe, 0xfc, 0xde, 0x10, 0x36, 0x7a, 0xc3, 0x7a,
- 0x6f, 0x18, 0x53, 0x36, 0xa4, 0x6c, 0xbc, 0x88, 0x3a, 0xf5, 0x88, 0x85, 0x51, 0x18, 0x53, 0x66,
- 0xf5, 0x86, 0x66, 0xc4, 0x42, 0x1e, 0xa2, 0xaa, 0x1d, 0xda, 0x3d, 0x16, 0x12, 0xbb, 0x6b, 0xf6,
- 0x86, 0x66, 0x7a, 0xd4, 0x8c, 0x79, 0xc8, 0x88, 0x4b, 0xa3, 0xce, 0xda, 0x8a, 0xdc, 0x8c, 0x3a,
- 0x75, 0x12, 0x79, 0x89, 0xce, 0x1a, 0x4a, 0x45, 0x0e, 0xe1, 0x44, 0xc9, 0x2e, 0xa4, 0xb2, 0x3e,
- 0xe5, 0x64, 0x4a, 0xfe, 0x57, 0x85, 0x54, 0xa7, 0x81, 0xeb, 0x05, 0x54, 0x1c, 0x18, 0xda, 0xb6,
- 0xda, 0xfc, 0xdb, 0xa9, 0x9b, 0x5b, 0x6a, 0xb7, 0xf6, 0x8e, 0x4b, 0xc4, 0x9c, 0x70, 0xaa, 0xce,
- 0x18, 0x03, 0xee, 0xf9, 0xf5, 0xae, 0x6f, 0xd7, 0xb9, 0xd7, 0xa7, 0x31, 0x27, 0xfd, 0x48, 0xed,
- 0xac, 0xba, 0xa1, 0x1b, 0xca, 0x65, 0x5d, 0xac, 0x12, 0x69, 0xed, 0xfb, 0x0c, 0xe4, 0xdb, 0x91,
- 0xef, 0x71, 0xd4, 0x84, 0x45, 0xce, 0x3c, 0xd7, 0xa5, 0xcc, 0xc8, 0xac, 0x67, 0x36, 0x8a, 0x9b,
- 0x55, 0x73, 0x12, 0x0a, 0x75, 0x19, 0x53, 0x1e, 0x3d, 0x4c, 0x8e, 0x35, 0xb4, 0x17, 0xa3, 0xea,
- 0xdc, 0xcb, 0x51, 0x35, 0x83, 0x53, 0x4d, 0x74, 0x08, 0x05, 0xd6, 0x8d, 0x2d, 0x87, 0xfa, 0x9c,
- 0x18, 0xf3, 0x12, 0xe6, 0x9f, 0x53, 0x30, 0xea, 0x7a, 0x66, 0x7a, 0x3d, 0x73, 0xff, 0x61, 0xb3,
- 0xd9, 0xe6, 0x84, 0xc7, 0x0d, 0x5d, 0x80, 0x1d, 0x8f, 0xaa, 0x1a, 0xbe, 0xd3, 0xde, 0x11, 0xea,
- 0x58, 0x63, 0xdd, 0x58, 0xae, 0xae, 0xe5, 0x7e, 0x79, 0x5e, 0xcd, 0xd4, 0x30, 0xe4, 0xf7, 0x29,
- 0x73, 0xe9, 0x6c, 0x9e, 0xca, 0xa3, 0xef, 0xf6, 0x54, 0x61, 0x3a, 0x50, 0x6a, 0x76, 0x49, 0xe0,
- 0x52, 0x4c, 0x23, 0xdf, 0xb3, 0x49, 0x8c, 0xf6, 0x7e, 0x0b, 0xbe, 0x71, 0x0a, 0xf8, 0x49, 0x9d,
- 0xdf, 0xb3, 0xf2, 0xcd, 0xf3, 0xea, 0x5c, 0xed, 0xf5, 0x3c, 0x94, 0x9b, 0x61, 0x3f, 0x1a, 0x70,
- 0xda, 0xec, 0x52, 0xbb, 0x17, 0x0f, 0xfa, 0xe8, 0x73, 0x28, 0xda, 0x6a, 0x6d, 0x79, 0x8e, 0xb4,
- 0xb5, 0xd4, 0xd8, 0x15, 0x08, 0x3f, 0x8d, 0xaa, 0x5b, 0xae, 0xc7, 0xbb, 0x83, 0x8e, 0x69, 0x87,
- 0xfd, 0xfa, 0xd8, 0xba, 0xd3, 0x99, 0xac, 0xeb, 0x51, 0xcf, 0xad, 0xcb, 0x54, 0x0f, 0x06, 0x9e,
- 0x63, 0x3e, 0x78, 0xb0, 0xbb, 0x73, 0x3c, 0xaa, 0x42, 0x8a, 0xbe, 0xbb, 0x83, 0x21, 0x45, 0xdf,
- 0x75, 0xd0, 0x3f, 0x60, 0x39, 0x26, 0x43, 0x6a, 0xc5, 0x01, 0x89, 0xe2, 0x6e, 0xc8, 0x65, 0x66,
- 0x34, 0xbc, 0x24, 0x84, 0x6d, 0x25, 0x43, 0x5b, 0x90, 0xeb, 0x87, 0x0e, 0x35, 0xb2, 0xeb, 0x99,
- 0x8d, 0xd2, 0xa9, 0x21, 0x4d, 0xd1, 0xf7, 0x43, 0x87, 0x62, 0x79, 0x18, 0x55, 0x20, 0xb1, 0x13,
- 0x85, 0x5e, 0xc0, 0x8d, 0x9c, 0x84, 0x9d, 0x92, 0x20, 0x03, 0x16, 0x87, 0x94, 0xc5, 0x5e, 0x18,
- 0x18, 0xf9, 0xf5, 0xcc, 0xc6, 0x32, 0x4e, 0x3f, 0xd1, 0x1d, 0x28, 0x70, 0xca, 0xfa, 0x5e, 0x40,
- 0x38, 0x35, 0x16, 0xd6, 0xb3, 0x1b, 0xc5, 0xcd, 0x4b, 0xa7, 0xd8, 0x54, 0x31, 0xde, 0xa1, 0xb1,
- 0xcd, 0xbc, 0x88, 0x87, 0xac, 0x91, 0x13, 0x31, 0xc2, 0x13, 0x65, 0x95, 0xc9, 0x87, 0x00, 0x22,
- 0xc4, 0xc4, 0xe6, 0x02, 0x7d, 0x15, 0xf2, 0x9d, 0x23, 0x4e, 0x63, 0x19, 0xd7, 0x2c, 0x4e, 0x3e,
- 0xd0, 0x15, 0x40, 0xf1, 0xc0, 0x75, 0x69, 0xcc, 0xa9, 0x63, 0x11, 0x6e, 0x05, 0x24, 0x08, 0x63,
- 0x19, 0x8c, 0x2c, 0xd6, 0xc7, 0x3b, 0xdb, 0xfc, 0x40, 0xc8, 0x15, 0xee, 0xd7, 0xf3, 0x70, 0xae,
- 0x9d, 0x6e, 0x4d, 0x59, 0xb8, 0x0f, 0x85, 0x98, 0x13, 0xc6, 0xad, 0x1e, 0x3d, 0x52, 0xd9, 0xfb,
- 0xdf, 0xdb, 0x51, 0xf5, 0xea, 0x4c, 0x99, 0x4b, 0x6f, 0x77, 0x97, 0x1e, 0x61, 0x4d, 0xc2, 0xdc,
- 0xa5, 0x47, 0x68, 0x1f, 0x16, 0x69, 0xe0, 0x48, 0xc0, 0xf9, 0x3f, 0x01, 0xb8, 0x40, 0x03, 0x47,
- 0xc0, 0x3d, 0x00, 0xb0, 0xc7, 0xfe, 0xca, 0xb4, 0x16, 0x37, 0xff, 0x63, 0x9e, 0x41, 0x6f, 0xe6,
- 0xe4, 0x8a, 0x53, 0xf5, 0x3c, 0x05, 0xa4, 0xc2, 0xf2, 0x83, 0x06, 0xab, 0x2a, 0x37, 0x9c, 0x3a,
- 0xb7, 0x86, 0xc4, 0xc7, 0x34, 0x1e, 0xf8, 0x82, 0x46, 0xf2, 0x92, 0x8f, 0x54, 0xf7, 0xff, 0xf7,
- 0x4c, 0x83, 0x0a, 0x45, 0xb0, 0x00, 0xc5, 0x89, 0x2e, 0xba, 0x01, 0xf9, 0x58, 0x30, 0x8d, 0xf2,
- 0xfa, 0xf2, 0x99, 0x20, 0x92, 0x97, 0x70, 0xa2, 0x24, 0xb4, 0xfb, 0xa2, 0xfb, 0x65, 0x3d, 0xce,
- 0xa2, 0x2d, 0xb9, 0x02, 0x27, 0x4a, 0x68, 0x03, 0x74, 0x2f, 0xb6, 0x7c, 0x4a, 0x62, 0x6a, 0x31,
- 0xfa, 0x64, 0x40, 0x63, 0x6e, 0x2c, 0xc8, 0xc2, 0x2e, 0x79, 0xf1, 0x9e, 0x10, 0xe3, 0x44, 0x8a,
- 0xb6, 0xa1, 0x30, 0x26, 0x59, 0x43, 0x93, 0xb6, 0xfe, 0x3e, 0x65, 0x4b, 0xb4, 0xa7, 0xd9, 0xf5,
- 0x6d, 0xf3, 0x30, 0x3d, 0x34, 0xae, 0xdd, 0x54, 0x80, 0xee, 0x81, 0xee, 0xd0, 0x88, 0x51, 0x19,
- 0x45, 0x45, 0x9b, 0xf0, 0x1e, 0xb4, 0x89, 0xcb, 0x13, 0x75, 0xc9, 0x95, 0xe8, 0x53, 0x28, 0xdb,
- 0x92, 0x9d, 0x2c, 0xa6, 0xe8, 0xc9, 0x58, 0x92, 0x80, 0xf5, 0xb3, 0x53, 0x7f, 0x82, 0xd5, 0x70,
- 0xc9, 0x3e, 0xc9, 0x8c, 0x97, 0xa0, 0xc4, 0xc8, 0x63, 0x6e, 0xf9, 0xa1, 0xab, 0x3c, 0x5d, 0x96,
- 0x9d, 0xb3, 0x24, 0xa4, 0x7b, 0xa1, 0x9b, 0xd8, 0x7f, 0x02, 0x45, 0xe2, 0x38, 0x56, 0x1c, 0x73,
- 0xd2, 0xf1, 0xa9, 0xb1, 0x22, 0x6d, 0xdf, 0x9c, 0xb5, 0x0a, 0x4e, 0xd4, 0x92, 0xb9, 0xed, 0x38,
- 0xed, 0xf6, 0xa1, 0xc0, 0x69, 0x94, 0x04, 0xbd, 0x4d, 0xbe, 0x31, 0x10, 0xc7, 0x69, 0x27, 0x36,
- 0xd0, 0x6d, 0xc8, 0x27, 0xfe, 0x20, 0x69, 0xec, 0xdf, 0x33, 0x45, 0x4e, 0x7a, 0xab, 0x12, 0x92,
- 0xa8, 0xa3, 0x2f, 0x32, 0x70, 0x2e, 0x62, 0x74, 0xa8, 0x92, 0x9f, 0xbc, 0x0d, 0x88, 0x6f, 0xac,
- 0xce, 0x92, 0xda, 0x9b, 0x6f, 0x47, 0xd5, 0x1b, 0xb3, 0xd3, 0xb6, 0x50, 0x6e, 0xfa, 0xa1, 0xdd,
- 0x1b, 0x23, 0xe0, 0x15, 0x61, 0x5b, 0x16, 0xd8, 0x3d, 0x65, 0x19, 0x7d, 0x06, 0xba, 0x9d, 0xcc,
- 0x0d, 0x2b, 0xa5, 0x73, 0xe3, 0xbc, 0xf4, 0xe6, 0xea, 0x4c, 0x8d, 0x3c, 0x35, 0x70, 0x70, 0xd9,
- 0x3e, 0x29, 0x58, 0xfb, 0x08, 0xa6, 0x02, 0x8a, 0x10, 0xe4, 0xc4, 0x2b, 0x25, 0xa1, 0x32, 0x2c,
- 0xd7, 0xa8, 0x0a, 0x79, 0x9b, 0xd9, 0x5b, 0x9b, 0xb2, 0x97, 0x97, 0x1b, 0x85, 0xe3, 0x51, 0x35,
- 0xdf, 0xc4, 0xcd, 0xad, 0x4d, 0x9c, 0xc8, 0x13, 0x2e, 0x68, 0xe5, 0xb4, 0x8c, 0x3e, 0xdf, 0xca,
- 0x69, 0x79, 0x7d, 0xa1, 0x95, 0xd3, 0x16, 0x75, 0xad, 0x95, 0xd3, 0x0a, 0x3a, 0xb4, 0x72, 0x5a,
- 0x49, 0x2f, 0xb7, 0x72, 0x5a, 0x59, 0xd7, 0x5b, 0x39, 0x4d, 0xd7, 0x57, 0x5a, 0x39, 0xed, 0x9c,
- 0xbe, 0xda, 0x5a, 0xd0, 0xbe, 0x3a, 0xd0, 0xbf, 0x3d, 0xa8, 0xad, 0x03, 0x7c, 0xc2, 0x3c, 0x4e,
- 0x1b, 0x84, 0xdb, 0xdd, 0xd3, 0x1c, 0xa8, 0xdd, 0x87, 0xa5, 0xbd, 0xd0, 0xf5, 0x6c, 0xe2, 0x7f,
- 0x1c, 0xed, 0x85, 0x2e, 0xda, 0x86, 0x6c, 0x18, 0x09, 0x52, 0x17, 0xe3, 0xe2, 0x5f, 0x67, 0xe5,
- 0x79, 0xac, 0xaa, 0xd2, 0x2c, 0x74, 0x6b, 0x3f, 0xe6, 0xa1, 0x88, 0xc9, 0x63, 0xde, 0x0c, 0xfb,
- 0x7d, 0x12, 0x38, 0xe8, 0x32, 0x94, 0xfb, 0xe4, 0x99, 0x4a, 0xb9, 0x17, 0x38, 0xf4, 0x99, 0xa4,
- 0x8d, 0x1c, 0x5e, 0xee, 0x93, 0x67, 0x32, 0x1b, 0xbb, 0x42, 0x88, 0x0e, 0xe1, 0x2f, 0x53, 0x9d,
- 0x3a, 0x7e, 0x37, 0x4a, 0x3d, 0x39, 0xdb, 0x8a, 0x9b, 0xc6, 0x29, 0xf3, 0x2b, 0x21, 0x8c, 0x8b,
- 0x13, 0xd5, 0x7b, 0x4a, 0x53, 0x6e, 0xa0, 0x21, 0x5c, 0x3c, 0x09, 0x65, 0xc5, 0x82, 0x5c, 0x02,
- 0x9b, 0x4a, 0xce, 0xc9, 0x36, 0x3e, 0x7c, 0x3b, 0xaa, 0x5e, 0x7b, 0xaf, 0x11, 0x20, 0x81, 0xdb,
- 0x0a, 0x05, 0x9f, 0x8f, 0xa6, 0xed, 0xa5, 0x62, 0xf4, 0x04, 0x2e, 0xb0, 0x71, 0xc7, 0x59, 0x74,
- 0x48, 0x7c, 0x8b, 0xc9, 0x9e, 0x93, 0x3d, 0x5d, 0xdc, 0xfc, 0xff, 0x1f, 0x6a, 0x58, 0x15, 0xe7,
- 0x55, 0x76, 0xda, 0x60, 0xd8, 0x83, 0xe2, 0x53, 0x91, 0x6d, 0xab, 0x23, 0xd2, 0x6d, 0x94, 0x66,
- 0x9c, 0x47, 0x93, 0x0a, 0xc1, 0xf0, 0x74, 0x52, 0x2d, 0x6d, 0x28, 0xf9, 0x49, 0x7a, 0xad, 0x30,
- 0x12, 0x94, 0x64, 0x94, 0x67, 0x9c, 0x37, 0xd3, 0x05, 0x85, 0x97, 0xfc, 0xe9, 0xf2, 0x7a, 0x04,
- 0xc0, 0x19, 0xb1, 0xa9, 0x25, 0x0b, 0x51, 0x97, 0x55, 0x76, 0xfd, 0xec, 0x48, 0x4c, 0xaa, 0xc9,
- 0x3c, 0x14, 0xea, 0x3b, 0x84, 0x93, 0x5b, 0x01, 0x67, 0x47, 0xb8, 0xc0, 0xd3, 0xef, 0xb5, 0x1b,
- 0x50, 0x3a, 0xb9, 0x89, 0x74, 0xc8, 0xa6, 0x6f, 0x87, 0x02, 0x16, 0x4b, 0xf1, 0x6a, 0x19, 0x12,
- 0x7f, 0x90, 0xcc, 0xce, 0x02, 0x4e, 0x3e, 0xae, 0xcd, 0x7f, 0x20, 0x5a, 0x2c, 0xab, 0xe7, 0xc6,
- 0x8d, 0x36, 0xaf, 0x67, 0x93, 0x26, 0xfa, 0xee, 0xa0, 0x76, 0x1d, 0x56, 0xa6, 0x1c, 0xb8, 0x1d,
- 0x86, 0x9c, 0xb2, 0x59, 0x8b, 0xba, 0x71, 0xe5, 0xc5, 0xeb, 0xca, 0xdc, 0x8b, 0xe3, 0x4a, 0xe6,
- 0xe5, 0x71, 0x25, 0xf3, 0xea, 0xb8, 0x92, 0xf9, 0xf9, 0xb8, 0x92, 0xf9, 0xf2, 0x4d, 0x65, 0xee,
- 0xe5, 0x9b, 0xca, 0xdc, 0xab, 0x37, 0x95, 0xb9, 0x47, 0x30, 0xf9, 0xcf, 0xe8, 0x2c, 0xc8, 0x5f,
- 0x86, 0xad, 0x5f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xe4, 0x48, 0xb2, 0x4d, 0x0d, 0x00, 0x00,
+ proto.RegisterFile("kv/kvserver/kvserverpb/proposer_kv.proto", fileDescriptor_proposer_kv_0b3536bd0bf3d98c)
+}
+
+var fileDescriptor_proposer_kv_0b3536bd0bf3d98c = []byte{
+ // 1453 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x73, 0x13, 0xc7,
+ 0x12, 0xb7, 0x2c, 0xc9, 0x5e, 0xb5, 0x6c, 0x69, 0x3d, 0x18, 0xd8, 0xe7, 0xf7, 0x9e, 0xe4, 0xd2,
+ 0xe3, 0x51, 0x4e, 0x42, 0x56, 0x94, 0x9d, 0x54, 0xa5, 0x80, 0x4a, 0x61, 0xc9, 0x10, 0x2c, 0x6c,
+ 0x07, 0x46, 0x86, 0xa4, 0xc8, 0x61, 0x6b, 0xb4, 0x3b, 0xac, 0x36, 0x5a, 0x69, 0x97, 0x9d, 0x91,
+ 0xc0, 0x9f, 0x22, 0x49, 0x55, 0x0e, 0xb9, 0x24, 0xe1, 0x98, 0xaf, 0x91, 0x1b, 0x47, 0x8e, 0x54,
+ 0x0e, 0xaa, 0x60, 0x2e, 0xf9, 0x0c, 0x9c, 0x52, 0x33, 0x3b, 0xab, 0x3f, 0x29, 0x13, 0x8b, 0x24,
+ 0xb7, 0xd9, 0x9e, 0xe9, 0x5f, 0xf7, 0xf4, 0x9f, 0x5f, 0xcf, 0xc2, 0x46, 0x67, 0x50, 0xed, 0x0c,
+ 0x18, 0x8d, 0x06, 0x34, 0x1a, 0x2d, 0xc2, 0x56, 0x35, 0x8c, 0x82, 0x30, 0x60, 0x34, 0xb2, 0x3a,
+ 0x03, 0x33, 0x8c, 0x02, 0x1e, 0xa0, 0xb2, 0x1d, 0xd8, 0x9d, 0x28, 0x20, 0x76, 0xdb, 0xec, 0x0c,
+ 0xcc, 0xe4, 0xa8, 0xc9, 0x78, 0x10, 0x11, 0x97, 0x86, 0xad, 0xb5, 0x15, 0xb9, 0x19, 0xb6, 0xaa,
+ 0x24, 0xf4, 0x62, 0x9d, 0x35, 0x94, 0x88, 0x1c, 0xc2, 0x89, 0x92, 0x9d, 0x4b, 0x64, 0x5d, 0xca,
+ 0xc9, 0x84, 0xfc, 0xdf, 0x0a, 0xa9, 0x4a, 0x7b, 0xae, 0xd7, 0xa3, 0xe2, 0xc0, 0xc0, 0xb6, 0xd5,
+ 0xe6, 0x7f, 0x4e, 0xdc, 0xdc, 0x52, 0xbb, 0x95, 0x37, 0x5c, 0x82, 0x71, 0xc2, 0xa9, 0x3a, 0x63,
+ 0xf4, 0xb9, 0xe7, 0x57, 0xdb, 0xbe, 0x5d, 0xe5, 0x5e, 0x97, 0x32, 0x4e, 0xba, 0xa1, 0xda, 0x59,
+ 0x75, 0x03, 0x37, 0x90, 0xcb, 0xaa, 0x58, 0xc5, 0xd2, 0xca, 0x4f, 0x29, 0xc8, 0x36, 0x43, 0xdf,
+ 0xe3, 0xa8, 0x0e, 0x8b, 0x3c, 0xf2, 0x5c, 0x97, 0x46, 0x46, 0x6a, 0x3d, 0xb5, 0x91, 0xdf, 0x2c,
+ 0x9b, 0xe3, 0x50, 0xa8, 0xcb, 0x98, 0xf2, 0xe8, 0x61, 0x7c, 0xac, 0xa6, 0x3d, 0x1b, 0x96, 0xe7,
+ 0x9e, 0x0f, 0xcb, 0x29, 0x9c, 0x68, 0xa2, 0x43, 0xc8, 0x45, 0x6d, 0x66, 0x39, 0xd4, 0xe7, 0xc4,
+ 0x98, 0x97, 0x30, 0xff, 0x9f, 0x80, 0x51, 0xd7, 0x33, 0x93, 0xeb, 0x99, 0xfb, 0xf7, 0xeb, 0xf5,
+ 0x26, 0x27, 0x9c, 0xd5, 0x74, 0x01, 0x76, 0x3c, 0x2c, 0x6b, 0xf8, 0x56, 0x73, 0x47, 0xa8, 0x63,
+ 0x2d, 0x6a, 0x33, 0xb9, 0xba, 0x92, 0xf9, 0xed, 0x69, 0x39, 0x55, 0xc1, 0x90, 0xdd, 0xa7, 0x91,
+ 0x4b, 0x67, 0xf3, 0x54, 0x1e, 0x7d, 0xb3, 0xa7, 0x0a, 0xd3, 0x81, 0x42, 0xbd, 0x4d, 0x7a, 0x2e,
+ 0xc5, 0x34, 0xf4, 0x3d, 0x9b, 0x30, 0xb4, 0xf7, 0x47, 0xf0, 0x8d, 0x13, 0xc0, 0xa7, 0x75, 0xfe,
+ 0xcc, 0xca, 0x77, 0x4f, 0xcb, 0x73, 0x95, 0x97, 0xf3, 0x50, 0xac, 0x07, 0xdd, 0xb0, 0xcf, 0x69,
+ 0xbd, 0x4d, 0xed, 0x0e, 0xeb, 0x77, 0xd1, 0x97, 0x90, 0xb7, 0xd5, 0xda, 0xf2, 0x1c, 0x69, 0x6b,
+ 0xa9, 0xb6, 0x2b, 0x10, 0x7e, 0x19, 0x96, 0xb7, 0x5c, 0x8f, 0xb7, 0xfb, 0x2d, 0xd3, 0x0e, 0xba,
+ 0xd5, 0x91, 0x75, 0xa7, 0x35, 0x5e, 0x57, 0xc3, 0x8e, 0x5b, 0x95, 0xa9, 0xee, 0xf7, 0x3d, 0xc7,
+ 0xbc, 0x77, 0x6f, 0x77, 0xe7, 0x78, 0x58, 0x86, 0x04, 0x7d, 0x77, 0x07, 0x43, 0x82, 0xbe, 0xeb,
+ 0xa0, 0xff, 0xc1, 0x32, 0x23, 0x03, 0x6a, 0xb1, 0x1e, 0x09, 0x59, 0x3b, 0xe0, 0x32, 0x33, 0x1a,
+ 0x5e, 0x12, 0xc2, 0xa6, 0x92, 0xa1, 0x2d, 0xc8, 0x74, 0x03, 0x87, 0x1a, 0xe9, 0xf5, 0xd4, 0x46,
+ 0xe1, 0xc4, 0x90, 0x26, 0xe8, 0xfb, 0x81, 0x43, 0xb1, 0x3c, 0x8c, 0x4a, 0x10, 0xdb, 0x09, 0x03,
+ 0xaf, 0xc7, 0x8d, 0x8c, 0x84, 0x9d, 0x90, 0x20, 0x03, 0x16, 0x07, 0x34, 0x62, 0x5e, 0xd0, 0x33,
+ 0xb2, 0xeb, 0xa9, 0x8d, 0x65, 0x9c, 0x7c, 0xa2, 0x5b, 0x90, 0xe3, 0x34, 0xea, 0x7a, 0x3d, 0xc2,
+ 0xa9, 0xb1, 0xb0, 0x9e, 0xde, 0xc8, 0x6f, 0x5e, 0x38, 0xc1, 0xa6, 0x8a, 0xf1, 0x0e, 0x65, 0x76,
+ 0xe4, 0x85, 0x3c, 0x88, 0x6a, 0x19, 0x11, 0x23, 0x3c, 0x56, 0x56, 0x99, 0xbc, 0x0f, 0x20, 0x42,
+ 0x4c, 0x6c, 0x2e, 0xd0, 0x57, 0x21, 0xdb, 0x3a, 0xe2, 0x94, 0xc9, 0xb8, 0xa6, 0x71, 0xfc, 0x81,
+ 0x2e, 0x01, 0x62, 0x7d, 0xd7, 0xa5, 0x8c, 0x53, 0xc7, 0x22, 0xdc, 0xea, 0x91, 0x5e, 0xc0, 0x64,
+ 0x30, 0xd2, 0x58, 0x1f, 0xed, 0x6c, 0xf3, 0x03, 0x21, 0x57, 0xb8, 0xdf, 0xce, 0xc3, 0x99, 0x66,
+ 0xb2, 0x35, 0x61, 0xe1, 0x2e, 0xe4, 0x18, 0x27, 0x11, 0xb7, 0x3a, 0xf4, 0x48, 0x65, 0xef, 0x83,
+ 0xd7, 0xc3, 0xf2, 0xe5, 0x99, 0x32, 0x97, 0xdc, 0xee, 0x36, 0x3d, 0xc2, 0x9a, 0x84, 0xb9, 0x4d,
+ 0x8f, 0xd0, 0x3e, 0x2c, 0xd2, 0x9e, 0x23, 0x01, 0xe7, 0xff, 0x06, 0xe0, 0x02, 0xed, 0x39, 0x02,
+ 0xee, 0x1e, 0x80, 0x3d, 0xf2, 0x57, 0xa6, 0x35, 0xbf, 0xf9, 0x9e, 0x79, 0x0a, 0xbd, 0x99, 0xe3,
+ 0x2b, 0x4e, 0xd4, 0xf3, 0x04, 0x90, 0x0a, 0xcb, 0xcf, 0x1a, 0xac, 0xaa, 0xdc, 0x70, 0xea, 0xdc,
+ 0x18, 0x10, 0x1f, 0x53, 0xd6, 0xf7, 0x05, 0x8d, 0x64, 0x25, 0x1f, 0xa9, 0xee, 0x7f, 0xff, 0x54,
+ 0x83, 0x0a, 0x45, 0xb0, 0x00, 0xc5, 0xb1, 0x2e, 0xba, 0x06, 0x59, 0x26, 0x98, 0x46, 0x79, 0x7d,
+ 0xf1, 0x54, 0x10, 0xc9, 0x4b, 0x38, 0x56, 0x12, 0xda, 0x5d, 0xd1, 0xfd, 0xb2, 0x1e, 0x67, 0xd1,
+ 0x96, 0x5c, 0x81, 0x63, 0x25, 0xb4, 0x01, 0xba, 0xc7, 0x2c, 0x9f, 0x12, 0x46, 0xad, 0x88, 0x3e,
+ 0xea, 0x53, 0xc6, 0x8d, 0x05, 0x59, 0xd8, 0x05, 0x8f, 0xed, 0x09, 0x31, 0x8e, 0xa5, 0x68, 0x1b,
+ 0x72, 0x23, 0x92, 0x35, 0x34, 0x69, 0xeb, 0xbf, 0x13, 0xb6, 0x44, 0x7b, 0x9a, 0x6d, 0xdf, 0x36,
+ 0x0f, 0x93, 0x43, 0xa3, 0xda, 0x4d, 0x04, 0xe8, 0x0e, 0xe8, 0x0e, 0x0d, 0x23, 0x2a, 0xa3, 0xa8,
+ 0x68, 0x13, 0xde, 0x82, 0x36, 0x71, 0x71, 0xac, 0x2e, 0xb9, 0x12, 0x7d, 0x0e, 0x45, 0x5b, 0xb2,
+ 0x93, 0x15, 0x29, 0x7a, 0x32, 0x96, 0x24, 0x60, 0xf5, 0xf4, 0xd4, 0x4f, 0xb1, 0x1a, 0x2e, 0xd8,
+ 0xd3, 0xcc, 0x78, 0x01, 0x0a, 0x11, 0x79, 0xc8, 0x2d, 0x3f, 0x70, 0x95, 0xa7, 0xcb, 0xb2, 0x73,
+ 0x96, 0x84, 0x74, 0x2f, 0x70, 0x63, 0xfb, 0x8f, 0x20, 0x4f, 0x1c, 0xc7, 0x62, 0x8c, 0x93, 0x96,
+ 0x4f, 0x8d, 0x15, 0x69, 0xfb, 0xfa, 0xac, 0x55, 0x30, 0x55, 0x4b, 0xe6, 0xb6, 0xe3, 0x34, 0x9b,
+ 0x87, 0x02, 0xa7, 0x56, 0x10, 0xf4, 0x36, 0xfe, 0xc6, 0x40, 0x1c, 0xa7, 0x19, 0xdb, 0x40, 0x37,
+ 0x21, 0x1b, 0xfb, 0x83, 0xa4, 0xb1, 0x77, 0x67, 0x8a, 0x9c, 0xf4, 0x56, 0x25, 0x24, 0x56, 0x47,
+ 0x5f, 0xa5, 0xe0, 0x4c, 0x18, 0xd1, 0x81, 0x4a, 0x7e, 0xfc, 0x36, 0x20, 0xbe, 0xb1, 0x3a, 0x4b,
+ 0x6a, 0xaf, 0xbf, 0x1e, 0x96, 0xaf, 0xcd, 0x4e, 0xdb, 0x42, 0xb9, 0xee, 0x07, 0x76, 0x67, 0x84,
+ 0x80, 0x57, 0x84, 0x6d, 0x59, 0x60, 0x77, 0x94, 0x65, 0xf4, 0x05, 0xe8, 0x76, 0x3c, 0x37, 0xac,
+ 0x84, 0xce, 0x8d, 0xb3, 0xd2, 0x9b, 0xcb, 0x33, 0x35, 0xf2, 0xc4, 0xc0, 0xc1, 0x45, 0x7b, 0x5a,
+ 0xb0, 0xf6, 0x09, 0x4c, 0x04, 0x14, 0x21, 0xc8, 0x88, 0x57, 0x4a, 0x4c, 0x65, 0x58, 0xae, 0x51,
+ 0x19, 0xb2, 0x76, 0x64, 0x6f, 0x6d, 0xca, 0x5e, 0x5e, 0xae, 0xe5, 0x8e, 0x87, 0xe5, 0x6c, 0x1d,
+ 0xd7, 0xb7, 0x36, 0x71, 0x2c, 0x8f, 0xb9, 0xa0, 0x91, 0xd1, 0x52, 0xfa, 0x7c, 0x23, 0xa3, 0x65,
+ 0xf5, 0x85, 0x46, 0x46, 0x5b, 0xd4, 0xb5, 0x46, 0x46, 0xcb, 0xe9, 0xd0, 0xc8, 0x68, 0x05, 0xbd,
+ 0xd8, 0xc8, 0x68, 0x45, 0x5d, 0x6f, 0x64, 0x34, 0x5d, 0x5f, 0x69, 0x64, 0xb4, 0x33, 0xfa, 0x6a,
+ 0x63, 0x41, 0xfb, 0xe6, 0x40, 0xff, 0xe1, 0xa0, 0xb2, 0x0e, 0xf0, 0x59, 0xe4, 0x71, 0x5a, 0x23,
+ 0xdc, 0x6e, 0x9f, 0xe4, 0x40, 0xe5, 0x2e, 0x2c, 0xed, 0x05, 0xae, 0x67, 0x13, 0xff, 0xd3, 0x70,
+ 0x2f, 0x70, 0xd1, 0x36, 0xa4, 0x83, 0x50, 0x90, 0xba, 0x18, 0x17, 0xef, 0x9c, 0x96, 0xe7, 0x91,
+ 0xaa, 0x4a, 0xb3, 0xd0, 0xad, 0x7c, 0xbf, 0x00, 0x79, 0x4c, 0x1e, 0xf2, 0x7a, 0xd0, 0xed, 0x92,
+ 0x9e, 0x83, 0x2e, 0x42, 0xb1, 0x4b, 0x9e, 0xa8, 0x94, 0x7b, 0x3d, 0x87, 0x3e, 0x91, 0xb4, 0x91,
+ 0xc1, 0xcb, 0x5d, 0xf2, 0x44, 0x66, 0x63, 0x57, 0x08, 0xd1, 0x21, 0xfc, 0x6b, 0xa2, 0x53, 0x47,
+ 0xef, 0x46, 0xa9, 0x27, 0x67, 0x5b, 0x7e, 0xd3, 0x38, 0x61, 0x7e, 0xc5, 0x84, 0x71, 0x7e, 0xac,
+ 0x7a, 0x47, 0x69, 0xca, 0x0d, 0x34, 0x80, 0xf3, 0xd3, 0x50, 0x16, 0x13, 0xe4, 0xd2, 0xb3, 0xa9,
+ 0xe4, 0x9c, 0x74, 0xed, 0xe3, 0xd7, 0xc3, 0xf2, 0x95, 0xb7, 0x1a, 0x01, 0x12, 0xb8, 0xa9, 0x50,
+ 0xf0, 0xd9, 0x70, 0xd2, 0x5e, 0x22, 0x46, 0x8f, 0xe0, 0x5c, 0x34, 0xea, 0x38, 0x8b, 0x0e, 0x88,
+ 0x6f, 0x45, 0xb2, 0xe7, 0x64, 0x4f, 0xe7, 0x37, 0x3f, 0xfc, 0x4b, 0x0d, 0xab, 0xe2, 0xbc, 0x1a,
+ 0x9d, 0x34, 0x18, 0xf6, 0x20, 0xff, 0x58, 0x64, 0xdb, 0x6a, 0x89, 0x74, 0x1b, 0x85, 0x19, 0xe7,
+ 0xd1, 0xb8, 0x42, 0x30, 0x3c, 0x1e, 0x57, 0x4b, 0x13, 0x0a, 0x7e, 0x9c, 0x5e, 0x2b, 0x08, 0x05,
+ 0x25, 0x19, 0xc5, 0x19, 0xe7, 0xcd, 0x64, 0x41, 0xe1, 0x25, 0x7f, 0xb2, 0xbc, 0x1e, 0x00, 0xf0,
+ 0x88, 0xd8, 0xd4, 0x92, 0x85, 0xa8, 0xcb, 0x2a, 0xbb, 0x7a, 0x7a, 0x24, 0xc6, 0xd5, 0x64, 0x1e,
+ 0x0a, 0xf5, 0x1d, 0xc2, 0xc9, 0x8d, 0x1e, 0x8f, 0x8e, 0x70, 0x8e, 0x27, 0xdf, 0xe8, 0x00, 0x74,
+ 0xdb, 0x0f, 0x18, 0x75, 0xac, 0xf1, 0xcc, 0x58, 0x99, 0x7d, 0x66, 0x14, 0x63, 0xe5, 0x91, 0x78,
+ 0xed, 0x1a, 0x14, 0xa6, 0x8d, 0x21, 0x1d, 0xd2, 0xc9, 0x5b, 0x24, 0x87, 0xc5, 0x52, 0xbc, 0x82,
+ 0x06, 0xc4, 0xef, 0xc7, 0xb3, 0x38, 0x87, 0xe3, 0x8f, 0x2b, 0xf3, 0x1f, 0x89, 0x96, 0x4d, 0xeb,
+ 0x99, 0x51, 0xe3, 0xce, 0xeb, 0xe9, 0xb8, 0x29, 0x7f, 0x3c, 0xa8, 0x5c, 0x85, 0x95, 0x89, 0x0b,
+ 0xdd, 0x0c, 0x02, 0x4e, 0xa3, 0x59, 0x9b, 0xa4, 0xe2, 0xc2, 0xd9, 0xfa, 0xb4, 0x9f, 0x0a, 0xe0,
+ 0x1f, 0xbe, 0x7d, 0xed, 0xd2, 0xb3, 0x97, 0xa5, 0xb9, 0x67, 0xc7, 0xa5, 0xd4, 0xf3, 0xe3, 0x52,
+ 0xea, 0xc5, 0x71, 0x29, 0xf5, 0xeb, 0x71, 0x29, 0xf5, 0xf5, 0xab, 0xd2, 0xdc, 0xf3, 0x57, 0xa5,
+ 0xb9, 0x17, 0xaf, 0x4a, 0x73, 0x0f, 0x60, 0xfc, 0x83, 0xd4, 0x5a, 0x90, 0xff, 0x3a, 0x5b, 0xbf,
+ 0x07, 0x00, 0x00, 0xff, 0xff, 0x38, 0xb4, 0xb7, 0xb4, 0x06, 0x0e, 0x00, 0x00,
}
diff --git a/pkg/kv/kvserver/kvserverpb/proposer_kv.proto b/pkg/kv/kvserver/kvserverpb/proposer_kv.proto
index 3267b2a7b4a8..249b4e45ca58 100644
--- a/pkg/kv/kvserver/kvserverpb/proposer_kv.proto
+++ b/pkg/kv/kvserver/kvserverpb/proposer_kv.proto
@@ -240,8 +240,24 @@ message RaftCommand {
// been added after it, and on removal, the assignment counters must be
// updated accordingly. Managing retry of proposals becomes trickier as
// well as that uproots whatever ordering was originally envisioned.
+ //
+ // This field is set through RaftCommandFooter hackery.
uint64 max_lease_index = 4;
+ // The closed timestamp carried by this command. Once a follower is told to
+ // apply this command, it knows that there will be no further writes at
+ // timestamps <= closed_timestamp. Note that the command itself might
+ // represent a write at a lower timestamp, so the closed timestamp can only be
+ // used after this command is applied.
+ //
+ // The field can be zero, which is to be interpreted as no closed timestamp
+ // update. Some commands (lease requests) implicitly carry a closed timestamp
+ // in a command-specific way. If the value is not zero, the value is greater
+ // or equal to that of the previous commands (and all before it).
+ //
+ // This field is set through ClosedTimestampFooter hackery.
+ util.hlc.Timestamp closed_timestamp = 17 [(gogoproto.nullable) = false];
+
reserved 3;
// Proposer-evaluated KV mode.
@@ -277,3 +293,10 @@ message RaftCommand {
message RaftCommandFooter {
uint64 max_lease_index = 4;
}
+
+// ClosedTimestampFooter is similar to RaftCommandFooter, allowing the proposal
+// buffer to fill in the closed_timestamp field after most of the proto has been
+// marshaled already.
+message ClosedTimestampFooter {
+ util.hlc.Timestamp closed_timestamp = 17 [(gogoproto.nullable) = false];
+}
diff --git a/pkg/kv/kvserver/kvserverpb/state.pb.go b/pkg/kv/kvserver/kvserverpb/state.pb.go
index d33ed0c2ccae..b81a0c1f0d0d 100644
--- a/pkg/kv/kvserver/kvserverpb/state.pb.go
+++ b/pkg/kv/kvserver/kvserverpb/state.pb.go
@@ -102,13 +102,20 @@ type ReplicaState struct {
// [1]: migration.Manager
// [2]: PurgeOutdatedReplicas
Version *roachpb.Version `protobuf:"bytes,12,opt,name=version,proto3" json:"version,omitempty"`
+ // closed_timestamp is the largest timestamp that is known to have been
+ // closed. This means that the current leaseholder (if any) and any future
+ // leaseholder will not evaluate writes at or below this timestamp, and also
+ // that any in-flight commands that can still apply are writing at higher
+ // timestamps. Non-leaseholder replicas are free to serve "follower reads" at
+ // or below this timestamp.
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,13,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
}
func (m *ReplicaState) Reset() { *m = ReplicaState{} }
func (m *ReplicaState) String() string { return proto.CompactTextString(m) }
func (*ReplicaState) ProtoMessage() {}
func (*ReplicaState) Descriptor() ([]byte, []int) {
- return fileDescriptor_state_acd314f0f91777f8, []int{0}
+ return fileDescriptor_state_884b07f3590284d4, []int{0}
}
func (m *ReplicaState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -180,7 +187,7 @@ func (m *RangeInfo) Reset() { *m = RangeInfo{} }
func (m *RangeInfo) String() string { return proto.CompactTextString(m) }
func (*RangeInfo) ProtoMessage() {}
func (*RangeInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_state_acd314f0f91777f8, []int{1}
+ return fileDescriptor_state_884b07f3590284d4, []int{1}
}
func (m *RangeInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -216,7 +223,7 @@ func (m *RangeInfo_CTEntry) Reset() { *m = RangeInfo_CTEntry{} }
func (m *RangeInfo_CTEntry) String() string { return proto.CompactTextString(m) }
func (*RangeInfo_CTEntry) ProtoMessage() {}
func (*RangeInfo_CTEntry) Descriptor() ([]byte, []int) {
- return fileDescriptor_state_acd314f0f91777f8, []int{1, 0}
+ return fileDescriptor_state_884b07f3590284d4, []int{1, 0}
}
func (m *RangeInfo_CTEntry) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -252,7 +259,7 @@ func (m *LatchManagerInfo) Reset() { *m = LatchManagerInfo{} }
func (m *LatchManagerInfo) String() string { return proto.CompactTextString(m) }
func (*LatchManagerInfo) ProtoMessage() {}
func (*LatchManagerInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_state_acd314f0f91777f8, []int{2}
+ return fileDescriptor_state_884b07f3590284d4, []int{2}
}
func (m *LatchManagerInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -329,6 +336,9 @@ func (this *ReplicaState) Equal(that interface{}) bool {
if !this.Version.Equal(that1.Version) {
return false
}
+ if !this.ClosedTimestamp.Equal(&that1.ClosedTimestamp) {
+ return false
+ }
return true
}
func (this *RangeInfo) Equal(that interface{}) bool {
@@ -530,6 +540,14 @@ func (m *ReplicaState) MarshalTo(dAtA []byte) (int, error) {
}
i += n6
}
+ dAtA[i] = 0x6a
+ i++
+ i = encodeVarintState(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n7, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n7
return i, nil
}
@@ -551,11 +569,11 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintState(dAtA, i, uint64(m.ReplicaState.Size()))
- n7, err := m.ReplicaState.MarshalTo(dAtA[i:])
+ n8, err := m.ReplicaState.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n7
+ i += n8
if m.LastIndex != 0 {
dAtA[i] = 0x10
i++
@@ -599,19 +617,19 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x5a
i++
i = encodeVarintState(dAtA, i, uint64(m.NewestClosedTimestamp.Size()))
- n8, err := m.NewestClosedTimestamp.MarshalTo(dAtA[i:])
+ n9, err := m.NewestClosedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n8
+ i += n9
dAtA[i] = 0x62
i++
i = encodeVarintState(dAtA, i, uint64(m.ActiveClosedTimestamp.Size()))
- n9, err := m.ActiveClosedTimestamp.MarshalTo(dAtA[i:])
+ n10, err := m.ActiveClosedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n9
+ i += n10
if m.RangefeedRegistrations != 0 {
dAtA[i] = 0x68
i++
@@ -623,22 +641,22 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintState(dAtA, i, uint64(m.ProposalQuotaBaseIndex))
}
if len(m.ProposalQuotaReleaseQueue) > 0 {
- dAtA11 := make([]byte, len(m.ProposalQuotaReleaseQueue)*10)
- var j10 int
+ dAtA12 := make([]byte, len(m.ProposalQuotaReleaseQueue)*10)
+ var j11 int
for _, num1 := range m.ProposalQuotaReleaseQueue {
num := uint64(num1)
for num >= 1<<7 {
- dAtA11[j10] = uint8(uint64(num)&0x7f | 0x80)
+ dAtA12[j11] = uint8(uint64(num)&0x7f | 0x80)
num >>= 7
- j10++
+ j11++
}
- dAtA11[j10] = uint8(num)
- j10++
+ dAtA12[j11] = uint8(num)
+ j11++
}
dAtA[i] = 0x7a
i++
- i = encodeVarintState(dAtA, i, uint64(j10))
- i += copy(dAtA[i:], dAtA11[:j10])
+ i = encodeVarintState(dAtA, i, uint64(j11))
+ i += copy(dAtA[i:], dAtA12[:j11])
}
if m.TenantID != 0 {
dAtA[i] = 0x80
@@ -681,11 +699,11 @@ func (m *RangeInfo_CTEntry) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintState(dAtA, i, uint64(m.ClosedTimestamp.Size()))
- n12, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ n13, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n12
+ i += n13
if m.MLAI != 0 {
dAtA[i] = 0x18
i++
@@ -775,6 +793,8 @@ func (m *ReplicaState) Size() (n int) {
l = m.Version.Size()
n += 1 + l + sovState(uint64(l))
}
+ l = m.ClosedTimestamp.Size()
+ n += 1 + l + sovState(uint64(l))
return n
}
@@ -1167,6 +1187,36 @@ func (m *ReplicaState) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 13:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowState
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthState
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipState(dAtA[iNdEx:])
@@ -1952,76 +2002,76 @@ var (
)
func init() {
- proto.RegisterFile("kv/kvserver/kvserverpb/state.proto", fileDescriptor_state_acd314f0f91777f8)
+ proto.RegisterFile("kv/kvserver/kvserverpb/state.proto", fileDescriptor_state_884b07f3590284d4)
}
-var fileDescriptor_state_acd314f0f91777f8 = []byte{
- // 1061 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xcd, 0x6e, 0x1b, 0x37,
- 0x10, 0xf6, 0x5a, 0x2b, 0x5b, 0xa2, 0xec, 0x58, 0x61, 0x9d, 0x78, 0xe3, 0xc4, 0x92, 0x21, 0xa0,
- 0x85, 0x0b, 0xa4, 0x2b, 0xd4, 0xe9, 0x0f, 0xfa, 0x03, 0x14, 0x96, 0x5c, 0x14, 0x72, 0x6d, 0x23,
- 0x66, 0x84, 0x1c, 0xd2, 0xc3, 0x82, 0xda, 0x1d, 0xaf, 0x16, 0x5a, 0x2d, 0x37, 0x24, 0xa5, 0xd8,
- 0x79, 0x8a, 0x3e, 0x42, 0x5f, 0xa3, 0x6f, 0x60, 0xf4, 0xe4, 0x63, 0x4e, 0x42, 0x2b, 0x5f, 0x7a,
- 0xeb, 0xbd, 0xa7, 0x80, 0xa4, 0x56, 0x96, 0x6c, 0x03, 0xc9, 0x8d, 0xfb, 0x7d, 0xdf, 0x0c, 0xc9,
- 0xf9, 0x86, 0xb3, 0xa8, 0xd6, 0x1b, 0xd6, 0x7b, 0x43, 0x01, 0x7c, 0x08, 0x7c, 0xba, 0x48, 0x3b,
- 0x75, 0x21, 0xa9, 0x04, 0x37, 0xe5, 0x4c, 0x32, 0x5c, 0xf5, 0x99, 0xdf, 0xe3, 0x8c, 0xfa, 0x5d,
- 0xb7, 0x37, 0x74, 0x33, 0x91, 0x2b, 0x24, 0xe3, 0x34, 0x84, 0xb4, 0xb3, 0xf9, 0x78, 0xb2, 0xac,
- 0x43, 0x12, 0x46, 0x09, 0xa4, 0x9d, 0x7a, 0x7f, 0xe8, 0xfb, 0x26, 0x7a, 0xf3, 0xb1, 0x8e, 0x4c,
- 0x3b, 0xf5, 0x28, 0x91, 0xc0, 0x13, 0x1a, 0x7b, 0x9c, 0x9e, 0xca, 0x09, 0xf9, 0x30, 0x23, 0xfb,
- 0x20, 0x69, 0x40, 0x25, 0x9d, 0xe0, 0x38, 0xc3, 0x67, 0x30, 0x67, 0x20, 0xa3, 0xb8, 0xde, 0x8d,
- 0xfd, 0xba, 0x8c, 0xfa, 0x20, 0x24, 0xed, 0xa7, 0x13, 0x66, 0x3d, 0x64, 0x21, 0xd3, 0xcb, 0xba,
- 0x5a, 0x19, 0xb4, 0xf6, 0xa7, 0x8d, 0x56, 0x08, 0xa4, 0x71, 0xe4, 0xd3, 0x17, 0xea, 0x36, 0xf8,
- 0x29, 0xc2, 0x6a, 0x6b, 0x8f, 0xa6, 0x69, 0x1c, 0x41, 0xe0, 0x45, 0x49, 0x00, 0x67, 0x8e, 0xb5,
- 0x6d, 0xed, 0xd8, 0xa4, 0xac, 0x98, 0x3d, 0x43, 0xb4, 0x14, 0x8e, 0x5d, 0xf4, 0x49, 0x0c, 0x54,
- 0xc0, 0x0d, 0xf9, 0xa2, 0x96, 0xdf, 0xd7, 0xd4, 0x9c, 0xfe, 0x1b, 0x64, 0x07, 0x20, 0x7c, 0x27,
- 0xb7, 0x6d, 0xed, 0x94, 0x76, 0x6b, 0xee, 0x75, 0xd1, 0x26, 0x77, 0x71, 0x09, 0x4d, 0x42, 0xd8,
- 0x07, 0xe1, 0xf3, 0x28, 0x95, 0x8c, 0x13, 0xad, 0xc7, 0x2e, 0xca, 0xeb, 0x64, 0x8e, 0xad, 0x03,
- 0x9d, 0x3b, 0x02, 0x0f, 0x15, 0x4f, 0x8c, 0x0c, 0x1f, 0xa3, 0x35, 0xc9, 0x07, 0x89, 0x4f, 0x25,
- 0x04, 0x9e, 0xb6, 0xc9, 0xc9, 0xeb, 0xc8, 0x4f, 0xef, 0xdc, 0xf2, 0x54, 0xb6, 0x33, 0xb5, 0xae,
- 0x02, 0xb9, 0x27, 0xe7, 0xbe, 0xf1, 0x09, 0x5a, 0x09, 0x7d, 0x4f, 0x76, 0x39, 0x88, 0x2e, 0x8b,
- 0x03, 0x67, 0x49, 0x27, 0xdb, 0x9a, 0x49, 0xa6, 0xea, 0xee, 0x76, 0x63, 0xdf, 0x6d, 0x67, 0x75,
- 0x6f, 0xac, 0x8d, 0x47, 0xd5, 0xd2, 0x2f, 0xcd, 0x76, 0x16, 0x45, 0x4a, 0xa1, 0x3f, 0xfd, 0xc0,
- 0x3f, 0xa0, 0xbc, 0x3a, 0x98, 0x70, 0x96, 0x6f, 0x1d, 0x6c, 0xd2, 0x29, 0x6e, 0xd6, 0x29, 0xee,
- 0xd1, 0xcb, 0x66, 0x53, 0x1d, 0x44, 0x10, 0x13, 0x83, 0xbf, 0x46, 0x1b, 0x03, 0x11, 0x25, 0xe1,
- 0xb4, 0xee, 0xfa, 0x8e, 0x5e, 0x0f, 0xce, 0x9d, 0xd2, 0xb6, 0xb5, 0x53, 0x20, 0xeb, 0x9a, 0x9e,
- 0xd4, 0x5e, 0xdf, 0xe1, 0x57, 0x38, 0xc7, 0x5f, 0xa1, 0xe5, 0x21, 0x70, 0x11, 0xb1, 0xc4, 0x59,
- 0xd1, 0xbb, 0x6e, 0xde, 0x51, 0x8e, 0x97, 0x46, 0x41, 0x32, 0xe9, 0xf7, 0xf6, 0xbf, 0x7f, 0x54,
- 0xad, 0x03, 0xbb, 0x50, 0x28, 0x17, 0x0f, 0xec, 0x42, 0xb1, 0x8c, 0x0e, 0xec, 0x02, 0x2a, 0x97,
- 0x6a, 0x7f, 0x15, 0x50, 0x51, 0xdb, 0xd5, 0x4a, 0x4e, 0x19, 0x3e, 0x32, 0xf7, 0x01, 0xdd, 0x2b,
- 0xa5, 0xdd, 0x2f, 0xdc, 0x0f, 0x3c, 0x08, 0x77, 0xb6, 0xed, 0x1a, 0x85, 0x8b, 0x51, 0x75, 0xe1,
- 0x72, 0x54, 0xb5, 0xcc, 0x0d, 0x01, 0x6f, 0x21, 0x14, 0x53, 0x21, 0xe7, 0x1a, 0xaa, 0xa8, 0x10,
- 0xd3, 0x48, 0x55, 0x54, 0x4a, 0x06, 0x7d, 0x2f, 0x85, 0x24, 0x88, 0x92, 0x50, 0xf7, 0x93, 0x4d,
- 0x50, 0x32, 0xe8, 0x3f, 0x37, 0x48, 0x26, 0x08, 0x38, 0x4b, 0x53, 0x08, 0xb4, 0xfb, 0x46, 0xb0,
- 0x6f, 0x10, 0x5c, 0x43, 0xab, 0xba, 0xd1, 0x63, 0x16, 0x7a, 0x22, 0x7a, 0x0b, 0xda, 0xd3, 0x1c,
- 0x29, 0x29, 0xf0, 0x90, 0x85, 0x2f, 0xa2, 0xb7, 0x80, 0x7f, 0x44, 0x9b, 0x34, 0x4d, 0x39, 0x3b,
- 0x8b, 0xfa, 0xaa, 0xbc, 0x29, 0x67, 0x29, 0x13, 0x34, 0xf6, 0x5e, 0x0f, 0x98, 0xa4, 0xda, 0xb8,
- 0x1c, 0x71, 0x66, 0x14, 0xcf, 0x27, 0x82, 0x13, 0xc5, 0xe3, 0xcf, 0xd0, 0x1a, 0x57, 0xe5, 0xf1,
- 0xfa, 0xf4, 0xcc, 0xeb, 0x9c, 0x4b, 0x10, 0x4e, 0x41, 0x87, 0xac, 0x6a, 0xf8, 0x88, 0x9e, 0x35,
- 0x14, 0x88, 0xbf, 0x44, 0x0f, 0xe6, 0x4e, 0xe2, 0x49, 0x3e, 0x10, 0x12, 0x02, 0x07, 0x69, 0x2b,
- 0xf1, 0xcc, 0x89, 0xda, 0x86, 0xc1, 0x29, 0xda, 0x48, 0xe0, 0x0d, 0x08, 0xe9, 0xf9, 0x31, 0x13,
- 0x10, 0x78, 0xd3, 0xd7, 0xae, 0xfd, 0x2f, 0xed, 0xee, 0x7e, 0xb8, 0xfc, 0x99, 0x73, 0x6e, 0xb3,
- 0xfd, 0x73, 0x22, 0xf9, 0x79, 0xc3, 0x56, 0x1e, 0x90, 0x07, 0x26, 0x71, 0x53, 0xe7, 0x9d, 0x36,
- 0x33, 0xfe, 0x0d, 0x6d, 0x50, 0x5f, 0x46, 0x43, 0xb8, 0xbd, 0xe3, 0xca, 0xc7, 0x3c, 0x86, 0x49,
- 0x72, 0x93, 0xe3, 0x66, 0xf2, 0x6f, 0xd1, 0x86, 0x2e, 0xc9, 0x29, 0x40, 0xe0, 0x71, 0x08, 0x23,
- 0x21, 0x39, 0x95, 0x11, 0x4b, 0x84, 0xb3, 0xaa, 0x2b, 0xf6, 0x70, 0x4a, 0x93, 0x59, 0x16, 0x7f,
- 0x87, 0x1e, 0xcd, 0x9b, 0xe2, 0x75, 0xd4, 0x34, 0x32, 0x4d, 0x73, 0xcf, 0x84, 0xa6, 0xb3, 0xa6,
- 0x34, 0xa8, 0x00, 0xd3, 0x41, 0x3f, 0xa1, 0x27, 0x37, 0x42, 0x39, 0x98, 0x59, 0xf6, 0x7a, 0x00,
- 0x03, 0x70, 0xd6, 0xb6, 0x73, 0x3b, 0x39, 0xf2, 0x68, 0x2e, 0x9a, 0x18, 0xc5, 0x89, 0x12, 0xe0,
- 0xcf, 0x51, 0x51, 0x42, 0x42, 0x13, 0xe9, 0x45, 0x81, 0x53, 0x56, 0xfd, 0xd5, 0x58, 0x19, 0x8f,
- 0xaa, 0x85, 0xb6, 0x06, 0x5b, 0xfb, 0xa4, 0x60, 0xe8, 0x56, 0xa0, 0x9b, 0x99, 0xf9, 0x3d, 0x4f,
- 0xd2, 0x4e, 0x0c, 0xce, 0xfd, 0x6d, 0x6b, 0xa7, 0x48, 0x8a, 0x0a, 0x69, 0x2b, 0x60, 0xf3, 0x3f,
- 0x0b, 0x2d, 0x4f, 0x4c, 0xc0, 0xaf, 0xd0, 0x72, 0xc2, 0x02, 0x50, 0x39, 0xd5, 0x43, 0xca, 0x37,
- 0xf6, 0xc6, 0xa3, 0xea, 0xd2, 0x31, 0x0b, 0xa0, 0xb5, 0xff, 0xff, 0xa8, 0xfa, 0x2c, 0x8c, 0x64,
- 0x77, 0xd0, 0x71, 0x7d, 0xd6, 0xaf, 0x4f, 0xeb, 0x1d, 0x74, 0xae, 0xd7, 0xf5, 0xb4, 0x17, 0xd6,
- 0xb3, 0xa7, 0x6c, 0xc2, 0xc8, 0x92, 0xca, 0xd8, 0x0a, 0xf0, 0x31, 0x2a, 0xdf, 0x32, 0x6f, 0xf1,
- 0xe3, 0xcd, 0x5b, 0xf3, 0x6f, 0xd8, 0xf6, 0x04, 0xd9, 0xfd, 0x98, 0x46, 0xfa, 0xf5, 0xe5, 0x1a,
- 0x85, 0xf1, 0xa8, 0x6a, 0x1f, 0x1d, 0xee, 0xb5, 0x88, 0x46, 0xf1, 0x3a, 0xca, 0x43, 0xca, 0xfc,
- 0xae, 0x9e, 0xd9, 0x39, 0x62, 0x3e, 0xcc, 0x30, 0x99, 0x8e, 0x14, 0xbb, 0x9c, 0x37, 0x23, 0xa5,
- 0x46, 0x50, 0xf9, 0x90, 0x4a, 0xbf, 0x7b, 0x44, 0x13, 0x1a, 0x02, 0xd7, 0x23, 0x65, 0x0b, 0x21,
- 0x0e, 0x34, 0xf0, 0x7c, 0x36, 0x48, 0xa4, 0x2e, 0x47, 0x8e, 0x14, 0x15, 0xd2, 0x54, 0x80, 0x7a,
- 0xe2, 0x6f, 0x78, 0x24, 0x61, 0xc2, 0x2f, 0x6a, 0x1e, 0x69, 0x48, 0x0b, 0x1a, 0x4f, 0x2f, 0xfe,
- 0xa9, 0x2c, 0x5c, 0x8c, 0x2b, 0xd6, 0xe5, 0xb8, 0x62, 0xbd, 0x1b, 0x57, 0xac, 0xbf, 0xc7, 0x15,
- 0xeb, 0xf7, 0xab, 0xca, 0xc2, 0xe5, 0x55, 0x65, 0xe1, 0xdd, 0x55, 0x65, 0xe1, 0x15, 0xba, 0xfe,
- 0x9b, 0x77, 0x96, 0xf4, 0x1f, 0xf1, 0xd9, 0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x8a, 0xae,
- 0x49, 0xee, 0x07, 0x00, 0x00,
+var fileDescriptor_state_884b07f3590284d4 = []byte{
+ // 1068 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcf, 0x4f, 0x1b, 0x47,
+ 0x14, 0x66, 0xe3, 0x35, 0xd8, 0x63, 0x08, 0xce, 0x14, 0xc2, 0x86, 0x04, 0x1b, 0x59, 0x6a, 0x45,
+ 0xa5, 0x74, 0xad, 0x92, 0xfe, 0x50, 0x7f, 0x48, 0x15, 0x36, 0x55, 0x65, 0x0a, 0x28, 0x4c, 0xac,
+ 0x1c, 0xd2, 0xc3, 0x6a, 0xbc, 0xfb, 0x58, 0xaf, 0xbc, 0xde, 0xd9, 0xcc, 0x8c, 0x1d, 0xc8, 0x7f,
+ 0xd0, 0x5b, 0xff, 0x84, 0xfe, 0x39, 0xa8, 0x27, 0x8e, 0x39, 0x59, 0xad, 0xb9, 0xf4, 0xd6, 0x7b,
+ 0x4f, 0xd5, 0xcc, 0x78, 0x8d, 0x0d, 0x48, 0x89, 0x7a, 0x9b, 0xfd, 0xde, 0xf7, 0xde, 0xcc, 0x7c,
+ 0xef, 0x9b, 0x67, 0xa3, 0x5a, 0x6f, 0x58, 0xef, 0x0d, 0x05, 0xf0, 0x21, 0xf0, 0xe9, 0x22, 0xed,
+ 0xd4, 0x85, 0xa4, 0x12, 0xdc, 0x94, 0x33, 0xc9, 0x70, 0xd5, 0x67, 0x7e, 0x8f, 0x33, 0xea, 0x77,
+ 0xdd, 0xde, 0xd0, 0xcd, 0x48, 0xae, 0x90, 0x8c, 0xd3, 0x10, 0xd2, 0xce, 0xe6, 0xe3, 0xc9, 0xb2,
+ 0x0e, 0x49, 0x18, 0x25, 0x90, 0x76, 0xea, 0xfd, 0xa1, 0xef, 0x9b, 0xec, 0xcd, 0xc7, 0x3a, 0x33,
+ 0xed, 0xd4, 0xa3, 0x44, 0x02, 0x4f, 0x68, 0xec, 0x71, 0x7a, 0x2a, 0x27, 0xc1, 0x87, 0x59, 0xb0,
+ 0x0f, 0x92, 0x06, 0x54, 0xd2, 0x09, 0x8e, 0x33, 0x7c, 0x06, 0x73, 0x06, 0x32, 0x8a, 0xeb, 0xdd,
+ 0xd8, 0xaf, 0xcb, 0xa8, 0x0f, 0x42, 0xd2, 0x7e, 0x3a, 0x89, 0xac, 0x85, 0x2c, 0x64, 0x7a, 0x59,
+ 0x57, 0x2b, 0x83, 0xd6, 0x7e, 0xcd, 0xa3, 0x65, 0x02, 0x69, 0x1c, 0xf9, 0xf4, 0x85, 0xba, 0x0d,
+ 0x7e, 0x8a, 0xb0, 0xda, 0xda, 0xa3, 0x69, 0x1a, 0x47, 0x10, 0x78, 0x51, 0x12, 0xc0, 0x99, 0x63,
+ 0x6d, 0x5b, 0x3b, 0x36, 0x29, 0xab, 0xc8, 0x9e, 0x09, 0xb4, 0x14, 0x8e, 0x5d, 0xf4, 0x51, 0x0c,
+ 0x54, 0xc0, 0x0d, 0xfa, 0x3d, 0x4d, 0x7f, 0xa0, 0x43, 0x73, 0xfc, 0xaf, 0x90, 0x1d, 0x80, 0xf0,
+ 0x9d, 0xdc, 0xb6, 0xb5, 0x53, 0xda, 0xad, 0xb9, 0xd7, 0xa2, 0x4d, 0xee, 0xe2, 0x12, 0x9a, 0x84,
+ 0xb0, 0x0f, 0xc2, 0xe7, 0x51, 0x2a, 0x19, 0x27, 0x9a, 0x8f, 0x5d, 0x94, 0xd7, 0xc5, 0x1c, 0x5b,
+ 0x27, 0x3a, 0x77, 0x24, 0x1e, 0xaa, 0x38, 0x31, 0x34, 0x7c, 0x8c, 0x56, 0x25, 0x1f, 0x24, 0x3e,
+ 0x95, 0x10, 0x78, 0xba, 0x4d, 0x4e, 0x5e, 0x67, 0x7e, 0x7c, 0xe7, 0x96, 0xa7, 0xb2, 0x9d, 0xb1,
+ 0xb5, 0x0a, 0xe4, 0xbe, 0x9c, 0xfb, 0xc6, 0x27, 0x68, 0x39, 0xf4, 0x3d, 0xd9, 0xe5, 0x20, 0xba,
+ 0x2c, 0x0e, 0x9c, 0x45, 0x5d, 0x6c, 0x6b, 0xa6, 0x98, 0xd2, 0xdd, 0xed, 0xc6, 0xbe, 0xdb, 0xce,
+ 0x74, 0x6f, 0xac, 0x8e, 0x47, 0xd5, 0xd2, 0x4f, 0xcd, 0x76, 0x96, 0x45, 0x4a, 0xa1, 0x3f, 0xfd,
+ 0xc0, 0xdf, 0xa1, 0xbc, 0x3a, 0x98, 0x70, 0x96, 0x6e, 0x1d, 0x6c, 0xe2, 0x14, 0x37, 0x73, 0x8a,
+ 0x7b, 0xf4, 0xb2, 0xd9, 0x54, 0x07, 0x11, 0xc4, 0xe4, 0xe0, 0x2f, 0xd1, 0xc6, 0x40, 0x44, 0x49,
+ 0x38, 0xd5, 0x5d, 0xdf, 0xd1, 0xeb, 0xc1, 0xb9, 0x53, 0xda, 0xb6, 0x76, 0x0a, 0x64, 0x4d, 0x87,
+ 0x27, 0xda, 0xeb, 0x3b, 0xfc, 0x0c, 0xe7, 0xf8, 0x0b, 0xb4, 0x34, 0x04, 0x2e, 0x22, 0x96, 0x38,
+ 0xcb, 0x7a, 0xd7, 0xcd, 0x3b, 0xe4, 0x78, 0x69, 0x18, 0x24, 0xa3, 0xe2, 0x63, 0x54, 0xf6, 0x63,
+ 0x26, 0x20, 0xf0, 0xa6, 0x9e, 0x72, 0x56, 0x3e, 0x44, 0x00, 0xfb, 0x62, 0x54, 0x5d, 0x20, 0xab,
+ 0x26, 0x79, 0x0a, 0x7f, 0x6b, 0xff, 0xfd, 0x7b, 0xd5, 0x3a, 0xb0, 0x0b, 0x85, 0x72, 0xf1, 0xc0,
+ 0x2e, 0x14, 0xcb, 0xe8, 0xc0, 0x2e, 0xa0, 0x72, 0xa9, 0xf6, 0x47, 0x01, 0x15, 0x75, 0xfb, 0x5b,
+ 0xc9, 0x29, 0xc3, 0x47, 0x46, 0x1f, 0xd0, 0xde, 0x2b, 0xed, 0x7e, 0xe6, 0xbe, 0xe7, 0x81, 0xb9,
+ 0xb3, 0x36, 0x6e, 0x14, 0xd4, 0xd6, 0x97, 0xa3, 0xaa, 0x65, 0x14, 0x03, 0xbc, 0x85, 0x50, 0x4c,
+ 0x85, 0x9c, 0x33, 0x68, 0x51, 0x21, 0xc6, 0x98, 0x55, 0x54, 0x4a, 0x06, 0x7d, 0x2f, 0x85, 0x24,
+ 0x88, 0x92, 0x50, 0xfb, 0xd3, 0x26, 0x28, 0x19, 0xf4, 0x9f, 0x1b, 0x24, 0x23, 0x04, 0x9c, 0xa5,
+ 0x29, 0x04, 0xda, 0x4d, 0x86, 0xb0, 0x6f, 0x10, 0x5c, 0x43, 0x2b, 0xfa, 0xe1, 0xc4, 0x2c, 0xf4,
+ 0x44, 0xf4, 0x16, 0xb4, 0x47, 0x72, 0xa4, 0xa4, 0xc0, 0x43, 0x16, 0xbe, 0x88, 0xde, 0x02, 0xfe,
+ 0x1e, 0x6d, 0xd2, 0x34, 0xe5, 0xec, 0x2c, 0xea, 0xab, 0x76, 0xa5, 0x9c, 0xa5, 0x4c, 0xd0, 0xd8,
+ 0x7b, 0x3d, 0x60, 0x92, 0x6a, 0x23, 0xe4, 0x88, 0x33, 0xc3, 0x78, 0x3e, 0x21, 0x9c, 0xa8, 0x38,
+ 0xfe, 0x04, 0xad, 0x72, 0x25, 0x8f, 0xd7, 0xa7, 0x67, 0x5e, 0xe7, 0x5c, 0x82, 0x70, 0x0a, 0x3a,
+ 0x65, 0x45, 0xc3, 0x47, 0xf4, 0xac, 0xa1, 0x40, 0xfc, 0x39, 0x5a, 0x9f, 0x3b, 0x89, 0x27, 0xf9,
+ 0x40, 0x48, 0x08, 0x1c, 0xa4, 0xad, 0x81, 0x67, 0x4e, 0xd4, 0x36, 0x11, 0x9c, 0xa2, 0x8d, 0x04,
+ 0xde, 0x80, 0x90, 0xde, 0xad, 0x4e, 0x97, 0xb4, 0xfc, 0xbb, 0xef, 0x97, 0x3f, 0xeb, 0x9c, 0xdb,
+ 0x6c, 0xff, 0x98, 0x48, 0x7e, 0x3e, 0x69, 0xff, 0xba, 0x29, 0xdc, 0x9c, 0x37, 0x01, 0xfe, 0x05,
+ 0x6d, 0x50, 0x5f, 0x46, 0x43, 0xb8, 0xbd, 0xe3, 0xf2, 0x87, 0x7b, 0x6b, 0xdd, 0xd4, 0xb8, 0x59,
+ 0xfc, 0x6b, 0xb4, 0xa1, 0x25, 0x39, 0x05, 0x08, 0x3c, 0x0e, 0x61, 0x24, 0x24, 0xa7, 0x32, 0x62,
+ 0x89, 0xd0, 0xc6, 0xcd, 0x91, 0x87, 0xd3, 0x30, 0x99, 0x8d, 0xe2, 0x6f, 0xd0, 0xa3, 0xf9, 0xa6,
+ 0x78, 0x1d, 0x35, 0xdd, 0x8c, 0x69, 0xee, 0x9b, 0xd4, 0x74, 0xb6, 0x29, 0x0d, 0x2a, 0xc0, 0x38,
+ 0xe8, 0x07, 0xf4, 0xe4, 0x46, 0x2a, 0x07, 0x33, 0x1b, 0x5f, 0x0f, 0x60, 0x00, 0xce, 0xea, 0x76,
+ 0x6e, 0x27, 0x47, 0x1e, 0xcd, 0x65, 0x13, 0xc3, 0x38, 0x51, 0x04, 0xfc, 0x29, 0x2a, 0x4a, 0x48,
+ 0x68, 0x22, 0xbd, 0x28, 0x70, 0xca, 0xca, 0x5f, 0x8d, 0xe5, 0xf1, 0xa8, 0x5a, 0x68, 0x6b, 0xb0,
+ 0xb5, 0x4f, 0x0a, 0x26, 0xdc, 0x0a, 0xb4, 0x99, 0x99, 0xdf, 0xf3, 0x24, 0xed, 0xc4, 0xe0, 0x3c,
+ 0xd8, 0xb6, 0x76, 0x8a, 0xa4, 0xa8, 0x90, 0xb6, 0x02, 0x36, 0xff, 0xb1, 0xd0, 0xd2, 0xa4, 0x09,
+ 0xf8, 0x15, 0x5a, 0x4a, 0x58, 0x00, 0xaa, 0xa6, 0x7a, 0x48, 0xf9, 0xc6, 0xde, 0x78, 0x54, 0x5d,
+ 0x3c, 0x66, 0x01, 0xb4, 0xf6, 0xff, 0x1d, 0x55, 0x9f, 0x85, 0x91, 0xec, 0x0e, 0x3a, 0xae, 0xcf,
+ 0xfa, 0xf5, 0xa9, 0xde, 0x41, 0xe7, 0x7a, 0x5d, 0x4f, 0x7b, 0x61, 0x3d, 0x1b, 0x0d, 0x26, 0x8d,
+ 0x2c, 0xaa, 0x8a, 0xad, 0xe0, 0xce, 0xc1, 0x70, 0xef, 0xff, 0x0f, 0x06, 0xfc, 0x04, 0xd9, 0xfd,
+ 0x98, 0x46, 0xfa, 0xf5, 0xe5, 0x1a, 0x85, 0xf1, 0xa8, 0x6a, 0x1f, 0x1d, 0xee, 0xb5, 0x88, 0x46,
+ 0xf1, 0x1a, 0xca, 0x43, 0xca, 0xfc, 0xae, 0xfe, 0x0d, 0xc8, 0x11, 0xf3, 0x61, 0x86, 0xc9, 0x74,
+ 0xa4, 0xd8, 0xe5, 0xbc, 0x19, 0x29, 0x35, 0x82, 0xca, 0x87, 0x54, 0xfa, 0xdd, 0x23, 0x9a, 0xd0,
+ 0x10, 0xb8, 0x1e, 0x29, 0x5b, 0x08, 0x71, 0xa0, 0x81, 0xe7, 0xb3, 0x41, 0x22, 0xb5, 0x1c, 0x39,
+ 0x52, 0x54, 0x48, 0x53, 0x01, 0xea, 0x89, 0xbf, 0xe1, 0x91, 0x84, 0x49, 0xfc, 0x9e, 0x8e, 0x23,
+ 0x0d, 0x69, 0x42, 0xe3, 0xe9, 0xc5, 0x5f, 0x95, 0x85, 0x8b, 0x71, 0xc5, 0xba, 0x1c, 0x57, 0xac,
+ 0x77, 0xe3, 0x8a, 0xf5, 0xe7, 0xb8, 0x62, 0xfd, 0x76, 0x55, 0x59, 0xb8, 0xbc, 0xaa, 0x2c, 0xbc,
+ 0xbb, 0xaa, 0x2c, 0xbc, 0x42, 0xd7, 0xff, 0x0e, 0x3a, 0x8b, 0xfa, 0x17, 0xf6, 0xd9, 0x7f, 0x01,
+ 0x00, 0x00, 0xff, 0xff, 0x23, 0xeb, 0x99, 0xc3, 0x3e, 0x08, 0x00, 0x00,
}
diff --git a/pkg/kv/kvserver/kvserverpb/state.proto b/pkg/kv/kvserver/kvserverpb/state.proto
index f8288300aeac..45e07446177e 100644
--- a/pkg/kv/kvserver/kvserverpb/state.proto
+++ b/pkg/kv/kvserver/kvserverpb/state.proto
@@ -100,6 +100,14 @@ message ReplicaState {
// [2]: PurgeOutdatedReplicas
roachpb.Version version = 12;
+ // closed_timestamp is the largest timestamp that is known to have been
+ // closed. This means that the current leaseholder (if any) and any future
+ // leaseholder will not evaluate writes at or below this timestamp, and also
+ // that any in-flight commands that can still apply are writing at higher
+ // timestamps. Non-leaseholder replicas are free to serve "follower reads" at
+ // or below this timestamp.
+ util.hlc.Timestamp closed_timestamp = 13 [(gogoproto.nullable) = false];
+
reserved 8, 9, 10;
}
diff --git a/pkg/kv/kvserver/replica.go b/pkg/kv/kvserver/replica.go
index e602af9193b0..e73af5140919 100644
--- a/pkg/kv/kvserver/replica.go
+++ b/pkg/kv/kvserver/replica.go
@@ -360,6 +360,10 @@ type Replica struct {
// consumed, commands are proposed through Raft and moved to the
// proposals map.
//
+ // The propBuf is the one closing timestamps, so evaluating writes must be
+ // registered with the propBuf through TrackEvaluatingRequest before their
+ // write timestamp is decided.
+ //
// Access to proposalBuf must occur *without* holding the mutex.
// Instead, the buffer internally holds a reference to mu and will use
// it appropriately.
diff --git a/pkg/kv/kvserver/replica_application_result.go b/pkg/kv/kvserver/replica_application_result.go
index a2761aa41bbd..9477b8cc0cec 100644
--- a/pkg/kv/kvserver/replica_application_result.go
+++ b/pkg/kv/kvserver/replica_application_result.go
@@ -205,6 +205,16 @@ func (r *Replica) tryReproposeWithNewLeaseIndex(
minTS, untrack := r.store.cfg.ClosedTimestamp.Tracker.Track(ctx)
defer untrack(ctx, 0, 0, 0) // covers all error paths below
+
+ // We need to track the request again in order to protect its timestamp until
+ // it gets reproposed.
+ // TODO(andrei): Only track if the request consults the ts cache. Some
+ // requests (e.g. EndTxn) don't care about closed timestamps.
+ minTS2, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, p.Request.WriteTimestamp())
+ defer tok.DoneIfNotMoved(ctx)
+ minTS.Forward(minTS2)
+
+ // NB: p.Request.Timestamp reflects the action of ba.SetActiveTimestamp.
// The IsIntentWrite condition matches the similar logic for caring
// about the closed timestamp cache in applyTimestampCache().
if p.Request.IsIntentWrite() && p.Request.WriteTimestamp().LessEq(minTS) {
@@ -222,7 +232,7 @@ func (r *Replica) tryReproposeWithNewLeaseIndex(
// Some tests check for this log message in the trace.
log.VEventf(ctx, 2, "retry: proposalIllegalLeaseIndex")
- maxLeaseIndex, pErr := r.propose(ctx, p)
+ maxLeaseIndex, pErr := r.propose(ctx, p, tok.Move(ctx))
if pErr != nil {
return pErr
}
diff --git a/pkg/kv/kvserver/replica_application_state_machine.go b/pkg/kv/kvserver/replica_application_state_machine.go
index cfd7cef7a35b..7793ca520fdd 100644
--- a/pkg/kv/kvserver/replica_application_state_machine.go
+++ b/pkg/kv/kvserver/replica_application_state_machine.go
@@ -376,8 +376,10 @@ type replicaAppBatch struct {
// replicaState other than Stats are overwritten completely rather than
// updated in-place.
stats enginepb.MVCCStats
- // maxTS is the maximum clock timestamp that any command that was staged in
- // this batch was evaluated at.
+ // maxTS is the maximum clock timestamp that this command carries. Timestamps
+ // come from the writes that are part of this command, and also from the
+ // closed timestamp carried by this command. Synthetic timestamps are not
+ // registered here.
maxTS hlc.ClockTimestamp
// migrateToAppliedStateKey tracks whether any command in the batch
// triggered a migration to the replica applied state key. If so, this
@@ -428,7 +430,8 @@ func (b *replicaAppBatch) Stage(cmdI apply.Command) (apply.CheckedCommand, error
return nil, makeNonDeterministicFailure("applied index jumped from %d to %d", applied, idx)
}
if log.V(4) {
- log.Infof(ctx, "processing command %x: maxLeaseIndex=%d", cmd.idKey, cmd.raftCmd.MaxLeaseIndex)
+ log.Infof(ctx, "processing command %x: raftIndex=%d maxLeaseIndex=%d closedts=%s",
+ cmd.idKey, cmd.ent.Index, cmd.raftCmd.MaxLeaseIndex, cmd.raftCmd.ClosedTimestamp)
}
// Determine whether the command should be applied to the replicated state
@@ -442,7 +445,20 @@ func (b *replicaAppBatch) Stage(cmdI apply.Command) (apply.CheckedCommand, error
cmd.raftCmd.ReplicatedEvalResult = kvserverpb.ReplicatedEvalResult{}
cmd.raftCmd.WriteBatch = nil
cmd.raftCmd.LogicalOpLog = nil
+ cmd.raftCmd.ClosedTimestamp.Reset()
} else {
+ // Assert that we're not writing under the closed timestamp. We can only do
+ // these checks on IsIntentWrite requests, since others (for example,
+ // EndTxn) can operate below the closed timestamp. In turn, this means that
+ // we can only assert on the leaseholder, as only that replica has
+ // cmd.proposal.Request filled in.
+ if cmd.IsLocal() && cmd.proposal.Request.IsIntentWrite() {
+ wts := cmd.proposal.Request.WriteTimestamp()
+ if wts.LessEq(b.state.ClosedTimestamp) {
+ return nil, makeNonDeterministicFailure("writing at %s below closed ts: %s (%s)",
+ wts, b.state.ClosedTimestamp.String(), cmd.proposal.Request.String())
+ }
+ }
log.Event(ctx, "applying command")
}
@@ -623,7 +639,7 @@ func (b *replicaAppBatch) runPreApplyTriggersAfterStagingWriteBatch(
//
// Alternatively if we discover that the RHS has already been removed
// from this store, clean up its data.
- splitPreApply(ctx, b.batch, res.Split.SplitTrigger, b.r)
+ splitPreApply(ctx, b.batch, res.Split.SplitTrigger, b.r, cmd.raftCmd.ClosedTimestamp)
// The rangefeed processor will no longer be provided logical ops for
// its entire range, so it needs to be shut down and all registrations
@@ -807,6 +823,18 @@ func (b *replicaAppBatch) stageTrivialReplicatedEvalResult(
if leaseAppliedIndex := cmd.leaseIndex; leaseAppliedIndex != 0 {
b.state.LeaseAppliedIndex = leaseAppliedIndex
}
+ if cts := cmd.raftCmd.ClosedTimestamp; !cts.IsEmpty() {
+ if cts.Less(b.state.ClosedTimestamp) {
+ log.Fatalf(ctx,
+ "closed timestamp regressing from %s to %s when applying command %x",
+ b.state.ClosedTimestamp, cts, cmd.idKey)
+ }
+ b.state.ClosedTimestamp = cts
+ if clockTS, ok := cts.TryToClockTimestamp(); ok {
+ b.maxTS.Forward(clockTS)
+ }
+ }
+
res := cmd.replicatedResult()
// Special-cased MVCC stats handling to exploit commutativity of stats delta
@@ -860,10 +888,11 @@ func (b *replicaAppBatch) ApplyToStateMachine(ctx context.Context) error {
b.batch.Close()
b.batch = nil
- // Update the replica's applied indexes and mvcc stats.
+ // Update the replica's applied indexes, mvcc stats and closed timestamp.
r.mu.Lock()
r.mu.state.RaftAppliedIndex = b.state.RaftAppliedIndex
r.mu.state.LeaseAppliedIndex = b.state.LeaseAppliedIndex
+ closedTimestampUpdated := r.mu.state.ClosedTimestamp.Forward(b.state.ClosedTimestamp)
prevStats := *r.mu.state.Stats
*r.mu.state.Stats = *b.state.Stats
@@ -879,6 +908,13 @@ func (b *replicaAppBatch) ApplyToStateMachine(ctx context.Context) error {
needsTruncationByLogSize := r.needsRaftLogTruncationLocked()
tenantID := r.mu.tenantID
r.mu.Unlock()
+ if closedTimestampUpdated {
+ // TODO(andrei): Pass in the new closed timestamp to
+ // r.handleClosedTimestampUpdateRaftMuLocked directly after the old closed
+ // ts tracker goes away. Until then we can't do it; we have to let the
+ // method consult r.maxClosed().
+ r.handleClosedTimestampUpdateRaftMuLocked(ctx)
+ }
// Record the stats delta in the StoreMetrics.
deltaStats := *b.state.Stats
@@ -926,7 +962,8 @@ func (b *replicaAppBatch) addAppliedStateKeyToBatch(ctx context.Context) error {
// Set the range applied state, which includes the last applied raft and
// lease index along with the mvcc stats, all in one key.
if err := loader.SetRangeAppliedState(
- ctx, b.batch, b.state.RaftAppliedIndex, b.state.LeaseAppliedIndex, b.state.Stats,
+ ctx, b.batch, b.state.RaftAppliedIndex, b.state.LeaseAppliedIndex,
+ b.state.Stats, &b.state.ClosedTimestamp,
); err != nil {
return wrapWithNonDeterministicFailure(err, "unable to set range applied state")
}
diff --git a/pkg/kv/kvserver/replica_follower_read.go b/pkg/kv/kvserver/replica_follower_read.go
index cdc35c0b3778..2ebd11c4fd63 100644
--- a/pkg/kv/kvserver/replica_follower_read.go
+++ b/pkg/kv/kvserver/replica_follower_read.go
@@ -141,13 +141,19 @@ func (r *Replica) maxClosedRLocked(ctx context.Context) (_ hlc.Timestamp, ok boo
lai := r.mu.state.LeaseAppliedIndex
lease := *r.mu.state.Lease
initialMaxClosed := r.mu.initialMaxClosed
+ replicaStateClosed := r.mu.state.ClosedTimestamp
if lease.Expiration != nil {
return hlc.Timestamp{}, false
}
+ // Look at the legacy closed timestamp propagation mechanism.
maxClosed := r.store.cfg.ClosedTimestamp.Provider.MaxClosed(
lease.Replica.NodeID, r.RangeID, ctpb.Epoch(lease.Epoch), ctpb.LAI(lai))
maxClosed.Forward(lease.Start.ToTimestamp())
maxClosed.Forward(initialMaxClosed)
+
+ // Look at the "new" closed timestamp propagation mechanism.
+ maxClosed.Forward(replicaStateClosed)
+
return maxClosed, true
}
diff --git a/pkg/kv/kvserver/replica_init.go b/pkg/kv/kvserver/replica_init.go
index de73dd090f99..c64027597c26 100644
--- a/pkg/kv/kvserver/replica_init.go
+++ b/pkg/kv/kvserver/replica_init.go
@@ -18,6 +18,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/keys"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/abortspan"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts/tracker"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/concurrency"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/split"
@@ -95,8 +96,9 @@ func newUnloadedReplica(
})
r.mu.proposals = map[kvserverbase.CmdIDKey]*ProposalData{}
r.mu.checksums = map[uuid.UUID]ReplicaChecksum{}
- r.mu.proposalBuf.Init((*replicaProposer)(r))
+ r.mu.proposalBuf.Init((*replicaProposer)(r), tracker.NewLockfreeTracker(), r.Clock(), r.ClusterSettings())
r.mu.proposalBuf.testing.allowLeaseProposalWhenNotLeader = store.cfg.TestingKnobs.AllowLeaseRequestProposalsWhenNotLeader
+ r.mu.proposalBuf.testing.dontCloseTimestamps = store.cfg.TestingKnobs.DontCloseTimestamps
if leaseHistoryMaxEntries > 0 {
r.leaseHistory = newLeaseHistory()
diff --git a/pkg/kv/kvserver/replica_proposal.go b/pkg/kv/kvserver/replica_proposal.go
index d4af67968b54..5ccc84b1025f 100644
--- a/pkg/kv/kvserver/replica_proposal.go
+++ b/pkg/kv/kvserver/replica_proposal.go
@@ -114,6 +114,15 @@ type ProposalData struct {
// here; this could be replaced with isLease and isChangeReplicas
// booleans.
Request *roachpb.BatchRequest
+
+ // leaseStatus represents the lease under which the Request was evaluated and
+ // under which this proposal is being made. For lease requests, this is the
+ // previous lease that the requester was aware of.
+ leaseStatus kvserverpb.LeaseStatus
+
+ // tok identifies the request to the propBuf. Once the proposal is made, the
+ // token will be used to stop tracking this request.
+ tok TrackedRequestToken
}
// finishApplication is called when a command application has finished. The
@@ -327,6 +336,10 @@ const (
func (r *Replica) leasePostApplyLocked(
ctx context.Context, prevLease *roachpb.Lease, newLease *roachpb.Lease, jumpOpt leaseJumpOption,
) {
+ // Note that we actually install the lease further down in this method.
+ // Everything we do before then doesn't need to worry about requests being
+ // evaluated under the new lease.
+
// Sanity check to make sure that the lease sequence is moving in the right
// direction.
if s1, s2 := prevLease.Sequence, newLease.Sequence; s1 != 0 {
@@ -412,6 +425,10 @@ func (r *Replica) leasePostApplyLocked(
// to not matter).
r.concMgr.OnRangeLeaseUpdated(newLease.Sequence, iAmTheLeaseHolder)
+ // Inform the propBuf about the new lease so that it can initialize its closed
+ // timestamp tracking.
+ r.mu.proposalBuf.OnLeaseChangeLocked(iAmTheLeaseHolder, r.mu.state.ClosedTimestamp)
+
// Ordering is critical here. We only install the new lease after we've
// checked for an in-progress merge and updated the timestamp cache. If the
// ordering were reversed, it would be possible for requests to see the new
@@ -833,6 +850,7 @@ func (r *Replica) requestToProposal(
ctx context.Context,
idKey kvserverbase.CmdIDKey,
ba *roachpb.BatchRequest,
+ st kvserverpb.LeaseStatus,
lul hlc.Timestamp,
latchSpans *spanset.SpanSet,
) (*ProposalData, *roachpb.Error) {
@@ -840,11 +858,12 @@ func (r *Replica) requestToProposal(
// Fill out the results even if pErr != nil; we'll return the error below.
proposal := &ProposalData{
- ctx: ctx,
- idKey: idKey,
- doneCh: make(chan proposalResult, 1),
- Local: &res.Local,
- Request: ba,
+ ctx: ctx,
+ idKey: idKey,
+ doneCh: make(chan proposalResult, 1),
+ Local: &res.Local,
+ Request: ba,
+ leaseStatus: st,
}
if needConsensus {
diff --git a/pkg/kv/kvserver/replica_proposal_buf.go b/pkg/kv/kvserver/replica_proposal_buf.go
index f5b31c1db79a..f991c35f41c9 100644
--- a/pkg/kv/kvserver/replica_proposal_buf.go
+++ b/pkg/kv/kvserver/replica_proposal_buf.go
@@ -15,7 +15,13 @@ import (
"sync"
"sync/atomic"
+ "github.com/cockroachdb/cockroach/pkg/clusterversion"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts/tracker"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverpb"
"github.com/cockroachdb/cockroach/pkg/roachpb"
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/cockroach/pkg/util/log"
"github.com/cockroachdb/cockroach/pkg/util/protoutil"
"github.com/cockroachdb/errors"
@@ -105,8 +111,8 @@ func (c *propBufCnt) read() propBufCntRes {
return propBufCntRes(atomic.LoadUint64((*uint64)(c)))
}
-// propBuf is a multi-producer, single-consumer buffer for Raft proposals. The
-// buffer supports concurrent insertion of proposals.
+// propBuf is a multi-producer, single-consumer buffer for Raft proposals on a
+// range. The buffer supports concurrent insertion of proposals.
//
// The proposal buffer also handles the assignment of maximum lease indexes for
// commands. Picking the maximum lease index for commands is done atomically
@@ -116,6 +122,11 @@ func (c *propBufCnt) read() propBufCntRes {
// get out of sync then some commands would necessarily be rejected beneath Raft
// during application (see checkForcedErr).
//
+// The proposal buffer also is in charge of advancing the respective range's
+// closed timestamp by assigning closed timestamp to proposals. For this
+// purpose, new requests starting evaluation needs to synchronize with the
+// proposal buffer (see TrackEvaluatingRequest).
+//
// Proposals enter the buffer via Insert() or ReinsertLocked(). They are moved
// into Raft via FlushLockedWithRaftGroup() when the buffer fills up, or during
// the next handleRaftReady iteration, whichever happens earlier. This
@@ -127,13 +138,35 @@ func (c *propBufCnt) read() propBufCntRes {
// initialization. Methods called "...Locked" and "...RLocked" expect the
// corresponding locker() and rlocker() to be held.
type propBuf struct {
- p proposer
- full sync.Cond
+ p proposer
+ clock *hlc.Clock
+ settings *cluster.Settings
+ // evalTracker tracks currently-evaluating requests, making sure that
+ // proposals coming out of the propBuf don't carry closed timestamps below
+ // currently-evaluating requests.
+ evalTracker tracker.Tracker
+ full sync.Cond
liBase uint64
cnt propBufCnt
arr propBufArray
+ // assignedClosedTimestamp is the largest "closed timestamp" - i.e. the largest
+ // timestamp that was communicated to other replicas as closed, representing a
+ // promise that this leaseholder will not evaluate writes below this timestamp
+ // any more.
+ //
+ // Note that this field is not used by the local replica (or by anybody)
+ // directly to decide whether follower reads can be served. See
+ // ReplicaState.closed_timestamp.
+ //
+ // This field can be read under the proposer's read lock, and written to under
+ // the write lock.
+ assignedClosedTimestamp hlc.Timestamp
+
+ // A buffer used to avoid allocations.
+ tmpClosedTimestampFooter kvserverpb.ClosedTimestampFooter
+
testing struct {
// leaseIndexFilter can be used by tests to override the max lease index
// assigned to a proposal by returning a non-zero lease index.
@@ -151,6 +184,8 @@ type propBuf struct {
// heartbeats and then expect other replicas to take the lease without
// worrying about Raft).
allowLeaseProposalWhenNotLeader bool
+ // dontCloseTimestamps inhibits the closing of timestamps.
+ dontCloseTimestamps bool
}
}
@@ -178,6 +213,12 @@ type proposer interface {
destroyed() destroyStatus
leaseAppliedIndex() uint64
enqueueUpdateCheck()
+ closeTimestampPolicy() roachpb.RangeClosedTimestampPolicy
+ // raftTransportClosedTimestampEnabled returns whether the range has switched
+ // to the Raft-based closed timestamp transport.
+ // TODO(andrei): This shouldn't be needed any more in 21.2, once the Raft
+ // transport is unconditionally enabled.
+ raftTransportClosedTimestampEnabled() bool
// The following require the proposer to hold an exclusive lock.
withGroupLocked(func(proposerRaft) error) error
registerProposalLocked(*ProposalData)
@@ -205,9 +246,14 @@ type proposerRaft interface {
}
// Init initializes the proposal buffer and binds it to the provided proposer.
-func (b *propBuf) Init(p proposer) {
+func (b *propBuf) Init(
+ p proposer, tracker tracker.Tracker, clock *hlc.Clock, settings *cluster.Settings,
+) {
b.p = p
b.full.L = p.rlocker()
+ b.clock = clock
+ b.evalTracker = tracker
+ b.settings = settings
b.liBase = p.leaseAppliedIndex()
}
@@ -225,12 +271,20 @@ func (b *propBuf) LastAssignedLeaseIndexRLocked() uint64 {
// proposer's Raft group. The method accepts the Raft command as part of the
// ProposalData struct, along with a partial encoding of the command in the
// provided byte slice. It is expected that the byte slice contains marshaled
-// information for all of the command's fields except for its max lease index,
-// which is assigned by the method when the command is sequenced in the buffer.
-// It is also expected that the byte slice has sufficient capacity to marshal
-// the maximum lease index field into it. After adding the proposal to the
+// information for all of the command's fields except for MaxLeaseIndex, and
+// ClosedTimestamp. MaxLeaseIndex is assigned here, when the command is
+// sequenced in the buffer. ClosedTimestamp will be assigned later, when the
+// buffer is flushed. It is also expected that the byte slice has sufficient
+// capacity to marshal these fields into it. After adding the proposal to the
// buffer, the assigned max lease index is returned.
-func (b *propBuf) Insert(ctx context.Context, p *ProposalData, data []byte) (uint64, error) {
+//
+// Insert takes ownership of the supplied token; the caller should tok.Move() it
+// into this method. It will be used to untrack the request once it comes out of the
+// proposal buffer.
+func (b *propBuf) Insert(
+ ctx context.Context, p *ProposalData, data []byte, tok TrackedRequestToken,
+) (uint64, error) {
+ defer tok.DoneIfNotMoved(ctx)
// Request a new max lease applied index for any request that isn't itself
// a lease request. Lease requests don't need unique max lease index values
// because their max lease indexes are ignored. See checkForcedErr.
@@ -252,6 +306,10 @@ func (b *propBuf) Insert(ctx context.Context, p *ProposalData, data []byte) (uin
}
// Assign the command's maximum lease index.
+ // TODO(andrei): Move this to Flush in 21.2, to mirror the assignment of the
+ // closed timestamp. For now it's needed here because Insert needs to return
+ // the MLAI for the benefit of the "old" closed timestamp tracker. When moving
+ // to flush, make sure to not reassign it on reproposals.
p.command.MaxLeaseIndex = b.liBase + res.leaseIndexOffset()
if filter := b.testing.leaseIndexFilter; filter != nil {
if override, err := filter(p); err != nil {
@@ -277,7 +335,9 @@ func (b *propBuf) Insert(ctx context.Context, p *ProposalData, data []byte) (uin
return 0, err
}
- // Insert the proposal into the buffer's array.
+ // Insert the proposal into the buffer's array. The buffer now takes ownership
+ // of the token.
+ p.tok = tok.Move(ctx)
b.insertIntoArray(p, res.arrayIndex())
// Return the maximum lease index that the proposal's command was given.
@@ -458,6 +518,8 @@ func (b *propBuf) FlushLockedWithRaftGroup(
}
}
+ closedTSTarget := b.computeClosedTimestampTarget()
+
// Remember the first error that we see when proposing the batch. We don't
// immediately return this error because we want to finish clearing out the
// buffer and registering each of the proposals with the proposer, but we
@@ -516,6 +578,11 @@ func (b *propBuf) FlushLockedWithRaftGroup(
}
}
+ // Exit the tracker.
+ reproposal := !p.tok.stillTracked()
+ if !reproposal {
+ p.tok.doneLocked(ctx)
+ }
// Raft processing bookkeeping.
b.p.registerProposalLocked(p)
@@ -538,6 +605,20 @@ func (b *propBuf) FlushLockedWithRaftGroup(
continue
}
+ // Figure out what closed timestamp this command will carry.
+ //
+ // If this is a reproposal, we don't reassign the closed timestamp. We
+ // could, in principle, but we'd have to make a copy of the encoded command
+ // as to not modify the copy that's already stored in the local replica's
+ // raft entry cache.
+ if !reproposal {
+ err := b.assignClosedTimestampToProposalLocked(ctx, p, closedTSTarget)
+ if err != nil {
+ firstErr = err
+ continue
+ }
+ }
+
// Coordinate proposing the command to etcd/raft.
if crt := p.command.ReplicatedEvalResult.ChangeReplicas; crt != nil {
// Flush any previously batched (non-conf change) proposals to
@@ -596,6 +677,121 @@ func (b *propBuf) FlushLockedWithRaftGroup(
return used, proposeBatch(raftGroup, b.p.replicaID(), ents)
}
+// computeClosedTimestampTarget computes the timestamp we'd like to close for
+// our range. Note that we might not be able to ultimately close this timestamp
+// if there's requests in flight.
+func (b *propBuf) computeClosedTimestampTarget() hlc.Timestamp {
+ now := b.clock.Now().WallTime
+ closedTSPolicy := b.p.closeTimestampPolicy()
+ var closedTSTarget hlc.Timestamp
+ switch closedTSPolicy {
+ case roachpb.LAG_BY_CLUSTER_SETTING, roachpb.LEAD_FOR_GLOBAL_READS:
+ targetDuration := closedts.TargetDuration.Get(&b.settings.SV)
+ closedTSTarget = hlc.Timestamp{WallTime: now - targetDuration.Nanoseconds()}
+ // TODO(andrei,nvanbenschoten): Resolve all the issues preventing us from closing
+ // timestamps in the future (which, in turn, forces future-time writes on
+ // global ranges), and enable the proper logic below.
+ //case roachpb.LEAD_FOR_GLOBAL_READS:
+ // closedTSTarget = hlc.Timestamp{
+ // WallTime: now + 2*b.clock.MaxOffset().Nanoseconds(),
+ // Synthetic: true,
+ // }
+ }
+ return closedTSTarget
+}
+
+// assignClosedTimestampToProposalLocked assigns a closed timestamp to be carried by
+// an outgoing proposal.
+//
+// This shouldn't be called for reproposals.
+func (b *propBuf) assignClosedTimestampToProposalLocked(
+ ctx context.Context, p *ProposalData, closedTSTarget hlc.Timestamp,
+) error {
+ if b.testing.dontCloseTimestamps {
+ return nil
+ }
+ // If the Raft transport is not enabled yet, bail. If the range has already
+ // started publishing closed timestamps using Raft, then it doesn't matter
+ // whether this node found out about the version bump yet.
+ if !b.p.raftTransportClosedTimestampEnabled() &&
+ !b.settings.Version.IsActive(ctx, clusterversion.ClosedTimestampsRaftTransport) {
+ return nil
+ }
+
+ // For lease requests, we make a distinction between lease extensions and
+ // brand new leases. Brand new leases carry a closed timestamp equal to the
+ // lease start time. Lease extensions don't get a closed timestamp. This is
+ // because they're proposed without a MLAI, and so two lease extensions might
+ // commute and both apply which would result in a closed timestamp regression.
+ // The command application side doesn't bother protecting against such
+ // regressions.
+ // Lease transfers behave like regular proposals. Note that transfers
+ // carry a summary of the timestamp cache, so the new leaseholder will be
+ // aware of all the reads performed by the previous leaseholder.
+ isBrandNewLeaseRequest := false
+ if p.Request.IsLeaseRequest() {
+ // We read the lease from the ReplicatedEvalResult, not from leaseReq, because the
+ // former is more up to date, having been modified by the evaluation.
+ newLease := p.command.ReplicatedEvalResult.State.Lease
+ oldLease := p.leaseStatus.Lease
+ leaseExtension := newLease.Sequence == oldLease.Sequence
+ if leaseExtension {
+ return nil
+ }
+ isBrandNewLeaseRequest = true
+ // For brand new leases, we close the lease start time. Since this proposing
+ // replica is not the leaseholder, the previous target is meaningless.
+ closedTSTarget = newLease.Start.ToTimestamp()
+ }
+ if !isBrandNewLeaseRequest {
+ lb := b.evalTracker.LowerBound(ctx)
+ if !lb.IsEmpty() {
+ // If the tracker told us that requests are currently evaluating at
+ // timestamps >= lb, then we can close up to lb.Prev(). We use FloorPrev()
+ // to get rid of the logical ticks; we try to not publish closed ts with
+ // logical ticks when there's no good reason for them.
+ closedTSTarget.Backward(lb.FloorPrev())
+ }
+ // We can't close timestamps above the current lease's expiration(*). This is
+ // in order to keep the monotonic property of closed timestamps carried by
+ // commands, which makes for straight-forward closed timestamp management on
+ // the command application side: if we allowed requests to close timestamps
+ // above the lease's expiration, then a future LeaseRequest proposed by
+ // another node might carry a lower closed timestamp (i.e. the lease start
+ // time).
+ // (*) If we've previously closed a higher timestamp under a previous lease
+ // with a higher expiration, then requests will keep carrying that closed
+ // timestamp; we won't regress the closed timestamp.
+ //
+ // HACK(andrei): We declare the lease expiration to be synthetic by fiat,
+ // because it frequently is synthetic even though currently it's not marked
+ // as such. See the TODO in Timestamp.Add() about the work remaining to
+ // properly mark these timestamps as synthetic. We need to make sure it's
+ // synthetic here so that the results of Backwards() can be synthetic.
+ leaseExpiration := p.leaseStatus.Expiration().WithSynthetic(true)
+ closedTSTarget.Backward(leaseExpiration)
+ }
+
+ // We're about to close closedTSTarget. The propBuf needs to remember that in
+ // order for incoming requests to be bumped above it (through
+ // TrackEvaluatingRequest).
+ b.forwardClosedTimestampLocked(closedTSTarget)
+ // Fill in the closed ts in the proposal.
+ f := &b.tmpClosedTimestampFooter
+ f.ClosedTimestamp = b.assignedClosedTimestamp
+ footerLen := f.Size()
+ if log.ExpensiveLogEnabled(ctx, 4) {
+ log.VEventf(ctx, 4, "attaching closed timestamp %s to proposal %x", b.assignedClosedTimestamp, p.idKey)
+ }
+
+ preLen := len(p.encodedCommand)
+ // Here we rely on p.encodedCommand to have been allocated with enough
+ // capacity for this footer.
+ p.encodedCommand = p.encodedCommand[:preLen+footerLen]
+ _, err := protoutil.MarshalTo(f, p.encodedCommand[preLen:])
+ return err
+}
+
func (b *propBuf) forwardLeaseIndexBase(v uint64) {
if b.liBase < v {
b.liBase = v
@@ -636,6 +832,109 @@ func (b *propBuf) FlushLockedWithoutProposing(ctx context.Context) {
}
}
+// OnLeaseChangeLocked is called when a new lease is applied to this range.
+// assignedClosedTimestamp is the range's closed timestamp after the new lease was applied. The
+// closed timestamp tracked by the propBuf is updated accordingly.
+func (b *propBuf) OnLeaseChangeLocked(leaseOwned bool, closedTS hlc.Timestamp) {
+ if leaseOwned {
+ b.forwardClosedTimestampLocked(closedTS)
+ } else {
+ // Zero out to avoid any confusion.
+ b.assignedClosedTimestamp = hlc.Timestamp{}
+ }
+}
+
+// forwardClosedTimestamp forwards the closed timestamp tracked by the propBuf.
+func (b *propBuf) forwardClosedTimestampLocked(closedTS hlc.Timestamp) {
+ b.assignedClosedTimestamp.Forward(closedTS)
+}
+
+// EvaluatingRequestsCount returns the count of requests currently tracked by
+// the propBuf.
+func (b *propBuf) EvaluatingRequestsCount() int {
+ b.p.rlocker().Lock()
+ defer b.p.rlocker().Unlock()
+ return b.evalTracker.Count()
+}
+
+// TrackedRequestToken represents the result of propBuf.TrackEvaluatingRequest:
+// a token to be later used for untracking the respective request.
+//
+// This token tries to make it easy to pass responsibility for untracking. The
+// intended pattern is:
+// tok := propbBuf.TrackEvaluatingRequest()
+// defer tok.DoneIfNotMoved()
+// fn(tok.Move())
+type TrackedRequestToken struct {
+ done bool
+ tok tracker.RemovalToken
+ b *propBuf
+}
+
+// DoneIfNotMoved untracks the request if Move had not been called on the token
+// previously. If Move had been called, this is a no-op.
+//
+// Note that if this ends up actually destroying the token (i.e. if Move() had
+// not been called previously) this takes r.mu, so it's pretty expensive. On
+// happy paths, the token is expected to have been Move()d, and a batch of
+// tokens are expected to be destroyed at once by the propBuf (which calls
+// doneLocked).
+func (t *TrackedRequestToken) DoneIfNotMoved(ctx context.Context) {
+ if t.done {
+ return
+ }
+ t.b.p.locker().Lock()
+ t.doneLocked(ctx)
+ t.b.p.locker().Unlock()
+}
+
+func (t *TrackedRequestToken) doneLocked(ctx context.Context) {
+ if t.done {
+ log.Fatalf(ctx, "duplicate Done() call")
+ }
+ t.done = true
+ t.b.evalTracker.Untrack(ctx, t.tok)
+}
+
+// stillTracked returns true if no Done* method has been called.
+func (t *TrackedRequestToken) stillTracked() bool {
+ return !t.done
+}
+
+// Move returns a new token which can untrack the request. The original token is
+// neutered; calling DoneIfNotMoved on it becomes a no-op.
+func (t *TrackedRequestToken) Move(ctx context.Context) TrackedRequestToken {
+ if t.done {
+ log.Fatalf(ctx, "attempting to Move() after Done() call")
+ }
+ cpy := *t
+ t.done = true
+ return cpy
+}
+
+// TrackEvaluatingRequest atomically starts tracking an evaluating request and
+// returns the minimum timestamp at which this request can write. The tracked
+// request is identified by its tentative write timestamp. After calling this,
+// the caller must bump the write timestamp to at least the returned minTS.
+//
+// The returned token must be used to eventually remove this request from the
+// tracked set by calling tok.Done(); the removal will allow timestamps above
+// its write timestamp to be closed. If the evaluation results in a proposal,
+// the token will make it back to this propBuf through Insert; in this case it
+// will be the propBuf itself that ultimately stops tracking the request once
+// the proposal is flushed from the buffer.
+func (b *propBuf) TrackEvaluatingRequest(
+ ctx context.Context, wts hlc.Timestamp,
+) (minTS hlc.Timestamp, _ TrackedRequestToken) {
+ b.p.rlocker().Lock()
+ defer b.p.rlocker().Unlock()
+
+ minTS = b.assignedClosedTimestamp.Next()
+ wts.Forward(minTS)
+ tok := b.evalTracker.Track(ctx, wts)
+ return minTS, TrackedRequestToken{tok: tok, b: b}
+}
+
const propBufArrayMinSize = 4
const propBufArrayMaxSize = 256
const propBufArrayShrinkDelay = 16
@@ -702,6 +1001,8 @@ func (a *propBufArray) adjustSize(used int) {
// replicaProposer implements the proposer interface.
type replicaProposer Replica
+var _ proposer = &replicaProposer{}
+
func (rp *replicaProposer) locker() sync.Locker {
return &rp.mu.RWMutex
}
@@ -726,6 +1027,14 @@ func (rp *replicaProposer) enqueueUpdateCheck() {
rp.store.enqueueRaftUpdateCheck(rp.RangeID)
}
+func (rp *replicaProposer) closeTimestampPolicy() roachpb.RangeClosedTimestampPolicy {
+ return (*Replica)(rp).closedTimestampPolicyRLocked()
+}
+
+func (rp *replicaProposer) raftTransportClosedTimestampEnabled() bool {
+ return !(*Replica)(rp).mu.state.ClosedTimestamp.IsEmpty()
+}
+
func (rp *replicaProposer) withGroupLocked(fn func(raftGroup proposerRaft) error) error {
// Pass true for mayCampaignOnWake because we're about to propose a command.
return (*Replica)(rp).withRaftGroupLocked(true, func(raftGroup *raft.RawNode) (bool, error) {
diff --git a/pkg/kv/kvserver/replica_proposal_buf_test.go b/pkg/kv/kvserver/replica_proposal_buf_test.go
index 116009a2acb9..07b5b159bd15 100644
--- a/pkg/kv/kvserver/replica_proposal_buf_test.go
+++ b/pkg/kv/kvserver/replica_proposal_buf_test.go
@@ -17,10 +17,16 @@ import (
"testing"
"time"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts/tracker"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverpb"
"github.com/cockroachdb/cockroach/pkg/roachpb"
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
"github.com/cockroachdb/cockroach/pkg/util/log"
+ "github.com/cockroachdb/cockroach/pkg/util/protoutil"
"github.com/cockroachdb/cockroach/pkg/util/syncutil"
"github.com/cockroachdb/errors"
"github.com/stretchr/testify/assert"
@@ -53,16 +59,31 @@ type testProposer struct {
// If leaderReplicaInDescriptor is set, this specifies what type of replica it
// is. Some types of replicas are not eligible to get a lease.
leaderReplicaType roachpb.ReplicaType
+ rangePolicy roachpb.RangeClosedTimestampPolicy
}
+var _ proposer = &testProposer{}
+
type testProposerRaft struct {
status raft.BasicStatus
+ // lastProps are the command that the propBuf flushed last.
+ lastProps []kvserverpb.RaftCommand
}
-var _ proposerRaft = testProposerRaft{}
+var _ proposerRaft = &testProposerRaft{}
-func (t testProposerRaft) Step(raftpb.Message) error {
- // TODO(andrei, nvanbenschoten): Capture the message and test against it.
+func (t *testProposerRaft) Step(msg raftpb.Message) error {
+ if msg.Type != raftpb.MsgProp {
+ return nil
+ }
+ // Decode and save all the commands.
+ t.lastProps = make([]kvserverpb.RaftCommand, len(msg.Entries))
+ for i, e := range msg.Entries {
+ _ /* idKey */, encodedCommand := DecodeRaftCommand(e.Data)
+ if err := protoutil.Unmarshal(encodedCommand, &t.lastProps[i]); err != nil {
+ return err
+ }
+ }
return nil
}
@@ -99,6 +120,14 @@ func (t *testProposer) enqueueUpdateCheck() {
t.enqueued++
}
+func (t *testProposer) closeTimestampPolicy() roachpb.RangeClosedTimestampPolicy {
+ return t.rangePolicy
+}
+
+func (t *testProposer) raftTransportClosedTimestampEnabled() bool {
+ return true
+}
+
func (t *testProposer) withGroupLocked(fn func(proposerRaft) error) error {
// Note that t.raftGroup can be nil, which FlushLockedWithRaftGroup supports.
return fn(t.raftGroup)
@@ -150,18 +179,55 @@ func (t *testProposer) rejectProposalWithRedirectLocked(
t.onRejectProposalWithRedirectLocked(prop, redirectTo)
}
-func newPropData(leaseReq bool) (*ProposalData, []byte) {
+// proposalCreator holds on to a lease and creates proposals using it.
+type proposalCreator struct {
+ lease kvserverpb.LeaseStatus
+}
+
+func (pc proposalCreator) newPutProposal() (*ProposalData, []byte) {
var ba roachpb.BatchRequest
- if leaseReq {
- ba.Add(&roachpb.RequestLeaseRequest{})
- } else {
- ba.Add(&roachpb.PutRequest{})
+ ba.Add(&roachpb.PutRequest{})
+ return pc.newProposal(ba)
+}
+
+func (pc proposalCreator) newLeaseProposal(lease roachpb.Lease) (*ProposalData, []byte) {
+ var ba roachpb.BatchRequest
+ ba.Add(&roachpb.RequestLeaseRequest{Lease: lease})
+ return pc.newProposal(ba)
+}
+
+func (pc proposalCreator) newProposal(ba roachpb.BatchRequest) (*ProposalData, []byte) {
+ var lease *roachpb.Lease
+ r, ok := ba.GetArg(roachpb.RequestLease)
+ if ok {
+ lease = &r.(*roachpb.RequestLeaseRequest).Lease
+ }
+ p := &ProposalData{
+ ctx: context.Background(),
+ idKey: kvserverbase.CmdIDKey("test-cmd"),
+ command: &kvserverpb.RaftCommand{
+ ReplicatedEvalResult: kvserverpb.ReplicatedEvalResult{
+ State: &kvserverpb.ReplicaState{Lease: lease},
+ },
+ },
+ Request: &ba,
+ leaseStatus: pc.lease,
+ }
+ return p, pc.encodeProposal(p)
+}
+
+func (pc proposalCreator) encodeProposal(p *ProposalData) []byte {
+ cmdLen := p.command.Size()
+ needed := raftCommandPrefixLen + cmdLen +
+ kvserverpb.MaxRaftCommandFooterSize() +
+ kvserverpb.MaxClosedTimestampFooterSize()
+ data := make([]byte, raftCommandPrefixLen, needed)
+ encodeRaftCommandPrefix(data, raftVersionStandard, p.idKey)
+ data = data[:raftCommandPrefixLen+p.command.Size()]
+ if _, err := protoutil.MarshalTo(p.command, data[raftCommandPrefixLen:]); err != nil {
+ panic(err)
}
- return &ProposalData{
- ctx: context.Background(),
- command: &kvserverpb.RaftCommand{},
- Request: &ba,
- }, make([]byte, 0, kvserverpb.MaxRaftCommandFooterSize())
+ return data
}
// TestProposalBuffer tests the basic behavior of the Raft proposal buffer.
@@ -172,14 +238,23 @@ func TestProposalBuffer(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
// Insert propBufArrayMinSize proposals. The buffer should not be flushed.
num := propBufArrayMinSize
for i := 0; i < num; i++ {
leaseReq := i == 3
- pd, data := newPropData(leaseReq)
- mlai, err := b.Insert(ctx, pd, data)
+ var pd *ProposalData
+ var data []byte
+ if leaseReq {
+ pd, data = pc.newLeaseProposal(roachpb.Lease{})
+ } else {
+ pd, data = pc.newPutProposal()
+ }
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err := b.Insert(ctx, pd, data, tok)
require.Nil(t, err)
if leaseReq {
expMlai := uint64(i)
@@ -196,12 +271,14 @@ func TestProposalBuffer(t *testing.T) {
require.Equal(t, 1, p.enqueued)
require.Equal(t, 0, p.registered)
}
+ require.Equal(t, num, b.evalTracker.Count())
// Insert another proposal. This causes the buffer to flush. Doing so
// results in a lease applied index being skipped, which is harmless.
// Remember that the lease request above did not receive a lease index.
- pd, data := newPropData(false)
- mlai, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newPutProposal()
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err := b.Insert(ctx, pd, data, tok)
require.Nil(t, err)
expMlai := uint64(num + 1)
require.Equal(t, expMlai, mlai)
@@ -212,6 +289,7 @@ func TestProposalBuffer(t *testing.T) {
require.Equal(t, num, p.registered)
require.Equal(t, uint64(num), b.liBase)
require.Equal(t, 2*propBufArrayMinSize, b.arr.len())
+ require.Equal(t, 1, b.evalTracker.Count())
// Increase the proposer's applied lease index and flush. The buffer's
// lease index offset should jump up.
@@ -224,7 +302,8 @@ func TestProposalBuffer(t *testing.T) {
// Insert one more proposal. The lease applied index should adjust to
// the increase accordingly.
- mlai, err = b.Insert(ctx, pd, data)
+ _, tok = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err = b.Insert(ctx, pd, data, tok)
require.Nil(t, err)
expMlai = p.lai + 1
require.Equal(t, expMlai, mlai)
@@ -252,7 +331,9 @@ func TestProposalBufferConcurrentWithDestroy(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
mlais := make(map[uint64]struct{})
dsErr := errors.New("destroyed")
@@ -263,8 +344,9 @@ func TestProposalBufferConcurrentWithDestroy(t *testing.T) {
for i := 0; i < concurrency; i++ {
g.Go(func() error {
for {
- pd, data := newPropData(false)
- mlai, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newPutProposal()
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err := b.Insert(ctx, pd, data, tok)
if err != nil {
if errors.Is(err, dsErr) {
return nil
@@ -323,12 +405,16 @@ func TestProposalBufferRegistersAllOnProposalError(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
num := propBufArrayMinSize
+ toks := make([]TrackedRequestToken, num)
for i := 0; i < num; i++ {
- pd, data := newPropData(false)
- _, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newPutProposal()
+ _, toks[i] = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, toks[i])
require.Nil(t, err)
}
require.Equal(t, num, b.Len())
@@ -346,6 +432,7 @@ func TestProposalBufferRegistersAllOnProposalError(t *testing.T) {
err := b.flushLocked(ctx)
require.Equal(t, propErr, err)
require.Equal(t, num, p.registered)
+ require.Zero(t, b.evalTracker.Count())
}
// TestProposalBufferRegistrationWithInsertionErrors tests that if during
@@ -358,12 +445,22 @@ func TestProposalBufferRegistrationWithInsertionErrors(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
num := propBufArrayMinSize / 2
+ toks1 := make([]TrackedRequestToken, num)
for i := 0; i < num; i++ {
- pd, data := newPropData(i%2 == 0)
- _, err := b.Insert(ctx, pd, data)
+ var pd *ProposalData
+ var data []byte
+ if i%2 == 0 {
+ pd, data = pc.newLeaseProposal(roachpb.Lease{})
+ } else {
+ pd, data = pc.newPutProposal()
+ }
+ _, toks1[i] = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, toks1[i])
require.Nil(t, err)
}
@@ -372,9 +469,17 @@ func TestProposalBufferRegistrationWithInsertionErrors(t *testing.T) {
return 0, insertErr
}
+ toks2 := make([]TrackedRequestToken, num)
for i := 0; i < num; i++ {
- pd, data := newPropData(i%2 == 0)
- _, err := b.Insert(ctx, pd, data)
+ var pd *ProposalData
+ var data []byte
+ if i%2 == 0 {
+ pd, data = pc.newLeaseProposal(roachpb.Lease{})
+ } else {
+ pd, data = pc.newPutProposal()
+ }
+ _, toks2[i] = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, toks2[i])
require.Equal(t, insertErr, err)
}
require.Equal(t, 2*num, b.Len())
@@ -383,6 +488,7 @@ func TestProposalBufferRegistrationWithInsertionErrors(t *testing.T) {
require.Equal(t, 0, b.Len())
require.Equal(t, num, p.registered)
+ require.Zero(t, b.evalTracker.Count())
}
// TestPropBufCnt tests the basic behavior of the counter maintained by the
@@ -494,6 +600,7 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
} {
t.Run(tc.name, func(t *testing.T) {
var p testProposer
+ var pc proposalCreator
// p.replicaID() is hardcoded; it'd better be hardcoded to what this test
// expects.
require.Equal(t, self, uint64(p.replicaID()))
@@ -519,7 +626,7 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
Lead: tc.leader,
},
}
- r := testProposerRaft{
+ r := &testProposerRaft{
status: raftStatus,
}
p.raftGroup = r
@@ -527,10 +634,12 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
p.leaderReplicaType = tc.leaderRepType
var b propBuf
- b.Init(&p)
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
- pd, data := newPropData(true /* leaseReq */)
- _, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newLeaseProposal(roachpb.Lease{})
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, tok)
require.NoError(t, err)
require.NoError(t, b.flushLocked(ctx))
if tc.expRejection {
@@ -541,3 +650,273 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
})
}
}
+
+func TestProposalBufferComputeClosedTimestampTarget(t *testing.T) {
+ defer leaktest.AfterTest(t)()
+ defer log.Scope(t).Close(t)
+
+ const nowNanos = 100
+ const maxOffsetNanos = 20
+ manualClock := hlc.NewManualClock(nowNanos)
+ clock := hlc.NewClock(manualClock.UnixNano, maxOffsetNanos)
+
+ const lagTargetNanos = 10
+ st := cluster.MakeTestingClusterSettings()
+ closedts.TargetDuration.Override(&st.SV, lagTargetNanos)
+
+ for _, tc := range []struct {
+ rangePolicy roachpb.RangeClosedTimestampPolicy
+ expClosedTSTarget hlc.Timestamp
+ }{
+ {
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ expClosedTSTarget: hlc.Timestamp{WallTime: nowNanos - lagTargetNanos},
+ },
+ {
+ rangePolicy: roachpb.LEAD_FOR_GLOBAL_READS,
+ expClosedTSTarget: hlc.Timestamp{WallTime: nowNanos - lagTargetNanos},
+ // TODO(andrei, nvanbenschoten): What we should be expecting here is the following, once
+ // the propBuf starts properly implementing this timestamp closing policy:
+ // expClosedTSTarget: hlc.Timestamp{WallTime: nowNanos + 2*maxOffsetNanos, Synthetic: true},
+ },
+ } {
+ t.Run(tc.rangePolicy.String(), func(t *testing.T) {
+ var p testProposer
+ p.rangePolicy = tc.rangePolicy
+ var b propBuf
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, st)
+ require.Equal(t, tc.expClosedTSTarget, b.computeClosedTimestampTarget())
+ })
+ }
+}
+
+// Test that the propBuf properly assigns closed timestamps to proposals being
+// flushed out of it. Each subtest proposes one command and checks for the
+// expected closed timestamp being written to the proposal by the propBuf.
+func TestProposalBufferClosedTimestamp(t *testing.T) {
+ defer leaktest.AfterTest(t)()
+ defer log.Scope(t).Close(t)
+ ctx := context.Background()
+
+ mc := hlc.NewManualClock((1613588135 * time.Second).Nanoseconds())
+ clock := hlc.NewClock(mc.UnixNano, time.Nanosecond)
+ st := cluster.MakeTestingClusterSettings()
+ closedts.TargetDuration.Override(&st.SV, time.Second)
+ now := clock.Now()
+ newLeaseStart := now.MustToClockTimestamp()
+ nowMinusClosedLag := hlc.Timestamp{
+ WallTime: mc.UnixNano() - closedts.TargetDuration.Get(&st.SV).Nanoseconds(),
+ }
+ nowMinusTwiceClosedLag := hlc.Timestamp{
+ WallTime: mc.UnixNano() - 2*closedts.TargetDuration.Get(&st.SV).Nanoseconds(),
+ }
+ expiredLeaseTimestamp := hlc.Timestamp{WallTime: mc.UnixNano() - 1000}
+ someClosedTS := hlc.Timestamp{WallTime: mc.UnixNano() - 2000}
+
+ type reqType int
+ checkClosedTS := func(t *testing.T, r *testProposerRaft, exp hlc.Timestamp) {
+ require.Len(t, r.lastProps, 1)
+ require.Equal(t, exp, r.lastProps[0].ClosedTimestamp)
+ }
+
+ // The lease that the proposals are made under.
+ curLease := roachpb.Lease{
+ Epoch: 0, // Expiration-based lease.
+ Sequence: 1,
+ Start: hlc.ClockTimestamp{},
+ // Expiration is filled by each test.
+ Expiration: nil,
+ }
+
+ const (
+ regularWrite reqType = iota
+ // newLease means that the request is a lease acquisition (new lease or
+ // lease extension).
+ newLease
+ leaseTransfer
+ )
+
+ for _, tc := range []struct {
+ name string
+
+ reqType reqType
+ // The lower bound of all currently-evaluating requests. We can't close this
+ // or above.
+ trackerLowerBound hlc.Timestamp
+ // The expiration of the current lease. The closed timestamp of most
+ // proposal is upper-bounded by this, which matters for
+ // LEAD_FOR_GLOBAL_READS ranges (on other ranges the propBuf would never
+ // like to close a timestamp above the current lease expiration because it
+ // wouldn't be processing commands if the lease is expired).
+ leaseExp hlc.Timestamp
+ rangePolicy roachpb.RangeClosedTimestampPolicy
+ // The highest closed timestamp that the propBuf has previously attached to
+ // a proposal. The propBuf should never propose a new closedTS below this.
+ prevClosedTimestamp hlc.Timestamp
+
+ // lease is used when reqType = newLease. This will be the lease being
+ // proposed.
+ lease roachpb.Lease
+
+ expClosed hlc.Timestamp
+ }{
+ {
+ name: "basic",
+ reqType: regularWrite,
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ prevClosedTimestamp: hlc.Timestamp{},
+ expClosed: nowMinusClosedLag,
+ },
+ {
+ // The request tracker will prevent us from closing below its lower bound.
+ name: "not closing below evaluating requests",
+ reqType: regularWrite,
+ trackerLowerBound: nowMinusTwiceClosedLag,
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ prevClosedTimestamp: hlc.Timestamp{},
+ expClosed: nowMinusTwiceClosedLag.FloorPrev(),
+ },
+ {
+ // Like the basic test, except that we can't close timestamp below what
+ // we've already closed previously.
+ name: "no regression",
+ reqType: regularWrite,
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ prevClosedTimestamp: someClosedTS,
+ expClosed: someClosedTS,
+ },
+ {
+ name: "brand new lease",
+ reqType: newLease,
+ lease: roachpb.Lease{
+ // Higher sequence => this is a brand new lease, not an extension.
+ Sequence: curLease.Sequence + 1,
+ Start: newLeaseStart,
+ },
+ trackerLowerBound: hlc.Timestamp{},
+ // The current lease can be expired; we won't backtrack the closed
+ // timestamp to this expiration.
+ leaseExp: expiredLeaseTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ expClosed: newLeaseStart.ToTimestamp(),
+ },
+ {
+ name: "lease extension",
+ reqType: newLease,
+ lease: roachpb.Lease{
+ // Same sequence => this is a lease extension.
+ Sequence: curLease.Sequence,
+ Start: newLeaseStart,
+ },
+ trackerLowerBound: hlc.Timestamp{},
+ // The current lease can be expired; we won't backtrack the closed
+ // timestamp to this expiration.
+ leaseExp: expiredLeaseTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ // Lease extensions don't carry closed timestamps because they don't get
+ // MLAIs, and so they can be reordered.
+ expClosed: hlc.Timestamp{},
+ },
+ {
+ // Lease transfers behave just like regular writes. The lease start time
+ // doesn't matter.
+ name: "lease transfer",
+ reqType: leaseTransfer,
+ lease: roachpb.Lease{
+ Sequence: curLease.Sequence + 1,
+ Start: newLeaseStart,
+ },
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ expClosed: nowMinusClosedLag,
+ },
+ {
+ // With the LEAD_FOR_GLOBAL_READS policy, we're expecting to close
+ // timestamps in the future.
+ // TODO(andrei,nvanbenschoten): The global policy is not actually hooked
+ // up at the moment, so this test expects a past timestamp to be closed.
+ // Once it is hooked up, we should also add another test that checks that
+ // timestamps above the current lease expiration are not closed.
+ name: "global range",
+ reqType: regularWrite,
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LEAD_FOR_GLOBAL_READS,
+ prevClosedTimestamp: hlc.Timestamp{},
+ expClosed: nowMinusClosedLag,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ r := &testProposerRaft{}
+ p := testProposer{
+ lai: 10,
+ raftGroup: r,
+ }
+ tracker := mockTracker{
+ lowerBound: tc.trackerLowerBound,
+ }
+ pc := proposalCreator{lease: kvserverpb.LeaseStatus{Lease: curLease}}
+ pc.lease.Lease.Expiration = &tc.leaseExp
+
+ var b propBuf
+ b.Init(&p, tracker, clock, st)
+ b.forwardClosedTimestampLocked(tc.prevClosedTimestamp)
+
+ var pd *ProposalData
+ var data []byte
+ switch tc.reqType {
+ case regularWrite:
+ pd, data = pc.newPutProposal()
+ case newLease:
+ pd, data = pc.newLeaseProposal(tc.lease)
+ case leaseTransfer:
+ var ba roachpb.BatchRequest
+ ba.Add(&roachpb.TransferLeaseRequest{
+ Lease: roachpb.Lease{
+ Start: now.MustToClockTimestamp(),
+ Sequence: pc.lease.Lease.Sequence + 1,
+ },
+ PrevLease: pc.lease.Lease,
+ })
+ pd, data = pc.newProposal(ba)
+ default:
+ t.Fatalf("unknown req type %d", tc.reqType)
+ }
+ tok := TrackedRequestToken{
+ done: false,
+ tok: nil,
+ b: &b,
+ }
+ _, err := b.Insert(ctx, pd, data, tok)
+ require.NoError(t, err)
+ require.NoError(t, b.flushLocked(ctx))
+ checkClosedTS(t, r, tc.expClosed)
+ })
+ }
+}
+
+type mockTracker struct {
+ lowerBound hlc.Timestamp
+}
+
+func (t mockTracker) Track(ctx context.Context, ts hlc.Timestamp) tracker.RemovalToken {
+ panic("unimplemented")
+}
+
+func (t mockTracker) Untrack(context.Context, tracker.RemovalToken) {}
+
+func (t mockTracker) LowerBound(context.Context) hlc.Timestamp {
+ return t.lowerBound
+}
+
+func (t mockTracker) Count() int {
+ panic("unimplemented")
+}
+
+var _ tracker.Tracker = mockTracker{}
diff --git a/pkg/kv/kvserver/replica_raft.go b/pkg/kv/kvserver/replica_raft.go
index 686294c3ee75..2568c9b44158 100644
--- a/pkg/kv/kvserver/replica_raft.go
+++ b/pkg/kv/kvserver/replica_raft.go
@@ -58,6 +58,10 @@ func makeIDKey() kvserverbase.CmdIDKey {
// caller should relinquish all ownership of it. If it does return an error, the
// caller retains full ownership over the guard.
//
+// evalAndPropose takes ownership of the supplied token; the caller should
+// tok.Move() it into this method. It will be used to untrack the request once
+// it comes out of the proposal buffer.
+//
// Return values:
// - a channel which receives a response or error upon application
// - a closure used to attempt to abandon the command. When called, it unbinds
@@ -73,9 +77,11 @@ func (r *Replica) evalAndPropose(
g *concurrency.Guard,
st kvserverpb.LeaseStatus,
lul hlc.Timestamp,
+ tok TrackedRequestToken,
) (chan proposalResult, func(), int64, *roachpb.Error) {
+ defer tok.DoneIfNotMoved(ctx)
idKey := makeIDKey()
- proposal, pErr := r.requestToProposal(ctx, idKey, ba, lul, g.LatchSpans())
+ proposal, pErr := r.requestToProposal(ctx, idKey, ba, st, lul, g.LatchSpans())
log.Event(proposal.ctx, "evaluated request")
// If the request hit a server-side concurrency retry error, immediately
@@ -200,7 +206,7 @@ func (r *Replica) evalAndPropose(
}
}
- maxLeaseIndex, pErr := r.propose(ctx, proposal)
+ maxLeaseIndex, pErr := r.propose(ctx, proposal, tok.Move(ctx))
if pErr != nil {
return nil, nil, 0, pErr
}
@@ -234,7 +240,14 @@ func (r *Replica) evalAndPropose(
// the method returns, all access to the command must be performed while holding
// Replica.mu and Replica.raftMu. If a non-nil error is returned the
// MaxLeaseIndex is not updated.
-func (r *Replica) propose(ctx context.Context, p *ProposalData) (index int64, pErr *roachpb.Error) {
+//
+// propose takes ownership of the supplied token; the caller should tok.Move()
+// it into this method. It will be used to untrack the request once it comes out
+// of the proposal buffer.
+func (r *Replica) propose(
+ ctx context.Context, p *ProposalData, tok TrackedRequestToken,
+) (index int64, pErr *roachpb.Error) {
+ defer tok.DoneIfNotMoved(ctx)
// If an error occurs reset the command's MaxLeaseIndex to its initial value.
// Failure to propose will propagate to the client. An invariant of this
@@ -304,8 +317,12 @@ func (r *Replica) propose(ctx context.Context, p *ProposalData) (index int64, pE
preLen = raftCommandPrefixLen
}
cmdLen := p.command.Size()
- cap := preLen + cmdLen + kvserverpb.MaxRaftCommandFooterSize()
- data := make([]byte, preLen, cap)
+ // Allocate the data slice with enough capacity to eventually hold the two
+ // "footers" that are filled later.
+ needed := preLen + cmdLen +
+ kvserverpb.MaxRaftCommandFooterSize() +
+ kvserverpb.MaxClosedTimestampFooterSize()
+ data := make([]byte, preLen, needed)
// Encode prefix with command ID, if necessary.
if prefix {
encodeRaftCommandPrefix(data, version, p.idKey)
@@ -345,7 +362,7 @@ func (r *Replica) propose(ctx context.Context, p *ProposalData) (index int64, pE
//
// NB: we must not hold r.mu while using the proposal buffer, see comment
// on the field.
- maxLeaseIndex, err := r.mu.proposalBuf.Insert(ctx, p, data)
+ maxLeaseIndex, err := r.mu.proposalBuf.Insert(ctx, p, data, tok.Move(ctx))
if err != nil {
return 0, roachpb.NewError(err)
}
@@ -977,6 +994,9 @@ const (
// waiting on.
// mu must be held.
//
+// Note that reproposals don't need to worry about checking the closed timestamp
+// before reproposing, since they're reusing the original LAI.
+//
// refreshAtDelta only applies for reasonTicks and specifies how old (in ticks)
// a command must be for it to be inspected; the usual value is the number of
// ticks of an election timeout (affect only proposals that have had ample time
diff --git a/pkg/kv/kvserver/replica_rangefeed_test.go b/pkg/kv/kvserver/replica_rangefeed_test.go
index 4105f97d4374..de435bd8712b 100644
--- a/pkg/kv/kvserver/replica_rangefeed_test.go
+++ b/pkg/kv/kvserver/replica_rangefeed_test.go
@@ -167,6 +167,7 @@ func TestReplicaRangefeed(t *testing.T) {
}
events = stream.Events()
+ // Filter out checkpoints. Those are not deterministic; they can come at any time.
var filteredEvents []*roachpb.RangeFeedEvent
for _, e := range events {
if e.Checkpoint != nil {
diff --git a/pkg/kv/kvserver/replica_test.go b/pkg/kv/kvserver/replica_test.go
index caa40fde4334..ac468760c49f 100644
--- a/pkg/kv/kvserver/replica_test.go
+++ b/pkg/kv/kvserver/replica_test.go
@@ -198,6 +198,9 @@ func (tc *testContext) Clock() *hlc.Clock {
func (tc *testContext) Start(t testing.TB, stopper *stop.Stopper) {
tc.manualClock = hlc.NewManualClock(123)
cfg := TestStoreConfig(hlc.NewClock(tc.manualClock.UnixNano, time.Nanosecond))
+ // testContext tests like to move the manual clock around and assume that they can write at past
+ // timestamps.
+ cfg.TestingKnobs.DontCloseTimestamps = true
tc.StartWithStoreConfig(t, stopper, cfg)
}
@@ -617,7 +620,8 @@ func sendLeaseRequest(r *Replica, l *roachpb.Lease) error {
ba.Timestamp = r.store.Clock().Now()
ba.Add(&roachpb.RequestLeaseRequest{Lease: *l})
st := r.CurrentLeaseStatus(ctx)
- ch, _, _, pErr := r.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := r.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr == nil {
// Next if the command was committed, wait for the range to apply it.
// TODO(bdarnell): refactor this to a more conventional error-handling pattern.
@@ -1418,7 +1422,8 @@ func TestReplicaLeaseRejectUnknownRaftNodeID(t *testing.T) {
ba := roachpb.BatchRequest{}
ba.Timestamp = tc.repl.store.Clock().Now()
ba.Add(&roachpb.RequestLeaseRequest{Lease: *lease})
- ch, _, _, pErr := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr == nil {
// Next if the command was committed, wait for the range to apply it.
// TODO(bdarnell): refactor to a more conventional error-handling pattern.
@@ -7894,7 +7899,8 @@ func TestReplicaCancelRaftCommandProgress(t *testing.T) {
},
})
st := repl.CurrentLeaseStatus(ctx)
- ch, _, idx, err := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, idx, err := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if err != nil {
t.Fatal(err)
}
@@ -7963,8 +7969,9 @@ func TestReplicaBurstPendingCommandsAndRepropose(t *testing.T) {
Key: roachpb.Key(fmt.Sprintf("k%d", i)),
},
})
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
st := tc.repl.CurrentLeaseStatus(ctx)
- ch, _, idx, err := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ ch, _, idx, err := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if err != nil {
t.Fatal(err)
}
@@ -8082,8 +8089,8 @@ func TestReplicaRefreshPendingCommandsTicks(t *testing.T) {
var ba roachpb.BatchRequest
ba.Timestamp = tc.Clock().Now()
ba.Add(&roachpb.PutRequest{RequestHeader: roachpb.RequestHeader{Key: roachpb.Key(id)}})
- lease, _ := r.GetLease()
- cmd, pErr := r.requestToProposal(ctx, kvserverbase.CmdIDKey(id), &ba, hlc.Timestamp{}, &allSpans)
+ st := r.CurrentLeaseStatus(ctx)
+ cmd, pErr := r.requestToProposal(ctx, kvserverbase.CmdIDKey(id), &ba, st, hlc.Timestamp{}, &allSpans)
if pErr != nil {
t.Fatal(pErr)
}
@@ -8092,8 +8099,9 @@ func TestReplicaRefreshPendingCommandsTicks(t *testing.T) {
dropProposals.m[cmd] = struct{}{} // silently drop proposals
dropProposals.Unlock()
- cmd.command.ProposerLeaseSequence = lease.Sequence
- if _, pErr := r.propose(ctx, cmd); pErr != nil {
+ cmd.command.ProposerLeaseSequence = st.Lease.Sequence
+ _, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ if _, pErr := r.propose(ctx, cmd, tok); pErr != nil {
t.Error(pErr)
}
r.mu.Lock()
@@ -8204,7 +8212,7 @@ func TestReplicaRefreshMultiple(t *testing.T) {
incCmdID = makeIDKey()
atomic.StoreInt32(&filterActive, 1)
- proposal, pErr := repl.requestToProposal(ctx, incCmdID, &ba, hlc.Timestamp{}, &allSpans)
+ proposal, pErr := repl.requestToProposal(ctx, incCmdID, &ba, repl.CurrentLeaseStatus(ctx), hlc.Timestamp{}, &allSpans)
if pErr != nil {
t.Fatal(pErr)
}
@@ -8234,7 +8242,8 @@ func TestReplicaRefreshMultiple(t *testing.T) {
// that it will generate a retry when it fails. Then call refreshProposals
// twice to repropose it and put it in the logs twice more.
proposal.command.ProposerLeaseSequence = repl.mu.state.Lease.Sequence
- if _, pErr := repl.propose(ctx, proposal); pErr != nil {
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ if _, pErr := repl.propose(ctx, proposal, tok); pErr != nil {
t.Fatal(pErr)
}
repl.mu.Lock()
@@ -8244,6 +8253,7 @@ func TestReplicaRefreshMultiple(t *testing.T) {
repl.refreshProposalsLocked(ctx, 0 /* refreshAtDelta */, reasonNewLeader)
repl.refreshProposalsLocked(ctx, 0 /* refreshAtDelta */, reasonNewLeader)
repl.mu.Unlock()
+ require.Zero(t, tc.repl.mu.proposalBuf.EvaluatingRequestsCount())
// Wait for our proposal to apply. The two refreshed proposals above
// will fail due to their illegal lease index. Then they'll generate
@@ -9238,6 +9248,7 @@ func TestCommandTooLarge(t *testing.T) {
func TestErrorInRaftApplicationClearsIntents(t *testing.T) {
defer leaktest.AfterTest(t)()
defer log.Scope(t).Close(t)
+ ctx := context.Background()
var storeKnobs StoreTestingKnobs
var filterActive int32
@@ -9257,7 +9268,7 @@ func TestErrorInRaftApplicationClearsIntents(t *testing.T) {
defer s.Stopper().Stop(context.Background())
splitKey := roachpb.Key("b")
- if err := kvDB.AdminSplit(context.Background(), splitKey, hlc.MaxTimestamp /* expirationTime */); err != nil {
+ if err := kvDB.AdminSplit(ctx, splitKey, hlc.MaxTimestamp /* expirationTime */); err != nil {
t.Fatal(err)
}
@@ -9296,7 +9307,8 @@ func TestErrorInRaftApplicationClearsIntents(t *testing.T) {
exLease, _ := repl.GetLease()
st := kvserverpb.LeaseStatus{Lease: exLease, State: kvserverpb.LeaseState_VALID}
- ch, _, _, pErr := repl.evalAndPropose(context.Background(), &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -9343,7 +9355,8 @@ func TestProposeWithAsyncConsensus(t *testing.T) {
atomic.StoreInt32(&filterActive, 1)
st := tc.repl.CurrentLeaseStatus(ctx)
- ch, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -9407,7 +9420,8 @@ func TestApplyPaginatedCommittedEntries(t *testing.T) {
atomic.StoreInt32(&filterActive, 1)
st := repl.CurrentLeaseStatus(ctx)
- _, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -9425,7 +9439,8 @@ func TestApplyPaginatedCommittedEntries(t *testing.T) {
ba2.Timestamp = tc.Clock().Now()
var pErr *roachpb.Error
- ch, _, _, pErr = repl.evalAndPropose(ctx, &ba2, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr = repl.evalAndPropose(ctx, &ba2, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -12537,9 +12552,10 @@ func TestProposalNotAcknowledgedOrReproposedAfterApplication(t *testing.T) {
// Hold the RaftLock to ensure that after evalAndPropose our proposal is in
// the proposal map. Entries are only removed from that map underneath raft.
tc.repl.RaftLock()
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
sp := cfg.AmbientCtx.Tracer.StartSpan("replica send", tracing.WithForceRealSpan())
tracedCtx := tracing.ContextWithSpan(ctx, sp)
- ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok)
if pErr != nil {
t.Fatal(pErr)
}
@@ -12625,13 +12641,14 @@ func TestLaterReproposalsDoNotReuseContext(t *testing.T) {
Value: roachpb.MakeValueFromBytes([]byte("val")),
})
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
// Hold the RaftLock to encourage the reproposals to occur in the same batch.
tc.repl.RaftLock()
tracedCtx, sp := tracer.StartSpanCtx(ctx, "replica send", tracing.WithForceRealSpan())
// Go out of our way to enable recording so that expensive logging is enabled
// for this context.
sp.SetVerbose(true)
- ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -12800,7 +12817,7 @@ func TestContainsEstimatesClampProposal(t *testing.T) {
ba.Timestamp = tc.Clock().Now()
req := putArgs(roachpb.Key("some-key"), []byte("some-value"))
ba.Add(&req)
- proposal, err := tc.repl.requestToProposal(ctx, cmdIDKey, &ba, hlc.Timestamp{}, &allSpans)
+ proposal, err := tc.repl.requestToProposal(ctx, cmdIDKey, &ba, tc.repl.CurrentLeaseStatus(ctx), hlc.Timestamp{}, &allSpans)
if err != nil {
t.Error(err)
}
diff --git a/pkg/kv/kvserver/replica_write.go b/pkg/kv/kvserver/replica_write.go
index b02db0ae3af0..fab0d7372cde 100644
--- a/pkg/kv/kvserver/replica_write.go
+++ b/pkg/kv/kvserver/replica_write.go
@@ -88,6 +88,25 @@ func (r *Replica) executeWriteBatch(
minTS, untrack := r.store.cfg.ClosedTimestamp.Tracker.Track(ctx)
defer untrack(ctx, 0, 0, 0) // covers all error returns below
+ // Start tracking this request. The act of tracking also gives us a closed
+ // timestamp, which we must ensure to evaluate above of. We're going to pass
+ // in minTS to applyTimestampCache(), which bumps us accordingly if necessary.
+ // We need to start tracking this request before we know the final write
+ // timestamp at which this request will evaluate because we need to atomically
+ // read the closed timestamp and start to be tracked.
+ // TODO(andrei): The timestamp cache might bump us above the timestamp at
+ // which we're registering with the proposalBuf. In that case, this request
+ // will be tracked at an unnecessarily low timestamp. We could invent an
+ // interface through which to communicate the updated timestamp to the
+ // proposalBuf.
+ minTS2, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, ba.WriteTimestamp())
+ defer tok.DoneIfNotMoved(ctx)
+ minTS.Forward(minTS2)
+
+ if !ba.IsSingleSkipLeaseCheckRequest() && st.Expiration().Less(minTS) {
+ log.Fatalf(ctx, "closed timestamp above lease expiration (%s vs %s): %s", minTS, st.Expiration(), ba)
+ }
+
// Examine the timestamp cache for preceding commands which require this
// command to move its timestamp forward. Or, in the case of a transactional
// write, the txn timestamp and possible write-too-old bool.
@@ -120,7 +139,7 @@ func (r *Replica) executeWriteBatch(
// If the command is proposed to Raft, ownership of and responsibility for
// the concurrency guard will be assumed by Raft, so provide the guard to
// evalAndPropose.
- ch, abandon, maxLeaseIndex, pErr := r.evalAndPropose(ctx, ba, g, st, localUncertaintyLimit)
+ ch, abandon, maxLeaseIndex, pErr := r.evalAndPropose(ctx, ba, g, st, localUncertaintyLimit, tok.Move(ctx))
if pErr != nil {
if maxLeaseIndex != 0 {
log.Fatalf(
diff --git a/pkg/kv/kvserver/stateloader/stateloader.go b/pkg/kv/kvserver/stateloader/stateloader.go
index 9a1a4d5be558..a6610a807d39 100644
--- a/pkg/kv/kvserver/stateloader/stateloader.go
+++ b/pkg/kv/kvserver/stateloader/stateloader.go
@@ -83,6 +83,9 @@ func (rsl StateLoader) Load(
ms := as.RangeStats.ToStats()
s.Stats = &ms
+ if as.ClosedTimestamp != nil {
+ s.ClosedTimestamp = *as.ClosedTimestamp
+ }
} else {
if s.RaftAppliedIndex, s.LeaseAppliedIndex, err = rsl.LoadAppliedIndex(ctx, reader); err != nil {
return kvserverpb.ReplicaState{}, err
@@ -167,8 +170,8 @@ func (rsl StateLoader) Save(
}
}
if state.UsingAppliedStateKey {
- rai, lai := state.RaftAppliedIndex, state.LeaseAppliedIndex
- if err := rsl.SetRangeAppliedState(ctx, readWriter, rai, lai, ms); err != nil {
+ rai, lai, ct := state.RaftAppliedIndex, state.LeaseAppliedIndex, &state.ClosedTimestamp
+ if err := rsl.SetRangeAppliedState(ctx, readWriter, rai, lai, ms, ct); err != nil {
return enginepb.MVCCStats{}, err
}
} else {
@@ -294,17 +297,26 @@ func (rsl StateLoader) LoadMVCCStats(
// The applied indices and the stats used to be stored separately in different
// keys. We now deem those keys to be "legacy" because they have been replaced
// by the range applied state key.
+//
+// TODO(andrei): closedTimestamp is a pointer to avoid an allocation when
+// putting it in RangeAppliedState. RangeAppliedState.ClosedTimestamp is made
+// non-nullable (see comments on the field), this argument should be taken by
+// value.
func (rsl StateLoader) SetRangeAppliedState(
ctx context.Context,
readWriter storage.ReadWriter,
appliedIndex, leaseAppliedIndex uint64,
newMS *enginepb.MVCCStats,
+ closedTimestamp *hlc.Timestamp,
) error {
as := enginepb.RangeAppliedState{
RaftAppliedIndex: appliedIndex,
LeaseAppliedIndex: leaseAppliedIndex,
RangeStats: newMS.ToPersistentStats(),
}
+ if closedTimestamp != nil && !closedTimestamp.IsEmpty() {
+ as.ClosedTimestamp = closedTimestamp
+ }
// The RangeAppliedStateKey is not included in stats. This is also reflected
// in C.MVCCComputeStats and ComputeStatsForRange.
ms := (*enginepb.MVCCStats)(nil)
@@ -477,12 +489,26 @@ func (rsl StateLoader) SetMVCCStats(
if as, err := rsl.LoadRangeAppliedState(ctx, readWriter); err != nil {
return err
} else if as != nil {
- return rsl.SetRangeAppliedState(ctx, readWriter, as.RaftAppliedIndex, as.LeaseAppliedIndex, newMS)
+ return rsl.SetRangeAppliedState(
+ ctx, readWriter, as.RaftAppliedIndex, as.LeaseAppliedIndex, newMS, as.ClosedTimestamp)
}
return rsl.writeLegacyMVCCStatsInternal(ctx, readWriter, newMS)
}
+// SetClosedTimestamp overwrites the closed timestamp.
+func (rsl StateLoader) SetClosedTimestamp(
+ ctx context.Context, readWriter storage.ReadWriter, closedTS hlc.Timestamp,
+) error {
+ as, err := rsl.LoadRangeAppliedState(ctx, readWriter)
+ if err != nil {
+ return err
+ }
+ return rsl.SetRangeAppliedState(
+ ctx, readWriter, as.RaftAppliedIndex, as.LeaseAppliedIndex,
+ as.RangeStats.ToStatsPtr(), &closedTS)
+}
+
// SetLegacyRaftTruncatedState overwrites the truncated state.
func (rsl StateLoader) SetLegacyRaftTruncatedState(
ctx context.Context,
diff --git a/pkg/kv/kvserver/store_split.go b/pkg/kv/kvserver/store_split.go
index 83692feba9f1..7f8dccbfa3c4 100644
--- a/pkg/kv/kvserver/store_split.go
+++ b/pkg/kv/kvserver/store_split.go
@@ -18,6 +18,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/roachpb"
"github.com/cockroachdb/cockroach/pkg/storage"
"github.com/cockroachdb/cockroach/pkg/storage/enginepb"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/cockroach/pkg/util/log"
"github.com/cockroachdb/errors"
"go.etcd.io/etcd/raft/v3"
@@ -28,7 +29,12 @@ import (
// changes to the given ReadWriter will be written atomically with the
// split commit.
func splitPreApply(
- ctx context.Context, readWriter storage.ReadWriter, split roachpb.SplitTrigger, r *Replica,
+ ctx context.Context,
+ readWriter storage.ReadWriter,
+ split roachpb.SplitTrigger,
+ r *Replica,
+ // The closed timestamp used to initialize the RHS.
+ closedTS hlc.Timestamp,
) {
// Sanity check that the store is in the split.
//
@@ -116,6 +122,11 @@ func splitPreApply(
log.Fatalf(ctx, "%v", err)
}
+ // Persist the closed timestamp.
+ if err := rsl.SetClosedTimestamp(ctx, readWriter, closedTS); err != nil {
+ log.Fatalf(ctx, "%s", err)
+ }
+
// The initialMaxClosed is assigned to the RHS replica to ensure that
// follower reads do not regress following the split. After the split occurs
// there will be no information in the closedts subsystem about the newly
diff --git a/pkg/kv/kvserver/testing_knobs.go b/pkg/kv/kvserver/testing_knobs.go
index 96ad6bff8468..aaba2ea7c185 100644
--- a/pkg/kv/kvserver/testing_knobs.go
+++ b/pkg/kv/kvserver/testing_knobs.go
@@ -239,6 +239,9 @@ type StoreTestingKnobs struct {
// heartbeats and then expect other replicas to take the lease without
// worrying about Raft).
AllowLeaseRequestProposalsWhenNotLeader bool
+ // DontCloseTimestamps inhibits the propBuf's closing of timestamps. All Raft
+ // commands will carry an empty closed timestamp.
+ DontCloseTimestamps bool
// AllowDangerousReplicationChanges disables safeguards
// in execChangeReplicasTxn that prevent moving
// to a configuration that cannot make progress.
diff --git a/pkg/roachpb/batch.go b/pkg/roachpb/batch.go
index ed1bf4d6a188..37ce483aa908 100644
--- a/pkg/roachpb/batch.go
+++ b/pkg/roachpb/batch.go
@@ -56,7 +56,7 @@ func (ba *BatchRequest) SetActiveTimestamp(nowFn func() hlc.Timestamp) error {
// provisional commit timestamp evolves.
//
// Note that writes will be performed at the provisional commit timestamp,
- // txn.Timestamp, regardless of the batch timestamp.
+ // txn.WriteTimestamp, regardless of the batch timestamp.
ba.Timestamp = txn.ReadTimestamp
} else {
// When not transactional, allow empty timestamp and use nowFn instead
diff --git a/pkg/storage/enginepb/mvcc3.go b/pkg/storage/enginepb/mvcc3.go
index b03c00ca9bce..1cb6924095d5 100644
--- a/pkg/storage/enginepb/mvcc3.go
+++ b/pkg/storage/enginepb/mvcc3.go
@@ -30,6 +30,11 @@ func (ms *MVCCPersistentStats) ToStats() MVCCStats {
return MVCCStats(*ms)
}
+// ToStatsPtr converts the receiver to a *MVCCStats.
+func (ms *MVCCPersistentStats) ToStatsPtr() *MVCCStats {
+ return (*MVCCStats)(ms)
+}
+
// SafeValue implements the redact.SafeValue interface.
func (ms *MVCCStats) SafeValue() {}
diff --git a/pkg/storage/enginepb/mvcc3.pb.go b/pkg/storage/enginepb/mvcc3.pb.go
index 8d61e5cafc58..def873b63b77 100644
--- a/pkg/storage/enginepb/mvcc3.pb.go
+++ b/pkg/storage/enginepb/mvcc3.pb.go
@@ -129,7 +129,7 @@ type TxnMeta struct {
func (m *TxnMeta) Reset() { *m = TxnMeta{} }
func (*TxnMeta) ProtoMessage() {}
func (*TxnMeta) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{0}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{0}
}
func (m *TxnMeta) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -165,7 +165,7 @@ func (m *IgnoredSeqNumRange) Reset() { *m = IgnoredSeqNumRange{} }
func (m *IgnoredSeqNumRange) String() string { return proto.CompactTextString(m) }
func (*IgnoredSeqNumRange) ProtoMessage() {}
func (*IgnoredSeqNumRange) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{1}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{1}
}
func (m *IgnoredSeqNumRange) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -216,7 +216,7 @@ func (m *MVCCStatsDelta) Reset() { *m = MVCCStatsDelta{} }
func (m *MVCCStatsDelta) String() string { return proto.CompactTextString(m) }
func (*MVCCStatsDelta) ProtoMessage() {}
func (*MVCCStatsDelta) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{2}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{2}
}
func (m *MVCCStatsDelta) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -268,7 +268,7 @@ func (m *MVCCPersistentStats) Reset() { *m = MVCCPersistentStats{} }
func (m *MVCCPersistentStats) String() string { return proto.CompactTextString(m) }
func (*MVCCPersistentStats) ProtoMessage() {}
func (*MVCCPersistentStats) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{3}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{3}
}
func (m *MVCCPersistentStats) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -307,13 +307,25 @@ type RangeAppliedState struct {
// range_stats is the set of mvcc stats that accounts for the current value
// of the Raft state machine.
RangeStats MVCCPersistentStats `protobuf:"bytes,3,opt,name=range_stats,json=rangeStats,proto3" json:"range_stats"`
+ // closed_timestamp is the largest timestamp that is known to have been closed
+ // as of this lease applied index. This means that the current leaseholder (if
+ // any) and any future leaseholder will not evaluate writes at or below this
+ // timestamp, and also that any in-flight commands that can still apply are
+ // writing at higher timestamps. Non-leaseholder replicas are free to serve
+ // "follower reads" at or below this timestamp.
+ //
+ // TODO(andrei): Make this field not-nullable in 21.2, once all the ranges
+ // have a closed timestamp applied to their state (this might need a
+ // migration). In 21.1 we cannot write empty timestamp to disk because that
+ // looks like an inconsistency to the consistency-checker.
+ ClosedTimestamp *hlc.Timestamp `protobuf:"bytes,4,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp,omitempty"`
}
func (m *RangeAppliedState) Reset() { *m = RangeAppliedState{} }
func (m *RangeAppliedState) String() string { return proto.CompactTextString(m) }
func (*RangeAppliedState) ProtoMessage() {}
func (*RangeAppliedState) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{4}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{4}
}
func (m *RangeAppliedState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -351,7 +363,7 @@ func (m *MVCCWriteValueOp) Reset() { *m = MVCCWriteValueOp{} }
func (m *MVCCWriteValueOp) String() string { return proto.CompactTextString(m) }
func (*MVCCWriteValueOp) ProtoMessage() {}
func (*MVCCWriteValueOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{5}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{5}
}
func (m *MVCCWriteValueOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -389,7 +401,7 @@ func (m *MVCCWriteIntentOp) Reset() { *m = MVCCWriteIntentOp{} }
func (m *MVCCWriteIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCWriteIntentOp) ProtoMessage() {}
func (*MVCCWriteIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{6}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{6}
}
func (m *MVCCWriteIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -425,7 +437,7 @@ func (m *MVCCUpdateIntentOp) Reset() { *m = MVCCUpdateIntentOp{} }
func (m *MVCCUpdateIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCUpdateIntentOp) ProtoMessage() {}
func (*MVCCUpdateIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{7}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{7}
}
func (m *MVCCUpdateIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -464,7 +476,7 @@ func (m *MVCCCommitIntentOp) Reset() { *m = MVCCCommitIntentOp{} }
func (m *MVCCCommitIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCCommitIntentOp) ProtoMessage() {}
func (*MVCCCommitIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{8}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{8}
}
func (m *MVCCCommitIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -504,7 +516,7 @@ func (m *MVCCAbortIntentOp) Reset() { *m = MVCCAbortIntentOp{} }
func (m *MVCCAbortIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCAbortIntentOp) ProtoMessage() {}
func (*MVCCAbortIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{9}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{9}
}
func (m *MVCCAbortIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -540,7 +552,7 @@ func (m *MVCCAbortTxnOp) Reset() { *m = MVCCAbortTxnOp{} }
func (m *MVCCAbortTxnOp) String() string { return proto.CompactTextString(m) }
func (*MVCCAbortTxnOp) ProtoMessage() {}
func (*MVCCAbortTxnOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{10}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{10}
}
func (m *MVCCAbortTxnOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -579,7 +591,7 @@ func (m *MVCCLogicalOp) Reset() { *m = MVCCLogicalOp{} }
func (m *MVCCLogicalOp) String() string { return proto.CompactTextString(m) }
func (*MVCCLogicalOp) ProtoMessage() {}
func (*MVCCLogicalOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{11}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{11}
}
func (m *MVCCLogicalOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -811,6 +823,9 @@ func (this *RangeAppliedState) Equal(that interface{}) bool {
if !this.RangeStats.Equal(&that1.RangeStats) {
return false
}
+ if !this.ClosedTimestamp.Equal(that1.ClosedTimestamp) {
+ return false
+ }
return true
}
func (m *TxnMeta) Marshal() (dAtA []byte, err error) {
@@ -1143,6 +1158,16 @@ func (m *RangeAppliedState) MarshalTo(dAtA []byte) (int, error) {
return 0, err
}
i += n4
+ if m.ClosedTimestamp != nil {
+ dAtA[i] = 0x22
+ i++
+ i = encodeVarintMvcc3(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n5, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n5
+ }
return i, nil
}
@@ -1170,11 +1195,11 @@ func (m *MVCCWriteValueOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n5, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n6, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n5
+ i += n6
if len(m.Value) > 0 {
dAtA[i] = 0x1a
i++
@@ -1208,11 +1233,11 @@ func (m *MVCCWriteIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n6, err := m.TxnID.MarshalTo(dAtA[i:])
+ n7, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n6
+ i += n7
if len(m.TxnKey) > 0 {
dAtA[i] = 0x12
i++
@@ -1222,19 +1247,19 @@ func (m *MVCCWriteIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n7, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n8, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n7
+ i += n8
dAtA[i] = 0x22
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnMinTimestamp.Size()))
- n8, err := m.TxnMinTimestamp.MarshalTo(dAtA[i:])
+ n9, err := m.TxnMinTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n8
+ i += n9
return i, nil
}
@@ -1256,19 +1281,19 @@ func (m *MVCCUpdateIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n9, err := m.TxnID.MarshalTo(dAtA[i:])
+ n10, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n9
+ i += n10
dAtA[i] = 0x12
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n10, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n11, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n10
+ i += n11
return i, nil
}
@@ -1290,11 +1315,11 @@ func (m *MVCCCommitIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n11, err := m.TxnID.MarshalTo(dAtA[i:])
+ n12, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n11
+ i += n12
if len(m.Key) > 0 {
dAtA[i] = 0x12
i++
@@ -1304,11 +1329,11 @@ func (m *MVCCCommitIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n12, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n13, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n12
+ i += n13
if len(m.Value) > 0 {
dAtA[i] = 0x22
i++
@@ -1342,11 +1367,11 @@ func (m *MVCCAbortIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n13, err := m.TxnID.MarshalTo(dAtA[i:])
+ n14, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n13
+ i += n14
return i, nil
}
@@ -1368,11 +1393,11 @@ func (m *MVCCAbortTxnOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n14, err := m.TxnID.MarshalTo(dAtA[i:])
+ n15, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n14
+ i += n15
return i, nil
}
@@ -1395,61 +1420,61 @@ func (m *MVCCLogicalOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.WriteValue.Size()))
- n15, err := m.WriteValue.MarshalTo(dAtA[i:])
+ n16, err := m.WriteValue.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n15
+ i += n16
}
if m.WriteIntent != nil {
dAtA[i] = 0x12
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.WriteIntent.Size()))
- n16, err := m.WriteIntent.MarshalTo(dAtA[i:])
+ n17, err := m.WriteIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n16
+ i += n17
}
if m.UpdateIntent != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.UpdateIntent.Size()))
- n17, err := m.UpdateIntent.MarshalTo(dAtA[i:])
+ n18, err := m.UpdateIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n17
+ i += n18
}
if m.CommitIntent != nil {
dAtA[i] = 0x22
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.CommitIntent.Size()))
- n18, err := m.CommitIntent.MarshalTo(dAtA[i:])
+ n19, err := m.CommitIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n18
+ i += n19
}
if m.AbortIntent != nil {
dAtA[i] = 0x2a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.AbortIntent.Size()))
- n19, err := m.AbortIntent.MarshalTo(dAtA[i:])
+ n20, err := m.AbortIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n19
+ i += n20
}
if m.AbortTxn != nil {
dAtA[i] = 0x32
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.AbortTxn.Size()))
- n20, err := m.AbortTxn.MarshalTo(dAtA[i:])
+ n21, err := m.AbortTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n20
+ i += n21
}
return i, nil
}
@@ -1585,6 +1610,9 @@ func NewPopulatedRangeAppliedState(r randyMvcc3, easy bool) *RangeAppliedState {
this.LeaseAppliedIndex = uint64(uint64(r.Uint32()))
v5 := NewPopulatedMVCCPersistentStats(r, easy)
this.RangeStats = *v5
+ if r.Intn(10) != 0 {
+ this.ClosedTimestamp = hlc.NewPopulatedTimestamp(r, easy)
+ }
if !easy && r.Intn(10) != 0 {
}
return this
@@ -1833,6 +1861,10 @@ func (m *RangeAppliedState) Size() (n int) {
}
l = m.RangeStats.Size()
n += 1 + l + sovMvcc3(uint64(l))
+ if m.ClosedTimestamp != nil {
+ l = m.ClosedTimestamp.Size()
+ n += 1 + l + sovMvcc3(uint64(l))
+ }
return n
}
@@ -3116,6 +3148,39 @@ func (m *RangeAppliedState) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowMvcc3
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthMvcc3
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.ClosedTimestamp == nil {
+ m.ClosedTimestamp = &hlc.Timestamp{}
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipMvcc3(dAtA[iNdEx:])
@@ -4308,86 +4373,87 @@ var (
)
func init() {
- proto.RegisterFile("storage/enginepb/mvcc3.proto", fileDescriptor_mvcc3_91ae80d2fc45e9ad)
+ proto.RegisterFile("storage/enginepb/mvcc3.proto", fileDescriptor_mvcc3_ed774bd3b5c68109)
}
-var fileDescriptor_mvcc3_91ae80d2fc45e9ad = []byte{
- // 1219 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x41, 0x6f, 0x1b, 0x45,
- 0x14, 0xf6, 0x7a, 0xd7, 0xc9, 0xfa, 0xd9, 0x49, 0xec, 0x69, 0x05, 0x56, 0x69, 0xed, 0xe0, 0x03,
- 0x8a, 0x4a, 0xbb, 0x46, 0x2d, 0xa7, 0xdc, 0xec, 0xa4, 0x2a, 0x2e, 0x4d, 0x53, 0x36, 0x6e, 0x91,
- 0x40, 0x62, 0x35, 0x5e, 0x0f, 0x9b, 0x55, 0xd6, 0xb3, 0xdb, 0xdd, 0xb1, 0x6b, 0xff, 0x0b, 0x2e,
- 0x48, 0x1c, 0x40, 0xca, 0x8f, 0xe0, 0xc0, 0x4f, 0xc8, 0xb1, 0x12, 0x1c, 0x2a, 0x24, 0x2c, 0x70,
- 0x2f, 0xfc, 0x86, 0xf6, 0x82, 0x66, 0x66, 0xbd, 0xb6, 0x03, 0x71, 0x0c, 0x81, 0x88, 0xdb, 0xcc,
- 0xfb, 0xde, 0xfb, 0xde, 0x9b, 0xe7, 0x6f, 0xe7, 0x8d, 0xe1, 0x7a, 0xc4, 0xfc, 0x10, 0x3b, 0xa4,
- 0x46, 0xa8, 0xe3, 0x52, 0x12, 0xb4, 0x6b, 0xdd, 0xbe, 0x6d, 0xdf, 0x35, 0x82, 0xd0, 0x67, 0x3e,
- 0xba, 0x66, 0xfb, 0xf6, 0x51, 0xe8, 0x63, 0xfb, 0xd0, 0x88, 0xfd, 0x8c, 0x89, 0xdf, 0xb5, 0x52,
- 0x8f, 0xb9, 0x5e, 0xed, 0xd0, 0xb3, 0x6b, 0xcc, 0xed, 0x92, 0x88, 0xe1, 0x6e, 0x20, 0xa3, 0xae,
- 0x5d, 0x75, 0x7c, 0xc7, 0x17, 0xcb, 0x1a, 0x5f, 0x49, 0x6b, 0xf5, 0x6b, 0x15, 0x56, 0x5b, 0x03,
- 0xba, 0x47, 0x18, 0x46, 0x9f, 0x40, 0xda, 0xed, 0x94, 0x94, 0x4d, 0x65, 0x2b, 0xdf, 0xa8, 0x9f,
- 0x8c, 0x2a, 0xa9, 0x9f, 0x47, 0x95, 0xbb, 0x8e, 0xcb, 0x0e, 0x7b, 0x6d, 0xc3, 0xf6, 0xbb, 0xb5,
- 0x24, 0x6d, 0xa7, 0x3d, 0x5d, 0xd7, 0x82, 0x23, 0xa7, 0x26, 0x92, 0xf6, 0x7a, 0x6e, 0xc7, 0x78,
- 0xf2, 0xa4, 0xb9, 0x3b, 0x1e, 0x55, 0xd2, 0xcd, 0x5d, 0x33, 0xed, 0x76, 0x50, 0x01, 0xd4, 0x23,
- 0x32, 0x2c, 0xa9, 0x9c, 0xd3, 0xe4, 0x4b, 0x54, 0x85, 0x0c, 0x09, 0x7c, 0xfb, 0xb0, 0xa4, 0x6d,
- 0x2a, 0x5b, 0x99, 0x46, 0xfe, 0xf5, 0xa8, 0xa2, 0xb7, 0x06, 0xf4, 0x1e, 0xb7, 0x99, 0x12, 0x42,
- 0x0f, 0x61, 0xe3, 0x79, 0xe8, 0x32, 0x62, 0x25, 0x67, 0x28, 0x65, 0x36, 0x95, 0xad, 0xdc, 0x9d,
- 0x1b, 0xc6, 0xf4, 0xe8, 0x3c, 0xa7, 0x71, 0xe8, 0xd9, 0x46, 0x6b, 0xe2, 0xd4, 0xd0, 0x78, 0xd1,
- 0xe6, 0xba, 0x88, 0x4d, 0xac, 0xe8, 0x7d, 0xd0, 0x83, 0xd0, 0xf5, 0x43, 0x97, 0x0d, 0x4b, 0x2b,
- 0x22, 0xe9, 0xc6, 0xeb, 0x51, 0x25, 0xd7, 0x1a, 0xd0, 0xc7, 0xb1, 0xd9, 0x4c, 0x1c, 0xd0, 0x7b,
- 0xa0, 0x47, 0xe4, 0x59, 0x8f, 0x50, 0x9b, 0x94, 0x56, 0x85, 0x33, 0xbc, 0x1e, 0x55, 0x56, 0x5a,
- 0x03, 0x7a, 0x40, 0x9e, 0x99, 0x09, 0x86, 0x3e, 0x82, 0xb5, 0xae, 0x4b, 0x67, 0x0a, 0xcc, 0x2e,
- 0x5f, 0x60, 0xbe, 0xeb, 0xd2, 0xc4, 0xb6, 0xad, 0x7f, 0x73, 0x5c, 0x49, 0xfd, 0x70, 0x5c, 0x51,
- 0x1e, 0x68, 0x7a, 0xba, 0xa0, 0x3e, 0xd0, 0x74, 0xbd, 0x90, 0xad, 0x7e, 0x01, 0xa8, 0xe9, 0x50,
- 0x3f, 0x24, 0x9d, 0x03, 0xf2, 0xec, 0x51, 0xaf, 0x6b, 0x62, 0xea, 0x10, 0xb4, 0x09, 0x99, 0x88,
- 0xe1, 0x90, 0x89, 0x1f, 0x69, 0xbe, 0x34, 0x09, 0xa0, 0xeb, 0xa0, 0x12, 0xda, 0x29, 0xa5, 0xff,
- 0x84, 0x73, 0xf3, 0xb6, 0xce, 0xf3, 0xfc, 0x7e, 0x5c, 0x51, 0xaa, 0x3f, 0x69, 0xb0, 0xbe, 0xf7,
- 0x74, 0x67, 0xe7, 0x80, 0x61, 0x16, 0xed, 0x12, 0x8f, 0x61, 0x74, 0x13, 0x8a, 0x1e, 0x8e, 0x98,
- 0xd5, 0x0b, 0x3a, 0x98, 0x11, 0x8b, 0x62, 0xea, 0x47, 0x22, 0x51, 0xc1, 0xdc, 0xe0, 0xc0, 0x13,
- 0x61, 0x7f, 0xc4, 0xcd, 0xe8, 0x06, 0x80, 0x4b, 0x19, 0xa1, 0xcc, 0xc2, 0x0e, 0x11, 0xd9, 0x0a,
- 0x66, 0x56, 0x5a, 0xea, 0x0e, 0x41, 0x1f, 0x40, 0xde, 0xb1, 0xad, 0xf6, 0x90, 0x91, 0x48, 0x38,
- 0xf0, 0xdf, 0xbf, 0xd0, 0x58, 0x1f, 0x8f, 0x2a, 0x70, 0x7f, 0xa7, 0xc1, 0xcd, 0x75, 0x87, 0x98,
- 0xe0, 0xd8, 0x93, 0x35, 0x27, 0xf4, 0xdc, 0x3e, 0x91, 0x31, 0x42, 0x1b, 0xc8, 0xcc, 0x72, 0x8b,
- 0xf0, 0x48, 0x60, 0xdb, 0xef, 0x51, 0x26, 0xc4, 0x10, 0xc3, 0x3b, 0xdc, 0x80, 0xde, 0x81, 0xec,
- 0x11, 0x19, 0xc6, 0xc1, 0x2b, 0x02, 0xd5, 0x8f, 0xc8, 0x50, 0xc6, 0xc6, 0xa0, 0x0c, 0x5d, 0x4d,
- 0xc0, 0x24, 0xb2, 0x8f, 0xbd, 0x38, 0x52, 0x97, 0x60, 0x1f, 0x7b, 0x49, 0x24, 0x07, 0x65, 0x64,
- 0x36, 0x01, 0x65, 0xe4, 0xbb, 0x90, 0x8f, 0x5b, 0x20, 0x83, 0x41, 0xe0, 0x39, 0x69, 0x93, 0xf1,
- 0x53, 0x17, 0x49, 0x91, 0x9b, 0x75, 0x49, 0xf2, 0x47, 0xc3, 0x28, 0xa6, 0xc8, 0xcb, 0x14, 0xd1,
- 0x30, 0x4a, 0xf2, 0x73, 0x50, 0x06, 0xaf, 0x25, 0xa0, 0x8c, 0xbc, 0x0d, 0xc8, 0xf6, 0x29, 0xc3,
- 0x2e, 0x8d, 0x2c, 0x12, 0x31, 0xb7, 0x8b, 0x39, 0xc5, 0xfa, 0xa6, 0xb2, 0xa5, 0x9a, 0xc5, 0x09,
- 0x72, 0x6f, 0x02, 0xa0, 0x2d, 0x28, 0xe0, 0xb6, 0x1f, 0x32, 0x2b, 0x0a, 0x30, 0x8d, 0xf3, 0x6d,
- 0x08, 0xca, 0x75, 0x61, 0x3f, 0x08, 0x30, 0x95, 0x59, 0x3f, 0x84, 0xb7, 0x22, 0x12, 0xe0, 0x10,
- 0x33, 0xd2, 0xb1, 0xe6, 0xea, 0x2f, 0x08, 0xff, 0xab, 0x09, 0xda, 0x9c, 0x1e, 0x64, 0x5b, 0x13,
- 0xb2, 0xfa, 0x45, 0x83, 0x2b, 0x5c, 0x56, 0x8f, 0x49, 0x18, 0xb9, 0x11, 0x47, 0x85, 0xc0, 0xfe,
- 0x6f, 0xda, 0x52, 0x17, 0x6b, 0x4b, 0x5d, 0xa8, 0x2d, 0x75, 0x91, 0xb6, 0xd4, 0x45, 0xda, 0x52,
- 0x17, 0x69, 0x4b, 0x3d, 0x47, 0x5b, 0xea, 0xf9, 0xda, 0x52, 0xcf, 0xd1, 0x96, 0xba, 0x48, 0x5b,
- 0xea, 0xbf, 0xaf, 0x2d, 0xf5, 0x6f, 0x6a, 0x4b, 0x3d, 0x43, 0x5b, 0xd3, 0x6b, 0xeb, 0x47, 0x05,
- 0x8a, 0xe2, 0x2a, 0xac, 0x07, 0x81, 0xe7, 0x92, 0x0e, 0x57, 0x17, 0x41, 0xb7, 0x00, 0x85, 0xf8,
- 0x4b, 0x66, 0x61, 0x69, 0xb4, 0x5c, 0xda, 0x21, 0x03, 0x21, 0x2f, 0xcd, 0x2c, 0x70, 0x24, 0xf6,
- 0x6e, 0x72, 0x3b, 0x32, 0xe0, 0x8a, 0x47, 0x70, 0x44, 0x4e, 0xb9, 0xa7, 0x85, 0x7b, 0x51, 0x40,
- 0x73, 0xfe, 0x4f, 0x21, 0x17, 0xf2, 0x94, 0x56, 0xc4, 0xa5, 0x2c, 0xf4, 0x96, 0xbb, 0x53, 0x33,
- 0xce, 0x1e, 0xc2, 0xc6, 0x5f, 0x7c, 0x01, 0xf1, 0xd5, 0x0f, 0x82, 0x49, 0x58, 0x66, 0x4e, 0xf5,
- 0xad, 0x02, 0x05, 0x1e, 0xf3, 0x29, 0x1f, 0x5c, 0x4f, 0xb1, 0xd7, 0x23, 0xfb, 0xc1, 0x64, 0x74,
- 0x2a, 0xd3, 0xd1, 0x59, 0x87, 0xec, 0x74, 0xde, 0xa4, 0x97, 0x9f, 0x37, 0xd3, 0x28, 0x74, 0x15,
- 0x32, 0x7d, 0xce, 0x1f, 0x4f, 0x64, 0xb9, 0xe1, 0x5f, 0x40, 0x10, 0x92, 0xbe, 0x25, 0x21, 0x4d,
- 0x40, 0x59, 0x6e, 0x11, 0xb5, 0x54, 0xbf, 0x4b, 0x43, 0x31, 0x29, 0x4f, 0xfe, 0x2e, 0xfb, 0x01,
- 0xfa, 0x1c, 0x56, 0xd8, 0x80, 0x5a, 0xc9, 0x8b, 0x61, 0xf7, 0x62, 0x2f, 0x86, 0x4c, 0x6b, 0x40,
- 0x9b, 0xbb, 0x66, 0x86, 0x0d, 0x68, 0xb3, 0x83, 0xde, 0x86, 0x55, 0x4e, 0xce, 0x1b, 0x90, 0x16,
- 0xe5, 0xf0, 0x5c, 0x1f, 0x9f, 0xee, 0x81, 0xfa, 0x8f, 0x7a, 0xb0, 0x0f, 0x45, 0xce, 0x3d, 0x3f,
- 0xbe, 0xb5, 0xe5, 0xa9, 0x36, 0xd8, 0x80, 0xee, 0xcd, 0x4c, 0xf0, 0xea, 0xf7, 0x0a, 0x20, 0xde,
- 0x1f, 0x79, 0x89, 0x5d, 0x4e, 0x83, 0x2e, 0xae, 0x85, 0xea, 0x9b, 0xb8, 0xec, 0x1d, 0xbf, 0xdb,
- 0x75, 0xd9, 0xe5, 0x94, 0x1d, 0x8b, 0x3a, 0x7d, 0x86, 0xa8, 0xd5, 0x8b, 0x89, 0x5a, 0x3b, 0x5b,
- 0xd4, 0x99, 0xd3, 0xa2, 0x0e, 0xa4, 0xa6, 0xeb, 0xfc, 0x7e, 0xba, 0x94, 0xb3, 0x57, 0xbb, 0xf2,
- 0xc5, 0x25, 0x32, 0xb6, 0x06, 0xf4, 0xbf, 0x4e, 0xf7, 0x46, 0x85, 0x35, 0x9e, 0xef, 0xa1, 0xef,
- 0xb8, 0x36, 0xf6, 0xf6, 0x03, 0xb4, 0x07, 0x39, 0xf9, 0xac, 0x96, 0x2d, 0x51, 0x44, 0xb3, 0x6f,
- 0x9d, 0x77, 0x91, 0xcd, 0x5e, 0x4a, 0x26, 0x3c, 0x4f, 0x76, 0xe8, 0x31, 0xe4, 0x25, 0x9d, 0xbc,
- 0xc7, 0x63, 0x15, 0xde, 0x5e, 0x8a, 0x6f, 0xd2, 0x71, 0x53, 0x56, 0x24, 0xb7, 0xe8, 0x00, 0xd6,
- 0xe2, 0x07, 0x42, 0x4c, 0x29, 0xf5, 0x60, 0x9c, 0x47, 0x39, 0xff, 0xe1, 0x99, 0xf9, 0xde, 0xcc,
- 0x9e, 0x93, 0xda, 0x42, 0xe1, 0x13, 0x52, 0x6d, 0x39, 0xd2, 0xf9, 0xcf, 0xc2, 0xcc, 0xdb, 0x33,
- 0x7b, 0x7e, 0x76, 0x39, 0xf1, 0x62, 0xce, 0xcc, 0x72, 0x67, 0x9f, 0x53, 0x9b, 0x99, 0xc3, 0xd3,
- 0x2d, 0xba, 0x0f, 0x59, 0xc9, 0xc8, 0x06, 0x54, 0x3c, 0x33, 0x72, 0x77, 0x6e, 0x2e, 0x45, 0x27,
- 0xa4, 0x64, 0xea, 0x38, 0x5e, 0x6f, 0x6b, 0x27, 0xc7, 0x15, 0xa5, 0x71, 0xf3, 0xe4, 0xb7, 0x72,
- 0xea, 0x64, 0x5c, 0x56, 0x5e, 0x8c, 0xcb, 0xca, 0xcb, 0x71, 0x59, 0xf9, 0x75, 0x5c, 0x56, 0xbe,
- 0x7a, 0x55, 0x4e, 0xbd, 0x78, 0x55, 0x4e, 0xbd, 0x7c, 0x55, 0x4e, 0x7d, 0xa6, 0x4f, 0xa8, 0xda,
- 0x2b, 0xe2, 0xaf, 0xe0, 0xdd, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x83, 0xbe, 0x76, 0x2a, 0x76,
- 0x0e, 0x00, 0x00,
+var fileDescriptor_mvcc3_ed774bd3b5c68109 = []byte{
+ // 1236 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x41, 0x6f, 0xe3, 0x44,
+ 0x14, 0x8e, 0x63, 0xa7, 0x75, 0x26, 0x69, 0x93, 0xce, 0xae, 0x20, 0x5a, 0x76, 0x93, 0x92, 0x03,
+ 0xaa, 0x96, 0x5d, 0x07, 0xb5, 0x9c, 0x7a, 0x4b, 0xda, 0xd5, 0x6e, 0x96, 0xed, 0xb6, 0xb8, 0x69,
+ 0x91, 0x40, 0xc2, 0x9a, 0xd8, 0x83, 0x6b, 0xd5, 0x19, 0xbb, 0xf6, 0x24, 0xeb, 0xfc, 0x0b, 0x2e,
+ 0x48, 0x1c, 0x40, 0xea, 0x8f, 0xe0, 0xc0, 0x4f, 0xe8, 0x71, 0x0f, 0x1c, 0x56, 0x48, 0x44, 0x90,
+ 0x5e, 0xf8, 0x0d, 0xdd, 0x0b, 0x9a, 0x19, 0xc7, 0x49, 0x0a, 0x4d, 0x03, 0x85, 0x8a, 0xdb, 0xcc,
+ 0xfb, 0xde, 0xfb, 0xde, 0x9b, 0x97, 0xcf, 0xf3, 0x26, 0xe0, 0x7e, 0x48, 0xbd, 0x00, 0xd9, 0xb8,
+ 0x86, 0x89, 0xed, 0x10, 0xec, 0xb7, 0x6b, 0x9d, 0x9e, 0x69, 0x6e, 0x68, 0x7e, 0xe0, 0x51, 0x0f,
+ 0xde, 0x33, 0x3d, 0xf3, 0x38, 0xf0, 0x90, 0x79, 0xa4, 0xc5, 0x7e, 0xda, 0xc8, 0xef, 0x5e, 0xa9,
+ 0x4b, 0x1d, 0xb7, 0x76, 0xe4, 0x9a, 0x35, 0xea, 0x74, 0x70, 0x48, 0x51, 0xc7, 0x17, 0x51, 0xf7,
+ 0xee, 0xda, 0x9e, 0xed, 0xf1, 0x65, 0x8d, 0xad, 0x84, 0xb5, 0xfa, 0x8d, 0x0c, 0x16, 0x5b, 0x11,
+ 0xd9, 0xc1, 0x14, 0xc1, 0x4f, 0x41, 0xda, 0xb1, 0x4a, 0xd2, 0xaa, 0xb4, 0x96, 0x6f, 0xd4, 0xcf,
+ 0x06, 0x95, 0xd4, 0xcf, 0x83, 0xca, 0x86, 0xed, 0xd0, 0xa3, 0x6e, 0x5b, 0x33, 0xbd, 0x4e, 0x2d,
+ 0x49, 0x6b, 0xb5, 0xc7, 0xeb, 0x9a, 0x7f, 0x6c, 0xd7, 0x78, 0xd2, 0x6e, 0xd7, 0xb1, 0xb4, 0x83,
+ 0x83, 0xe6, 0xf6, 0x70, 0x50, 0x49, 0x37, 0xb7, 0xf5, 0xb4, 0x63, 0xc1, 0x22, 0x90, 0x8f, 0x71,
+ 0xbf, 0x24, 0x33, 0x4e, 0x9d, 0x2d, 0x61, 0x15, 0x64, 0xb0, 0xef, 0x99, 0x47, 0x25, 0x65, 0x55,
+ 0x5a, 0xcb, 0x34, 0xf2, 0x17, 0x83, 0x8a, 0xda, 0x8a, 0xc8, 0x13, 0x66, 0xd3, 0x05, 0x04, 0x5f,
+ 0x80, 0xc2, 0xab, 0xc0, 0xa1, 0xd8, 0x48, 0xce, 0x50, 0xca, 0xac, 0x4a, 0x6b, 0xb9, 0xf5, 0x07,
+ 0xda, 0xf8, 0xe8, 0x2c, 0xa7, 0x76, 0xe4, 0x9a, 0x5a, 0x6b, 0xe4, 0xd4, 0x50, 0x58, 0xd1, 0xfa,
+ 0x32, 0x8f, 0x4d, 0xac, 0xf0, 0x43, 0xa0, 0xfa, 0x81, 0xe3, 0x05, 0x0e, 0xed, 0x97, 0x16, 0x78,
+ 0xd2, 0xc2, 0xc5, 0xa0, 0x92, 0x6b, 0x45, 0x64, 0x2f, 0x36, 0xeb, 0x89, 0x03, 0xfc, 0x00, 0xa8,
+ 0x21, 0x3e, 0xe9, 0x62, 0x62, 0xe2, 0xd2, 0x22, 0x77, 0x06, 0x17, 0x83, 0xca, 0x42, 0x2b, 0x22,
+ 0xfb, 0xf8, 0x44, 0x4f, 0x30, 0xf8, 0x0c, 0x2c, 0x75, 0x1c, 0x32, 0x51, 0x60, 0x76, 0xfe, 0x02,
+ 0xf3, 0x1d, 0x87, 0x24, 0xb6, 0x4d, 0xf5, 0xdb, 0xd3, 0x4a, 0xea, 0xc7, 0xd3, 0x8a, 0xf4, 0x5c,
+ 0x51, 0xd3, 0x45, 0xf9, 0xb9, 0xa2, 0xaa, 0xc5, 0x6c, 0xf5, 0x4b, 0x00, 0x9b, 0x36, 0xf1, 0x02,
+ 0x6c, 0xed, 0xe3, 0x93, 0x97, 0xdd, 0x8e, 0x8e, 0x88, 0x8d, 0xe1, 0x2a, 0xc8, 0x84, 0x14, 0x05,
+ 0x94, 0xff, 0x48, 0xd3, 0xa5, 0x09, 0x00, 0xde, 0x07, 0x32, 0x26, 0x56, 0x29, 0xfd, 0x27, 0x9c,
+ 0x99, 0x37, 0x55, 0x96, 0xe7, 0xf7, 0xd3, 0x8a, 0x54, 0xfd, 0x49, 0x01, 0xcb, 0x3b, 0x87, 0x5b,
+ 0x5b, 0xfb, 0x14, 0xd1, 0x70, 0x1b, 0xbb, 0x14, 0xc1, 0x87, 0x60, 0xc5, 0x45, 0x21, 0x35, 0xba,
+ 0xbe, 0x85, 0x28, 0x36, 0x08, 0x22, 0x5e, 0xc8, 0x13, 0x15, 0xf5, 0x02, 0x03, 0x0e, 0xb8, 0xfd,
+ 0x25, 0x33, 0xc3, 0x07, 0x00, 0x38, 0x84, 0x62, 0x42, 0x0d, 0x64, 0x63, 0x9e, 0xad, 0xa8, 0x67,
+ 0x85, 0xa5, 0x6e, 0x63, 0xf8, 0x11, 0xc8, 0xdb, 0xa6, 0xd1, 0xee, 0x53, 0x1c, 0x72, 0x07, 0xf6,
+ 0xfb, 0x17, 0x1b, 0xcb, 0xc3, 0x41, 0x05, 0x3c, 0xdd, 0x6a, 0x30, 0x73, 0xdd, 0xc6, 0x3a, 0xb0,
+ 0xcd, 0xd1, 0x9a, 0x11, 0xba, 0x4e, 0x0f, 0x8b, 0x18, 0xae, 0x0d, 0xa8, 0x67, 0x99, 0x85, 0x7b,
+ 0x24, 0xb0, 0xe9, 0x75, 0x09, 0xe5, 0x62, 0x88, 0xe1, 0x2d, 0x66, 0x80, 0xef, 0x81, 0xec, 0x31,
+ 0xee, 0xc7, 0xc1, 0x0b, 0x1c, 0x55, 0x8f, 0x71, 0x5f, 0xc4, 0xc6, 0xa0, 0x08, 0x5d, 0x4c, 0xc0,
+ 0x24, 0xb2, 0x87, 0xdc, 0x38, 0x52, 0x15, 0x60, 0x0f, 0xb9, 0x49, 0x24, 0x03, 0x45, 0x64, 0x36,
+ 0x01, 0x45, 0xe4, 0xfb, 0x20, 0x1f, 0xb7, 0x40, 0x04, 0x03, 0x8e, 0xe7, 0x84, 0x4d, 0xc4, 0x8f,
+ 0x5d, 0x04, 0x45, 0x6e, 0xd2, 0x25, 0xc9, 0x1f, 0xf6, 0xc3, 0x98, 0x22, 0x2f, 0x52, 0x84, 0xfd,
+ 0x30, 0xc9, 0xcf, 0x40, 0x11, 0xbc, 0x94, 0x80, 0x22, 0xf2, 0x31, 0x80, 0xa6, 0x47, 0x28, 0x72,
+ 0x48, 0x68, 0xe0, 0x90, 0x3a, 0x1d, 0xc4, 0x28, 0x96, 0x57, 0xa5, 0x35, 0x59, 0x5f, 0x19, 0x21,
+ 0x4f, 0x46, 0x00, 0x5c, 0x03, 0x45, 0xd4, 0xf6, 0x02, 0x6a, 0x84, 0x3e, 0x22, 0x71, 0xbe, 0x02,
+ 0xa7, 0x5c, 0xe6, 0xf6, 0x7d, 0x1f, 0x11, 0x91, 0xf5, 0x63, 0xf0, 0x4e, 0x88, 0x7d, 0x14, 0x20,
+ 0x8a, 0x2d, 0x63, 0xaa, 0xfe, 0x22, 0xf7, 0xbf, 0x9b, 0xa0, 0xcd, 0xf1, 0x41, 0x36, 0x15, 0x2e,
+ 0xab, 0x5f, 0x14, 0x70, 0x87, 0xc9, 0x6a, 0x0f, 0x07, 0xa1, 0x13, 0x32, 0x94, 0x0b, 0xec, 0xff,
+ 0xa6, 0x2d, 0x79, 0xb6, 0xb6, 0xe4, 0x99, 0xda, 0x92, 0x67, 0x69, 0x4b, 0x9e, 0xa5, 0x2d, 0x79,
+ 0x96, 0xb6, 0xe4, 0x6b, 0xb4, 0x25, 0x5f, 0xaf, 0x2d, 0xf9, 0x1a, 0x6d, 0xc9, 0xb3, 0xb4, 0x25,
+ 0xff, 0xfb, 0xda, 0x92, 0xff, 0xa6, 0xb6, 0xe4, 0x2b, 0xb4, 0x35, 0xbe, 0xb6, 0xbe, 0x4f, 0x83,
+ 0x15, 0x7e, 0x15, 0xd6, 0x7d, 0xdf, 0x75, 0xb0, 0xc5, 0xd4, 0x85, 0xe1, 0x23, 0x00, 0x03, 0xf4,
+ 0x15, 0x35, 0x90, 0x30, 0x1a, 0x0e, 0xb1, 0x70, 0xc4, 0xe5, 0xa5, 0xe8, 0x45, 0x86, 0xc4, 0xde,
+ 0x4d, 0x66, 0x87, 0x1a, 0xb8, 0xe3, 0x62, 0x14, 0xe2, 0x4b, 0xee, 0x69, 0xee, 0xbe, 0xc2, 0xa1,
+ 0x29, 0xff, 0x43, 0x90, 0x0b, 0x58, 0x4a, 0x23, 0x64, 0x52, 0xe6, 0x7a, 0xcb, 0xad, 0xd7, 0xb4,
+ 0xab, 0x87, 0xb0, 0xf6, 0x17, 0x5f, 0x40, 0x7c, 0xf5, 0x03, 0xce, 0x24, 0xbe, 0x89, 0x67, 0xa0,
+ 0x68, 0xba, 0x5e, 0x88, 0xad, 0x89, 0x29, 0xa2, 0xcc, 0x31, 0x45, 0xf4, 0x82, 0x08, 0x9b, 0x18,
+ 0x21, 0x49, 0x7f, 0xbe, 0x93, 0x40, 0x91, 0x65, 0xff, 0x8c, 0x8d, 0xc0, 0x43, 0xe4, 0x76, 0xf1,
+ 0xae, 0x3f, 0x1a, 0xc2, 0xd2, 0x78, 0x08, 0xd7, 0x41, 0x76, 0x9c, 0x33, 0x3d, 0xff, 0xe4, 0x1a,
+ 0x47, 0xc1, 0xbb, 0x20, 0xd3, 0x63, 0xfc, 0xf1, 0x6c, 0x17, 0x1b, 0xf6, 0x2d, 0xf9, 0x01, 0xee,
+ 0x19, 0x02, 0x52, 0x38, 0x94, 0x65, 0x16, 0x5e, 0x0b, 0xff, 0xf9, 0x92, 0xf2, 0xc4, 0x2f, 0xbc,
+ 0xeb, 0xc3, 0x2f, 0xc0, 0x02, 0x8d, 0x88, 0x91, 0xbc, 0x3d, 0xb6, 0x6f, 0xf6, 0xf6, 0xc8, 0xb4,
+ 0x22, 0xd2, 0xdc, 0xd6, 0x33, 0x34, 0x22, 0x4d, 0x0b, 0xbe, 0x0b, 0x16, 0x19, 0x39, 0x6b, 0x40,
+ 0x9a, 0x97, 0xc3, 0x72, 0x7d, 0x72, 0xb9, 0x07, 0xf2, 0x3f, 0xea, 0xc1, 0x2e, 0x58, 0x61, 0xdc,
+ 0xd3, 0x0f, 0x01, 0x65, 0x7e, 0xaa, 0x02, 0x8d, 0xc8, 0xce, 0xc4, 0x5b, 0xa0, 0xfa, 0x83, 0x04,
+ 0x20, 0xeb, 0x8f, 0xb8, 0x0e, 0x6f, 0xa7, 0x41, 0x37, 0xd7, 0x42, 0xf5, 0x6d, 0x5c, 0xf6, 0x96,
+ 0xd7, 0xe9, 0x38, 0xf4, 0x76, 0xca, 0x8e, 0x45, 0x9d, 0xbe, 0x42, 0xd4, 0xf2, 0xcd, 0x44, 0xad,
+ 0x5c, 0x2d, 0xea, 0xcc, 0x65, 0x51, 0xfb, 0x42, 0xd3, 0x75, 0x76, 0xd3, 0xdd, 0xca, 0xd9, 0xab,
+ 0x1d, 0xf1, 0x76, 0xe3, 0x19, 0x5b, 0x11, 0xf9, 0xaf, 0xd3, 0xbd, 0x95, 0xc1, 0x12, 0xcb, 0xf7,
+ 0xc2, 0xb3, 0x1d, 0x13, 0xb9, 0xbb, 0x3e, 0xdc, 0x01, 0x39, 0xf1, 0x40, 0x17, 0x2d, 0x91, 0x78,
+ 0xb3, 0x1f, 0x5d, 0x77, 0x25, 0x4e, 0x5e, 0x4a, 0x3a, 0x78, 0x95, 0xec, 0xe0, 0x1e, 0xc8, 0x0b,
+ 0x3a, 0x31, 0x11, 0x62, 0x15, 0x3e, 0x9e, 0x8b, 0x6f, 0xd4, 0x71, 0x5d, 0x54, 0x24, 0xb6, 0x70,
+ 0x1f, 0x2c, 0xc5, 0x4f, 0x8d, 0x98, 0x52, 0xe8, 0x41, 0xbb, 0x8e, 0x72, 0xfa, 0xc3, 0xd3, 0xf3,
+ 0xdd, 0x89, 0x3d, 0x23, 0x35, 0xb9, 0xc2, 0x47, 0xa4, 0xca, 0x7c, 0xa4, 0xd3, 0x9f, 0x85, 0x9e,
+ 0x37, 0x27, 0xf6, 0xec, 0xec, 0x62, 0x76, 0xc6, 0x9c, 0x99, 0xf9, 0xce, 0x3e, 0xa5, 0x36, 0x3d,
+ 0x87, 0xc6, 0x5b, 0xf8, 0x14, 0x64, 0x05, 0x23, 0x8d, 0x08, 0x7f, 0xb0, 0xe4, 0xd6, 0x1f, 0xce,
+ 0x45, 0xc7, 0xa5, 0xa4, 0xab, 0x28, 0x5e, 0x6f, 0x2a, 0x67, 0xa7, 0x15, 0xa9, 0xf1, 0xf0, 0xec,
+ 0xb7, 0x72, 0xea, 0x6c, 0x58, 0x96, 0x5e, 0x0f, 0xcb, 0xd2, 0x9b, 0x61, 0x59, 0xfa, 0x75, 0x58,
+ 0x96, 0xbe, 0x3e, 0x2f, 0xa7, 0x5e, 0x9f, 0x97, 0x53, 0x6f, 0xce, 0xcb, 0xa9, 0xcf, 0xd5, 0x11,
+ 0x55, 0x7b, 0x81, 0xff, 0xa9, 0xdc, 0xf8, 0x23, 0x00, 0x00, 0xff, 0xff, 0x46, 0x22, 0xed, 0xb0,
+ 0xc0, 0x0e, 0x00, 0x00,
}
diff --git a/pkg/storage/enginepb/mvcc3.proto b/pkg/storage/enginepb/mvcc3.proto
index a283b4088bed..66181e1e064f 100644
--- a/pkg/storage/enginepb/mvcc3.proto
+++ b/pkg/storage/enginepb/mvcc3.proto
@@ -203,6 +203,19 @@ message RangeAppliedState {
// range_stats is the set of mvcc stats that accounts for the current value
// of the Raft state machine.
MVCCPersistentStats range_stats = 3 [(gogoproto.nullable) = false];
+
+ // closed_timestamp is the largest timestamp that is known to have been closed
+ // as of this lease applied index. This means that the current leaseholder (if
+ // any) and any future leaseholder will not evaluate writes at or below this
+ // timestamp, and also that any in-flight commands that can still apply are
+ // writing at higher timestamps. Non-leaseholder replicas are free to serve
+ // "follower reads" at or below this timestamp.
+ //
+ // TODO(andrei): Make this field not-nullable in 21.2, once all the ranges
+ // have a closed timestamp applied to their state (this might need a
+ // migration). In 21.1 we cannot write empty timestamp to disk because that
+ // looks like an inconsistency to the consistency-checker.
+ util.hlc.Timestamp closed_timestamp = 4;
}
// MVCCWriteValueOp corresponds to a value being written outside of a
diff --git a/pkg/util/hlc/timestamp.go b/pkg/util/hlc/timestamp.go
index 8a92f35190f2..af127a9c2457 100644
--- a/pkg/util/hlc/timestamp.go
+++ b/pkg/util/hlc/timestamp.go
@@ -196,6 +196,10 @@ func (t Timestamp) Add(wallTime int64, logical int32) Timestamp {
// // Adding a positive value to a Timestamp adds the Synthetic flag.
// s.Synthetic = true
// }
+ //
+ // When addressing this TODO, remove the hack in
+ // propBuf.assignClosedTimestampToProposal that manually marks lease
+ // expirations as synthetic.
return s
}
@@ -360,6 +364,15 @@ func (t Timestamp) UnsafeToClockTimestamp() ClockTimestamp {
return ClockTimestamp(t)
}
+// MustToClockTimestamp casts a Timestamp to a ClockTimestamp. Panics if the
+// timestamp is synthetic. See TryToClockTimestamp if you don't want to panic.
+func (t Timestamp) MustToClockTimestamp() ClockTimestamp {
+ if t.Synthetic {
+ panic(fmt.Sprintf("can't convert synthetic timestamp to ClockTimestamp: %s", t))
+ }
+ return ClockTimestamp(t)
+}
+
// ToTimestamp upcasts a ClockTimestamp into a Timestamp.
func (t ClockTimestamp) ToTimestamp() Timestamp {
if t.Synthetic {
From 8738d72e79cf1a8d22a66728cade562c868acdcd Mon Sep 17 00:00:00 2001
From: Andrei Matei
Date: Fri, 5 Feb 2021 13:18:37 -0500
Subject: [PATCH 5/6] kvserver: reset tscache after merge to closed ts
This patch deals with what happens to the RHS's timestamp cache on a
merge. Before this patch, we were either not touching the cache at all,
when the leases of the LHS and RHS were collocated at merge time, or we
were bumping the RHS's ts cache up to the freeze point otherwise
(because, in this case, the RHS's ts cache info has been lost). This
patch goes further: now we'll bump the RHS ts cache up to the RHS closed
timestamp on the argument the the RHS's closed timestamp is lost.
This patch is needed by the effort to move closed timestamp to be
per-range instead of per-store, and also to have future-time closed
timestamps. Today, the new ts cache bump is not necessary for a fairly
subtle reason: if the pre-merge leases are collocated,, then the closed
ts of the RHS is not "lost" because it's the same as the one of the LHS.
If the leases are not collocated, the freeze time of the RHS is
certainly above its closed ts. So, in either case, the current code
doesn't lead to the possibility of accepting write post-merge that
invalidate previous follower reads.
The RHS' closed timestamp is plumbed from the freeze to the merge
through subsume response.
Release note: None
---
pkg/kv/kvserver/batcheval/cmd_subsume.go | 9 +
pkg/kv/kvserver/batcheval/eval_context.go | 4 +
pkg/kv/kvserver/replica_application_result.go | 2 +-
pkg/kv/kvserver/replica_command.go | 9 +-
pkg/kv/kvserver/replica_eval_context_span.go | 16 +
pkg/kv/kvserver/replica_follower_read.go | 15 +
pkg/kv/kvserver/store_merge.go | 45 +-
pkg/roachpb/api.pb.go | 1859 +++++++++--------
pkg/roachpb/api.proto | 15 +
pkg/roachpb/data.pb.go | 576 ++---
pkg/roachpb/data.proto | 17 +-
11 files changed, 1386 insertions(+), 1181 deletions(-)
diff --git a/pkg/kv/kvserver/batcheval/cmd_subsume.go b/pkg/kv/kvserver/batcheval/cmd_subsume.go
index 77797e62b7c4..9bf39a925ffa 100644
--- a/pkg/kv/kvserver/batcheval/cmd_subsume.go
+++ b/pkg/kv/kvserver/batcheval/cmd_subsume.go
@@ -151,6 +151,15 @@ func Subsume(
reply.MVCCStats = cArgs.EvalCtx.GetMVCCStats()
reply.LeaseAppliedIndex = lai
reply.FreezeStart = cArgs.EvalCtx.Clock().NowAsClockTimestamp()
+ // FrozenClosedTimestamp might return an empty timestamp if the Raft-based
+ // closed timestamp transport hasn't been enabled yet. That's OK because, if
+ // the new transport is not enabled, then ranges with leading closed
+ // timestamps can't exist yet, and so the closed timestamp must be below the
+ // FreezeStart. The FreezeStart is used by Store.MergeRange to bump the RHS'
+ // ts cache if LHS/RHS leases are not collocated. The case when the leases are
+ // collocated also works out because then the closed timestamp (according to
+ // the old mechanism) is the same for both ranges being merged.
+ reply.ClosedTimestamp = cArgs.EvalCtx.FrozenClosedTimestamp(ctx)
return result.Result{
Local: result.LocalResult{FreezeStart: reply.FreezeStart.ToTimestamp()},
diff --git a/pkg/kv/kvserver/batcheval/eval_context.go b/pkg/kv/kvserver/batcheval/eval_context.go
index fa59268280a6..7851f091b101 100644
--- a/pkg/kv/kvserver/batcheval/eval_context.go
+++ b/pkg/kv/kvserver/batcheval/eval_context.go
@@ -68,6 +68,7 @@ type EvalContext interface {
GetTerm(uint64) (uint64, error)
GetLeaseAppliedIndex() uint64
GetTracker() closedts.TrackerI
+ FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp
Desc() *roachpb.RangeDescriptor
ContainsKey(key roachpb.Key) bool
@@ -184,6 +185,9 @@ func (m *mockEvalCtxImpl) GetLeaseAppliedIndex() uint64 {
func (m *mockEvalCtxImpl) GetTracker() closedts.TrackerI {
panic("unimplemented")
}
+func (m *mockEvalCtxImpl) FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp {
+ panic("unimplemented")
+}
func (m *mockEvalCtxImpl) Desc() *roachpb.RangeDescriptor {
return m.MockEvalCtx.Desc
}
diff --git a/pkg/kv/kvserver/replica_application_result.go b/pkg/kv/kvserver/replica_application_result.go
index 9477b8cc0cec..90c9d0247bf1 100644
--- a/pkg/kv/kvserver/replica_application_result.go
+++ b/pkg/kv/kvserver/replica_application_result.go
@@ -256,7 +256,7 @@ func (r *Replica) handleSplitResult(ctx context.Context, split *kvserverpb.Split
func (r *Replica) handleMergeResult(ctx context.Context, merge *kvserverpb.Merge) {
if err := r.store.MergeRange(
- ctx, r, merge.LeftDesc, merge.RightDesc, merge.FreezeStart,
+ ctx, r, merge.LeftDesc, merge.RightDesc, merge.FreezeStart, merge.RightClosedTimestamp,
); err != nil {
// Our in-memory state has diverged from the on-disk state.
log.Fatalf(ctx, "failed to update store after merging range: %s", err)
diff --git a/pkg/kv/kvserver/replica_command.go b/pkg/kv/kvserver/replica_command.go
index 996fb16630c0..be67327eba17 100644
--- a/pkg/kv/kvserver/replica_command.go
+++ b/pkg/kv/kvserver/replica_command.go
@@ -744,10 +744,11 @@ func (r *Replica) AdminMerge(
Commit: true,
InternalCommitTrigger: &roachpb.InternalCommitTrigger{
MergeTrigger: &roachpb.MergeTrigger{
- LeftDesc: updatedLeftDesc,
- RightDesc: rightDesc,
- RightMVCCStats: rhsSnapshotRes.MVCCStats,
- FreezeStart: rhsSnapshotRes.FreezeStart,
+ LeftDesc: updatedLeftDesc,
+ RightDesc: rightDesc,
+ RightMVCCStats: rhsSnapshotRes.MVCCStats,
+ FreezeStart: rhsSnapshotRes.FreezeStart,
+ RightClosedTimestamp: rhsSnapshotRes.ClosedTimestamp,
},
},
})
diff --git a/pkg/kv/kvserver/replica_eval_context_span.go b/pkg/kv/kvserver/replica_eval_context_span.go
index 0e8d519a6893..3eff1ee1bf0b 100644
--- a/pkg/kv/kvserver/replica_eval_context_span.go
+++ b/pkg/kv/kvserver/replica_eval_context_span.go
@@ -117,6 +117,22 @@ func (rec *SpanSetReplicaEvalContext) GetTracker() closedts.TrackerI {
return rec.i.GetTracker()
}
+// FrozenClosedTimestamp is part of the EvalContext interface.
+func (rec *SpanSetReplicaEvalContext) FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp {
+ // To capture a closed timestamp, all keys must be latched to prevent any
+ // concurrent writes (which could advance the closed timestamp).
+ desc := rec.i.Desc()
+ rec.ss.AssertAllowed(spanset.SpanReadWrite, roachpb.Span{
+ Key: keys.MakeRangeKeyPrefix(desc.StartKey),
+ EndKey: keys.MakeRangeKeyPrefix(desc.EndKey),
+ })
+ rec.ss.AssertAllowed(spanset.SpanReadWrite, roachpb.Span{
+ Key: desc.StartKey.AsRawKey(),
+ EndKey: desc.EndKey.AsRawKey(),
+ })
+ return rec.i.FrozenClosedTimestamp(ctx)
+}
+
// IsFirstRange returns true iff the replica belongs to the first range.
func (rec *SpanSetReplicaEvalContext) IsFirstRange() bool {
return rec.i.IsFirstRange()
diff --git a/pkg/kv/kvserver/replica_follower_read.go b/pkg/kv/kvserver/replica_follower_read.go
index 2ebd11c4fd63..fdc55e0dad92 100644
--- a/pkg/kv/kvserver/replica_follower_read.go
+++ b/pkg/kv/kvserver/replica_follower_read.go
@@ -157,3 +157,18 @@ func (r *Replica) maxClosedRLocked(ctx context.Context) (_ hlc.Timestamp, ok boo
return maxClosed, true
}
+
+// FrozenClosedTimestamp returns the closed timestamp. Unlike
+// MaxClosedTimestamp, it only looks at the "new" closed timestamp mechanism,
+// ignoring the old one. It returns an empty result if the new mechanism is not
+// enabled yet. The new mechanism has better properties than the old one -
+// namely the closing of timestamps is synchronized with subsumption requests
+// (through latches). Callers who need that property should be prepared to get
+// an empty result back, meaning that the closed timestamp cannot be known.
+func (r *Replica) FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+ // TODO(andrei): Make sure that this synchronizes with the closed timestamps
+ // side-transport once the side-transport is written.
+ return r.mu.state.ClosedTimestamp
+}
diff --git a/pkg/kv/kvserver/store_merge.go b/pkg/kv/kvserver/store_merge.go
index 0b8c9c03f24c..a8d497b71e86 100644
--- a/pkg/kv/kvserver/store_merge.go
+++ b/pkg/kv/kvserver/store_merge.go
@@ -29,6 +29,7 @@ func (s *Store) MergeRange(
leftRepl *Replica,
newLeftDesc, rightDesc roachpb.RangeDescriptor,
freezeStart hlc.ClockTimestamp,
+ rightClosedTS hlc.Timestamp,
) error {
if oldLeftDesc := leftRepl.Desc(); !oldLeftDesc.EndKey.Less(newLeftDesc.EndKey) {
return errors.Errorf("the new end key is not greater than the current one: %+v <= %+v",
@@ -74,20 +75,36 @@ func (s *Store) MergeRange(
leftLease, _ := leftRepl.GetLease()
rightLease, _ := rightRepl.GetLease()
- if leftLease.OwnedBy(s.Ident.StoreID) && !rightLease.OwnedBy(s.Ident.StoreID) {
- // We hold the lease for the LHS, but do not hold the lease for the RHS.
- // That means we don't have up-to-date timestamp cache entries for the
- // keyspace previously owned by the RHS. Bump the low water mark for the RHS
- // keyspace to freezeStart, the time at which the RHS promised to stop
- // serving traffic, as freezeStart is guaranteed to be greater than any
- // entry in the RHS's timestamp cache.
- //
- // Note that we need to update our clock with freezeStart to preserve the
- // invariant that our clock is always greater than or equal to any
- // timestamps in the timestamp cache. For a full discussion, see the comment
- // on TestStoreRangeMergeTimestampCacheCausality.
- s.Clock().Update(freezeStart)
- setTimestampCacheLowWaterMark(s.tsCache, &rightDesc, freezeStart.ToTimestamp())
+ if leftLease.OwnedBy(s.Ident.StoreID) {
+ if !rightLease.OwnedBy(s.Ident.StoreID) {
+ // We hold the lease for the LHS, but do not hold the lease for the RHS.
+ // That means we don't have up-to-date timestamp cache entries for the
+ // keyspace previously owned by the RHS. Bump the low water mark for the RHS
+ // keyspace to freezeStart, the time at which the RHS promised to stop
+ // serving traffic, as freezeStart is guaranteed to be greater than any
+ // entry in the RHS's timestamp cache.
+ //
+ // Note that we need to update our clock with freezeStart to preserve the
+ // invariant that our clock is always greater than or equal to any
+ // timestamps in the timestamp cache. For a full discussion, see the comment
+ // on TestStoreRangeMergeTimestampCacheCausality.
+ s.Clock().Update(freezeStart)
+ setTimestampCacheLowWaterMark(s.tsCache, &rightDesc, freezeStart.ToTimestamp())
+ }
+ // When merging ranges, the closed timestamp of the RHS can regress. It's
+ // possible that, at subsumption time, the RHS had a high closed timestamp.
+ // Being ingested by the LHS, the closed timestamp of the RHS is lost, and
+ // the LHS's closed timestamp takes over the respective keys. In order to
+ // not violate reads that might have been performed by the RHS according to
+ // the old closed ts (either by the leaseholder or by followers), we bump
+ // the timestamp cache.
+ // In the case when the RHS lease was not collocated with the LHS, this bump
+ // is frequently (but not necessarily) redundant with the bumping to the
+ // freeze time done above.
+ if !rightClosedTS.Synthetic {
+ s.Clock().Update(rightClosedTS.UnsafeToClockTimestamp())
+ }
+ setTimestampCacheLowWaterMark(s.tsCache, &rightDesc, rightClosedTS)
}
// Update the subsuming range's descriptor.
diff --git a/pkg/roachpb/api.pb.go b/pkg/roachpb/api.pb.go
index a50d6497f1c4..d619f1df3fcb 100644
--- a/pkg/roachpb/api.pb.go
+++ b/pkg/roachpb/api.pb.go
@@ -74,7 +74,7 @@ func (x ReadConsistencyType) String() string {
return proto.EnumName(ReadConsistencyType_name, int32(x))
}
func (ReadConsistencyType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{0}
}
// ScanFormat is an enumeration of the available response formats for MVCCScan
@@ -102,7 +102,7 @@ func (x ScanFormat) String() string {
return proto.EnumName(ScanFormat_name, int32(x))
}
func (ScanFormat) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{1}
}
type ChecksumMode int32
@@ -149,7 +149,7 @@ func (x ChecksumMode) String() string {
return proto.EnumName(ChecksumMode_name, int32(x))
}
func (ChecksumMode) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{2}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{2}
}
// PushTxnType determines what action to take when pushing a transaction.
@@ -180,7 +180,7 @@ func (x PushTxnType) String() string {
return proto.EnumName(PushTxnType_name, int32(x))
}
func (PushTxnType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{3}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{3}
}
type ExternalStorageProvider int32
@@ -221,7 +221,7 @@ func (x ExternalStorageProvider) String() string {
return proto.EnumName(ExternalStorageProvider_name, int32(x))
}
func (ExternalStorageProvider) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{4}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{4}
}
type MVCCFilter int32
@@ -244,7 +244,7 @@ func (x MVCCFilter) String() string {
return proto.EnumName(MVCCFilter_name, int32(x))
}
func (MVCCFilter) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{5}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{5}
}
type ResponseHeader_ResumeReason int32
@@ -270,7 +270,7 @@ func (x ResponseHeader_ResumeReason) String() string {
return proto.EnumName(ResponseHeader_ResumeReason_name, int32(x))
}
func (ResponseHeader_ResumeReason) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{1, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{1, 0}
}
type CheckConsistencyResponse_Status int32
@@ -312,7 +312,7 @@ func (x CheckConsistencyResponse_Status) String() string {
return proto.EnumName(CheckConsistencyResponse_Status_name, int32(x))
}
func (CheckConsistencyResponse_Status) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{25, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{25, 0}
}
// RequestHeader is supplied with every storage node request.
@@ -333,7 +333,7 @@ func (m *RequestHeader) Reset() { *m = RequestHeader{} }
func (m *RequestHeader) String() string { return proto.CompactTextString(m) }
func (*RequestHeader) ProtoMessage() {}
func (*RequestHeader) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{0}
}
func (m *RequestHeader) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -399,7 +399,7 @@ func (m *ResponseHeader) Reset() { *m = ResponseHeader{} }
func (m *ResponseHeader) String() string { return proto.CompactTextString(m) }
func (*ResponseHeader) ProtoMessage() {}
func (*ResponseHeader) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{1}
}
func (m *ResponseHeader) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -439,7 +439,7 @@ func (m *GetRequest) Reset() { *m = GetRequest{} }
func (m *GetRequest) String() string { return proto.CompactTextString(m) }
func (*GetRequest) ProtoMessage() {}
func (*GetRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{2}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{2}
}
func (m *GetRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -482,7 +482,7 @@ func (m *GetResponse) Reset() { *m = GetResponse{} }
func (m *GetResponse) String() string { return proto.CompactTextString(m) }
func (*GetResponse) ProtoMessage() {}
func (*GetResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{3}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{3}
}
func (m *GetResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -525,7 +525,7 @@ func (m *PutRequest) Reset() { *m = PutRequest{} }
func (m *PutRequest) String() string { return proto.CompactTextString(m) }
func (*PutRequest) ProtoMessage() {}
func (*PutRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{4}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{4}
}
func (m *PutRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -559,7 +559,7 @@ func (m *PutResponse) Reset() { *m = PutResponse{} }
func (m *PutResponse) String() string { return proto.CompactTextString(m) }
func (*PutResponse) ProtoMessage() {}
func (*PutResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{5}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{5}
}
func (m *PutResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -648,7 +648,7 @@ func (m *ConditionalPutRequest) Reset() { *m = ConditionalPutRequest{} }
func (m *ConditionalPutRequest) String() string { return proto.CompactTextString(m) }
func (*ConditionalPutRequest) ProtoMessage() {}
func (*ConditionalPutRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{6}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{6}
}
func (m *ConditionalPutRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -683,7 +683,7 @@ func (m *ConditionalPutResponse) Reset() { *m = ConditionalPutResponse{}
func (m *ConditionalPutResponse) String() string { return proto.CompactTextString(m) }
func (*ConditionalPutResponse) ProtoMessage() {}
func (*ConditionalPutResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{7}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{7}
}
func (m *ConditionalPutResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -729,7 +729,7 @@ func (m *InitPutRequest) Reset() { *m = InitPutRequest{} }
func (m *InitPutRequest) String() string { return proto.CompactTextString(m) }
func (*InitPutRequest) ProtoMessage() {}
func (*InitPutRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{8}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{8}
}
func (m *InitPutRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -763,7 +763,7 @@ func (m *InitPutResponse) Reset() { *m = InitPutResponse{} }
func (m *InitPutResponse) String() string { return proto.CompactTextString(m) }
func (*InitPutResponse) ProtoMessage() {}
func (*InitPutResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{9}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{9}
}
func (m *InitPutResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -803,7 +803,7 @@ func (m *IncrementRequest) Reset() { *m = IncrementRequest{} }
func (m *IncrementRequest) String() string { return proto.CompactTextString(m) }
func (*IncrementRequest) ProtoMessage() {}
func (*IncrementRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{10}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{10}
}
func (m *IncrementRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -840,7 +840,7 @@ func (m *IncrementResponse) Reset() { *m = IncrementResponse{} }
func (m *IncrementResponse) String() string { return proto.CompactTextString(m) }
func (*IncrementResponse) ProtoMessage() {}
func (*IncrementResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{11}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{11}
}
func (m *IncrementResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -874,7 +874,7 @@ func (m *DeleteRequest) Reset() { *m = DeleteRequest{} }
func (m *DeleteRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteRequest) ProtoMessage() {}
func (*DeleteRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{12}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{12}
}
func (m *DeleteRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -908,7 +908,7 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} }
func (m *DeleteResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteResponse) ProtoMessage() {}
func (*DeleteResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{13}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{13}
}
func (m *DeleteResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -960,7 +960,7 @@ func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} }
func (m *DeleteRangeRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteRangeRequest) ProtoMessage() {}
func (*DeleteRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{14}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{14}
}
func (m *DeleteRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -997,7 +997,7 @@ func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} }
func (m *DeleteRangeResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteRangeResponse) ProtoMessage() {}
func (*DeleteRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{15}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{15}
}
func (m *DeleteRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1052,7 +1052,7 @@ func (m *ClearRangeRequest) Reset() { *m = ClearRangeRequest{} }
func (m *ClearRangeRequest) String() string { return proto.CompactTextString(m) }
func (*ClearRangeRequest) ProtoMessage() {}
func (*ClearRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{16}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{16}
}
func (m *ClearRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1086,7 +1086,7 @@ func (m *ClearRangeResponse) Reset() { *m = ClearRangeResponse{} }
func (m *ClearRangeResponse) String() string { return proto.CompactTextString(m) }
func (*ClearRangeResponse) ProtoMessage() {}
func (*ClearRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{17}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{17}
}
func (m *ClearRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1128,7 +1128,7 @@ func (m *RevertRangeRequest) Reset() { *m = RevertRangeRequest{} }
func (m *RevertRangeRequest) String() string { return proto.CompactTextString(m) }
func (*RevertRangeRequest) ProtoMessage() {}
func (*RevertRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{18}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{18}
}
func (m *RevertRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1162,7 +1162,7 @@ func (m *RevertRangeResponse) Reset() { *m = RevertRangeResponse{} }
func (m *RevertRangeResponse) String() string { return proto.CompactTextString(m) }
func (*RevertRangeResponse) ProtoMessage() {}
func (*RevertRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{19}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{19}
}
func (m *RevertRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1213,7 +1213,7 @@ func (m *ScanRequest) Reset() { *m = ScanRequest{} }
func (m *ScanRequest) String() string { return proto.CompactTextString(m) }
func (*ScanRequest) ProtoMessage() {}
func (*ScanRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{20}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{20}
}
func (m *ScanRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1265,7 +1265,7 @@ func (m *ScanResponse) Reset() { *m = ScanResponse{} }
func (m *ScanResponse) String() string { return proto.CompactTextString(m) }
func (*ScanResponse) ProtoMessage() {}
func (*ScanResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{21}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{21}
}
func (m *ScanResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1316,7 +1316,7 @@ func (m *ReverseScanRequest) Reset() { *m = ReverseScanRequest{} }
func (m *ReverseScanRequest) String() string { return proto.CompactTextString(m) }
func (*ReverseScanRequest) ProtoMessage() {}
func (*ReverseScanRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{22}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{22}
}
func (m *ReverseScanRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1368,7 +1368,7 @@ func (m *ReverseScanResponse) Reset() { *m = ReverseScanResponse{} }
func (m *ReverseScanResponse) String() string { return proto.CompactTextString(m) }
func (*ReverseScanResponse) ProtoMessage() {}
func (*ReverseScanResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{23}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{23}
}
func (m *ReverseScanResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1421,7 +1421,7 @@ func (m *CheckConsistencyRequest) Reset() { *m = CheckConsistencyRequest
func (m *CheckConsistencyRequest) String() string { return proto.CompactTextString(m) }
func (*CheckConsistencyRequest) ProtoMessage() {}
func (*CheckConsistencyRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{24}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{24}
}
func (m *CheckConsistencyRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1458,7 +1458,7 @@ func (m *CheckConsistencyResponse) Reset() { *m = CheckConsistencyRespon
func (m *CheckConsistencyResponse) String() string { return proto.CompactTextString(m) }
func (*CheckConsistencyResponse) ProtoMessage() {}
func (*CheckConsistencyResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{25}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{25}
}
func (m *CheckConsistencyResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1502,7 +1502,7 @@ func (m *CheckConsistencyResponse_Result) Reset() { *m = CheckConsistenc
func (m *CheckConsistencyResponse_Result) String() string { return proto.CompactTextString(m) }
func (*CheckConsistencyResponse_Result) ProtoMessage() {}
func (*CheckConsistencyResponse_Result) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{25, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{25, 0}
}
func (m *CheckConsistencyResponse_Result) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1550,7 +1550,7 @@ func (m *RecomputeStatsRequest) Reset() { *m = RecomputeStatsRequest{} }
func (m *RecomputeStatsRequest) String() string { return proto.CompactTextString(m) }
func (*RecomputeStatsRequest) ProtoMessage() {}
func (*RecomputeStatsRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{26}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{26}
}
func (m *RecomputeStatsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1586,7 +1586,7 @@ func (m *RecomputeStatsResponse) Reset() { *m = RecomputeStatsResponse{}
func (m *RecomputeStatsResponse) String() string { return proto.CompactTextString(m) }
func (*RecomputeStatsResponse) ProtoMessage() {}
func (*RecomputeStatsResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{27}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{27}
}
func (m *RecomputeStatsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1697,7 +1697,7 @@ func (m *EndTxnRequest) Reset() { *m = EndTxnRequest{} }
func (m *EndTxnRequest) String() string { return proto.CompactTextString(m) }
func (*EndTxnRequest) ProtoMessage() {}
func (*EndTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{28}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{28}
}
func (m *EndTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1743,7 +1743,7 @@ func (m *EndTxnResponse) Reset() { *m = EndTxnResponse{} }
func (m *EndTxnResponse) String() string { return proto.CompactTextString(m) }
func (*EndTxnResponse) ProtoMessage() {}
func (*EndTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{29}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{29}
}
func (m *EndTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1804,7 +1804,7 @@ func (m *AdminSplitRequest) Reset() { *m = AdminSplitRequest{} }
func (m *AdminSplitRequest) String() string { return proto.CompactTextString(m) }
func (*AdminSplitRequest) ProtoMessage() {}
func (*AdminSplitRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{30}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{30}
}
func (m *AdminSplitRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1839,7 +1839,7 @@ func (m *AdminSplitResponse) Reset() { *m = AdminSplitResponse{} }
func (m *AdminSplitResponse) String() string { return proto.CompactTextString(m) }
func (*AdminSplitResponse) ProtoMessage() {}
func (*AdminSplitResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{31}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{31}
}
func (m *AdminSplitResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1878,7 +1878,7 @@ func (m *AdminUnsplitRequest) Reset() { *m = AdminUnsplitRequest{} }
func (m *AdminUnsplitRequest) String() string { return proto.CompactTextString(m) }
func (*AdminUnsplitRequest) ProtoMessage() {}
func (*AdminUnsplitRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{32}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{32}
}
func (m *AdminUnsplitRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1913,7 +1913,7 @@ func (m *AdminUnsplitResponse) Reset() { *m = AdminUnsplitResponse{} }
func (m *AdminUnsplitResponse) String() string { return proto.CompactTextString(m) }
func (*AdminUnsplitResponse) ProtoMessage() {}
func (*AdminUnsplitResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{33}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{33}
}
func (m *AdminUnsplitResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1956,7 +1956,7 @@ func (m *AdminMergeRequest) Reset() { *m = AdminMergeRequest{} }
func (m *AdminMergeRequest) String() string { return proto.CompactTextString(m) }
func (*AdminMergeRequest) ProtoMessage() {}
func (*AdminMergeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{34}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{34}
}
func (m *AdminMergeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1991,7 +1991,7 @@ func (m *AdminMergeResponse) Reset() { *m = AdminMergeResponse{} }
func (m *AdminMergeResponse) String() string { return proto.CompactTextString(m) }
func (*AdminMergeResponse) ProtoMessage() {}
func (*AdminMergeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{35}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{35}
}
func (m *AdminMergeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2029,7 +2029,7 @@ func (m *AdminTransferLeaseRequest) Reset() { *m = AdminTransferLeaseReq
func (m *AdminTransferLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*AdminTransferLeaseRequest) ProtoMessage() {}
func (*AdminTransferLeaseRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{36}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{36}
}
func (m *AdminTransferLeaseRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2062,7 +2062,7 @@ func (m *AdminTransferLeaseResponse) Reset() { *m = AdminTransferLeaseRe
func (m *AdminTransferLeaseResponse) String() string { return proto.CompactTextString(m) }
func (*AdminTransferLeaseResponse) ProtoMessage() {}
func (*AdminTransferLeaseResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{37}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{37}
}
func (m *AdminTransferLeaseResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2097,7 +2097,7 @@ func (m *ReplicationChange) Reset() { *m = ReplicationChange{} }
func (m *ReplicationChange) String() string { return proto.CompactTextString(m) }
func (*ReplicationChange) ProtoMessage() {}
func (*ReplicationChange) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{38}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{38}
}
func (m *ReplicationChange) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2155,7 +2155,7 @@ func (m *AdminChangeReplicasRequest) Reset() { *m = AdminChangeReplicasR
func (m *AdminChangeReplicasRequest) String() string { return proto.CompactTextString(m) }
func (*AdminChangeReplicasRequest) ProtoMessage() {}
func (*AdminChangeReplicasRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{39}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{39}
}
func (m *AdminChangeReplicasRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2190,7 +2190,7 @@ func (m *AdminChangeReplicasResponse) Reset() { *m = AdminChangeReplicas
func (m *AdminChangeReplicasResponse) String() string { return proto.CompactTextString(m) }
func (*AdminChangeReplicasResponse) ProtoMessage() {}
func (*AdminChangeReplicasResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{40}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{40}
}
func (m *AdminChangeReplicasResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2228,7 +2228,7 @@ func (m *AdminRelocateRangeRequest) Reset() { *m = AdminRelocateRangeReq
func (m *AdminRelocateRangeRequest) String() string { return proto.CompactTextString(m) }
func (*AdminRelocateRangeRequest) ProtoMessage() {}
func (*AdminRelocateRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{41}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{41}
}
func (m *AdminRelocateRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2261,7 +2261,7 @@ func (m *AdminRelocateRangeResponse) Reset() { *m = AdminRelocateRangeRe
func (m *AdminRelocateRangeResponse) String() string { return proto.CompactTextString(m) }
func (*AdminRelocateRangeResponse) ProtoMessage() {}
func (*AdminRelocateRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{42}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{42}
}
func (m *AdminRelocateRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2303,7 +2303,7 @@ func (m *HeartbeatTxnRequest) Reset() { *m = HeartbeatTxnRequest{} }
func (m *HeartbeatTxnRequest) String() string { return proto.CompactTextString(m) }
func (*HeartbeatTxnRequest) ProtoMessage() {}
func (*HeartbeatTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{43}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{43}
}
func (m *HeartbeatTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2340,7 +2340,7 @@ func (m *HeartbeatTxnResponse) Reset() { *m = HeartbeatTxnResponse{} }
func (m *HeartbeatTxnResponse) String() string { return proto.CompactTextString(m) }
func (*HeartbeatTxnResponse) ProtoMessage() {}
func (*HeartbeatTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{44}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{44}
}
func (m *HeartbeatTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2378,7 +2378,7 @@ func (m *GCRequest) Reset() { *m = GCRequest{} }
func (m *GCRequest) String() string { return proto.CompactTextString(m) }
func (*GCRequest) ProtoMessage() {}
func (*GCRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{45}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{45}
}
func (m *GCRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2412,7 +2412,7 @@ func (m *GCRequest_GCKey) Reset() { *m = GCRequest_GCKey{} }
func (m *GCRequest_GCKey) String() string { return proto.CompactTextString(m) }
func (*GCRequest_GCKey) ProtoMessage() {}
func (*GCRequest_GCKey) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{45, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{45, 0}
}
func (m *GCRequest_GCKey) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2446,7 +2446,7 @@ func (m *GCResponse) Reset() { *m = GCResponse{} }
func (m *GCResponse) String() string { return proto.CompactTextString(m) }
func (*GCResponse) ProtoMessage() {}
func (*GCResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{46}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{46}
}
func (m *GCResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2515,7 +2515,7 @@ func (m *PushTxnRequest) Reset() { *m = PushTxnRequest{} }
func (m *PushTxnRequest) String() string { return proto.CompactTextString(m) }
func (*PushTxnRequest) ProtoMessage() {}
func (*PushTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{47}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{47}
}
func (m *PushTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2558,7 +2558,7 @@ func (m *PushTxnResponse) Reset() { *m = PushTxnResponse{} }
func (m *PushTxnResponse) String() string { return proto.CompactTextString(m) }
func (*PushTxnResponse) ProtoMessage() {}
func (*PushTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{48}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{48}
}
func (m *PushTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2605,7 +2605,7 @@ func (m *RecoverTxnRequest) Reset() { *m = RecoverTxnRequest{} }
func (m *RecoverTxnRequest) String() string { return proto.CompactTextString(m) }
func (*RecoverTxnRequest) ProtoMessage() {}
func (*RecoverTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{49}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{49}
}
func (m *RecoverTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2641,7 +2641,7 @@ func (m *RecoverTxnResponse) Reset() { *m = RecoverTxnResponse{} }
func (m *RecoverTxnResponse) String() string { return proto.CompactTextString(m) }
func (*RecoverTxnResponse) ProtoMessage() {}
func (*RecoverTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{50}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{50}
}
func (m *RecoverTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2685,7 +2685,7 @@ func (m *QueryTxnRequest) Reset() { *m = QueryTxnRequest{} }
func (m *QueryTxnRequest) String() string { return proto.CompactTextString(m) }
func (*QueryTxnRequest) ProtoMessage() {}
func (*QueryTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{51}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{51}
}
func (m *QueryTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2729,7 +2729,7 @@ func (m *QueryTxnResponse) Reset() { *m = QueryTxnResponse{} }
func (m *QueryTxnResponse) String() string { return proto.CompactTextString(m) }
func (*QueryTxnResponse) ProtoMessage() {}
func (*QueryTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{52}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{52}
}
func (m *QueryTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2797,7 +2797,7 @@ func (m *QueryIntentRequest) Reset() { *m = QueryIntentRequest{} }
func (m *QueryIntentRequest) String() string { return proto.CompactTextString(m) }
func (*QueryIntentRequest) ProtoMessage() {}
func (*QueryIntentRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{53}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{53}
}
func (m *QueryIntentRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2833,7 +2833,7 @@ func (m *QueryIntentResponse) Reset() { *m = QueryIntentResponse{} }
func (m *QueryIntentResponse) String() string { return proto.CompactTextString(m) }
func (*QueryIntentResponse) ProtoMessage() {}
func (*QueryIntentResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{54}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{54}
}
func (m *QueryIntentResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2880,7 +2880,7 @@ func (m *ResolveIntentRequest) Reset() { *m = ResolveIntentRequest{} }
func (m *ResolveIntentRequest) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentRequest) ProtoMessage() {}
func (*ResolveIntentRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{55}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{55}
}
func (m *ResolveIntentRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2915,7 +2915,7 @@ func (m *ResolveIntentResponse) Reset() { *m = ResolveIntentResponse{} }
func (m *ResolveIntentResponse) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentResponse) ProtoMessage() {}
func (*ResolveIntentResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{56}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{56}
}
func (m *ResolveIntentResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2966,7 +2966,7 @@ func (m *ResolveIntentRangeRequest) Reset() { *m = ResolveIntentRangeReq
func (m *ResolveIntentRangeRequest) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentRangeRequest) ProtoMessage() {}
func (*ResolveIntentRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{57}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{57}
}
func (m *ResolveIntentRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3001,7 +3001,7 @@ func (m *ResolveIntentRangeResponse) Reset() { *m = ResolveIntentRangeRe
func (m *ResolveIntentRangeResponse) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentRangeResponse) ProtoMessage() {}
func (*ResolveIntentRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{58}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{58}
}
func (m *ResolveIntentRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3038,7 +3038,7 @@ func (m *MergeRequest) Reset() { *m = MergeRequest{} }
func (m *MergeRequest) String() string { return proto.CompactTextString(m) }
func (*MergeRequest) ProtoMessage() {}
func (*MergeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{59}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{59}
}
func (m *MergeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3072,7 +3072,7 @@ func (m *MergeResponse) Reset() { *m = MergeResponse{} }
func (m *MergeResponse) String() string { return proto.CompactTextString(m) }
func (*MergeResponse) ProtoMessage() {}
func (*MergeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{60}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{60}
}
func (m *MergeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3117,7 +3117,7 @@ func (m *TruncateLogRequest) Reset() { *m = TruncateLogRequest{} }
func (m *TruncateLogRequest) String() string { return proto.CompactTextString(m) }
func (*TruncateLogRequest) ProtoMessage() {}
func (*TruncateLogRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{61}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{61}
}
func (m *TruncateLogRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3151,7 +3151,7 @@ func (m *TruncateLogResponse) Reset() { *m = TruncateLogResponse{} }
func (m *TruncateLogResponse) String() string { return proto.CompactTextString(m) }
func (*TruncateLogResponse) ProtoMessage() {}
func (*TruncateLogResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{62}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{62}
}
func (m *TruncateLogResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3195,7 +3195,7 @@ func (m *RequestLeaseRequest) Reset() { *m = RequestLeaseRequest{} }
func (m *RequestLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*RequestLeaseRequest) ProtoMessage() {}
func (*RequestLeaseRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{63}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{63}
}
func (m *RequestLeaseRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3244,7 +3244,7 @@ func (m *TransferLeaseRequest) Reset() { *m = TransferLeaseRequest{} }
func (m *TransferLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*TransferLeaseRequest) ProtoMessage() {}
func (*TransferLeaseRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{64}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{64}
}
func (m *TransferLeaseRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3281,7 +3281,7 @@ func (m *LeaseInfoRequest) Reset() { *m = LeaseInfoRequest{} }
func (m *LeaseInfoRequest) String() string { return proto.CompactTextString(m) }
func (*LeaseInfoRequest) ProtoMessage() {}
func (*LeaseInfoRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{65}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{65}
}
func (m *LeaseInfoRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3318,7 +3318,7 @@ func (m *LeaseInfoResponse) Reset() { *m = LeaseInfoResponse{} }
func (m *LeaseInfoResponse) String() string { return proto.CompactTextString(m) }
func (*LeaseInfoResponse) ProtoMessage() {}
func (*LeaseInfoResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{66}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{66}
}
func (m *LeaseInfoResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3353,7 +3353,7 @@ func (m *RequestLeaseResponse) Reset() { *m = RequestLeaseResponse{} }
func (m *RequestLeaseResponse) String() string { return proto.CompactTextString(m) }
func (*RequestLeaseResponse) ProtoMessage() {}
func (*RequestLeaseResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{67}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{67}
}
func (m *RequestLeaseResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3408,7 +3408,7 @@ func (m *ComputeChecksumRequest) Reset() { *m = ComputeChecksumRequest{}
func (m *ComputeChecksumRequest) String() string { return proto.CompactTextString(m) }
func (*ComputeChecksumRequest) ProtoMessage() {}
func (*ComputeChecksumRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{68}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{68}
}
func (m *ComputeChecksumRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3445,7 +3445,7 @@ func (m *ComputeChecksumResponse) Reset() { *m = ComputeChecksumResponse
func (m *ComputeChecksumResponse) String() string { return proto.CompactTextString(m) }
func (*ComputeChecksumResponse) ProtoMessage() {}
func (*ComputeChecksumResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{69}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{69}
}
func (m *ComputeChecksumResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3485,7 +3485,7 @@ func (m *ExternalStorage) Reset() { *m = ExternalStorage{} }
func (m *ExternalStorage) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage) ProtoMessage() {}
func (*ExternalStorage) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70}
}
func (m *ExternalStorage) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3519,7 +3519,7 @@ func (m *ExternalStorage_LocalFilePath) Reset() { *m = ExternalStorage_L
func (m *ExternalStorage_LocalFilePath) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_LocalFilePath) ProtoMessage() {}
func (*ExternalStorage_LocalFilePath) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 0}
}
func (m *ExternalStorage_LocalFilePath) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3552,7 +3552,7 @@ func (m *ExternalStorage_Http) Reset() { *m = ExternalStorage_Http{} }
func (m *ExternalStorage_Http) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_Http) ProtoMessage() {}
func (*ExternalStorage_Http) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 1}
}
func (m *ExternalStorage_Http) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3594,7 +3594,7 @@ func (m *ExternalStorage_S3) Reset() { *m = ExternalStorage_S3{} }
func (m *ExternalStorage_S3) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_S3) ProtoMessage() {}
func (*ExternalStorage_S3) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 2}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 2}
}
func (m *ExternalStorage_S3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3633,7 +3633,7 @@ func (m *ExternalStorage_GCS) Reset() { *m = ExternalStorage_GCS{} }
func (m *ExternalStorage_GCS) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_GCS) ProtoMessage() {}
func (*ExternalStorage_GCS) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 3}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 3}
}
func (m *ExternalStorage_GCS) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3669,7 +3669,7 @@ func (m *ExternalStorage_Azure) Reset() { *m = ExternalStorage_Azure{} }
func (m *ExternalStorage_Azure) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_Azure) ProtoMessage() {}
func (*ExternalStorage_Azure) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 4}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 4}
}
func (m *ExternalStorage_Azure) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3708,7 +3708,7 @@ func (m *ExternalStorage_Workload) Reset() { *m = ExternalStorage_Worklo
func (m *ExternalStorage_Workload) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_Workload) ProtoMessage() {}
func (*ExternalStorage_Workload) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 5}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 5}
}
func (m *ExternalStorage_Workload) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3750,7 +3750,7 @@ func (m *ExternalStorage_FileTable) Reset() { *m = ExternalStorage_FileT
func (m *ExternalStorage_FileTable) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_FileTable) ProtoMessage() {}
func (*ExternalStorage_FileTable) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 6}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 6}
}
func (m *ExternalStorage_FileTable) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3790,7 +3790,7 @@ func (m *WriteBatchRequest) Reset() { *m = WriteBatchRequest{} }
func (m *WriteBatchRequest) String() string { return proto.CompactTextString(m) }
func (*WriteBatchRequest) ProtoMessage() {}
func (*WriteBatchRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{71}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{71}
}
func (m *WriteBatchRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3824,7 +3824,7 @@ func (m *WriteBatchResponse) Reset() { *m = WriteBatchResponse{} }
func (m *WriteBatchResponse) String() string { return proto.CompactTextString(m) }
func (*WriteBatchResponse) ProtoMessage() {}
func (*WriteBatchResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{72}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{72}
}
func (m *WriteBatchResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3860,7 +3860,7 @@ func (m *FileEncryptionOptions) Reset() { *m = FileEncryptionOptions{} }
func (m *FileEncryptionOptions) String() string { return proto.CompactTextString(m) }
func (*FileEncryptionOptions) ProtoMessage() {}
func (*FileEncryptionOptions) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{73}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{73}
}
func (m *FileEncryptionOptions) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3930,7 +3930,7 @@ func (m *ExportRequest) Reset() { *m = ExportRequest{} }
func (m *ExportRequest) String() string { return proto.CompactTextString(m) }
func (*ExportRequest) ProtoMessage() {}
func (*ExportRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{74}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{74}
}
func (m *ExportRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3982,7 +3982,7 @@ func (m *BulkOpSummary) Reset() { *m = BulkOpSummary{} }
func (m *BulkOpSummary) String() string { return proto.CompactTextString(m) }
func (*BulkOpSummary) ProtoMessage() {}
func (*BulkOpSummary) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{75}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{75}
}
func (m *BulkOpSummary) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4018,7 +4018,7 @@ func (m *ExportResponse) Reset() { *m = ExportResponse{} }
func (m *ExportResponse) String() string { return proto.CompactTextString(m) }
func (*ExportResponse) ProtoMessage() {}
func (*ExportResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{76}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{76}
}
func (m *ExportResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4058,7 +4058,7 @@ func (m *ExportResponse_File) Reset() { *m = ExportResponse_File{} }
func (m *ExportResponse_File) String() string { return proto.CompactTextString(m) }
func (*ExportResponse_File) ProtoMessage() {}
func (*ExportResponse_File) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{76, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{76, 0}
}
func (m *ExportResponse_File) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4109,7 +4109,7 @@ func (m *ImportRequest) Reset() { *m = ImportRequest{} }
func (m *ImportRequest) String() string { return proto.CompactTextString(m) }
func (*ImportRequest) ProtoMessage() {}
func (*ImportRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{77}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{77}
}
func (m *ImportRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4144,7 +4144,7 @@ func (m *ImportRequest_File) Reset() { *m = ImportRequest_File{} }
func (m *ImportRequest_File) String() string { return proto.CompactTextString(m) }
func (*ImportRequest_File) ProtoMessage() {}
func (*ImportRequest_File) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{77, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{77, 0}
}
func (m *ImportRequest_File) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4180,7 +4180,7 @@ func (m *ImportRequest_TableRekey) Reset() { *m = ImportRequest_TableRek
func (m *ImportRequest_TableRekey) String() string { return proto.CompactTextString(m) }
func (*ImportRequest_TableRekey) ProtoMessage() {}
func (*ImportRequest_TableRekey) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{77, 1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{77, 1}
}
func (m *ImportRequest_TableRekey) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4215,7 +4215,7 @@ func (m *ImportResponse) Reset() { *m = ImportResponse{} }
func (m *ImportResponse) String() string { return proto.CompactTextString(m) }
func (*ImportResponse) ProtoMessage() {}
func (*ImportResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{78}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{78}
}
func (m *ImportResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4253,7 +4253,7 @@ func (m *AdminScatterRequest) Reset() { *m = AdminScatterRequest{} }
func (m *AdminScatterRequest) String() string { return proto.CompactTextString(m) }
func (*AdminScatterRequest) ProtoMessage() {}
func (*AdminScatterRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{79}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{79}
}
func (m *AdminScatterRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4290,7 +4290,7 @@ func (m *AdminScatterResponse) Reset() { *m = AdminScatterResponse{} }
func (m *AdminScatterResponse) String() string { return proto.CompactTextString(m) }
func (*AdminScatterResponse) ProtoMessage() {}
func (*AdminScatterResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{80}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{80}
}
func (m *AdminScatterResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4323,7 +4323,7 @@ func (m *AdminScatterResponse_Range) Reset() { *m = AdminScatterResponse
func (m *AdminScatterResponse_Range) String() string { return proto.CompactTextString(m) }
func (*AdminScatterResponse_Range) ProtoMessage() {}
func (*AdminScatterResponse_Range) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{80, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{80, 0}
}
func (m *AdminScatterResponse_Range) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4368,7 +4368,7 @@ func (m *AdminVerifyProtectedTimestampRequest) Reset() { *m = AdminVerif
func (m *AdminVerifyProtectedTimestampRequest) String() string { return proto.CompactTextString(m) }
func (*AdminVerifyProtectedTimestampRequest) ProtoMessage() {}
func (*AdminVerifyProtectedTimestampRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{81}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{81}
}
func (m *AdminVerifyProtectedTimestampRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4406,7 +4406,7 @@ func (m *AdminVerifyProtectedTimestampResponse) Reset() { *m = AdminVeri
func (m *AdminVerifyProtectedTimestampResponse) String() string { return proto.CompactTextString(m) }
func (*AdminVerifyProtectedTimestampResponse) ProtoMessage() {}
func (*AdminVerifyProtectedTimestampResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{82}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{82}
}
func (m *AdminVerifyProtectedTimestampResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4459,7 +4459,7 @@ func (m *AddSSTableRequest) Reset() { *m = AddSSTableRequest{} }
func (m *AddSSTableRequest) String() string { return proto.CompactTextString(m) }
func (*AddSSTableRequest) ProtoMessage() {}
func (*AddSSTableRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{83}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{83}
}
func (m *AddSSTableRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4493,7 +4493,7 @@ func (m *AddSSTableResponse) Reset() { *m = AddSSTableResponse{} }
func (m *AddSSTableResponse) String() string { return proto.CompactTextString(m) }
func (*AddSSTableResponse) ProtoMessage() {}
func (*AddSSTableResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{84}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{84}
}
func (m *AddSSTableResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4537,7 +4537,7 @@ func (m *RefreshRequest) Reset() { *m = RefreshRequest{} }
func (m *RefreshRequest) String() string { return proto.CompactTextString(m) }
func (*RefreshRequest) ProtoMessage() {}
func (*RefreshRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{85}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{85}
}
func (m *RefreshRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4571,7 +4571,7 @@ func (m *RefreshResponse) Reset() { *m = RefreshResponse{} }
func (m *RefreshResponse) String() string { return proto.CompactTextString(m) }
func (*RefreshResponse) ProtoMessage() {}
func (*RefreshResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{86}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{86}
}
func (m *RefreshResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4610,7 +4610,7 @@ func (m *RefreshRangeRequest) Reset() { *m = RefreshRangeRequest{} }
func (m *RefreshRangeRequest) String() string { return proto.CompactTextString(m) }
func (*RefreshRangeRequest) ProtoMessage() {}
func (*RefreshRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{87}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{87}
}
func (m *RefreshRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4644,7 +4644,7 @@ func (m *RefreshRangeResponse) Reset() { *m = RefreshRangeResponse{} }
func (m *RefreshRangeResponse) String() string { return proto.CompactTextString(m) }
func (*RefreshRangeResponse) ProtoMessage() {}
func (*RefreshRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{88}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{88}
}
func (m *RefreshRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4693,7 +4693,7 @@ func (m *SubsumeRequest) Reset() { *m = SubsumeRequest{} }
func (m *SubsumeRequest) String() string { return proto.CompactTextString(m) }
func (*SubsumeRequest) ProtoMessage() {}
func (*SubsumeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{89}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{89}
}
func (m *SubsumeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4736,13 +4736,27 @@ type SubsumeResponse struct {
// being subsumed). It is suitable for use as the timestamp cache's low water
// mark for the keys previously owned by the subsumed range.
FreezeStart github_com_cockroachdb_cockroach_pkg_util_hlc.ClockTimestamp `protobuf:"bytes,5,opt,name=freeze_start,json=freezeStart,proto3,casttype=github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp" json:"freeze_start"`
+ // closed_timestamp is the range's closed timestamp at the moment of the
+ // subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,6,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
}
func (m *SubsumeResponse) Reset() { *m = SubsumeResponse{} }
func (m *SubsumeResponse) String() string { return proto.CompactTextString(m) }
func (*SubsumeResponse) ProtoMessage() {}
func (*SubsumeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{90}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{90}
}
func (m *SubsumeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4777,7 +4791,7 @@ func (m *RangeStatsRequest) Reset() { *m = RangeStatsRequest{} }
func (m *RangeStatsRequest) String() string { return proto.CompactTextString(m) }
func (*RangeStatsRequest) ProtoMessage() {}
func (*RangeStatsRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{91}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{91}
}
func (m *RangeStatsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4818,7 +4832,7 @@ func (m *RangeStatsResponse) Reset() { *m = RangeStatsResponse{} }
func (m *RangeStatsResponse) String() string { return proto.CompactTextString(m) }
func (*RangeStatsResponse) ProtoMessage() {}
func (*RangeStatsResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{92}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{92}
}
func (m *RangeStatsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4861,7 +4875,7 @@ func (m *MigrateRequest) Reset() { *m = MigrateRequest{} }
func (m *MigrateRequest) String() string { return proto.CompactTextString(m) }
func (*MigrateRequest) ProtoMessage() {}
func (*MigrateRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{93}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{93}
}
func (m *MigrateRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4895,7 +4909,7 @@ func (m *MigrateResponse) Reset() { *m = MigrateResponse{} }
func (m *MigrateResponse) String() string { return proto.CompactTextString(m) }
func (*MigrateResponse) ProtoMessage() {}
func (*MigrateResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{94}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{94}
}
func (m *MigrateResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4979,7 +4993,7 @@ func (m *RequestUnion) Reset() { *m = RequestUnion{} }
func (m *RequestUnion) String() string { return proto.CompactTextString(m) }
func (*RequestUnion) ProtoMessage() {}
func (*RequestUnion) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{95}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{95}
}
func (m *RequestUnion) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6460,7 +6474,7 @@ func (m *ResponseUnion) Reset() { *m = ResponseUnion{} }
func (m *ResponseUnion) String() string { return proto.CompactTextString(m) }
func (*ResponseUnion) ProtoMessage() {}
func (*ResponseUnion) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{96}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{96}
}
func (m *ResponseUnion) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8016,7 +8030,7 @@ func (m *Header) Reset() { *m = Header{} }
func (m *Header) String() string { return proto.CompactTextString(m) }
func (*Header) ProtoMessage() {}
func (*Header) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{97}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{97}
}
func (m *Header) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8052,7 +8066,7 @@ type BatchRequest struct {
func (m *BatchRequest) Reset() { *m = BatchRequest{} }
func (*BatchRequest) ProtoMessage() {}
func (*BatchRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{98}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{98}
}
func (m *BatchRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8089,7 +8103,7 @@ type BatchResponse struct {
func (m *BatchResponse) Reset() { *m = BatchResponse{} }
func (*BatchResponse) ProtoMessage() {}
func (*BatchResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{99}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{99}
}
func (m *BatchResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8165,7 +8179,7 @@ func (m *BatchResponse_Header) Reset() { *m = BatchResponse_Header{} }
func (m *BatchResponse_Header) String() string { return proto.CompactTextString(m) }
func (*BatchResponse_Header) ProtoMessage() {}
func (*BatchResponse_Header) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{99, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{99, 0}
}
func (m *BatchResponse_Header) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8203,7 +8217,7 @@ func (m *RangeLookupRequest) Reset() { *m = RangeLookupRequest{} }
func (m *RangeLookupRequest) String() string { return proto.CompactTextString(m) }
func (*RangeLookupRequest) ProtoMessage() {}
func (*RangeLookupRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{100}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{100}
}
func (m *RangeLookupRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8241,7 +8255,7 @@ func (m *RangeLookupResponse) Reset() { *m = RangeLookupResponse{} }
func (m *RangeLookupResponse) String() string { return proto.CompactTextString(m) }
func (*RangeLookupResponse) ProtoMessage() {}
func (*RangeLookupResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{101}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{101}
}
func (m *RangeLookupResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8280,7 +8294,7 @@ func (m *RangeFeedRequest) Reset() { *m = RangeFeedRequest{} }
func (m *RangeFeedRequest) String() string { return proto.CompactTextString(m) }
func (*RangeFeedRequest) ProtoMessage() {}
func (*RangeFeedRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{102}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{102}
}
func (m *RangeFeedRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8321,7 +8335,7 @@ func (m *RangeFeedValue) Reset() { *m = RangeFeedValue{} }
func (m *RangeFeedValue) String() string { return proto.CompactTextString(m) }
func (*RangeFeedValue) ProtoMessage() {}
func (*RangeFeedValue) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{103}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{103}
}
func (m *RangeFeedValue) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8362,7 +8376,7 @@ func (m *RangeFeedCheckpoint) Reset() { *m = RangeFeedCheckpoint{} }
func (m *RangeFeedCheckpoint) String() string { return proto.CompactTextString(m) }
func (*RangeFeedCheckpoint) ProtoMessage() {}
func (*RangeFeedCheckpoint) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{104}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{104}
}
func (m *RangeFeedCheckpoint) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8399,7 +8413,7 @@ func (m *RangeFeedError) Reset() { *m = RangeFeedError{} }
func (m *RangeFeedError) String() string { return proto.CompactTextString(m) }
func (*RangeFeedError) ProtoMessage() {}
func (*RangeFeedError) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{105}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{105}
}
func (m *RangeFeedError) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8436,7 +8450,7 @@ func (m *RangeFeedEvent) Reset() { *m = RangeFeedEvent{} }
func (m *RangeFeedEvent) String() string { return proto.CompactTextString(m) }
func (*RangeFeedEvent) ProtoMessage() {}
func (*RangeFeedEvent) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{106}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{106}
}
func (m *RangeFeedEvent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8480,7 +8494,7 @@ func (m *ResetQuorumRequest) Reset() { *m = ResetQuorumRequest{} }
func (m *ResetQuorumRequest) String() string { return proto.CompactTextString(m) }
func (*ResetQuorumRequest) ProtoMessage() {}
func (*ResetQuorumRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{107}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{107}
}
func (m *ResetQuorumRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8512,7 +8526,7 @@ func (m *ResetQuorumResponse) Reset() { *m = ResetQuorumResponse{} }
func (m *ResetQuorumResponse) String() string { return proto.CompactTextString(m) }
func (*ResetQuorumResponse) ProtoMessage() {}
func (*ResetQuorumResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{108}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{108}
}
func (m *ResetQuorumResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8553,7 +8567,7 @@ func (m *GossipSubscriptionRequest) Reset() { *m = GossipSubscriptionReq
func (m *GossipSubscriptionRequest) String() string { return proto.CompactTextString(m) }
func (*GossipSubscriptionRequest) ProtoMessage() {}
func (*GossipSubscriptionRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{109}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{109}
}
func (m *GossipSubscriptionRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8593,7 +8607,7 @@ func (m *GossipSubscriptionEvent) Reset() { *m = GossipSubscriptionEvent
func (m *GossipSubscriptionEvent) String() string { return proto.CompactTextString(m) }
func (*GossipSubscriptionEvent) ProtoMessage() {}
func (*GossipSubscriptionEvent) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{110}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{110}
}
func (m *GossipSubscriptionEvent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8629,7 +8643,7 @@ func (m *JoinNodeRequest) Reset() { *m = JoinNodeRequest{} }
func (m *JoinNodeRequest) String() string { return proto.CompactTextString(m) }
func (*JoinNodeRequest) ProtoMessage() {}
func (*JoinNodeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{111}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{111}
}
func (m *JoinNodeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8668,7 +8682,7 @@ func (m *JoinNodeResponse) Reset() { *m = JoinNodeResponse{} }
func (m *JoinNodeResponse) String() string { return proto.CompactTextString(m) }
func (*JoinNodeResponse) ProtoMessage() {}
func (*JoinNodeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{112}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{112}
}
func (m *JoinNodeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8708,7 +8722,7 @@ type ContentionEvent struct {
func (m *ContentionEvent) Reset() { *m = ContentionEvent{} }
func (*ContentionEvent) ProtoMessage() {}
func (*ContentionEvent) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{113}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{113}
}
func (m *ContentionEvent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -13504,6 +13518,14 @@ func (m *SubsumeResponse) MarshalTo(dAtA []byte) (int, error) {
return 0, err
}
i += n157
+ dAtA[i] = 0x32
+ i++
+ i = encodeVarintApi(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n158, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n158
return i, nil
}
@@ -13525,11 +13547,11 @@ func (m *RangeStatsRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestHeader.Size()))
- n158, err := m.RequestHeader.MarshalTo(dAtA[i:])
+ n159, err := m.RequestHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n158
+ i += n159
return i, nil
}
@@ -13551,19 +13573,19 @@ func (m *RangeStatsResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResponseHeader.Size()))
- n159, err := m.ResponseHeader.MarshalTo(dAtA[i:])
+ n160, err := m.ResponseHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n159
+ i += n160
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.MVCCStats.Size()))
- n160, err := m.MVCCStats.MarshalTo(dAtA[i:])
+ n161, err := m.MVCCStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n160
+ i += n161
if m.QueriesPerSecond != 0 {
dAtA[i] = 0x19
i++
@@ -13573,11 +13595,11 @@ func (m *RangeStatsResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.RangeInfo.Size()))
- n161, err := m.RangeInfo.MarshalTo(dAtA[i:])
+ n162, err := m.RangeInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n161
+ i += n162
return i, nil
}
@@ -13599,19 +13621,19 @@ func (m *MigrateRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestHeader.Size()))
- n162, err := m.RequestHeader.MarshalTo(dAtA[i:])
+ n163, err := m.RequestHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n162
+ i += n163
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Version.Size()))
- n163, err := m.Version.MarshalTo(dAtA[i:])
+ n164, err := m.Version.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n163
+ i += n164
return i, nil
}
@@ -13633,11 +13655,11 @@ func (m *MigrateResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResponseHeader.Size()))
- n164, err := m.ResponseHeader.MarshalTo(dAtA[i:])
+ n165, err := m.ResponseHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n164
+ i += n165
return i, nil
}
@@ -13657,11 +13679,11 @@ func (m *RequestUnion) MarshalTo(dAtA []byte) (int, error) {
var l int
_ = l
if m.Value != nil {
- nn165, err := m.Value.MarshalTo(dAtA[i:])
+ nn166, err := m.Value.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += nn165
+ i += nn166
}
return i, nil
}
@@ -13672,11 +13694,11 @@ func (m *RequestUnion_Get) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Get.Size()))
- n166, err := m.Get.MarshalTo(dAtA[i:])
+ n167, err := m.Get.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n166
+ i += n167
}
return i, nil
}
@@ -13686,11 +13708,11 @@ func (m *RequestUnion_Put) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Put.Size()))
- n167, err := m.Put.MarshalTo(dAtA[i:])
+ n168, err := m.Put.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n167
+ i += n168
}
return i, nil
}
@@ -13700,11 +13722,11 @@ func (m *RequestUnion_ConditionalPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.ConditionalPut.Size()))
- n168, err := m.ConditionalPut.MarshalTo(dAtA[i:])
+ n169, err := m.ConditionalPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n168
+ i += n169
}
return i, nil
}
@@ -13714,11 +13736,11 @@ func (m *RequestUnion_Increment) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.Increment.Size()))
- n169, err := m.Increment.MarshalTo(dAtA[i:])
+ n170, err := m.Increment.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n169
+ i += n170
}
return i, nil
}
@@ -13728,11 +13750,11 @@ func (m *RequestUnion_Delete) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Delete.Size()))
- n170, err := m.Delete.MarshalTo(dAtA[i:])
+ n171, err := m.Delete.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n170
+ i += n171
}
return i, nil
}
@@ -13742,11 +13764,11 @@ func (m *RequestUnion_DeleteRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x32
i++
i = encodeVarintApi(dAtA, i, uint64(m.DeleteRange.Size()))
- n171, err := m.DeleteRange.MarshalTo(dAtA[i:])
+ n172, err := m.DeleteRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n171
+ i += n172
}
return i, nil
}
@@ -13756,11 +13778,11 @@ func (m *RequestUnion_Scan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Scan.Size()))
- n172, err := m.Scan.MarshalTo(dAtA[i:])
+ n173, err := m.Scan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n172
+ i += n173
}
return i, nil
}
@@ -13770,11 +13792,11 @@ func (m *RequestUnion_EndTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x4a
i++
i = encodeVarintApi(dAtA, i, uint64(m.EndTxn.Size()))
- n173, err := m.EndTxn.MarshalTo(dAtA[i:])
+ n174, err := m.EndTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n173
+ i += n174
}
return i, nil
}
@@ -13784,11 +13806,11 @@ func (m *RequestUnion_AdminSplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x52
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminSplit.Size()))
- n174, err := m.AdminSplit.MarshalTo(dAtA[i:])
+ n175, err := m.AdminSplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n174
+ i += n175
}
return i, nil
}
@@ -13798,11 +13820,11 @@ func (m *RequestUnion_AdminMerge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x5a
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminMerge.Size()))
- n175, err := m.AdminMerge.MarshalTo(dAtA[i:])
+ n176, err := m.AdminMerge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n175
+ i += n176
}
return i, nil
}
@@ -13812,11 +13834,11 @@ func (m *RequestUnion_HeartbeatTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x62
i++
i = encodeVarintApi(dAtA, i, uint64(m.HeartbeatTxn.Size()))
- n176, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
+ n177, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n176
+ i += n177
}
return i, nil
}
@@ -13826,11 +13848,11 @@ func (m *RequestUnion_Gc) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x6a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Gc.Size()))
- n177, err := m.Gc.MarshalTo(dAtA[i:])
+ n178, err := m.Gc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n177
+ i += n178
}
return i, nil
}
@@ -13840,11 +13862,11 @@ func (m *RequestUnion_PushTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x72
i++
i = encodeVarintApi(dAtA, i, uint64(m.PushTxn.Size()))
- n178, err := m.PushTxn.MarshalTo(dAtA[i:])
+ n179, err := m.PushTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n178
+ i += n179
}
return i, nil
}
@@ -13856,11 +13878,11 @@ func (m *RequestUnion_ResolveIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntent.Size()))
- n179, err := m.ResolveIntent.MarshalTo(dAtA[i:])
+ n180, err := m.ResolveIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n179
+ i += n180
}
return i, nil
}
@@ -13872,11 +13894,11 @@ func (m *RequestUnion_ResolveIntentRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntentRange.Size()))
- n180, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
+ n181, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n180
+ i += n181
}
return i, nil
}
@@ -13888,11 +13910,11 @@ func (m *RequestUnion_Merge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.Merge.Size()))
- n181, err := m.Merge.MarshalTo(dAtA[i:])
+ n182, err := m.Merge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n181
+ i += n182
}
return i, nil
}
@@ -13904,11 +13926,11 @@ func (m *RequestUnion_TruncateLog) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.TruncateLog.Size()))
- n182, err := m.TruncateLog.MarshalTo(dAtA[i:])
+ n183, err := m.TruncateLog.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n182
+ i += n183
}
return i, nil
}
@@ -13920,11 +13942,11 @@ func (m *RequestUnion_RequestLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestLease.Size()))
- n183, err := m.RequestLease.MarshalTo(dAtA[i:])
+ n184, err := m.RequestLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n183
+ i += n184
}
return i, nil
}
@@ -13936,11 +13958,11 @@ func (m *RequestUnion_ReverseScan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ReverseScan.Size()))
- n184, err := m.ReverseScan.MarshalTo(dAtA[i:])
+ n185, err := m.ReverseScan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n184
+ i += n185
}
return i, nil
}
@@ -13952,11 +13974,11 @@ func (m *RequestUnion_ComputeChecksum) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ComputeChecksum.Size()))
- n185, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
+ n186, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n185
+ i += n186
}
return i, nil
}
@@ -13968,11 +13990,11 @@ func (m *RequestUnion_CheckConsistency) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.CheckConsistency.Size()))
- n186, err := m.CheckConsistency.MarshalTo(dAtA[i:])
+ n187, err := m.CheckConsistency.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n186
+ i += n187
}
return i, nil
}
@@ -13984,11 +14006,11 @@ func (m *RequestUnion_InitPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.InitPut.Size()))
- n187, err := m.InitPut.MarshalTo(dAtA[i:])
+ n188, err := m.InitPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n187
+ i += n188
}
return i, nil
}
@@ -14000,11 +14022,11 @@ func (m *RequestUnion_TransferLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.TransferLease.Size()))
- n188, err := m.TransferLease.MarshalTo(dAtA[i:])
+ n189, err := m.TransferLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n188
+ i += n189
}
return i, nil
}
@@ -14016,11 +14038,11 @@ func (m *RequestUnion_AdminTransferLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminTransferLease.Size()))
- n189, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
+ n190, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n189
+ i += n190
}
return i, nil
}
@@ -14032,11 +14054,11 @@ func (m *RequestUnion_LeaseInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.LeaseInfo.Size()))
- n190, err := m.LeaseInfo.MarshalTo(dAtA[i:])
+ n191, err := m.LeaseInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n190
+ i += n191
}
return i, nil
}
@@ -14048,11 +14070,11 @@ func (m *RequestUnion_WriteBatch) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.WriteBatch.Size()))
- n191, err := m.WriteBatch.MarshalTo(dAtA[i:])
+ n192, err := m.WriteBatch.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n191
+ i += n192
}
return i, nil
}
@@ -14064,11 +14086,11 @@ func (m *RequestUnion_Export) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Export.Size()))
- n192, err := m.Export.MarshalTo(dAtA[i:])
+ n193, err := m.Export.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n192
+ i += n193
}
return i, nil
}
@@ -14080,11 +14102,11 @@ func (m *RequestUnion_QueryTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryTxn.Size()))
- n193, err := m.QueryTxn.MarshalTo(dAtA[i:])
+ n194, err := m.QueryTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n193
+ i += n194
}
return i, nil
}
@@ -14096,11 +14118,11 @@ func (m *RequestUnion_Import) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Import.Size()))
- n194, err := m.Import.MarshalTo(dAtA[i:])
+ n195, err := m.Import.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n194
+ i += n195
}
return i, nil
}
@@ -14112,11 +14134,11 @@ func (m *RequestUnion_AdminChangeReplicas) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminChangeReplicas.Size()))
- n195, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
+ n196, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n195
+ i += n196
}
return i, nil
}
@@ -14128,11 +14150,11 @@ func (m *RequestUnion_AdminScatter) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminScatter.Size()))
- n196, err := m.AdminScatter.MarshalTo(dAtA[i:])
+ n197, err := m.AdminScatter.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n196
+ i += n197
}
return i, nil
}
@@ -14144,11 +14166,11 @@ func (m *RequestUnion_AddSstable) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AddSstable.Size()))
- n197, err := m.AddSstable.MarshalTo(dAtA[i:])
+ n198, err := m.AddSstable.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n197
+ i += n198
}
return i, nil
}
@@ -14160,11 +14182,11 @@ func (m *RequestUnion_ClearRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.ClearRange.Size()))
- n198, err := m.ClearRange.MarshalTo(dAtA[i:])
+ n199, err := m.ClearRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n198
+ i += n199
}
return i, nil
}
@@ -14176,11 +14198,11 @@ func (m *RequestUnion_RecomputeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecomputeStats.Size()))
- n199, err := m.RecomputeStats.MarshalTo(dAtA[i:])
+ n200, err := m.RecomputeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n199
+ i += n200
}
return i, nil
}
@@ -14192,11 +14214,11 @@ func (m *RequestUnion_Refresh) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Refresh.Size()))
- n200, err := m.Refresh.MarshalTo(dAtA[i:])
+ n201, err := m.Refresh.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n200
+ i += n201
}
return i, nil
}
@@ -14208,11 +14230,11 @@ func (m *RequestUnion_RefreshRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RefreshRange.Size()))
- n201, err := m.RefreshRange.MarshalTo(dAtA[i:])
+ n202, err := m.RefreshRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n201
+ i += n202
}
return i, nil
}
@@ -14224,11 +14246,11 @@ func (m *RequestUnion_QueryIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryIntent.Size()))
- n202, err := m.QueryIntent.MarshalTo(dAtA[i:])
+ n203, err := m.QueryIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n202
+ i += n203
}
return i, nil
}
@@ -14240,11 +14262,11 @@ func (m *RequestUnion_Subsume) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Subsume.Size()))
- n203, err := m.Subsume.MarshalTo(dAtA[i:])
+ n204, err := m.Subsume.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n203
+ i += n204
}
return i, nil
}
@@ -14256,11 +14278,11 @@ func (m *RequestUnion_RangeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RangeStats.Size()))
- n204, err := m.RangeStats.MarshalTo(dAtA[i:])
+ n205, err := m.RangeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n204
+ i += n205
}
return i, nil
}
@@ -14272,11 +14294,11 @@ func (m *RequestUnion_AdminRelocateRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminRelocateRange.Size()))
- n205, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
+ n206, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n205
+ i += n206
}
return i, nil
}
@@ -14288,11 +14310,11 @@ func (m *RequestUnion_RecoverTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecoverTxn.Size()))
- n206, err := m.RecoverTxn.MarshalTo(dAtA[i:])
+ n207, err := m.RecoverTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n206
+ i += n207
}
return i, nil
}
@@ -14304,11 +14326,11 @@ func (m *RequestUnion_AdminUnsplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminUnsplit.Size()))
- n207, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
+ n208, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n207
+ i += n208
}
return i, nil
}
@@ -14320,11 +14342,11 @@ func (m *RequestUnion_RevertRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.RevertRange.Size()))
- n208, err := m.RevertRange.MarshalTo(dAtA[i:])
+ n209, err := m.RevertRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n208
+ i += n209
}
return i, nil
}
@@ -14336,11 +14358,11 @@ func (m *RequestUnion_AdminVerifyProtectedTimestamp) MarshalTo(dAtA []byte) (int
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminVerifyProtectedTimestamp.Size()))
- n209, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
+ n210, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n209
+ i += n210
}
return i, nil
}
@@ -14352,11 +14374,11 @@ func (m *RequestUnion_Migrate) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.Migrate.Size()))
- n210, err := m.Migrate.MarshalTo(dAtA[i:])
+ n211, err := m.Migrate.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n210
+ i += n211
}
return i, nil
}
@@ -14376,11 +14398,11 @@ func (m *ResponseUnion) MarshalTo(dAtA []byte) (int, error) {
var l int
_ = l
if m.Value != nil {
- nn211, err := m.Value.MarshalTo(dAtA[i:])
+ nn212, err := m.Value.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += nn211
+ i += nn212
}
return i, nil
}
@@ -14391,11 +14413,11 @@ func (m *ResponseUnion_Get) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Get.Size()))
- n212, err := m.Get.MarshalTo(dAtA[i:])
+ n213, err := m.Get.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n212
+ i += n213
}
return i, nil
}
@@ -14405,11 +14427,11 @@ func (m *ResponseUnion_Put) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Put.Size()))
- n213, err := m.Put.MarshalTo(dAtA[i:])
+ n214, err := m.Put.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n213
+ i += n214
}
return i, nil
}
@@ -14419,11 +14441,11 @@ func (m *ResponseUnion_ConditionalPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.ConditionalPut.Size()))
- n214, err := m.ConditionalPut.MarshalTo(dAtA[i:])
+ n215, err := m.ConditionalPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n214
+ i += n215
}
return i, nil
}
@@ -14433,11 +14455,11 @@ func (m *ResponseUnion_Increment) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.Increment.Size()))
- n215, err := m.Increment.MarshalTo(dAtA[i:])
+ n216, err := m.Increment.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n215
+ i += n216
}
return i, nil
}
@@ -14447,11 +14469,11 @@ func (m *ResponseUnion_Delete) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Delete.Size()))
- n216, err := m.Delete.MarshalTo(dAtA[i:])
+ n217, err := m.Delete.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n216
+ i += n217
}
return i, nil
}
@@ -14461,11 +14483,11 @@ func (m *ResponseUnion_DeleteRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x32
i++
i = encodeVarintApi(dAtA, i, uint64(m.DeleteRange.Size()))
- n217, err := m.DeleteRange.MarshalTo(dAtA[i:])
+ n218, err := m.DeleteRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n217
+ i += n218
}
return i, nil
}
@@ -14475,11 +14497,11 @@ func (m *ResponseUnion_Scan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Scan.Size()))
- n218, err := m.Scan.MarshalTo(dAtA[i:])
+ n219, err := m.Scan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n218
+ i += n219
}
return i, nil
}
@@ -14489,11 +14511,11 @@ func (m *ResponseUnion_EndTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x4a
i++
i = encodeVarintApi(dAtA, i, uint64(m.EndTxn.Size()))
- n219, err := m.EndTxn.MarshalTo(dAtA[i:])
+ n220, err := m.EndTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n219
+ i += n220
}
return i, nil
}
@@ -14503,11 +14525,11 @@ func (m *ResponseUnion_AdminSplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x52
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminSplit.Size()))
- n220, err := m.AdminSplit.MarshalTo(dAtA[i:])
+ n221, err := m.AdminSplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n220
+ i += n221
}
return i, nil
}
@@ -14517,11 +14539,11 @@ func (m *ResponseUnion_AdminMerge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x5a
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminMerge.Size()))
- n221, err := m.AdminMerge.MarshalTo(dAtA[i:])
+ n222, err := m.AdminMerge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n221
+ i += n222
}
return i, nil
}
@@ -14531,11 +14553,11 @@ func (m *ResponseUnion_HeartbeatTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x62
i++
i = encodeVarintApi(dAtA, i, uint64(m.HeartbeatTxn.Size()))
- n222, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
+ n223, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n222
+ i += n223
}
return i, nil
}
@@ -14545,11 +14567,11 @@ func (m *ResponseUnion_Gc) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x6a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Gc.Size()))
- n223, err := m.Gc.MarshalTo(dAtA[i:])
+ n224, err := m.Gc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n223
+ i += n224
}
return i, nil
}
@@ -14559,11 +14581,11 @@ func (m *ResponseUnion_PushTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x72
i++
i = encodeVarintApi(dAtA, i, uint64(m.PushTxn.Size()))
- n224, err := m.PushTxn.MarshalTo(dAtA[i:])
+ n225, err := m.PushTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n224
+ i += n225
}
return i, nil
}
@@ -14575,11 +14597,11 @@ func (m *ResponseUnion_ResolveIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntent.Size()))
- n225, err := m.ResolveIntent.MarshalTo(dAtA[i:])
+ n226, err := m.ResolveIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n225
+ i += n226
}
return i, nil
}
@@ -14591,11 +14613,11 @@ func (m *ResponseUnion_ResolveIntentRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntentRange.Size()))
- n226, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
+ n227, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n226
+ i += n227
}
return i, nil
}
@@ -14607,11 +14629,11 @@ func (m *ResponseUnion_Merge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.Merge.Size()))
- n227, err := m.Merge.MarshalTo(dAtA[i:])
+ n228, err := m.Merge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n227
+ i += n228
}
return i, nil
}
@@ -14623,11 +14645,11 @@ func (m *ResponseUnion_TruncateLog) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.TruncateLog.Size()))
- n228, err := m.TruncateLog.MarshalTo(dAtA[i:])
+ n229, err := m.TruncateLog.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n228
+ i += n229
}
return i, nil
}
@@ -14639,11 +14661,11 @@ func (m *ResponseUnion_RequestLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestLease.Size()))
- n229, err := m.RequestLease.MarshalTo(dAtA[i:])
+ n230, err := m.RequestLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n229
+ i += n230
}
return i, nil
}
@@ -14655,11 +14677,11 @@ func (m *ResponseUnion_ReverseScan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ReverseScan.Size()))
- n230, err := m.ReverseScan.MarshalTo(dAtA[i:])
+ n231, err := m.ReverseScan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n230
+ i += n231
}
return i, nil
}
@@ -14671,11 +14693,11 @@ func (m *ResponseUnion_ComputeChecksum) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ComputeChecksum.Size()))
- n231, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
+ n232, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n231
+ i += n232
}
return i, nil
}
@@ -14687,11 +14709,11 @@ func (m *ResponseUnion_CheckConsistency) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.CheckConsistency.Size()))
- n232, err := m.CheckConsistency.MarshalTo(dAtA[i:])
+ n233, err := m.CheckConsistency.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n232
+ i += n233
}
return i, nil
}
@@ -14703,11 +14725,11 @@ func (m *ResponseUnion_InitPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.InitPut.Size()))
- n233, err := m.InitPut.MarshalTo(dAtA[i:])
+ n234, err := m.InitPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n233
+ i += n234
}
return i, nil
}
@@ -14719,11 +14741,11 @@ func (m *ResponseUnion_AdminTransferLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminTransferLease.Size()))
- n234, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
+ n235, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n234
+ i += n235
}
return i, nil
}
@@ -14735,11 +14757,11 @@ func (m *ResponseUnion_LeaseInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.LeaseInfo.Size()))
- n235, err := m.LeaseInfo.MarshalTo(dAtA[i:])
+ n236, err := m.LeaseInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n235
+ i += n236
}
return i, nil
}
@@ -14751,11 +14773,11 @@ func (m *ResponseUnion_WriteBatch) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.WriteBatch.Size()))
- n236, err := m.WriteBatch.MarshalTo(dAtA[i:])
+ n237, err := m.WriteBatch.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n236
+ i += n237
}
return i, nil
}
@@ -14767,11 +14789,11 @@ func (m *ResponseUnion_Export) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Export.Size()))
- n237, err := m.Export.MarshalTo(dAtA[i:])
+ n238, err := m.Export.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n237
+ i += n238
}
return i, nil
}
@@ -14783,11 +14805,11 @@ func (m *ResponseUnion_QueryTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryTxn.Size()))
- n238, err := m.QueryTxn.MarshalTo(dAtA[i:])
+ n239, err := m.QueryTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n238
+ i += n239
}
return i, nil
}
@@ -14799,11 +14821,11 @@ func (m *ResponseUnion_Import) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Import.Size()))
- n239, err := m.Import.MarshalTo(dAtA[i:])
+ n240, err := m.Import.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n239
+ i += n240
}
return i, nil
}
@@ -14815,11 +14837,11 @@ func (m *ResponseUnion_AdminChangeReplicas) MarshalTo(dAtA []byte) (int, error)
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminChangeReplicas.Size()))
- n240, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
+ n241, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n240
+ i += n241
}
return i, nil
}
@@ -14831,11 +14853,11 @@ func (m *ResponseUnion_AdminScatter) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminScatter.Size()))
- n241, err := m.AdminScatter.MarshalTo(dAtA[i:])
+ n242, err := m.AdminScatter.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n241
+ i += n242
}
return i, nil
}
@@ -14847,11 +14869,11 @@ func (m *ResponseUnion_AddSstable) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AddSstable.Size()))
- n242, err := m.AddSstable.MarshalTo(dAtA[i:])
+ n243, err := m.AddSstable.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n242
+ i += n243
}
return i, nil
}
@@ -14863,11 +14885,11 @@ func (m *ResponseUnion_ClearRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.ClearRange.Size()))
- n243, err := m.ClearRange.MarshalTo(dAtA[i:])
+ n244, err := m.ClearRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n243
+ i += n244
}
return i, nil
}
@@ -14879,11 +14901,11 @@ func (m *ResponseUnion_RecomputeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecomputeStats.Size()))
- n244, err := m.RecomputeStats.MarshalTo(dAtA[i:])
+ n245, err := m.RecomputeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n244
+ i += n245
}
return i, nil
}
@@ -14895,11 +14917,11 @@ func (m *ResponseUnion_Refresh) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Refresh.Size()))
- n245, err := m.Refresh.MarshalTo(dAtA[i:])
+ n246, err := m.Refresh.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n245
+ i += n246
}
return i, nil
}
@@ -14911,11 +14933,11 @@ func (m *ResponseUnion_RefreshRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RefreshRange.Size()))
- n246, err := m.RefreshRange.MarshalTo(dAtA[i:])
+ n247, err := m.RefreshRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n246
+ i += n247
}
return i, nil
}
@@ -14927,11 +14949,11 @@ func (m *ResponseUnion_QueryIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryIntent.Size()))
- n247, err := m.QueryIntent.MarshalTo(dAtA[i:])
+ n248, err := m.QueryIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n247
+ i += n248
}
return i, nil
}
@@ -14943,11 +14965,11 @@ func (m *ResponseUnion_Subsume) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Subsume.Size()))
- n248, err := m.Subsume.MarshalTo(dAtA[i:])
+ n249, err := m.Subsume.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n248
+ i += n249
}
return i, nil
}
@@ -14959,11 +14981,11 @@ func (m *ResponseUnion_RangeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RangeStats.Size()))
- n249, err := m.RangeStats.MarshalTo(dAtA[i:])
+ n250, err := m.RangeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n249
+ i += n250
}
return i, nil
}
@@ -14975,11 +14997,11 @@ func (m *ResponseUnion_AdminRelocateRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminRelocateRange.Size()))
- n250, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
+ n251, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n250
+ i += n251
}
return i, nil
}
@@ -14991,11 +15013,11 @@ func (m *ResponseUnion_RecoverTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecoverTxn.Size()))
- n251, err := m.RecoverTxn.MarshalTo(dAtA[i:])
+ n252, err := m.RecoverTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n251
+ i += n252
}
return i, nil
}
@@ -15007,11 +15029,11 @@ func (m *ResponseUnion_AdminUnsplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminUnsplit.Size()))
- n252, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
+ n253, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n252
+ i += n253
}
return i, nil
}
@@ -15023,11 +15045,11 @@ func (m *ResponseUnion_RevertRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.RevertRange.Size()))
- n253, err := m.RevertRange.MarshalTo(dAtA[i:])
+ n254, err := m.RevertRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n253
+ i += n254
}
return i, nil
}
@@ -15039,11 +15061,11 @@ func (m *ResponseUnion_AdminVerifyProtectedTimestamp) MarshalTo(dAtA []byte) (in
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminVerifyProtectedTimestamp.Size()))
- n254, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
+ n255, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n254
+ i += n255
}
return i, nil
}
@@ -15055,11 +15077,11 @@ func (m *ResponseUnion_Migrate) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.Migrate.Size()))
- n255, err := m.Migrate.MarshalTo(dAtA[i:])
+ n256, err := m.Migrate.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n255
+ i += n256
}
return i, nil
}
@@ -15081,19 +15103,19 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Timestamp.Size()))
- n256, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n257, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n256
+ i += n257
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Replica.Size()))
- n257, err := m.Replica.MarshalTo(dAtA[i:])
+ n258, err := m.Replica.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n257
+ i += n258
if m.RangeID != 0 {
dAtA[i] = 0x18
i++
@@ -15109,11 +15131,11 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Txn.Size()))
- n258, err := m.Txn.MarshalTo(dAtA[i:])
+ n259, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n258
+ i += n259
}
if m.ReadConsistency != 0 {
dAtA[i] = 0x30
@@ -15172,11 +15194,11 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ClientRangeInfo.Size()))
- n259, err := m.ClientRangeInfo.MarshalTo(dAtA[i:])
+ n260, err := m.ClientRangeInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n259
+ i += n260
if m.WaitPolicy != 0 {
dAtA[i] = 0x90
i++
@@ -15205,11 +15227,11 @@ func (m *BatchRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Header.Size()))
- n260, err := m.Header.MarshalTo(dAtA[i:])
+ n261, err := m.Header.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n260
+ i += n261
if len(m.Requests) > 0 {
for _, msg := range m.Requests {
dAtA[i] = 0x12
@@ -15243,11 +15265,11 @@ func (m *BatchResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.BatchResponse_Header.Size()))
- n261, err := m.BatchResponse_Header.MarshalTo(dAtA[i:])
+ n262, err := m.BatchResponse_Header.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n261
+ i += n262
if len(m.Responses) > 0 {
for _, msg := range m.Responses {
dAtA[i] = 0x12
@@ -15282,38 +15304,38 @@ func (m *BatchResponse_Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n262, err := m.Error.MarshalTo(dAtA[i:])
+ n263, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n262
+ i += n263
}
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Timestamp.Size()))
- n263, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n264, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n263
+ i += n264
if m.Txn != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Txn.Size()))
- n264, err := m.Txn.MarshalTo(dAtA[i:])
+ n265, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n264
+ i += n265
}
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Now.Size()))
- n265, err := m.Now.MarshalTo(dAtA[i:])
+ n266, err := m.Now.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n265
+ i += n266
if len(m.CollectedSpans) > 0 {
for _, msg := range m.CollectedSpans {
dAtA[i] = 0x32
@@ -15428,11 +15450,11 @@ func (m *RangeLookupResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n266, err := m.Error.MarshalTo(dAtA[i:])
+ n267, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n266
+ i += n267
}
return i, nil
}
@@ -15455,19 +15477,19 @@ func (m *RangeFeedRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Header.Size()))
- n267, err := m.Header.MarshalTo(dAtA[i:])
+ n268, err := m.Header.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n267
+ i += n268
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Span.Size()))
- n268, err := m.Span.MarshalTo(dAtA[i:])
+ n269, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n268
+ i += n269
if m.WithDiff {
dAtA[i] = 0x18
i++
@@ -15505,19 +15527,19 @@ func (m *RangeFeedValue) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Value.Size()))
- n269, err := m.Value.MarshalTo(dAtA[i:])
+ n270, err := m.Value.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n269
+ i += n270
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.PrevValue.Size()))
- n270, err := m.PrevValue.MarshalTo(dAtA[i:])
+ n271, err := m.PrevValue.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n270
+ i += n271
return i, nil
}
@@ -15539,19 +15561,19 @@ func (m *RangeFeedCheckpoint) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Span.Size()))
- n271, err := m.Span.MarshalTo(dAtA[i:])
+ n272, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n271
+ i += n272
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolvedTS.Size()))
- n272, err := m.ResolvedTS.MarshalTo(dAtA[i:])
+ n273, err := m.ResolvedTS.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n272
+ i += n273
return i, nil
}
@@ -15573,11 +15595,11 @@ func (m *RangeFeedError) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n273, err := m.Error.MarshalTo(dAtA[i:])
+ n274, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n273
+ i += n274
return i, nil
}
@@ -15600,31 +15622,31 @@ func (m *RangeFeedEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Val.Size()))
- n274, err := m.Val.MarshalTo(dAtA[i:])
+ n275, err := m.Val.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n274
+ i += n275
}
if m.Checkpoint != nil {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Checkpoint.Size()))
- n275, err := m.Checkpoint.MarshalTo(dAtA[i:])
+ n276, err := m.Checkpoint.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n275
+ i += n276
}
if m.Error != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n276, err := m.Error.MarshalTo(dAtA[i:])
+ n277, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n276
+ i += n277
}
return i, nil
}
@@ -15727,11 +15749,11 @@ func (m *GossipSubscriptionEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Content.Size()))
- n277, err := m.Content.MarshalTo(dAtA[i:])
+ n278, err := m.Content.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n277
+ i += n278
if len(m.PatternMatched) > 0 {
dAtA[i] = 0x1a
i++
@@ -15742,11 +15764,11 @@ func (m *GossipSubscriptionEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n278, err := m.Error.MarshalTo(dAtA[i:])
+ n279, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n278
+ i += n279
}
return i, nil
}
@@ -15770,11 +15792,11 @@ func (m *JoinNodeRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.BinaryVersion.Size()))
- n279, err := m.BinaryVersion.MarshalTo(dAtA[i:])
+ n280, err := m.BinaryVersion.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n279
+ i += n280
}
return i, nil
}
@@ -15814,11 +15836,11 @@ func (m *JoinNodeResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.ActiveVersion.Size()))
- n280, err := m.ActiveVersion.MarshalTo(dAtA[i:])
+ n281, err := m.ActiveVersion.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n280
+ i += n281
}
return i, nil
}
@@ -15847,19 +15869,19 @@ func (m *ContentionEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.TxnMeta.Size()))
- n281, err := m.TxnMeta.MarshalTo(dAtA[i:])
+ n282, err := m.TxnMeta.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n281
+ i += n282
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration)))
- n282, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i:])
+ n283, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i:])
if err != nil {
return 0, err
}
- i += n282
+ i += n283
return i, nil
}
@@ -17729,6 +17751,8 @@ func (m *SubsumeResponse) Size() (n int) {
}
l = m.FreezeStart.Size()
n += 1 + l + sovApi(uint64(l))
+ l = m.ClosedTimestamp.Size()
+ n += 1 + l + sovApi(uint64(l))
return n
}
@@ -32970,6 +32994,36 @@ func (m *SubsumeResponse) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowApi
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthApi
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])
@@ -38922,520 +38976,521 @@ var (
ErrIntOverflowApi = fmt.Errorf("proto: integer overflow")
)
-func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_30e97dda177d9566) }
-
-var fileDescriptor_api_30e97dda177d9566 = []byte{
- // 8182 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0xbd, 0x5d, 0x6c, 0x23, 0x59,
- 0x76, 0x1f, 0xae, 0x22, 0x29, 0x89, 0x3c, 0xa4, 0x48, 0xea, 0xaa, 0x3f, 0xd8, 0x9c, 0x99, 0x56,
- 0x77, 0xf5, 0x77, 0xef, 0x8c, 0x34, 0xdd, 0xbd, 0xf3, 0x9f, 0xf1, 0xf4, 0x78, 0xd6, 0x12, 0xc5,
- 0x6e, 0x52, 0x6a, 0xa9, 0xd5, 0x45, 0xaa, 0x1b, 0x33, 0x5e, 0xff, 0x6b, 0x4b, 0x55, 0x57, 0x54,
- 0xad, 0xc8, 0x2a, 0x76, 0x55, 0x51, 0x1f, 0x03, 0x04, 0x88, 0x63, 0xc3, 0xd9, 0x27, 0x63, 0x1f,
- 0x0c, 0x64, 0x0d, 0x07, 0xf1, 0x3a, 0x1b, 0xc4, 0x0f, 0x01, 0x92, 0x00, 0x09, 0xf2, 0x85, 0xc4,
- 0x7e, 0x31, 0x90, 0x45, 0xe0, 0xc4, 0xeb, 0xa7, 0x18, 0x01, 0xa2, 0xd8, 0xda, 0xbc, 0x04, 0x0e,
- 0x8c, 0x20, 0x08, 0x60, 0x60, 0x1e, 0x82, 0xe0, 0x7e, 0xd4, 0x17, 0x59, 0xfc, 0x50, 0x4f, 0x6d,
- 0x32, 0x80, 0x5f, 0x24, 0xd6, 0xb9, 0xf7, 0x9c, 0xba, 0xf7, 0xdc, 0x7b, 0xcf, 0x3d, 0xbf, 0x5b,
- 0xe7, 0xde, 0x0b, 0xf3, 0x96, 0xa9, 0xa8, 0xfb, 0xdd, 0xdd, 0x65, 0xa5, 0xab, 0x2f, 0x75, 0x2d,
- 0xd3, 0x31, 0xd1, 0xbc, 0x6a, 0xaa, 0x07, 0x94, 0xbc, 0xc4, 0x13, 0xcb, 0xf7, 0x0f, 0x0e, 0x97,
- 0x0f, 0x0e, 0x6d, 0x6c, 0x1d, 0x62, 0x6b, 0x59, 0x35, 0x0d, 0xb5, 0x67, 0x59, 0xd8, 0x50, 0x4f,
- 0x96, 0xdb, 0xa6, 0x7a, 0x40, 0xff, 0xe8, 0x46, 0x8b, 0xb1, 0x97, 0x91, 0x2b, 0x51, 0x53, 0x1c,
- 0x85, 0xd3, 0x2e, 0xb8, 0x34, 0x6c, 0x59, 0xa6, 0x65, 0x73, 0xea, 0x25, 0x97, 0xda, 0xc1, 0x8e,
- 0x12, 0xc8, 0xfd, 0x96, 0xed, 0x98, 0x96, 0xd2, 0xc2, 0xcb, 0xd8, 0x68, 0xe9, 0x06, 0x26, 0x19,
- 0x0e, 0x55, 0x95, 0x27, 0xbe, 0x1d, 0x99, 0xf8, 0x88, 0xa7, 0x96, 0x7a, 0x8e, 0xde, 0x5e, 0xde,
- 0x6f, 0xab, 0xcb, 0x8e, 0xde, 0xc1, 0xb6, 0xa3, 0x74, 0xba, 0x3c, 0xe5, 0x3e, 0x4d, 0x71, 0x2c,
- 0x45, 0xd5, 0x8d, 0x96, 0xfb, 0xbf, 0xbb, 0xbb, 0x6c, 0x61, 0xd5, 0xb4, 0x34, 0xac, 0xc9, 0x76,
- 0x57, 0x31, 0xdc, 0xe2, 0xb6, 0xcc, 0x96, 0x49, 0x7f, 0x2e, 0x93, 0x5f, 0x9c, 0x7a, 0xb5, 0x65,
- 0x9a, 0xad, 0x36, 0x5e, 0xa6, 0x4f, 0xbb, 0xbd, 0xbd, 0x65, 0xad, 0x67, 0x29, 0x8e, 0x6e, 0x72,
- 0x2e, 0xf1, 0x9f, 0x09, 0x30, 0x27, 0xe1, 0xd7, 0x3d, 0x6c, 0x3b, 0x35, 0xac, 0x68, 0xd8, 0x42,
- 0x57, 0x20, 0x79, 0x80, 0x4f, 0x4a, 0xc9, 0x6b, 0xc2, 0xdd, 0xdc, 0xea, 0xec, 0x97, 0xa7, 0x8b,
- 0xc9, 0x0d, 0x7c, 0x22, 0x11, 0x1a, 0xba, 0x06, 0xb3, 0xd8, 0xd0, 0x64, 0x92, 0x9c, 0x0a, 0x27,
- 0xcf, 0x60, 0x43, 0xdb, 0xc0, 0x27, 0xe8, 0xdb, 0x90, 0xb6, 0x89, 0x34, 0x43, 0xc5, 0xa5, 0xe9,
- 0x6b, 0xc2, 0xdd, 0xe9, 0xd5, 0x5f, 0xf8, 0xf2, 0x74, 0xf1, 0x93, 0x96, 0xee, 0xec, 0xf7, 0x76,
- 0x97, 0x54, 0xb3, 0xb3, 0xec, 0xb5, 0x93, 0xb6, 0xeb, 0xff, 0x5e, 0xee, 0x1e, 0xb4, 0x96, 0xfb,
- 0x75, 0xb4, 0xd4, 0x3c, 0x36, 0x1a, 0xf8, 0xb5, 0xe4, 0x49, 0x5c, 0x4f, 0xa5, 0x85, 0x62, 0x62,
- 0x3d, 0x95, 0x4e, 0x14, 0x93, 0xe2, 0x1f, 0x25, 0x20, 0x2f, 0x61, 0xbb, 0x6b, 0x1a, 0x36, 0xe6,
- 0x25, 0x7f, 0x1f, 0x92, 0xce, 0xb1, 0x41, 0x4b, 0x9e, 0x7d, 0x78, 0x75, 0x69, 0xa0, 0x47, 0x2c,
- 0x35, 0x2d, 0xc5, 0xb0, 0x15, 0x95, 0x54, 0x5f, 0x22, 0x59, 0xd1, 0x47, 0x90, 0xb5, 0xb0, 0xdd,
- 0xeb, 0x60, 0xaa, 0x48, 0x5a, 0xa9, 0xec, 0xc3, 0xcb, 0x11, 0x9c, 0x8d, 0xae, 0x62, 0x48, 0xc0,
- 0xf2, 0x92, 0xdf, 0xe8, 0x0a, 0xa4, 0x8d, 0x5e, 0x87, 0xa8, 0xc2, 0xa6, 0x15, 0x4d, 0x4a, 0xb3,
- 0x46, 0xaf, 0xb3, 0x81, 0x4f, 0x6c, 0xd4, 0x80, 0x39, 0x2e, 0xd4, 0xc2, 0x8a, 0x6d, 0x1a, 0xa5,
- 0xd9, 0x6b, 0xc2, 0xdd, 0xfc, 0xc3, 0xa5, 0x08, 0xb1, 0xe1, 0x0a, 0x90, 0xc7, 0x5e, 0x07, 0x4b,
- 0x94, 0x4b, 0xca, 0x59, 0x81, 0x27, 0xf4, 0x16, 0x64, 0xc8, 0xfb, 0x76, 0x4f, 0x1c, 0x6c, 0x97,
- 0xd2, 0xf4, 0x85, 0xa4, 0x00, 0xab, 0xe4, 0x59, 0xfc, 0x14, 0x72, 0x41, 0x56, 0x84, 0x20, 0x2f,
- 0x55, 0x1b, 0x3b, 0x9b, 0x55, 0x79, 0x67, 0x6b, 0x63, 0xeb, 0xf9, 0xab, 0xad, 0xe2, 0x14, 0xba,
- 0x00, 0x45, 0x4e, 0xdb, 0xa8, 0x7e, 0x26, 0x3f, 0xab, 0x6f, 0xd6, 0x9b, 0x45, 0xa1, 0x9c, 0xfa,
- 0xde, 0x8f, 0xae, 0x4e, 0xad, 0xa7, 0xd2, 0x33, 0xc5, 0x59, 0xf1, 0x47, 0x02, 0xc0, 0x53, 0xec,
- 0xf0, 0xde, 0x80, 0x56, 0x61, 0x66, 0x9f, 0x16, 0xab, 0x24, 0x50, 0xb5, 0x5c, 0x8b, 0x2c, 0x7f,
- 0xa0, 0xe7, 0xac, 0xa6, 0x7f, 0x7c, 0xba, 0x38, 0xf5, 0x93, 0xd3, 0x45, 0x41, 0xe2, 0x9c, 0xe8,
- 0x05, 0x64, 0x0f, 0xf0, 0x89, 0xcc, 0xc7, 0x5a, 0x29, 0x41, 0x15, 0xf1, 0x7e, 0x40, 0xd0, 0xc1,
- 0xe1, 0x92, 0x3b, 0x44, 0x97, 0x02, 0x43, 0x74, 0x89, 0x70, 0x2c, 0x35, 0x1c, 0x0b, 0x1b, 0x2d,
- 0x67, 0x5f, 0x82, 0x03, 0x7c, 0xf2, 0x8c, 0xc9, 0x10, 0x7f, 0x5f, 0x80, 0x2c, 0x2d, 0x25, 0xd3,
- 0x1c, 0xaa, 0xf4, 0x15, 0xf3, 0xfa, 0x58, 0x35, 0x47, 0x94, 0x73, 0x09, 0xa6, 0x0f, 0x95, 0x76,
- 0x0f, 0xd3, 0x12, 0x66, 0x1f, 0x96, 0x22, 0x64, 0xbc, 0x24, 0xe9, 0x12, 0xcb, 0x86, 0x1e, 0x43,
- 0x4e, 0x37, 0x1c, 0x6c, 0x38, 0x32, 0x63, 0x4b, 0x8e, 0x61, 0xcb, 0xb2, 0xdc, 0xf4, 0x41, 0xfc,
- 0xa7, 0x02, 0xc0, 0x76, 0x2f, 0x56, 0x3d, 0x7f, 0x73, 0xc2, 0xf2, 0xaf, 0xa6, 0x08, 0xab, 0x5b,
- 0x8b, 0x4b, 0x30, 0xa3, 0x1b, 0x6d, 0xdd, 0x60, 0xe5, 0x4f, 0x4b, 0xfc, 0x09, 0x5d, 0x80, 0xe9,
- 0xdd, 0xb6, 0x6e, 0x68, 0x74, 0x3c, 0xa4, 0x25, 0xf6, 0x20, 0x4a, 0x90, 0xa5, 0xa5, 0x8e, 0x51,
- 0xef, 0xe2, 0x69, 0x02, 0x2e, 0x56, 0x4c, 0x43, 0xd3, 0xc9, 0x90, 0x54, 0xda, 0x5f, 0x0b, 0xad,
- 0xac, 0xc3, 0x05, 0x0d, 0x77, 0x2d, 0xac, 0x2a, 0x0e, 0xd6, 0x64, 0x7c, 0xdc, 0x9d, 0xb0, 0x8d,
- 0x91, 0xcf, 0x55, 0x3d, 0xee, 0x52, 0x5a, 0xb4, 0x26, 0xd1, 0x37, 0xe1, 0xb2, 0xd2, 0x6e, 0x9b,
- 0x47, 0xb2, 0xbe, 0x27, 0x6b, 0x26, 0xb6, 0x65, 0xc3, 0x74, 0x64, 0x7c, 0xac, 0xdb, 0x0e, 0x35,
- 0x25, 0x69, 0x69, 0x81, 0x26, 0xd7, 0xf7, 0xd6, 0x4c, 0x6c, 0x6f, 0x99, 0x4e, 0x95, 0x24, 0x11,
- 0x0b, 0x40, 0x0a, 0xc3, 0x2c, 0xc0, 0x0c, 0x31, 0xbf, 0x52, 0x1a, 0x1f, 0x77, 0xa9, 0x05, 0x08,
- 0x34, 0xe5, 0x6c, 0xb0, 0x29, 0xc5, 0x5f, 0x82, 0x4b, 0xfd, 0xfa, 0x8d, 0xb3, 0xfd, 0xfe, 0x50,
- 0x80, 0x7c, 0xdd, 0xd0, 0x9d, 0xaf, 0x45, 0xc3, 0x79, 0xca, 0x4e, 0x06, 0x95, 0x7d, 0x1f, 0x8a,
- 0x7b, 0x8a, 0xde, 0x7e, 0x6e, 0x34, 0xcd, 0xce, 0xae, 0xed, 0x98, 0x06, 0xb6, 0x79, 0x6b, 0x0c,
- 0xd0, 0xc5, 0x97, 0x50, 0xf0, 0x6a, 0x13, 0xa7, 0x9a, 0x1c, 0x28, 0xd6, 0x0d, 0xd5, 0xc2, 0x1d,
- 0x6c, 0xc4, 0xaa, 0xa7, 0xb7, 0x21, 0xa3, 0xbb, 0x72, 0xa9, 0xae, 0x92, 0x92, 0x4f, 0x10, 0x7b,
- 0x30, 0x1f, 0x78, 0x6b, 0x9c, 0xe6, 0x92, 0x4c, 0x46, 0xf8, 0x48, 0xf6, 0xdb, 0x88, 0x4c, 0x46,
- 0xf8, 0x88, 0x99, 0xb7, 0x06, 0xcc, 0xad, 0xe1, 0x36, 0x76, 0x70, 0x8c, 0x35, 0x15, 0x77, 0x20,
- 0xef, 0x0a, 0x8d, 0xb3, 0x61, 0xfe, 0x96, 0x00, 0x88, 0xcb, 0x55, 0x8c, 0x56, 0x9c, 0x25, 0x46,
- 0x8b, 0xc4, 0xb5, 0x70, 0x7a, 0x96, 0xc1, 0x7c, 0x04, 0xd6, 0x27, 0x81, 0x91, 0xa8, 0x9b, 0xe0,
- 0x0f, 0xd9, 0x54, 0x70, 0xc8, 0x72, 0xf7, 0xe6, 0x08, 0x16, 0x42, 0x05, 0x8b, 0xb7, 0xf9, 0x52,
- 0xb4, 0x4c, 0x89, 0x6b, 0xc9, 0xa0, 0x0f, 0x47, 0x89, 0xe2, 0x0f, 0x04, 0x98, 0xaf, 0xb4, 0xb1,
- 0x62, 0xc5, 0xae, 0x91, 0x6f, 0x41, 0x5a, 0xc3, 0x8a, 0x46, 0xab, 0xcc, 0x06, 0xf6, 0x3b, 0x01,
- 0x29, 0xc4, 0xd3, 0x5d, 0xda, 0x6f, 0xab, 0x4b, 0x4d, 0xd7, 0x07, 0xe6, 0xa3, 0xdb, 0x63, 0x12,
- 0x3f, 0x03, 0x14, 0x2c, 0x59, 0x9c, 0x1d, 0xe1, 0x7f, 0x09, 0x80, 0x24, 0x7c, 0x88, 0x2d, 0x27,
- 0xf6, 0x6a, 0xaf, 0x41, 0xd6, 0x51, 0xac, 0x16, 0x76, 0x64, 0xe2, 0xdd, 0x9f, 0xa7, 0xe6, 0xc0,
- 0xf8, 0x08, 0x19, 0x35, 0xe1, 0x0e, 0x36, 0x94, 0xdd, 0x36, 0xa6, 0x52, 0xe4, 0x5d, 0xb3, 0x67,
- 0x68, 0xb2, 0xee, 0x60, 0x4b, 0x71, 0x4c, 0x4b, 0x36, 0xbb, 0x8e, 0xde, 0xd1, 0xbf, 0xa0, 0x8e,
- 0x3d, 0xef, 0x6a, 0x37, 0x58, 0x76, 0xc2, 0xbc, 0x4a, 0x32, 0xd7, 0x79, 0xde, 0xe7, 0x81, 0xac,
- 0xe2, 0xe7, 0xb0, 0x10, 0xaa, 0x75, 0x9c, 0x2a, 0xfd, 0x1f, 0x02, 0x64, 0x1b, 0xaa, 0x62, 0xc4,
- 0xa9, 0xcb, 0x4f, 0x21, 0x6b, 0xab, 0x8a, 0x21, 0xef, 0x99, 0x56, 0x47, 0x71, 0xe8, 0xc0, 0xc9,
- 0x87, 0x74, 0xe9, 0xf9, 0xeb, 0xaa, 0x62, 0x3c, 0xa1, 0x99, 0x24, 0xb0, 0xbd, 0xdf, 0xfd, 0xfe,
- 0xe8, 0xf4, 0x57, 0xf7, 0x47, 0xd9, 0x70, 0x5d, 0x4f, 0xa5, 0x93, 0xc5, 0x94, 0xf8, 0x97, 0x02,
- 0xe4, 0x58, 0x95, 0xe3, 0x1c, 0xae, 0x1f, 0x40, 0xca, 0x32, 0x8f, 0xd8, 0x70, 0xcd, 0x3e, 0x7c,
- 0x2b, 0x42, 0xc4, 0x06, 0x3e, 0x09, 0xce, 0x87, 0x34, 0x3b, 0x5a, 0x05, 0xee, 0x75, 0xca, 0x94,
- 0x3b, 0x39, 0x29, 0x37, 0x30, 0x2e, 0x89, 0xc8, 0xb8, 0x03, 0x85, 0x5d, 0xc5, 0x51, 0xf7, 0x65,
- 0x8b, 0x17, 0x92, 0xcc, 0x9d, 0xc9, 0xbb, 0x39, 0x29, 0x4f, 0xc9, 0x6e, 0xd1, 0x6d, 0x52, 0x73,
- 0x36, 0x7e, 0x6c, 0xfc, 0x57, 0xac, 0xcd, 0xff, 0xb7, 0xc0, 0xc7, 0x90, 0x5b, 0xf3, 0xbf, 0x6a,
- 0x4d, 0xff, 0x9b, 0x09, 0xb8, 0x5c, 0xd9, 0xc7, 0xea, 0x41, 0xc5, 0x34, 0x6c, 0xdd, 0x76, 0x88,
- 0xee, 0xe2, 0x6c, 0xff, 0xb7, 0x20, 0x73, 0xa4, 0x3b, 0xfb, 0xb2, 0xa6, 0xef, 0xed, 0x51, 0xeb,
- 0x99, 0x96, 0xd2, 0x84, 0xb0, 0xa6, 0xef, 0xed, 0xa1, 0x47, 0x90, 0xea, 0x98, 0x1a, 0x73, 0xce,
- 0xf3, 0x0f, 0x17, 0x23, 0xc4, 0xd3, 0xa2, 0xd9, 0xbd, 0xce, 0xa6, 0xa9, 0x61, 0x89, 0x66, 0x46,
- 0x57, 0x01, 0x54, 0x42, 0xed, 0x9a, 0xba, 0xe1, 0xf0, 0xd9, 0x37, 0x40, 0x41, 0x35, 0xc8, 0x38,
- 0xd8, 0xea, 0xe8, 0x86, 0xe2, 0xe0, 0xd2, 0x34, 0x55, 0xde, 0xcd, 0xc8, 0x82, 0x77, 0xdb, 0xba,
- 0xaa, 0xac, 0x61, 0x5b, 0xb5, 0xf4, 0xae, 0x63, 0x5a, 0x5c, 0x8b, 0x3e, 0xb3, 0xf8, 0xeb, 0x29,
- 0x28, 0x0d, 0xea, 0x26, 0xce, 0x1e, 0xb2, 0x0d, 0x33, 0x16, 0xb6, 0x7b, 0x6d, 0x87, 0xf7, 0x91,
- 0x87, 0xc3, 0x54, 0x10, 0x51, 0x02, 0xba, 0xde, 0xd0, 0x76, 0x78, 0xb1, 0xb9, 0x9c, 0xf2, 0xbf,
- 0x16, 0x60, 0x86, 0x25, 0xa0, 0x07, 0x90, 0xb6, 0xc8, 0xc4, 0x20, 0xeb, 0x1a, 0x2d, 0x63, 0x72,
- 0xf5, 0xd2, 0xd9, 0xe9, 0xe2, 0x2c, 0x9d, 0x2c, 0xea, 0x6b, 0x5f, 0xfa, 0x3f, 0xa5, 0x59, 0x9a,
- 0xaf, 0xae, 0x91, 0xd6, 0xb2, 0x1d, 0xc5, 0x72, 0xe8, 0x22, 0x51, 0x82, 0xa1, 0x14, 0x4a, 0xd8,
- 0xc0, 0x27, 0x68, 0x1d, 0x66, 0x6c, 0x47, 0x71, 0x7a, 0x36, 0x6f, 0xaf, 0x73, 0x15, 0xb6, 0x41,
- 0x39, 0x25, 0x2e, 0x81, 0xb8, 0x4f, 0x1a, 0x76, 0x14, 0xbd, 0x4d, 0x1b, 0x30, 0x23, 0xf1, 0x27,
- 0xf1, 0xb7, 0x04, 0x98, 0x61, 0x59, 0xd1, 0x65, 0x58, 0x90, 0x56, 0xb6, 0x9e, 0x56, 0xe5, 0xfa,
- 0xd6, 0x5a, 0xb5, 0x59, 0x95, 0x36, 0xeb, 0x5b, 0x2b, 0xcd, 0x6a, 0x71, 0x0a, 0x5d, 0x02, 0xe4,
- 0x26, 0x54, 0x9e, 0x6f, 0x35, 0xea, 0x8d, 0x66, 0x75, 0xab, 0x59, 0x14, 0xe8, 0x1a, 0x09, 0xa5,
- 0x07, 0xa8, 0x09, 0x74, 0x13, 0xae, 0xf5, 0x53, 0xe5, 0x46, 0x73, 0xa5, 0xd9, 0x90, 0xab, 0x8d,
- 0x66, 0x7d, 0x73, 0xa5, 0x59, 0x5d, 0x2b, 0x26, 0x47, 0xe4, 0x22, 0x2f, 0x91, 0xa4, 0x6a, 0xa5,
- 0x59, 0x4c, 0x89, 0x0e, 0x5c, 0x94, 0xb0, 0x6a, 0x76, 0xba, 0x3d, 0x07, 0x93, 0x52, 0xda, 0x71,
- 0x8e, 0x94, 0xcb, 0x30, 0xab, 0x59, 0x27, 0xb2, 0xd5, 0x33, 0xf8, 0x38, 0x99, 0xd1, 0xac, 0x13,
- 0xa9, 0x67, 0x88, 0xff, 0x58, 0x80, 0x4b, 0xfd, 0xaf, 0x8d, 0xb3, 0x13, 0xbe, 0x80, 0xac, 0xa2,
- 0x69, 0x58, 0x93, 0x35, 0xdc, 0x76, 0x14, 0xee, 0xe2, 0xdc, 0x0f, 0x48, 0xe2, 0x4b, 0x7b, 0x4b,
- 0xde, 0xd2, 0xde, 0xe6, 0xcb, 0x4a, 0x85, 0x16, 0x64, 0x8d, 0x70, 0xb8, 0xe6, 0x87, 0x0a, 0xa1,
- 0x14, 0xf1, 0xbf, 0xa7, 0x60, 0xae, 0x6a, 0x68, 0xcd, 0xe3, 0x58, 0xe7, 0x92, 0x4b, 0x30, 0xa3,
- 0x9a, 0x9d, 0x8e, 0xee, 0xb8, 0x0a, 0x62, 0x4f, 0xe8, 0xe7, 0x02, 0xae, 0x69, 0x72, 0x02, 0x07,
- 0xcd, 0x77, 0x4a, 0xd1, 0x77, 0xe0, 0x32, 0xb1, 0x9a, 0x96, 0xa1, 0xb4, 0x65, 0x26, 0x4d, 0x76,
- 0x2c, 0xbd, 0xd5, 0xc2, 0x16, 0x5f, 0x4e, 0xbc, 0x1b, 0x51, 0xce, 0x3a, 0xe7, 0xa8, 0x50, 0x86,
- 0x26, 0xcb, 0x2f, 0x5d, 0xd4, 0xa3, 0xc8, 0xe8, 0x13, 0x00, 0x32, 0x15, 0xd1, 0x25, 0x4a, 0x9b,
- 0xdb, 0xa3, 0x61, 0x6b, 0x94, 0xae, 0x09, 0x22, 0x0c, 0xe4, 0xd9, 0x46, 0xcb, 0x04, 0x87, 0xbc,
- 0xee, 0xe9, 0x16, 0x96, 0x1f, 0x74, 0x55, 0xba, 0x70, 0x90, 0x5e, 0xcd, 0x9f, 0x9d, 0x2e, 0x82,
- 0xc4, 0xc8, 0x0f, 0xb6, 0x2b, 0x04, 0x97, 0xb0, 0xdf, 0x5d, 0x15, 0xbd, 0x82, 0x7b, 0x81, 0xf5,
- 0x0f, 0x32, 0xf3, 0xf2, 0x6a, 0x29, 0x8e, 0xbc, 0xaf, 0xb7, 0xf6, 0xb1, 0x25, 0x7b, 0xcb, 0xd4,
- 0x74, 0x25, 0x32, 0x2d, 0xdd, 0xf4, 0x19, 0x2a, 0x8a, 0xc1, 0x4a, 0xbf, 0xe2, 0xd4, 0x68, 0x66,
- 0x4f, 0x67, 0x44, 0xf9, 0x5d, 0x53, 0xb7, 0x4d, 0xa3, 0x94, 0x61, 0xca, 0x67, 0x4f, 0xe8, 0x1e,
- 0x14, 0x9d, 0x63, 0x43, 0xde, 0xc7, 0x8a, 0xe5, 0xec, 0x62, 0xc5, 0x21, 0xb3, 0x34, 0xd0, 0x1c,
- 0x05, 0xe7, 0xd8, 0xa8, 0x05, 0xc8, 0xe8, 0x05, 0x14, 0x75, 0x43, 0xde, 0x6b, 0xeb, 0xad, 0x7d,
- 0x47, 0x3e, 0xb2, 0x74, 0x07, 0xdb, 0xa5, 0x79, 0xaa, 0x90, 0xa8, 0x7e, 0xdb, 0xe0, 0xeb, 0xc6,
- 0xda, 0x2b, 0x92, 0x93, 0xab, 0x26, 0xaf, 0x1b, 0x4f, 0x28, 0x3f, 0x25, 0xda, 0xeb, 0xa9, 0xf4,
- 0x6c, 0x31, 0x2d, 0xfe, 0x67, 0x01, 0xf2, 0x6e, 0x77, 0x8b, 0x73, 0x64, 0xdc, 0x85, 0xa2, 0x69,
- 0x60, 0xb9, 0xbb, 0xaf, 0xd8, 0x98, 0xeb, 0x91, 0x4f, 0x38, 0x79, 0xd3, 0xc0, 0xdb, 0x84, 0xcc,
- 0xd4, 0x85, 0xb6, 0x61, 0xde, 0x76, 0x94, 0x96, 0x6e, 0xb4, 0x02, 0xea, 0x9d, 0x9e, 0x1c, 0x2c,
- 0x14, 0x39, 0xb7, 0x47, 0x0f, 0x79, 0x29, 0x7f, 0x2c, 0xc0, 0xfc, 0x8a, 0xd6, 0xd1, 0x8d, 0x46,
- 0xb7, 0xad, 0xc7, 0xba, 0x06, 0x71, 0x13, 0x32, 0x36, 0x91, 0xe9, 0x1b, 0x7c, 0x1f, 0x51, 0xa6,
- 0x69, 0x0a, 0xb1, 0xfc, 0xcf, 0xa0, 0x80, 0x8f, 0xbb, 0x3a, 0xfb, 0xf4, 0xc0, 0x80, 0x50, 0x6a,
- 0xf2, 0xba, 0xe5, 0x7d, 0x5e, 0x92, 0xc4, 0xeb, 0xf4, 0x19, 0xa0, 0x60, 0x95, 0xe2, 0xc4, 0x2e,
- 0x9f, 0xc1, 0x02, 0x15, 0xbd, 0x63, 0xd8, 0x31, 0xeb, 0x4b, 0xfc, 0x45, 0xb8, 0x10, 0x16, 0x1d,
- 0x67, 0xb9, 0x5f, 0xf1, 0x56, 0xde, 0xc4, 0x56, 0xac, 0x20, 0xd6, 0xd3, 0x35, 0x17, 0x1c, 0x67,
- 0x99, 0x7f, 0x55, 0x80, 0x2b, 0x54, 0x36, 0xfd, 0x3a, 0xb3, 0x87, 0xad, 0x67, 0x58, 0xb1, 0x63,
- 0x45, 0xe0, 0x37, 0x60, 0x86, 0x21, 0x69, 0xda, 0x3f, 0xa7, 0x57, 0xb3, 0xc4, 0x73, 0x69, 0x38,
- 0xa6, 0x45, 0x3c, 0x17, 0x9e, 0x24, 0x2a, 0x50, 0x8e, 0x2a, 0x45, 0x9c, 0x35, 0xfd, 0x3b, 0x02,
- 0xcc, 0x73, 0xa7, 0x91, 0x74, 0xe5, 0xca, 0x3e, 0xf1, 0x99, 0x50, 0x15, 0xb2, 0x2a, 0xfd, 0x25,
- 0x3b, 0x27, 0x5d, 0x4c, 0xe5, 0xe7, 0x47, 0xf9, 0x9b, 0x8c, 0xad, 0x79, 0xd2, 0xc5, 0xc4, 0x69,
- 0x75, 0x7f, 0x13, 0x45, 0x05, 0x2a, 0x39, 0xd2, 0x63, 0xa5, 0xe3, 0x88, 0xe6, 0x75, 0x5d, 0x3f,
- 0xae, 0x83, 0x7f, 0x92, 0xe4, 0x4a, 0x60, 0xef, 0xe0, 0xd9, 0x63, 0xf5, 0x51, 0x3e, 0x87, 0x4b,
- 0xc1, 0xd9, 0x25, 0x50, 0xf1, 0xc4, 0x39, 0x2a, 0x1e, 0x58, 0xa1, 0xf7, 0xa9, 0xe8, 0x33, 0x08,
- 0xac, 0xc1, 0xcb, 0xac, 0x4e, 0x2e, 0xfa, 0x39, 0x8f, 0x3a, 0xe6, 0x7d, 0x29, 0x8c, 0x6e, 0xa3,
- 0x0a, 0xa4, 0xf1, 0x71, 0x57, 0xd6, 0xb0, 0xad, 0x72, 0xc3, 0x25, 0x46, 0x09, 0x24, 0x45, 0x19,
- 0xc0, 0x03, 0xb3, 0xf8, 0xb8, 0x4b, 0x88, 0x68, 0x87, 0xcc, 0x5e, 0xae, 0xab, 0x40, 0x8b, 0x6d,
- 0x8f, 0x87, 0x17, 0x7e, 0x4f, 0xe1, 0xe2, 0x0a, 0x9e, 0x97, 0xc0, 0x44, 0x88, 0x3f, 0x14, 0xe0,
- 0xad, 0xc8, 0x56, 0x8b, 0x73, 0x22, 0xfb, 0x04, 0x52, 0xb4, 0xf2, 0x89, 0x73, 0x56, 0x9e, 0x72,
- 0x89, 0xdf, 0x4b, 0xf0, 0x31, 0x2e, 0xe1, 0xb6, 0x49, 0x14, 0x1b, 0xfb, 0x2a, 0xdb, 0x73, 0x98,
- 0x3b, 0x34, 0x1d, 0xe2, 0x9b, 0xf0, 0x66, 0x4f, 0x9c, 0xbb, 0xd9, 0x73, 0x54, 0x80, 0xdb, 0xe2,
- 0x2f, 0x61, 0xde, 0x30, 0x0d, 0x39, 0x2c, 0xf4, 0xfc, 0x7d, 0xa9, 0x60, 0x98, 0xc6, 0xcb, 0x80,
- 0x5c, 0xcf, 0xce, 0xf4, 0x69, 0x22, 0x4e, 0x3b, 0xf3, 0x7d, 0x01, 0x16, 0x3c, 0xb7, 0x29, 0x66,
- 0x0f, 0xfa, 0x03, 0x48, 0x1a, 0xe6, 0xd1, 0x79, 0x56, 0x31, 0x49, 0x7e, 0x32, 0xeb, 0x85, 0x4b,
- 0x14, 0x67, 0x7d, 0xff, 0x4d, 0x02, 0x32, 0x4f, 0x2b, 0x71, 0xd6, 0xf2, 0x13, 0xbe, 0x42, 0xce,
- 0xda, 0x3b, 0xaa, 0xb7, 0x7b, 0xef, 0x5b, 0x7a, 0x5a, 0xd9, 0xc0, 0x27, 0x6e, 0x6f, 0x27, 0x5c,
- 0x68, 0x05, 0x32, 0xce, 0xbe, 0x85, 0xed, 0x7d, 0xb3, 0xad, 0x9d, 0xc7, 0xcd, 0xf1, 0xb9, 0xca,
- 0x18, 0xa6, 0xa9, 0x5c, 0x37, 0x1a, 0x43, 0x88, 0x88, 0xc6, 0x20, 0xaf, 0xf1, 0x3c, 0xc5, 0xc4,
- 0x79, 0x5e, 0x13, 0x70, 0x11, 0xa7, 0x8b, 0x33, 0xe2, 0x0b, 0x00, 0x52, 0x9d, 0x38, 0x9b, 0xe4,
- 0xd7, 0x92, 0x90, 0xdf, 0xee, 0xd9, 0xfb, 0x31, 0xf7, 0xbe, 0x0a, 0x40, 0xb7, 0x67, 0x53, 0x08,
- 0x72, 0x6c, 0xf0, 0x3a, 0x8f, 0x09, 0xf4, 0x70, 0x2b, 0xcd, 0xf8, 0x9a, 0xc7, 0x06, 0xaa, 0x71,
- 0x21, 0x58, 0xf6, 0xa3, 0x45, 0x6e, 0x8c, 0x02, 0xab, 0xcd, 0x63, 0x63, 0x13, 0x7b, 0x28, 0x95,
- 0x49, 0xc2, 0x44, 0xd2, 0x27, 0x30, 0x4b, 0x1e, 0x64, 0xc7, 0x3c, 0x4f, 0x33, 0xcf, 0x10, 0x9e,
- 0xa6, 0x89, 0x1e, 0x43, 0x86, 0x71, 0x93, 0xd9, 0x6f, 0x86, 0xce, 0x7e, 0x51, 0x75, 0xe1, 0x6a,
- 0xa4, 0xf3, 0x5e, 0x9a, 0xb2, 0x92, 0xb9, 0xee, 0x02, 0x4c, 0xef, 0x99, 0x96, 0xea, 0x7e, 0xef,
- 0x65, 0x0f, 0xac, 0x3d, 0xd7, 0x53, 0xe9, 0x74, 0x31, 0xb3, 0x9e, 0x4a, 0x67, 0x8a, 0x20, 0xfe,
- 0x96, 0x00, 0x05, 0xaf, 0x21, 0xe2, 0x9c, 0x10, 0x2a, 0x21, 0x2d, 0x9e, 0xbf, 0x29, 0x88, 0x02,
- 0xc5, 0x7f, 0x4b, 0x3d, 0x22, 0xd5, 0x3c, 0xa4, 0x2d, 0x13, 0x67, 0x4f, 0x79, 0xcc, 0x62, 0x81,
- 0x12, 0xe7, 0x6d, 0x5d, 0x1a, 0x16, 0xf4, 0x00, 0x2e, 0xe8, 0x1d, 0x62, 0xcf, 0x75, 0xa7, 0x7d,
- 0xc2, 0x61, 0x9b, 0x83, 0xdd, 0x0f, 0xcb, 0x0b, 0x7e, 0x5a, 0xc5, 0x4d, 0x12, 0xff, 0x1e, 0x5d,
- 0x00, 0xf7, 0x6b, 0x12, 0xa7, 0xaa, 0xeb, 0x30, 0x67, 0x31, 0xd1, 0xc4, 0xad, 0x39, 0xa7, 0xb6,
- 0x73, 0x1e, 0x2b, 0x51, 0xf8, 0xef, 0x24, 0xa0, 0xf0, 0xa2, 0x87, 0xad, 0x93, 0xaf, 0x93, 0xba,
- 0x6f, 0x43, 0xe1, 0x48, 0xd1, 0x1d, 0x79, 0xcf, 0xb4, 0xe4, 0x5e, 0x57, 0x53, 0x1c, 0x37, 0x20,
- 0x65, 0x8e, 0x90, 0x9f, 0x98, 0xd6, 0x0e, 0x25, 0x22, 0x0c, 0xe8, 0xc0, 0x30, 0x8f, 0x0c, 0x99,
- 0x90, 0x29, 0x50, 0x3e, 0x36, 0xf8, 0xaa, 0xf4, 0xea, 0x87, 0xff, 0xe9, 0x74, 0xf1, 0xd1, 0x44,
- 0x61, 0x66, 0x34, 0xa4, 0xae, 0xd7, 0xd3, 0xb5, 0xa5, 0x9d, 0x9d, 0xfa, 0x9a, 0x54, 0xa4, 0x22,
- 0x5f, 0x31, 0x89, 0xcd, 0x63, 0xc3, 0x16, 0xff, 0x7e, 0x02, 0x8a, 0xbe, 0x8e, 0xe2, 0x6c, 0xc8,
- 0x2a, 0x64, 0x5f, 0xf7, 0xb0, 0xa5, 0xbf, 0x41, 0x33, 0x02, 0x67, 0x24, 0x66, 0xe7, 0x73, 0xc8,
- 0x85, 0x34, 0x90, 0xfc, 0x6a, 0x1a, 0xc8, 0x1e, 0xf9, 0x95, 0x47, 0xf7, 0x61, 0xde, 0x39, 0x36,
- 0x64, 0x16, 0x60, 0xc8, 0x82, 0x52, 0xdc, 0x78, 0x89, 0x82, 0x43, 0xf4, 0x41, 0xe8, 0x34, 0x20,
- 0xc5, 0x16, 0x7f, 0x5f, 0x00, 0x44, 0x15, 0x55, 0x67, 0x9f, 0x0d, 0xbe, 0x2e, 0xfd, 0xe9, 0x2e,
- 0x14, 0x69, 0xc8, 0xa6, 0xac, 0xef, 0xc9, 0x1d, 0xdd, 0xb6, 0x75, 0xa3, 0xc5, 0x3b, 0x54, 0x9e,
- 0xd2, 0xeb, 0x7b, 0x9b, 0x8c, 0x2a, 0xfe, 0x35, 0x58, 0x08, 0x55, 0x20, 0xce, 0xc6, 0xbe, 0x0e,
- 0xb9, 0x3d, 0xf6, 0x95, 0x96, 0x0a, 0xe7, 0x2b, 0x8e, 0x59, 0x4a, 0x63, 0xef, 0x13, 0xff, 0x3c,
- 0x01, 0x17, 0x24, 0x6c, 0x9b, 0xed, 0x43, 0x1c, 0xbf, 0x0a, 0x6b, 0xc0, 0x3f, 0xe7, 0xc8, 0x6f,
- 0xa4, 0xc9, 0x0c, 0x63, 0x66, 0xd3, 0x5c, 0x78, 0xd9, 0xfe, 0xe6, 0xe8, 0x1e, 0x3b, 0xb8, 0x50,
- 0xcf, 0x97, 0xfd, 0x52, 0xa1, 0x65, 0x3f, 0x13, 0x0a, 0x7a, 0xcb, 0x30, 0x89, 0x4d, 0xb3, 0xf1,
- 0x6b, 0xa3, 0xd7, 0x71, 0xc1, 0xd0, 0xd2, 0xa8, 0x42, 0xd6, 0x19, 0x4b, 0x03, 0xbf, 0xde, 0xea,
- 0x75, 0xa8, 0xef, 0xbc, 0x7a, 0x89, 0x94, 0xf7, 0xec, 0x74, 0x31, 0x1f, 0x4a, 0xb3, 0xa5, 0xbc,
- 0xee, 0x3d, 0x13, 0xe9, 0xe2, 0xb7, 0xe1, 0x62, 0x9f, 0xb2, 0xe3, 0xf4, 0x78, 0xfe, 0x55, 0x12,
- 0xae, 0x84, 0xc5, 0xc7, 0x0d, 0x71, 0xbe, 0xee, 0x0d, 0x5a, 0x83, 0xb9, 0x8e, 0x6e, 0xbc, 0xd9,
- 0xea, 0x65, 0xae, 0xa3, 0x1b, 0xfe, 0x4a, 0x71, 0x44, 0xd7, 0x98, 0xf9, 0x99, 0x76, 0x0d, 0x05,
- 0xca, 0x51, 0x6d, 0x17, 0x67, 0xff, 0xf8, 0x9e, 0x00, 0xb9, 0xb8, 0x97, 0xe5, 0xde, 0x2c, 0x50,
- 0x4e, 0x6c, 0xc2, 0xdc, 0xcf, 0x60, 0x1d, 0xef, 0x77, 0x04, 0x40, 0x4d, 0xab, 0x67, 0x10, 0x50,
- 0xfb, 0xcc, 0x6c, 0xc5, 0x59, 0xcd, 0x0b, 0x30, 0xad, 0x1b, 0x1a, 0x3e, 0xa6, 0xd5, 0x4c, 0x49,
- 0xec, 0x21, 0xf4, 0x75, 0x32, 0x39, 0xd1, 0xd7, 0x49, 0xf1, 0x73, 0x58, 0x08, 0x15, 0x31, 0xce,
- 0xfa, 0xff, 0xb7, 0x04, 0x2c, 0xf0, 0x8a, 0xc4, 0xbe, 0x82, 0xf9, 0x4d, 0x98, 0x6e, 0x13, 0x99,
- 0x23, 0xda, 0x99, 0xbe, 0xd3, 0x6d, 0x67, 0x9a, 0x19, 0xfd, 0x3c, 0x40, 0xd7, 0xc2, 0x87, 0x32,
- 0x63, 0x4d, 0x4e, 0xc4, 0x9a, 0x21, 0x1c, 0x94, 0x80, 0x7e, 0x20, 0x40, 0x81, 0x0c, 0xe8, 0xae,
- 0x65, 0x76, 0x4d, 0x9b, 0xf8, 0x2c, 0xf6, 0x64, 0x30, 0xe7, 0xc5, 0xd9, 0xe9, 0xe2, 0xdc, 0xa6,
- 0x6e, 0x6c, 0x73, 0xc6, 0x66, 0x63, 0xe2, 0x3d, 0x00, 0xee, 0x4e, 0x88, 0xa5, 0x4a, 0xdb, 0x54,
- 0x0f, 0xfc, 0xef, 0x6d, 0xc4, 0xb2, 0x78, 0xe2, 0x6c, 0xf1, 0x8f, 0x04, 0xb8, 0xf0, 0x33, 0x5b,
- 0x2e, 0xfe, 0x7f, 0xa1, 0x6c, 0xf1, 0x25, 0x14, 0xe9, 0x8f, 0xba, 0xb1, 0x67, 0xc6, 0xb9, 0x70,
- 0xff, 0xeb, 0x02, 0xcc, 0x07, 0x04, 0xc7, 0xe9, 0xe0, 0xbc, 0x91, 0x9e, 0xc4, 0x5f, 0x24, 0x2e,
- 0x4f, 0x70, 0x94, 0xc4, 0x39, 0x06, 0xff, 0x79, 0x02, 0x2e, 0x55, 0xd8, 0x67, 0x6e, 0x37, 0xee,
- 0x23, 0xce, 0x9e, 0x51, 0x82, 0xd9, 0x43, 0x6c, 0xd9, 0xba, 0xc9, 0xa6, 0xdf, 0x39, 0xc9, 0x7d,
- 0x44, 0x65, 0x48, 0xdb, 0x86, 0xd2, 0xb5, 0xf7, 0x4d, 0xf7, 0xfb, 0x9e, 0xf7, 0xec, 0xc5, 0xa8,
- 0x4c, 0xbf, 0x79, 0x8c, 0xca, 0xcc, 0xe8, 0x18, 0x95, 0xd9, 0xaf, 0x10, 0xa3, 0xc2, 0x3f, 0xa6,
- 0xfd, 0x3b, 0x01, 0x2e, 0x0f, 0x68, 0x2e, 0xce, 0xde, 0xf2, 0x5d, 0xc8, 0xaa, 0x5c, 0x30, 0x31,
- 0xd8, 0xec, 0x4b, 0x61, 0x9d, 0x64, 0x7b, 0x43, 0xdc, 0x72, 0x76, 0xba, 0x08, 0x6e, 0x51, 0xeb,
- 0x6b, 0x5c, 0x39, 0xe4, 0xb7, 0x26, 0xfe, 0xca, 0x1c, 0x14, 0xaa, 0xc7, 0x6c, 0x95, 0xbc, 0xc1,
- 0xdc, 0x04, 0xf4, 0x04, 0xd2, 0x5d, 0xcb, 0x3c, 0xd4, 0xdd, 0x6a, 0xe4, 0x43, 0x01, 0x0a, 0x6e,
- 0x35, 0xfa, 0xb8, 0xb6, 0x39, 0x87, 0xe4, 0xf1, 0xa2, 0x26, 0x64, 0x9e, 0x99, 0xaa, 0xd2, 0x7e,
- 0xa2, 0xb7, 0xdd, 0x9e, 0xff, 0xfe, 0x78, 0x41, 0x4b, 0x1e, 0xcf, 0xb6, 0xe2, 0xec, 0xbb, 0x8d,
- 0xe0, 0x11, 0x51, 0x1d, 0xd2, 0x35, 0xc7, 0xe9, 0x92, 0x44, 0x6e, 0x3b, 0xee, 0x4c, 0x20, 0x94,
- 0xb0, 0xb8, 0x51, 0xb2, 0x2e, 0x3b, 0x6a, 0xc2, 0xfc, 0x53, 0xba, 0xe7, 0xab, 0xd2, 0x36, 0x7b,
- 0x5a, 0xc5, 0x34, 0xf6, 0xf4, 0x16, 0xb7, 0xdb, 0xb7, 0x27, 0x90, 0xf9, 0xb4, 0xd2, 0x90, 0x06,
- 0x05, 0xa0, 0x15, 0x48, 0x37, 0x1e, 0x71, 0x61, 0xcc, 0xaf, 0xbb, 0x35, 0x81, 0xb0, 0xc6, 0x23,
- 0xc9, 0x63, 0x43, 0xeb, 0x90, 0x5d, 0xf9, 0xa2, 0x67, 0x61, 0x2e, 0x65, 0x66, 0x68, 0x74, 0x44,
- 0xbf, 0x14, 0xca, 0x25, 0x05, 0x99, 0x51, 0x03, 0xf2, 0xaf, 0x4c, 0xeb, 0xa0, 0x6d, 0x2a, 0x6e,
- 0x0d, 0x67, 0xa9, 0xb8, 0x6f, 0x4c, 0x20, 0xce, 0x65, 0x94, 0xfa, 0x44, 0xa0, 0x6f, 0x43, 0x81,
- 0x34, 0x46, 0x53, 0xd9, 0x6d, 0xbb, 0x85, 0x4c, 0x53, 0xa9, 0xef, 0x4e, 0x20, 0xd5, 0xe3, 0x74,
- 0x17, 0xfe, 0xfb, 0x44, 0x95, 0x25, 0x98, 0x0b, 0x75, 0x02, 0x84, 0x20, 0xd5, 0x25, 0xed, 0x2d,
- 0xd0, 0xf8, 0x25, 0xfa, 0x1b, 0xbd, 0x07, 0xb3, 0x86, 0xa9, 0x61, 0x77, 0x84, 0xcc, 0xad, 0x5e,
- 0x38, 0x3b, 0x5d, 0x9c, 0xd9, 0x32, 0x35, 0xe6, 0xd1, 0xf0, 0x5f, 0xd2, 0x0c, 0xc9, 0x54, 0xd7,
- 0xca, 0xd7, 0x20, 0x45, 0xda, 0x9d, 0x18, 0xa6, 0x5d, 0xc5, 0xc6, 0x3b, 0x96, 0xce, 0xa5, 0xb9,
- 0x8f, 0xe5, 0x7f, 0x94, 0x80, 0x44, 0xe3, 0x11, 0xf1, 0xd9, 0x77, 0x7b, 0xea, 0x01, 0x76, 0x78,
- 0x3a, 0x7f, 0xa2, 0xbe, 0xbc, 0x85, 0xf7, 0x74, 0xe6, 0x5a, 0x65, 0x24, 0xfe, 0x84, 0xde, 0x01,
- 0x50, 0x54, 0x15, 0xdb, 0xb6, 0xec, 0xee, 0x05, 0xcc, 0x48, 0x19, 0x46, 0xd9, 0xc0, 0x27, 0x84,
- 0xcd, 0xc6, 0xaa, 0x85, 0x1d, 0x37, 0xf8, 0x8a, 0x3d, 0x11, 0x36, 0x07, 0x77, 0xba, 0xb2, 0x63,
- 0x1e, 0x60, 0x83, 0xf6, 0x93, 0x0c, 0x31, 0x35, 0x9d, 0x6e, 0x93, 0x10, 0x88, 0x95, 0xc4, 0x86,
- 0xe6, 0x9b, 0xb4, 0x8c, 0xe4, 0x3d, 0x13, 0x91, 0x16, 0x6e, 0xe9, 0x7c, 0xbb, 0x5c, 0x46, 0xe2,
- 0x4f, 0x44, 0x4b, 0x4a, 0xcf, 0xd9, 0xa7, 0x2d, 0x91, 0x91, 0xe8, 0x6f, 0x74, 0x1b, 0x0a, 0x2c,
- 0x5e, 0x53, 0xc6, 0x86, 0x2a, 0x53, 0xe3, 0x9a, 0xa1, 0xc9, 0x73, 0x8c, 0x5c, 0x35, 0x54, 0x62,
- 0x4a, 0xd1, 0x23, 0xe0, 0x04, 0xf9, 0xa0, 0x63, 0x13, 0x9d, 0x02, 0xc9, 0xb5, 0x5a, 0x38, 0x3b,
- 0x5d, 0xcc, 0x36, 0x68, 0xc2, 0xc6, 0x66, 0xa3, 0xbe, 0x26, 0x65, 0x59, 0xae, 0x8d, 0x8e, 0x5d,
- 0xd7, 0xca, 0xbf, 0x21, 0x40, 0xf2, 0x69, 0xa5, 0x71, 0x6e, 0x95, 0xb9, 0x05, 0x4d, 0x06, 0x0a,
- 0x7a, 0x07, 0x0a, 0xbb, 0x7a, 0xbb, 0xad, 0x1b, 0x2d, 0xe2, 0x45, 0x7d, 0x17, 0xab, 0xae, 0xc2,
- 0xf2, 0x9c, 0xbc, 0xcd, 0xa8, 0xe8, 0x1a, 0x64, 0x55, 0x0b, 0x6b, 0xd8, 0x70, 0x74, 0xa5, 0x6d,
- 0x73, 0xcd, 0x05, 0x49, 0xe5, 0x5f, 0x16, 0x60, 0x9a, 0x8e, 0x00, 0xf4, 0x36, 0x64, 0x54, 0xd3,
- 0x70, 0x14, 0xdd, 0xe0, 0xa6, 0x2c, 0x23, 0xf9, 0x84, 0xa1, 0xc5, 0xbb, 0x0e, 0x39, 0x45, 0x55,
- 0xcd, 0x9e, 0xe1, 0xc8, 0x86, 0xd2, 0xc1, 0xbc, 0x98, 0x59, 0x4e, 0xdb, 0x52, 0x3a, 0x18, 0x2d,
- 0x82, 0xfb, 0xe8, 0x6d, 0xf1, 0xcc, 0x48, 0xc0, 0x49, 0x1b, 0xf8, 0xa4, 0xfc, 0x07, 0x02, 0xa4,
- 0xdd, 0x31, 0x43, 0x8a, 0xd1, 0xc2, 0x06, 0x0b, 0x2a, 0x77, 0x8b, 0xe1, 0x11, 0xfa, 0xa7, 0xca,
- 0x8c, 0x3f, 0x55, 0x5e, 0x80, 0x69, 0x87, 0x0c, 0x0b, 0x5e, 0x02, 0xf6, 0x40, 0xd7, 0xb3, 0xdb,
- 0x4a, 0x8b, 0x2d, 0xe7, 0x65, 0x24, 0xf6, 0x40, 0x2a, 0xc3, 0xc3, 0x7e, 0x99, 0x46, 0xf8, 0x13,
- 0x29, 0x29, 0x0b, 0x4e, 0xdd, 0xc5, 0x2d, 0xdd, 0xa0, 0x7d, 0x29, 0x29, 0x01, 0x25, 0xad, 0x12,
- 0x0a, 0x7a, 0x0b, 0x32, 0x2c, 0x03, 0x36, 0x34, 0xda, 0xa1, 0x92, 0x52, 0x9a, 0x12, 0xaa, 0x86,
- 0x56, 0xc6, 0x90, 0xf1, 0x06, 0x27, 0x69, 0xb6, 0x9e, 0xed, 0x29, 0x92, 0xfe, 0x46, 0xef, 0xc3,
- 0x85, 0xd7, 0x3d, 0xa5, 0xad, 0xef, 0xd1, 0x95, 0x3a, 0x1a, 0x75, 0x4f, 0x75, 0xc6, 0x6a, 0x82,
- 0xbc, 0x34, 0x2a, 0x81, 0xaa, 0xce, 0x1d, 0xcb, 0x49, 0x7f, 0x2c, 0x8b, 0xbf, 0x2b, 0xc0, 0x3c,
- 0x8b, 0x3c, 0x62, 0x01, 0xb3, 0xf1, 0xf9, 0x21, 0x1f, 0x43, 0x46, 0x53, 0x1c, 0x85, 0x6d, 0x5a,
- 0x4d, 0x8c, 0xdc, 0xb4, 0xea, 0x6d, 0xa2, 0x50, 0x1c, 0x85, 0x6e, 0x5c, 0x45, 0x90, 0x22, 0xbf,
- 0xd9, 0xfe, 0x5e, 0x89, 0xfe, 0x16, 0x3f, 0x03, 0x14, 0x2c, 0x68, 0x9c, 0x1e, 0xd9, 0x3d, 0xb8,
- 0x48, 0x74, 0x5d, 0x35, 0x54, 0xeb, 0xa4, 0xeb, 0xe8, 0xa6, 0xf1, 0x9c, 0xfe, 0xb5, 0x51, 0x31,
- 0xf0, 0x61, 0x8b, 0x7e, 0xcf, 0x12, 0x7f, 0x6f, 0x06, 0xe6, 0xaa, 0xc7, 0x5d, 0xd3, 0x8a, 0x75,
- 0x19, 0x6c, 0x15, 0x66, 0xf9, 0x4a, 0xc1, 0x88, 0x6f, 0xd7, 0x7d, 0xc6, 0xdc, 0xfd, 0x70, 0xcf,
- 0x19, 0xd1, 0x2a, 0x00, 0x0b, 0x6a, 0xa5, 0x81, 0x4b, 0xc9, 0x73, 0x7c, 0x6a, 0xa3, 0x6c, 0x74,
- 0x03, 0xc7, 0x16, 0x64, 0x3b, 0x87, 0xaa, 0x2a, 0xef, 0xe9, 0x6d, 0x87, 0xc7, 0x06, 0x46, 0x87,
- 0xb1, 0x6f, 0xbe, 0xac, 0x54, 0x9e, 0xd0, 0x4c, 0x2c, 0x4c, 0xcf, 0x7f, 0x96, 0x80, 0x48, 0x60,
- 0xbf, 0xd1, 0xbb, 0xc0, 0x37, 0x13, 0xc9, 0xb6, 0xbb, 0x6f, 0x70, 0x75, 0xee, 0xec, 0x74, 0x31,
- 0x23, 0x51, 0x6a, 0xa3, 0xd1, 0x94, 0x32, 0x2c, 0x43, 0xc3, 0x76, 0xd0, 0x0d, 0x98, 0x33, 0x3b,
- 0xba, 0x23, 0xbb, 0x4e, 0x12, 0xf7, 0x28, 0x73, 0x84, 0xe8, 0x3a, 0x51, 0xe7, 0xd9, 0x63, 0x32,
- 0x3b, 0xf1, 0x1e, 0x13, 0xf4, 0x37, 0x05, 0xb8, 0xc4, 0x15, 0x29, 0xef, 0xd2, 0x38, 0x7c, 0xa5,
- 0xad, 0x3b, 0x27, 0xf2, 0xc1, 0x61, 0x29, 0x4d, 0xfd, 0xd6, 0x9f, 0x8b, 0x6c, 0x90, 0x40, 0x3f,
- 0x58, 0x72, 0x9b, 0xe5, 0xe4, 0x19, 0x67, 0xde, 0x38, 0xac, 0x1a, 0x8e, 0x75, 0xb2, 0x7a, 0xf9,
- 0xec, 0x74, 0x71, 0x61, 0x30, 0xf5, 0xa5, 0xb4, 0x60, 0x0f, 0xb2, 0xa0, 0x1a, 0x00, 0xf6, 0xfa,
- 0x21, 0x9d, 0x31, 0xa2, 0xfd, 0x8f, 0xc8, 0x0e, 0x2b, 0x05, 0x78, 0xd1, 0x5d, 0x28, 0xf2, 0x3d,
- 0x3d, 0x7b, 0x7a, 0x1b, 0xcb, 0xb6, 0xfe, 0x05, 0xa6, 0x73, 0x4b, 0x52, 0xca, 0x33, 0x3a, 0x11,
- 0xd1, 0xd0, 0xbf, 0xc0, 0xe5, 0xef, 0x42, 0x69, 0x58, 0xe9, 0x83, 0x43, 0x20, 0xc3, 0x3e, 0xe9,
- 0x7e, 0x14, 0x5e, 0xcf, 0x99, 0xa0, 0xab, 0xf2, 0x35, 0x9d, 0x8f, 0x13, 0x1f, 0x09, 0xe2, 0x3f,
- 0x48, 0xc0, 0xdc, 0x6a, 0xaf, 0x7d, 0xf0, 0xbc, 0xdb, 0xe8, 0x75, 0x3a, 0x8a, 0x75, 0x42, 0xcc,
- 0x20, 0x33, 0x14, 0xa4, 0x80, 0x02, 0x33, 0x83, 0xd4, 0x12, 0xe8, 0x5f, 0x60, 0x32, 0x39, 0x05,
- 0xc2, 0x65, 0xf8, 0x3e, 0x03, 0x5a, 0x07, 0x9f, 0x4c, 0xb7, 0x02, 0x7c, 0x04, 0xa5, 0x40, 0x46,
- 0xba, 0xf8, 0x22, 0x63, 0xc3, 0xb1, 0x74, 0xcc, 0x16, 0x10, 0x93, 0x52, 0x20, 0xa6, 0xa7, 0x4e,
- 0x92, 0xab, 0x2c, 0x15, 0x35, 0x21, 0x47, 0x32, 0x9e, 0xc8, 0x74, 0x0a, 0x71, 0x17, 0x78, 0x1f,
- 0x44, 0x54, 0x2b, 0x54, 0xee, 0x25, 0xaa, 0x9f, 0x0a, 0xe5, 0xa1, 0x3f, 0xa5, 0x2c, 0xf6, 0x29,
- 0xe5, 0x4f, 0xa1, 0xd8, 0x9f, 0x21, 0xa8, 0xcb, 0x14, 0xd3, 0xe5, 0x85, 0xa0, 0x2e, 0x93, 0x01,
- 0x3d, 0xad, 0xa7, 0xd2, 0xa9, 0xe2, 0xb4, 0xf8, 0x67, 0x49, 0xc8, 0xbb, 0xdd, 0x2c, 0x4e, 0xa0,
- 0xb3, 0x0a, 0xd3, 0xa4, 0x53, 0xb8, 0x11, 0x28, 0xb7, 0x47, 0xf4, 0x6e, 0x1e, 0xd9, 0x4e, 0x3a,
- 0x8b, 0x0b, 0x92, 0x29, 0x6b, 0x1c, 0x06, 0xa7, 0xfc, 0xcb, 0x09, 0x48, 0x51, 0x6c, 0xf1, 0x00,
- 0x52, 0x74, 0xa2, 0x10, 0x26, 0x99, 0x28, 0x68, 0x56, 0x6f, 0x3a, 0x4b, 0x04, 0x5c, 0x53, 0xe2,
- 0xf3, 0xed, 0x2b, 0x1f, 0x3c, 0x78, 0x48, 0x8d, 0x4d, 0x4e, 0xe2, 0x4f, 0x68, 0x95, 0x86, 0x46,
- 0x99, 0x96, 0x83, 0x35, 0xee, 0xd3, 0x5f, 0x1b, 0xd7, 0xbe, 0xee, 0xa4, 0xe4, 0xf2, 0xa1, 0x2b,
- 0x90, 0x24, 0x56, 0x6c, 0x96, 0x45, 0x39, 0x9c, 0x9d, 0x2e, 0x26, 0x89, 0xfd, 0x22, 0x34, 0xb4,
- 0x0c, 0xd9, 0xb0, 0xc9, 0x20, 0x1e, 0x1c, 0x35, 0x8c, 0x81, 0xe1, 0x0e, 0x6d, 0x6f, 0x68, 0x31,
- 0x3c, 0xcb, 0xdb, 0xf8, 0x2f, 0x52, 0x30, 0x57, 0xef, 0xc4, 0x3d, 0xa5, 0xac, 0x84, 0x5b, 0x38,
- 0x0a, 0x08, 0x85, 0x5e, 0x1a, 0xd1, 0xc0, 0xa1, 0x19, 0x3c, 0x79, 0xbe, 0x19, 0xbc, 0x4e, 0x3c,
- 0x65, 0x7e, 0xf0, 0x44, 0x72, 0x08, 0xe6, 0x09, 0xbf, 0x9f, 0xfa, 0x29, 0x12, 0xe1, 0xf1, 0xf7,
- 0x7a, 0xd0, 0x48, 0x95, 0x4f, 0xa9, 0x43, 0xce, 0x7a, 0xd9, 0xcc, 0xe4, 0xbd, 0x6c, 0x16, 0x1b,
- 0x1a, 0x9d, 0xd4, 0xc2, 0x16, 0x75, 0xf6, 0xcd, 0x2d, 0x6a, 0xd9, 0xe1, 0x9d, 0xf5, 0x63, 0x48,
- 0x6a, 0xba, 0xdb, 0x38, 0x93, 0x4f, 0xd5, 0x84, 0x69, 0x4c, 0xaf, 0x4d, 0x05, 0x7b, 0x2d, 0xeb,
- 0x25, 0xe5, 0x3a, 0x80, 0xaf, 0x1b, 0x74, 0x0d, 0x66, 0xcc, 0xb6, 0xe6, 0x6e, 0x76, 0x99, 0x5b,
- 0xcd, 0x9c, 0x9d, 0x2e, 0x4e, 0x3f, 0x6f, 0x6b, 0xf5, 0x35, 0x69, 0xda, 0x6c, 0x6b, 0x75, 0x8d,
- 0x9e, 0xfa, 0x81, 0x8f, 0x64, 0x2f, 0x12, 0x2e, 0x27, 0xcd, 0x1a, 0xf8, 0x68, 0x0d, 0xdb, 0x2a,
- 0xef, 0x70, 0xbf, 0x2d, 0x40, 0xde, 0xd5, 0x7d, 0xbc, 0x46, 0x25, 0xad, 0x77, 0xf8, 0x20, 0x4b,
- 0x9e, 0x6f, 0x90, 0xb9, 0x7c, 0x7c, 0x63, 0xf1, 0xaf, 0x0a, 0x3c, 0xb6, 0xb9, 0xa1, 0x2a, 0x0e,
- 0x71, 0x2a, 0x62, 0x1c, 0x18, 0xf7, 0xa0, 0x68, 0x29, 0x86, 0x66, 0x76, 0xf4, 0x2f, 0x30, 0x5b,
- 0x08, 0xb5, 0xf9, 0x67, 0xcf, 0x82, 0x47, 0xa7, 0xab, 0x7e, 0xb6, 0xf8, 0x07, 0x09, 0x1e, 0x07,
- 0xed, 0x15, 0x23, 0x4e, 0x75, 0x7d, 0x07, 0xe6, 0x83, 0x53, 0x1b, 0x0b, 0xb5, 0x64, 0xa3, 0xf5,
- 0xbd, 0x08, 0x79, 0x51, 0x05, 0x61, 0xf1, 0x8c, 0x6e, 0x70, 0x7d, 0x60, 0x46, 0xa4, 0xc2, 0x50,
- 0x05, 0xb2, 0xfc, 0xe3, 0x83, 0xb1, 0x67, 0xba, 0x81, 0x62, 0x6f, 0x0f, 0x0b, 0x8b, 0xac, 0x1b,
- 0x7b, 0xa6, 0xfb, 0x21, 0xdf, 0x72, 0x09, 0x76, 0xf9, 0x17, 0x60, 0x9a, 0x26, 0xbf, 0x81, 0x89,
- 0xe6, 0xad, 0xf9, 0xa7, 0x09, 0xb8, 0x49, 0x4b, 0xff, 0x12, 0x5b, 0xfa, 0xde, 0xc9, 0xb6, 0x65,
- 0x3a, 0x58, 0x75, 0xb0, 0xe6, 0xaf, 0x9c, 0xc7, 0x6a, 0xf7, 0x32, 0x5d, 0xf7, 0x05, 0xe7, 0x0a,
- 0x38, 0xf3, 0xb8, 0xd0, 0x06, 0x14, 0x78, 0x68, 0x81, 0xd2, 0xd6, 0x0f, 0xb1, 0xac, 0x38, 0xe7,
- 0x99, 0xdd, 0xe6, 0x18, 0xef, 0x0a, 0x61, 0x5d, 0x71, 0x90, 0x06, 0x19, 0x2e, 0x4c, 0xd7, 0xf8,
- 0x81, 0x44, 0x4f, 0xbf, 0xda, 0x82, 0x62, 0x9a, 0xc5, 0x37, 0xd4, 0xd7, 0xa4, 0x34, 0x93, 0x5c,
- 0xd7, 0xc4, 0xff, 0x28, 0xc0, 0xad, 0x31, 0x2a, 0x8e, 0xb3, 0xeb, 0x96, 0x21, 0x7d, 0x48, 0x5e,
- 0xa4, 0x73, 0x1d, 0xa7, 0x25, 0xef, 0x19, 0x6d, 0xc2, 0xdc, 0x9e, 0xa2, 0xb7, 0xfd, 0x2e, 0x3d,
- 0x3c, 0x3e, 0x31, 0x3a, 0x1a, 0x37, 0xc7, 0xd8, 0x59, 0x1f, 0x16, 0x7f, 0x33, 0x01, 0xf3, 0x2b,
- 0x9a, 0xd6, 0x68, 0x70, 0x1b, 0x18, 0x5f, 0x4f, 0x71, 0x41, 0x66, 0xc2, 0x07, 0x99, 0xe8, 0x3d,
- 0x40, 0x9a, 0x6e, 0xb3, 0x83, 0x4f, 0xec, 0x7d, 0x45, 0x33, 0x8f, 0xfc, 0xb8, 0x8c, 0x79, 0x37,
- 0xa5, 0xe1, 0x26, 0xa0, 0x06, 0x50, 0xb4, 0x23, 0xdb, 0x8e, 0xe2, 0x7d, 0x77, 0xba, 0x35, 0xd1,
- 0x96, 0x32, 0x06, 0x83, 0xbc, 0x47, 0x29, 0x43, 0xe4, 0xd0, 0x9f, 0xc4, 0x6f, 0xd7, 0x49, 0xd5,
- 0x1d, 0x59, 0xb1, 0xdd, 0xfd, 0x43, 0xec, 0xc8, 0x95, 0x3c, 0xa3, 0xaf, 0xd8, 0x6c, 0x5b, 0x10,
- 0xdb, 0xf0, 0xe0, 0xab, 0x26, 0x4e, 0x48, 0xfc, 0x77, 0x05, 0xc8, 0x4b, 0x78, 0xcf, 0xc2, 0x76,
- 0xac, 0x8b, 0x02, 0x4f, 0x20, 0x67, 0x31, 0xa9, 0xf2, 0x9e, 0x65, 0x76, 0xce, 0x33, 0xae, 0xb2,
- 0x9c, 0xf1, 0x89, 0x65, 0x76, 0xb8, 0x61, 0x79, 0x09, 0x05, 0xaf, 0x8c, 0x71, 0x56, 0xfe, 0x77,
- 0xe9, 0x76, 0x69, 0x26, 0x38, 0xee, 0x00, 0x89, 0x78, 0x35, 0x40, 0x3f, 0x54, 0x05, 0x0b, 0x1a,
- 0xa7, 0x1a, 0xfe, 0xab, 0x00, 0xf9, 0x46, 0x6f, 0x97, 0x9d, 0xd9, 0x15, 0x9f, 0x06, 0xaa, 0x90,
- 0x69, 0xe3, 0x3d, 0x47, 0x7e, 0xa3, 0x50, 0xfd, 0x34, 0x61, 0xa5, 0x1b, 0x15, 0x9e, 0x02, 0x58,
- 0x74, 0x8b, 0x1d, 0x95, 0x93, 0x3c, 0xa7, 0x9c, 0x0c, 0xe5, 0x25, 0x64, 0xf1, 0x2f, 0x12, 0x50,
- 0xf0, 0xaa, 0x19, 0xa7, 0x95, 0x7c, 0x15, 0xb2, 0x0e, 0xc9, 0xf3, 0x58, 0x87, 0x79, 0x1e, 0x13,
- 0x12, 0x6d, 0x21, 0x96, 0x60, 0x81, 0x3a, 0x2e, 0xb2, 0xd2, 0xed, 0xb6, 0x75, 0x17, 0xee, 0x52,
- 0xfb, 0x93, 0x92, 0xe6, 0x69, 0xd2, 0x0a, 0x4b, 0xa1, 0x40, 0x17, 0xfd, 0x9a, 0x00, 0xb9, 0x3d,
- 0x0b, 0xe3, 0x2f, 0xb0, 0x4c, 0xa1, 0xd7, 0x64, 0x41, 0x2f, 0x6b, 0xa4, 0x0c, 0x5f, 0xf9, 0xa3,
- 0x78, 0x96, 0xbd, 0xb8, 0x41, 0xde, 0xcb, 0x3b, 0xed, 0x2b, 0x98, 0xa7, 0x8d, 0x12, 0xf7, 0xde,
- 0x62, 0xf1, 0x47, 0x09, 0x40, 0x41, 0xc9, 0x3f, 0xbb, 0xc6, 0x4c, 0xc4, 0xd7, 0x98, 0xef, 0x02,
- 0x62, 0x61, 0x93, 0xb6, 0xdc, 0xc5, 0x96, 0x6c, 0x63, 0xd5, 0xe4, 0xc7, 0x43, 0x09, 0x52, 0x91,
- 0xa7, 0x6c, 0x63, 0xab, 0x41, 0xe9, 0x68, 0x05, 0xc0, 0x77, 0xe9, 0xf8, 0x8c, 0x33, 0x89, 0x47,
- 0x97, 0xf1, 0x3c, 0x3a, 0xf1, 0xfb, 0x02, 0xe4, 0x37, 0xf5, 0x96, 0xa5, 0xc4, 0x7a, 0xfa, 0x11,
- 0xfa, 0x38, 0xbc, 0x98, 0x9e, 0x7d, 0x58, 0x8e, 0x0a, 0xf4, 0x61, 0x39, 0x5c, 0x88, 0xc6, 0x19,
- 0x88, 0x21, 0xf7, 0x4a, 0x14, 0xa7, 0x05, 0xfb, 0xf7, 0x65, 0xc8, 0xf1, 0x72, 0xef, 0x18, 0xba,
- 0x69, 0xa0, 0x07, 0x90, 0x6c, 0xf1, 0x8f, 0x25, 0xd9, 0xc8, 0x85, 0x4d, 0xff, 0x6c, 0xc1, 0xda,
- 0x94, 0x44, 0xf2, 0x12, 0x96, 0x6e, 0xcf, 0x89, 0x70, 0x25, 0xfd, 0xd8, 0xf7, 0x20, 0x4b, 0xb7,
- 0xe7, 0xa0, 0x06, 0x14, 0x54, 0xff, 0x40, 0x33, 0x99, 0xb0, 0x27, 0x87, 0xc2, 0xce, 0xc8, 0xa3,
- 0xe5, 0x6a, 0x53, 0x52, 0x5e, 0x0d, 0x25, 0xa0, 0x4a, 0xf0, 0x1c, 0xad, 0xd4, 0x40, 0x60, 0x9d,
- 0xbf, 0x6b, 0x3b, 0x7c, 0x86, 0x57, 0x6d, 0x2a, 0x70, 0xdc, 0x16, 0xfa, 0x18, 0x66, 0x34, 0x7a,
- 0x62, 0x13, 0x37, 0x01, 0x51, 0x0d, 0x1d, 0x3a, 0x18, 0xab, 0x36, 0x25, 0x71, 0x0e, 0xb4, 0x0e,
- 0x39, 0xf6, 0x8b, 0x39, 0x76, 0x1c, 0x8b, 0xdf, 0x1a, 0x2e, 0x21, 0x30, 0x75, 0xd6, 0xa6, 0xa4,
- 0xac, 0xe6, 0x53, 0xd1, 0x37, 0x21, 0x65, 0xab, 0x8a, 0x8b, 0xc6, 0xaf, 0x0e, 0x39, 0x28, 0xc5,
- 0x67, 0xa6, 0xb9, 0xd1, 0x63, 0x76, 0xb4, 0xa7, 0x73, 0xec, 0x2e, 0x8c, 0x46, 0x15, 0x3f, 0xb4,
- 0x21, 0x9f, 0x14, 0x1f, 0x53, 0x02, 0x7a, 0x0a, 0x59, 0x85, 0x78, 0xc8, 0x32, 0xdd, 0xd2, 0x4a,
- 0x57, 0x42, 0xa3, 0xc3, 0x11, 0x06, 0xb6, 0x20, 0xd7, 0xe8, 0xae, 0x7f, 0x97, 0xe8, 0x0b, 0xea,
- 0x60, 0xab, 0x85, 0x4b, 0xd9, 0xd1, 0x82, 0x82, 0xe1, 0x74, 0x9e, 0x20, 0x4a, 0x24, 0x9e, 0xb2,
- 0xb7, 0x9f, 0x9c, 0x56, 0x2a, 0x37, 0xf4, 0x03, 0x78, 0xc4, 0x4e, 0xa9, 0xda, 0x94, 0x94, 0xdb,
- 0x0f, 0x90, 0xd1, 0x12, 0x24, 0x5a, 0x6a, 0x69, 0x6e, 0xa8, 0x49, 0xf0, 0x76, 0x03, 0xd5, 0xa6,
- 0xa4, 0x44, 0x4b, 0x45, 0x9f, 0x42, 0x9a, 0x6d, 0xed, 0x38, 0x36, 0x4a, 0xf9, 0xa1, 0x63, 0x2c,
- 0xbc, 0x41, 0xa6, 0x36, 0x25, 0xd1, 0xdd, 0x24, 0xe4, 0x7d, 0xdb, 0x90, 0xb7, 0x58, 0x3c, 0xa2,
- 0x1b, 0x3d, 0x5c, 0x1c, 0x1a, 0x14, 0x10, 0x15, 0x40, 0x5c, 0xa3, 0x58, 0x29, 0x40, 0x47, 0xdf,
- 0x81, 0x0b, 0x61, 0x89, 0xbc, 0xa7, 0xcd, 0x0f, 0xfd, 0xc0, 0x3d, 0x34, 0x98, 0xb5, 0x36, 0x25,
- 0x21, 0x6b, 0x20, 0x11, 0x7d, 0x08, 0xd3, 0xac, 0xd5, 0x10, 0x15, 0x19, 0x15, 0xe7, 0xd2, 0xd7,
- 0x60, 0x2c, 0x3f, 0xe9, 0xfc, 0x0e, 0x0f, 0xca, 0x93, 0xdb, 0x66, 0xab, 0xb4, 0x30, 0xb4, 0xf3,
- 0x0f, 0x86, 0x17, 0x92, 0xce, 0xef, 0xf8, 0x54, 0xd2, 0xee, 0x16, 0x4b, 0xe1, 0x81, 0x58, 0x17,
- 0x86, 0xb6, 0x7b, 0x44, 0xac, 0x5e, 0x8d, 0x6e, 0x97, 0xf0, 0xc9, 0xa4, 0x68, 0x16, 0x3b, 0xdb,
- 0x47, 0xa6, 0x63, 0xea, 0xe2, 0xd0, 0xa2, 0x0d, 0x1e, 0x7e, 0x54, 0xa3, 0x5e, 0xa5, 0x47, 0x45,
- 0x2f, 0xa1, 0xc8, 0x4f, 0xe0, 0xf0, 0xbf, 0xc2, 0x5c, 0xa2, 0xf2, 0xee, 0x45, 0x9a, 0xae, 0xa8,
- 0x28, 0xa6, 0xda, 0x94, 0x54, 0x50, 0xc3, 0x29, 0xe8, 0x33, 0x98, 0xa7, 0xf2, 0x64, 0xd5, 0x3f,
- 0x34, 0xa5, 0x54, 0x1a, 0x38, 0x82, 0x63, 0xf8, 0xf9, 0x2a, 0xae, 0xe4, 0xa2, 0xda, 0x97, 0x44,
- 0xba, 0xb1, 0x6e, 0xe8, 0x0e, 0xb5, 0xb2, 0xe5, 0xa1, 0xdd, 0x38, 0x7c, 0x00, 0x24, 0xe9, 0xc6,
- 0x3a, 0xa3, 0x90, 0x6e, 0xec, 0xf0, 0x28, 0x3d, 0xde, 0x1c, 0x6f, 0x0f, 0xed, 0xc6, 0x51, 0xe1,
- 0x7c, 0xa4, 0x1b, 0x3b, 0x41, 0x3a, 0xe9, 0xc6, 0xcc, 0x40, 0xf4, 0xc9, 0x7d, 0x67, 0x68, 0x37,
- 0x1e, 0xba, 0xb5, 0x9c, 0x74, 0x63, 0x65, 0x20, 0x11, 0xad, 0x01, 0x30, 0x07, 0x90, 0x7a, 0x01,
- 0x57, 0x87, 0x4e, 0x06, 0xfd, 0xd1, 0x7a, 0x64, 0x32, 0x68, 0xbb, 0x34, 0x62, 0xc8, 0x28, 0xbc,
- 0x94, 0xe9, 0x47, 0xe7, 0xd2, 0xe2, 0x50, 0x43, 0x36, 0xf0, 0x81, 0x98, 0x18, 0xb2, 0x23, 0x8f,
- 0x48, 0x66, 0x15, 0xb6, 0x4a, 0x5e, 0xba, 0x36, 0xdc, 0x2c, 0x07, 0x3f, 0x96, 0x51, 0xb3, 0x4c,
- 0x09, 0x68, 0x05, 0x32, 0xc4, 0xc9, 0x39, 0xa1, 0x66, 0xe8, 0xfa, 0x50, 0x2f, 0xbe, 0x6f, 0x3f,
- 0x50, 0x6d, 0x4a, 0x4a, 0xbf, 0xe6, 0x24, 0xf2, 0x7a, 0xb6, 0x7e, 0x58, 0x12, 0x87, 0xbe, 0x3e,
- 0xb4, 0xd6, 0x4c, 0x5e, 0xcf, 0x38, 0x90, 0x0a, 0x17, 0x59, 0x5b, 0xf1, 0x5d, 0xde, 0x16, 0xdf,
- 0x98, 0x5c, 0xba, 0x41, 0x45, 0x0d, 0x5d, 0x88, 0x8b, 0xdc, 0x7c, 0x5e, 0x9b, 0x92, 0x16, 0x94,
- 0xc1, 0x54, 0x32, 0xe0, 0xf9, 0xd4, 0xc3, 0x96, 0xef, 0x4a, 0x37, 0x87, 0x0e, 0xf8, 0x88, 0x55,
- 0x4f, 0x32, 0xe0, 0x95, 0x00, 0x99, 0x4d, 0x40, 0x9a, 0x6c, 0xdb, 0x2c, 0x44, 0xe1, 0xd6, 0x88,
- 0x09, 0xa8, 0x6f, 0xdd, 0x84, 0x4d, 0x40, 0x5a, 0x83, 0x71, 0x12, 0x41, 0x6a, 0x1b, 0x2b, 0x16,
- 0x37, 0xb3, 0xb7, 0x87, 0x0a, 0x1a, 0x38, 0x6b, 0x91, 0x08, 0x52, 0x3d, 0x22, 0x71, 0x78, 0x2c,
- 0xf7, 0xe8, 0x1e, 0xee, 0x21, 0xdf, 0x19, 0xea, 0xf0, 0x44, 0x9e, 0x2d, 0x44, 0x1c, 0x1e, 0x2b,
- 0x94, 0x80, 0x7e, 0x1e, 0x66, 0x39, 0xe0, 0x2d, 0xdd, 0x1d, 0xe1, 0x02, 0x06, 0xd7, 0x28, 0xc8,
- 0xb8, 0xe6, 0x3c, 0xcc, 0xca, 0x32, 0xa0, 0xcd, 0xaa, 0x77, 0x6f, 0x84, 0x95, 0x1d, 0xc0, 0xfa,
- 0xcc, 0xca, 0xfa, 0x64, 0x62, 0x65, 0x59, 0x3f, 0xe5, 0x73, 0xdd, 0xfd, 0xa1, 0x56, 0x76, 0x70,
- 0xb7, 0x11, 0xb1, 0xb2, 0xaf, 0x7d, 0x2a, 0xa9, 0x99, 0xcd, 0x00, 0x67, 0xe9, 0x1b, 0x43, 0x6b,
- 0x16, 0x46, 0xde, 0xa4, 0x66, 0x9c, 0x87, 0x34, 0x1b, 0xc3, 0x00, 0x4c, 0xd3, 0xef, 0x0e, 0x3f,
- 0x4a, 0xa1, 0x1f, 0x65, 0xd5, 0xdc, 0xa5, 0x5d, 0xa6, 0x61, 0xcf, 0x50, 0x59, 0x7c, 0x9f, 0x37,
- 0xd7, 0xd4, 0x7b, 0xa3, 0x0d, 0x55, 0xd4, 0xfe, 0x78, 0xcf, 0x50, 0x85, 0x12, 0x69, 0x51, 0xd9,
- 0xd6, 0x3e, 0x3a, 0xbe, 0x97, 0x46, 0x9c, 0xfa, 0xd0, 0xb7, 0xc1, 0x92, 0x16, 0xd5, 0x23, 0xfa,
- 0x43, 0xa8, 0xc7, 0x8e, 0x24, 0x29, 0x2d, 0x8f, 0x1e, 0x42, 0xe1, 0x43, 0x51, 0xbc, 0x21, 0xc4,
- 0xc9, 0xde, 0x9c, 0xe9, 0x7a, 0x18, 0xef, 0x8f, 0x9e, 0x33, 0xfb, 0x5d, 0x0b, 0x36, 0x67, 0x72,
- 0x9f, 0xe2, 0x6f, 0x08, 0x70, 0x8d, 0x95, 0x8d, 0xae, 0x81, 0x9e, 0xc8, 0xde, 0x4a, 0x72, 0x60,
- 0x9b, 0xc9, 0x03, 0xfa, 0x82, 0x0f, 0x87, 0x15, 0x77, 0xcc, 0xca, 0x78, 0x6d, 0x4a, 0x7a, 0x47,
- 0x19, 0x95, 0x8f, 0x74, 0xa9, 0x0e, 0x43, 0x50, 0xa5, 0x87, 0x43, 0xbb, 0x54, 0x18, 0xf5, 0x91,
- 0x2e, 0xc5, 0x79, 0x56, 0x67, 0xf9, 0x77, 0x68, 0x6f, 0x5b, 0x6e, 0xa1, 0x58, 0x5c, 0x4f, 0xa5,
- 0x2f, 0x17, 0x4b, 0xeb, 0xa9, 0xf4, 0x95, 0x62, 0x79, 0x3d, 0x95, 0x7e, 0xab, 0xf8, 0xb6, 0xf8,
- 0x0f, 0xcb, 0x30, 0xe7, 0x82, 0x2e, 0x06, 0xa8, 0x1e, 0x06, 0x01, 0xd5, 0xd5, 0x61, 0x80, 0x8a,
- 0xc3, 0x34, 0x8e, 0xa8, 0x1e, 0x06, 0x11, 0xd5, 0xd5, 0x61, 0x88, 0xca, 0xe7, 0x21, 0x90, 0xaa,
- 0x39, 0x0c, 0x52, 0xdd, 0x9b, 0x00, 0x52, 0x79, 0xa2, 0xfa, 0x31, 0xd5, 0xda, 0x20, 0xa6, 0xba,
- 0x39, 0x1a, 0x53, 0x79, 0xa2, 0x02, 0xa0, 0xea, 0x71, 0x1f, 0xa8, 0xba, 0x3e, 0x02, 0x54, 0x79,
- 0xfc, 0x2e, 0xaa, 0xda, 0x88, 0x44, 0x55, 0xb7, 0xc7, 0xa1, 0x2a, 0x4f, 0x4e, 0x08, 0x56, 0x7d,
- 0x10, 0x82, 0x55, 0x8b, 0x43, 0x61, 0x95, 0xc7, 0xcd, 0x70, 0xd5, 0x27, 0xfd, 0xb8, 0xea, 0xfa,
- 0x08, 0x5c, 0xe5, 0xd7, 0x80, 0x03, 0xab, 0x5a, 0x14, 0xb0, 0xba, 0x35, 0x06, 0x58, 0x79, 0x52,
- 0x82, 0xc8, 0xaa, 0x16, 0x85, 0xac, 0x6e, 0x8d, 0x41, 0x56, 0x7d, 0x92, 0x18, 0xb4, 0xda, 0x8a,
- 0x86, 0x56, 0x77, 0xc6, 0x42, 0x2b, 0x4f, 0x5a, 0x18, 0x5b, 0x2d, 0x07, 0xb0, 0xd5, 0x3b, 0x43,
- 0xb0, 0x95, 0xc7, 0x4a, 0xc0, 0xd5, 0xb7, 0x06, 0xc0, 0x95, 0x38, 0x0a, 0x5c, 0x79, 0xbc, 0x1e,
- 0xba, 0x7a, 0x31, 0x04, 0x5d, 0xdd, 0x1d, 0x8f, 0xae, 0x3c, 0x61, 0x7d, 0xf0, 0x4a, 0x19, 0x09,
- 0xaf, 0xde, 0x9b, 0x10, 0x5e, 0x79, 0xd2, 0xa3, 0xf0, 0xd5, 0x47, 0x61, 0x7c, 0x75, 0x6d, 0x38,
- 0xbe, 0xf2, 0xc4, 0x70, 0x80, 0xb5, 0x11, 0x09, 0xb0, 0x6e, 0x8f, 0x03, 0x58, 0xfe, 0x38, 0x08,
- 0x22, 0xac, 0xad, 0x68, 0x84, 0x75, 0x67, 0x2c, 0xc2, 0xf2, 0x9b, 0x3f, 0x04, 0xb1, 0x36, 0x22,
- 0x21, 0xd6, 0xed, 0x71, 0x10, 0xcb, 0x2f, 0x5c, 0x10, 0x63, 0xbd, 0x1a, 0x8a, 0xb1, 0xee, 0x4f,
- 0x82, 0xb1, 0x3c, 0xa1, 0x03, 0x20, 0xeb, 0xf3, 0xe1, 0x20, 0xeb, 0x1b, 0xe7, 0x38, 0xc4, 0x32,
- 0x12, 0x65, 0x7d, 0x6b, 0x00, 0x65, 0x89, 0xa3, 0x50, 0x96, 0xdf, 0x9f, 0x5d, 0x98, 0xa5, 0x8c,
- 0x04, 0x45, 0xef, 0x4d, 0x08, 0x8a, 0xfc, 0xce, 0x17, 0x81, 0x8a, 0xaa, 0x11, 0xa8, 0xe8, 0xe6,
- 0x68, 0x54, 0xe4, 0x9b, 0x73, 0x1f, 0x16, 0xd5, 0xa2, 0x60, 0xd1, 0xad, 0x31, 0xb0, 0xc8, 0xb7,
- 0x42, 0x01, 0x5c, 0xf4, 0xb8, 0x0f, 0x17, 0x5d, 0x1f, 0x1b, 0x66, 0x15, 0x00, 0x46, 0xab, 0x83,
- 0xc0, 0xe8, 0xc6, 0x48, 0x60, 0xe4, 0x49, 0xf0, 0x91, 0xd1, 0xe3, 0x3e, 0x64, 0x74, 0x7d, 0x04,
- 0x32, 0xf2, 0x0b, 0xc0, 0xa1, 0x91, 0x36, 0x1a, 0x1a, 0x2d, 0x4d, 0x0a, 0x8d, 0x3c, 0xc1, 0x91,
- 0xd8, 0x68, 0x2b, 0x1a, 0x1b, 0xdd, 0x99, 0x30, 0x02, 0x62, 0x00, 0x1c, 0xd5, 0xa2, 0xc0, 0xd1,
- 0xad, 0x31, 0xe0, 0x28, 0x38, 0x87, 0x78, 0xe8, 0xa8, 0x16, 0x85, 0x8e, 0x6e, 0x8d, 0x41, 0x47,
- 0xbe, 0xa4, 0x00, 0x3c, 0x6a, 0x0e, 0x83, 0x47, 0xf7, 0x26, 0x80, 0x47, 0xbe, 0xf3, 0xd2, 0x87,
- 0x8f, 0x3e, 0xed, 0xc7, 0x47, 0xe2, 0x28, 0x7c, 0xe4, 0x8f, 0x48, 0x17, 0x20, 0x6d, 0x45, 0x03,
- 0xa4, 0x3b, 0x63, 0x01, 0x52, 0xd0, 0x48, 0x06, 0x10, 0xd2, 0x46, 0x24, 0x42, 0xba, 0x3d, 0x0e,
- 0x21, 0xf9, 0x46, 0x32, 0x08, 0x91, 0x3e, 0xed, 0x87, 0x48, 0xe2, 0x28, 0x88, 0xe4, 0x57, 0xce,
- 0xc5, 0x48, 0xb5, 0x28, 0x8c, 0x74, 0x6b, 0x0c, 0x46, 0xf2, 0x1b, 0x2f, 0x00, 0x92, 0x94, 0x91,
- 0x20, 0xe9, 0xbd, 0x09, 0x41, 0x52, 0x9f, 0xe1, 0x0a, 0xa3, 0xa4, 0x5a, 0x14, 0x4a, 0xba, 0x35,
- 0x06, 0x25, 0x05, 0x0a, 0xeb, 0xc3, 0xa4, 0xad, 0x68, 0x98, 0x74, 0x67, 0x2c, 0x4c, 0xea, 0x1b,
- 0x4d, 0x2e, 0x4e, 0xda, 0x88, 0xc4, 0x49, 0xb7, 0xc7, 0xe1, 0xa4, 0xbe, 0x89, 0x8f, 0x3b, 0x07,
- 0xbf, 0x32, 0x39, 0x50, 0xfa, 0xe8, 0xfc, 0x40, 0xc9, 0x7b, 0xe7, 0x18, 0xa4, 0xf4, 0x69, 0x3f,
- 0x52, 0x12, 0x47, 0x21, 0x25, 0xbf, 0x67, 0x9d, 0x0f, 0x2a, 0xad, 0xa7, 0xd2, 0x6f, 0x17, 0xdf,
- 0x11, 0xff, 0x7c, 0x06, 0x66, 0x6a, 0x5e, 0x60, 0x92, 0x5f, 0x4b, 0xe1, 0x4d, 0x4e, 0xc2, 0x42,
- 0x6b, 0x64, 0xc4, 0x53, 0xbb, 0x39, 0xfe, 0xfc, 0xc4, 0xc1, 0x13, 0xfe, 0x38, 0xeb, 0x1b, 0x6c,
- 0x49, 0x47, 0x1f, 0xc0, 0x5c, 0xcf, 0xc6, 0x96, 0xdc, 0xb5, 0x74, 0xd3, 0xd2, 0x1d, 0xb6, 0xed,
- 0x46, 0x58, 0x2d, 0x7e, 0x79, 0xba, 0x98, 0xdb, 0xb1, 0xb1, 0xb5, 0xcd, 0xe9, 0x52, 0xae, 0x17,
- 0x78, 0x72, 0xef, 0x3a, 0x9b, 0x9e, 0xfc, 0xae, 0xb3, 0x17, 0x50, 0xb4, 0xb0, 0xa2, 0x85, 0x3c,
- 0x18, 0x76, 0xea, 0x54, 0x74, 0x9f, 0xa3, 0xdb, 0xe2, 0xdc, 0x9c, 0xf4, 0xf4, 0xa9, 0x82, 0x15,
- 0x26, 0xa2, 0x07, 0x70, 0xb1, 0xa3, 0x1c, 0xd3, 0x20, 0x56, 0xd9, 0x75, 0x0a, 0x69, 0x60, 0x2a,
- 0xbb, 0xa0, 0x0c, 0x75, 0x94, 0x63, 0x7a, 0x71, 0x1a, 0x4b, 0xa2, 0xb7, 0x9e, 0xdc, 0x82, 0xbc,
- 0xa6, 0xdb, 0x8e, 0x6e, 0xa8, 0x0e, 0x3f, 0xd0, 0x98, 0x1d, 0x06, 0x3c, 0xe7, 0x52, 0xd9, 0xa9,
- 0xc5, 0x15, 0x28, 0xb4, 0x14, 0x07, 0x1f, 0x29, 0x27, 0xb2, 0xbb, 0x1f, 0x2e, 0x4b, 0xcf, 0xee,
- 0x7c, 0xeb, 0xec, 0x74, 0x71, 0xee, 0x29, 0x4b, 0x1a, 0xd8, 0x16, 0x37, 0xd7, 0x0a, 0x24, 0x68,
- 0xe8, 0x0e, 0x14, 0x14, 0xfb, 0xc4, 0x50, 0x69, 0x95, 0xb1, 0x61, 0xf7, 0x6c, 0x0a, 0x33, 0xd2,
- 0x52, 0x9e, 0x92, 0x2b, 0x2e, 0x15, 0x5d, 0x87, 0x1c, 0x0f, 0xe7, 0x67, 0xb7, 0x2b, 0x15, 0x68,
- 0xf1, 0xf9, 0xb5, 0x1d, 0xec, 0x82, 0xa5, 0xc7, 0x50, 0xe6, 0x97, 0x10, 0x1c, 0x29, 0x96, 0x26,
- 0x53, 0x4d, 0xfa, 0x7d, 0xae, 0x48, 0xc5, 0x5e, 0x66, 0x97, 0x0e, 0x90, 0x0c, 0x44, 0x7d, 0xfe,
- 0xb8, 0x68, 0xc2, 0xbc, 0xda, 0xd6, 0x3d, 0x54, 0xc0, 0x9c, 0xa8, 0xf9, 0xa1, 0x23, 0xa4, 0x42,
- 0xf3, 0xf6, 0x7f, 0x66, 0x2e, 0xa8, 0x61, 0x32, 0x6a, 0x00, 0x3d, 0xb9, 0x47, 0xee, 0x9a, 0x6d,
- 0x5d, 0x3d, 0xa1, 0xb0, 0x20, 0x7c, 0xa4, 0xfa, 0xc8, 0x8b, 0x0d, 0x5e, 0x29, 0xba, 0xb3, 0x4d,
- 0x39, 0x25, 0x38, 0xf2, 0x7e, 0xb3, 0xe3, 0x90, 0xd7, 0x53, 0x69, 0x28, 0x66, 0xd7, 0x53, 0xe9,
- 0x5c, 0x71, 0x6e, 0x3d, 0x95, 0xce, 0x17, 0x0b, 0xe2, 0x6f, 0x08, 0x90, 0x0b, 0xed, 0x63, 0x7a,
- 0xdc, 0xf7, 0x11, 0xf9, 0x4a, 0x34, 0xfe, 0x1b, 0x16, 0x49, 0x98, 0xe6, 0xfd, 0xc5, 0x0d, 0xcb,
- 0x5c, 0x1c, 0x8e, 0x1f, 0xe8, 0x6a, 0x88, 0x1b, 0xa3, 0xe2, 0xb2, 0x7d, 0x9c, 0xfa, 0xc1, 0x0f,
- 0x17, 0xa7, 0xc4, 0xbf, 0x4c, 0xc1, 0x5c, 0x78, 0xd7, 0x52, 0xbd, 0xaf, 0x5c, 0x51, 0xf6, 0x39,
- 0xc4, 0xb1, 0x34, 0xe2, 0xe6, 0x96, 0x8c, 0x7f, 0xf9, 0x01, 0x2b, 0xe6, 0xb5, 0x11, 0x9f, 0xca,
- 0x83, 0xe5, 0xf4, 0x19, 0xcb, 0xff, 0x21, 0xe9, 0xd9, 0xa9, 0x25, 0x98, 0xa6, 0x07, 0x10, 0xf1,
- 0xa2, 0x95, 0xfa, 0xdb, 0x8a, 0xf8, 0xac, 0x24, 0x5d, 0x62, 0xd9, 0x88, 0x5d, 0x6b, 0xbe, 0xd1,
- 0x09, 0x7f, 0x7e, 0xd7, 0x3b, 0xff, 0x9d, 0x88, 0x3d, 0x76, 0xc2, 0xe3, 0xff, 0xc5, 0x38, 0x16,
- 0xf2, 0x3e, 0xf4, 0x4b, 0x50, 0x50, 0xcd, 0x76, 0x9b, 0xcd, 0x59, 0xcc, 0x32, 0x0c, 0x9e, 0xf9,
- 0x42, 0x8b, 0xc0, 0xaf, 0xc1, 0x5c, 0xf2, 0xae, 0xc3, 0x5c, 0x92, 0xf8, 0x75, 0x98, 0x81, 0x20,
- 0xd9, 0xbc, 0x27, 0xcc, 0x35, 0x28, 0xa1, 0x78, 0xdd, 0xd9, 0x37, 0x89, 0xd7, 0x65, 0x31, 0xde,
- 0xbc, 0xe7, 0xfd, 0xb1, 0xc0, 0x03, 0x62, 0x9e, 0x99, 0xe6, 0x41, 0xcf, 0x8b, 0xb3, 0x2d, 0x07,
- 0xcf, 0x6b, 0x4c, 0x7f, 0x79, 0xba, 0x98, 0x92, 0xbc, 0x03, 0x1b, 0xa3, 0x2c, 0x70, 0xe2, 0xab,
- 0x59, 0xe0, 0xeb, 0x90, 0xeb, 0x5a, 0x78, 0x0f, 0x3b, 0xea, 0xbe, 0x6c, 0xf4, 0x3a, 0x7c, 0x3b,
- 0x4e, 0xd6, 0xa5, 0x6d, 0xf5, 0x3a, 0xe8, 0x1e, 0x14, 0xbd, 0x2c, 0x1c, 0x2b, 0xbb, 0x07, 0x7a,
- 0xb9, 0x74, 0x8e, 0xac, 0xc5, 0xff, 0x29, 0xc0, 0x42, 0xa8, 0x4e, 0x7c, 0x4c, 0xad, 0x43, 0x56,
- 0xf3, 0xe6, 0x3c, 0xbb, 0x24, 0x9c, 0x33, 0xea, 0x34, 0xc8, 0x8c, 0x64, 0xb8, 0xe4, 0xbe, 0x96,
- 0x5e, 0x18, 0xe0, 0x8b, 0x4d, 0x9c, 0x53, 0xec, 0x45, 0x5f, 0xce, 0x5a, 0xe0, 0x05, 0xde, 0x20,
- 0x4b, 0x4e, 0x34, 0xc8, 0xc4, 0xdf, 0x16, 0xa0, 0x48, 0x5f, 0xf0, 0x04, 0x63, 0x2d, 0x16, 0xeb,
- 0xe6, 0x46, 0x73, 0x27, 0x26, 0xdf, 0x70, 0x13, 0xba, 0xe4, 0x24, 0x19, 0xbe, 0xe4, 0x44, 0xfc,
- 0xa1, 0x00, 0x79, 0xaf, 0x84, 0xec, 0x62, 0xc1, 0x11, 0xc7, 0x82, 0xbe, 0xd9, 0xe5, 0x79, 0xee,
- 0xf1, 0x25, 0x13, 0xdd, 0x75, 0x18, 0x3c, 0xbe, 0x84, 0x5d, 0xfa, 0xf6, 0xb7, 0xdd, 0x9e, 0x43,
- 0x8a, 0x58, 0xf1, 0x8f, 0xa9, 0x78, 0x83, 0xbd, 0x47, 0x12, 0xbd, 0x93, 0xd5, 0x6c, 0x1f, 0xb2,
- 0x13, 0x67, 0x26, 0x32, 0x7b, 0x88, 0x87, 0x81, 0x01, 0x5f, 0x55, 0xd3, 0x9a, 0x0d, 0x7a, 0x5b,
- 0x2b, 0xfb, 0x6d, 0x8b, 0x4f, 0x02, 0x0a, 0xa4, 0x8d, 0x4f, 0xb4, 0x34, 0x91, 0x29, 0x76, 0xb5,
- 0xc4, 0xfa, 0xca, 0x1f, 0x06, 0x5b, 0xa2, 0x7a, 0x48, 0xd0, 0xd4, 0x23, 0x48, 0x1e, 0x2a, 0xed,
- 0x51, 0x91, 0x54, 0xa1, 0x96, 0x93, 0x48, 0x6e, 0xf4, 0x24, 0x74, 0xba, 0x47, 0x62, 0xb8, 0xe7,
- 0x3f, 0xa8, 0xd2, 0xd0, 0x29, 0x20, 0x1f, 0x86, 0xfb, 0xfa, 0xc8, 0xd7, 0x07, 0x3b, 0xfd, 0xc7,
- 0xa9, 0x1f, 0xff, 0x70, 0x51, 0x10, 0x3f, 0x01, 0x24, 0x61, 0x1b, 0x3b, 0x2f, 0x7a, 0xa6, 0xe5,
- 0x9f, 0x94, 0x72, 0xbb, 0xef, 0xd6, 0x97, 0xe9, 0xd5, 0xec, 0x59, 0xd4, 0x61, 0x4a, 0x17, 0x61,
- 0x21, 0xc4, 0xcd, 0x8c, 0x85, 0xf8, 0x21, 0x5c, 0x79, 0x6a, 0xda, 0xb6, 0xde, 0x25, 0x10, 0x92,
- 0x8e, 0x4a, 0x32, 0xb5, 0x78, 0xe6, 0x31, 0xdd, 0xa5, 0x8b, 0x09, 0x06, 0x33, 0x23, 0x19, 0xc9,
- 0x7b, 0x16, 0x7f, 0x4f, 0x80, 0xcb, 0x83, 0x9c, 0x4c, 0xcb, 0x51, 0x5b, 0x25, 0x67, 0x55, 0xd3,
- 0x3f, 0x59, 0x6f, 0x7c, 0x6f, 0x75, 0xb3, 0x13, 0xb7, 0x90, 0xbf, 0x53, 0xee, 0x28, 0xd4, 0x7c,
- 0xf0, 0x6d, 0xdb, 0x79, 0x4e, 0xde, 0x64, 0x54, 0xdf, 0x92, 0xa4, 0x26, 0xb3, 0x24, 0x4d, 0x28,
- 0xac, 0x9b, 0xba, 0x41, 0xbc, 0x4f, 0xb7, 0xbe, 0x2b, 0x90, 0xdf, 0xd5, 0x0d, 0xc5, 0x3a, 0x91,
- 0xdd, 0x00, 0x3e, 0x61, 0x5c, 0x00, 0x9f, 0x34, 0xc7, 0x38, 0xf8, 0xa3, 0xf8, 0x13, 0x01, 0x8a,
- 0xbe, 0x58, 0x6e, 0x91, 0xdf, 0x05, 0x50, 0xdb, 0x3d, 0xdb, 0xc1, 0x96, 0xdb, 0x4a, 0x39, 0x16,
- 0xf6, 0x5e, 0x61, 0xd4, 0xfa, 0x9a, 0x94, 0xe1, 0x19, 0xea, 0x1a, 0xba, 0x11, 0x3e, 0x55, 0x62,
- 0x7a, 0x15, 0xce, 0x06, 0xce, 0x92, 0x20, 0xcd, 0x6e, 0x3b, 0xa6, 0xe5, 0x61, 0x17, 0xde, 0xec,
- 0xee, 0x39, 0xf9, 0x74, 0x33, 0x34, 0xc9, 0xb7, 0x02, 0x79, 0xe2, 0x2e, 0x1c, 0x62, 0xaf, 0x4a,
- 0xa9, 0xf1, 0x55, 0x62, 0x1c, 0x6e, 0x95, 0xfe, 0xa5, 0x00, 0x85, 0x0a, 0x6b, 0x0d, 0xaf, 0x85,
- 0x47, 0x58, 0xb4, 0x35, 0x48, 0x3b, 0xc7, 0x86, 0xdc, 0xc1, 0xde, 0xdd, 0x32, 0xe7, 0x38, 0xf6,
- 0x6e, 0xd6, 0x61, 0x8f, 0xf4, 0xfa, 0x41, 0x7e, 0xf7, 0x35, 0x1f, 0x2e, 0x57, 0x96, 0xd8, 0xe5,
- 0xd8, 0x4b, 0xee, 0xe5, 0xd8, 0x4b, 0x6b, 0x3c, 0x03, 0x33, 0xea, 0x3f, 0xf8, 0x2f, 0x8b, 0x82,
- 0xe4, 0x31, 0xb1, 0x79, 0xff, 0x7e, 0x83, 0xf4, 0xfa, 0x81, 0x99, 0x19, 0xe5, 0x01, 0x02, 0x97,
- 0x06, 0xf1, 0xeb, 0x96, 0x57, 0xd6, 0xe4, 0x9d, 0xad, 0xca, 0xf3, 0xcd, 0xcd, 0x7a, 0xb3, 0x59,
- 0x5d, 0x2b, 0x0a, 0xa8, 0x08, 0xb9, 0xd0, 0x95, 0x43, 0x09, 0x76, 0x01, 0xf3, 0xfd, 0xff, 0x0f,
- 0xc0, 0xbf, 0xbd, 0x8c, 0xc8, 0xda, 0xa8, 0x7e, 0x26, 0xbf, 0x5c, 0x79, 0xb6, 0x53, 0x6d, 0x14,
- 0xa7, 0x10, 0x82, 0xfc, 0xea, 0x4a, 0xb3, 0x52, 0x93, 0xa5, 0x6a, 0x63, 0xfb, 0xf9, 0x56, 0xa3,
- 0xea, 0x5e, 0xdc, 0x7c, 0x7f, 0x0d, 0x72, 0xc1, 0xb3, 0x83, 0xd0, 0x02, 0x14, 0x2a, 0xb5, 0x6a,
- 0x65, 0x43, 0x7e, 0x59, 0x5f, 0x91, 0x5f, 0xec, 0x54, 0x77, 0xaa, 0xc5, 0x29, 0x5a, 0x34, 0x4a,
- 0x7c, 0xb2, 0xf3, 0xec, 0x59, 0x51, 0x40, 0x05, 0xc8, 0xb2, 0x67, 0x7a, 0x3d, 0x51, 0x31, 0x71,
- 0x7f, 0x13, 0xb2, 0x81, 0x43, 0x86, 0xc9, 0xeb, 0xb6, 0x77, 0x1a, 0x35, 0xb9, 0x59, 0xdf, 0xac,
- 0x36, 0x9a, 0x2b, 0x9b, 0xdb, 0x4c, 0x06, 0xa5, 0xad, 0xac, 0x3e, 0x97, 0x9a, 0x45, 0xc1, 0x7b,
- 0x6e, 0x3e, 0xdf, 0xa9, 0xd4, 0xdc, 0x6a, 0x88, 0xa9, 0x74, 0xb2, 0x98, 0xbc, 0xff, 0xd7, 0x05,
- 0xb8, 0x3c, 0xe4, 0x1c, 0x1d, 0x94, 0x85, 0xd9, 0x1d, 0x83, 0x9e, 0xb8, 0x5a, 0x9c, 0x42, 0x73,
- 0x81, 0xa3, 0x74, 0x8a, 0x02, 0x4a, 0xb3, 0xc3, 0x4c, 0x8a, 0x09, 0x34, 0x03, 0x89, 0xc6, 0xa3,
- 0x62, 0x92, 0x94, 0x34, 0x70, 0x12, 0x4d, 0x31, 0x85, 0x32, 0xfc, 0x0c, 0x8c, 0xe2, 0x34, 0xca,
- 0xf9, 0x47, 0x51, 0x14, 0x67, 0x88, 0x28, 0xef, 0x48, 0x87, 0xe2, 0xec, 0xfd, 0xeb, 0x10, 0xd8,
- 0x36, 0x8f, 0x00, 0x66, 0x9e, 0x29, 0x0e, 0xb6, 0x9d, 0xe2, 0x14, 0x9a, 0x85, 0xe4, 0x4a, 0xbb,
- 0x5d, 0x14, 0x1e, 0xfe, 0x8b, 0x14, 0xa4, 0xdd, 0x6b, 0x78, 0xd0, 0x33, 0x98, 0x66, 0xcb, 0xca,
- 0x8b, 0xc3, 0xd1, 0x02, 0x1d, 0xd0, 0xe5, 0x6b, 0xe3, 0xe0, 0x84, 0x38, 0x85, 0xfe, 0x7f, 0xc8,
- 0x06, 0xbc, 0x28, 0x34, 0x74, 0x69, 0x2c, 0xe4, 0x39, 0x96, 0x6f, 0x8f, 0xcb, 0xe6, 0xc9, 0x7f,
- 0x05, 0x19, 0xcf, 0xaa, 0xa3, 0x1b, 0xa3, 0x6c, 0xbe, 0x2b, 0x7b, 0xf4, 0xc4, 0x40, 0xc6, 0x9f,
- 0x38, 0xf5, 0xbe, 0x80, 0x2c, 0x40, 0x83, 0x06, 0x18, 0x45, 0x05, 0x2b, 0x0c, 0xb5, 0xf0, 0xe5,
- 0xfb, 0x13, 0xe5, 0xf6, 0xdf, 0x49, 0x94, 0xe5, 0xcf, 0x22, 0xd1, 0xca, 0x1a, 0x98, 0xa3, 0xa2,
- 0x95, 0x15, 0x31, 0x19, 0x4d, 0xa1, 0x17, 0x90, 0x22, 0xd6, 0x13, 0x45, 0xf9, 0x95, 0x7d, 0xd6,
- 0xba, 0x7c, 0x63, 0x64, 0x1e, 0x57, 0xe4, 0xea, 0xbd, 0x1f, 0xff, 0xd9, 0xd5, 0xa9, 0x1f, 0x9f,
- 0x5d, 0x15, 0x7e, 0x72, 0x76, 0x55, 0xf8, 0x93, 0xb3, 0xab, 0xc2, 0x9f, 0x9e, 0x5d, 0x15, 0xbe,
- 0xff, 0xd3, 0xab, 0x53, 0x3f, 0xf9, 0xe9, 0xd5, 0xa9, 0x3f, 0xf9, 0xe9, 0xd5, 0xa9, 0xcf, 0x67,
- 0x39, 0xf7, 0xee, 0x0c, 0x35, 0x2d, 0x8f, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7c, 0xb1,
- 0x3d, 0x40, 0xb2, 0x80, 0x00, 0x00,
+func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_7ab19f7b4624e210) }
+
+var fileDescriptor_api_7ab19f7b4624e210 = []byte{
+ // 8196 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5d, 0x6c, 0x23, 0x59,
+ 0x76, 0x9e, 0x8a, 0xa4, 0x24, 0xf2, 0x50, 0x22, 0x4b, 0x57, 0xfd, 0xa3, 0xe6, 0xcc, 0xb4, 0xba,
+ 0xab, 0xff, 0xdb, 0x33, 0xd2, 0x74, 0xf7, 0x4e, 0x66, 0x3c, 0x3d, 0x9e, 0xb5, 0x44, 0xb1, 0x9b,
+ 0x94, 0x5a, 0x6a, 0x75, 0x91, 0xea, 0xc6, 0x8c, 0xd7, 0xa9, 0x2d, 0x55, 0x5d, 0x51, 0xb5, 0x22,
+ 0xab, 0xd8, 0x55, 0x45, 0xfd, 0x0c, 0x10, 0x20, 0x8e, 0x0d, 0x67, 0x9f, 0x8c, 0x7d, 0x30, 0x90,
+ 0x35, 0x1c, 0xc4, 0xeb, 0x6c, 0x10, 0x3f, 0x04, 0x48, 0x02, 0x24, 0xc8, 0x1f, 0x92, 0xf5, 0x8b,
+ 0x81, 0x2c, 0x02, 0x27, 0x5e, 0x3f, 0xc5, 0x08, 0x10, 0xc5, 0xd6, 0xe6, 0x25, 0x70, 0x10, 0x04,
+ 0x41, 0x00, 0x03, 0xf3, 0x10, 0x04, 0xf7, 0xa7, 0xfe, 0xc8, 0xe2, 0x8f, 0x7a, 0x6a, 0x93, 0x01,
+ 0xfc, 0x22, 0xb1, 0xce, 0xbd, 0xe7, 0xd4, 0xbd, 0xe7, 0xde, 0x7b, 0xee, 0xf9, 0x6e, 0x9d, 0x7b,
+ 0x2f, 0xcc, 0xd9, 0x96, 0xaa, 0xed, 0x77, 0x76, 0x97, 0xd5, 0x8e, 0xb1, 0xd4, 0xb1, 0x2d, 0xd7,
+ 0x42, 0x73, 0x9a, 0xa5, 0x1d, 0x50, 0xf2, 0x12, 0x4f, 0x2c, 0xdd, 0x3f, 0x38, 0x5c, 0x3e, 0x38,
+ 0x74, 0xb0, 0x7d, 0x88, 0xed, 0x65, 0xcd, 0x32, 0xb5, 0xae, 0x6d, 0x63, 0x53, 0x3b, 0x59, 0x6e,
+ 0x59, 0xda, 0x01, 0xfd, 0x63, 0x98, 0x4d, 0xc6, 0x5e, 0x42, 0x9e, 0x44, 0x5d, 0x75, 0x55, 0x4e,
+ 0xbb, 0xe0, 0xd1, 0xb0, 0x6d, 0x5b, 0xb6, 0xc3, 0xa9, 0x97, 0x3c, 0x6a, 0x1b, 0xbb, 0x6a, 0x28,
+ 0xf7, 0x5b, 0x8e, 0x6b, 0xd9, 0x6a, 0x13, 0x2f, 0x63, 0xb3, 0x69, 0x98, 0x98, 0x64, 0x38, 0xd4,
+ 0x34, 0x9e, 0xf8, 0x76, 0x6c, 0xe2, 0x23, 0x9e, 0xba, 0xd0, 0x75, 0x8d, 0xd6, 0xf2, 0x7e, 0x4b,
+ 0x5b, 0x76, 0x8d, 0x36, 0x76, 0x5c, 0xb5, 0xdd, 0xe1, 0x29, 0xf7, 0x69, 0x8a, 0x6b, 0xab, 0x9a,
+ 0x61, 0x36, 0xbd, 0xff, 0x9d, 0xdd, 0x65, 0x1b, 0x6b, 0x96, 0xad, 0x63, 0x5d, 0x71, 0x3a, 0xaa,
+ 0xe9, 0x15, 0xb7, 0x69, 0x35, 0x2d, 0xfa, 0x73, 0x99, 0xfc, 0xe2, 0xd4, 0xab, 0x4d, 0xcb, 0x6a,
+ 0xb6, 0xf0, 0x32, 0x7d, 0xda, 0xed, 0xee, 0x2d, 0xeb, 0x5d, 0x5b, 0x75, 0x0d, 0x8b, 0x73, 0x49,
+ 0xff, 0x4c, 0x80, 0x59, 0x19, 0xbf, 0xee, 0x62, 0xc7, 0xad, 0x62, 0x55, 0xc7, 0x36, 0xba, 0x02,
+ 0xe9, 0x03, 0x7c, 0xb2, 0x90, 0xbe, 0x26, 0xdc, 0x9d, 0x59, 0x9d, 0xfe, 0xf2, 0x74, 0x31, 0xbd,
+ 0x81, 0x4f, 0x64, 0x42, 0x43, 0xd7, 0x60, 0x1a, 0x9b, 0xba, 0x42, 0x92, 0x33, 0xd1, 0xe4, 0x29,
+ 0x6c, 0xea, 0x1b, 0xf8, 0x04, 0x7d, 0x0b, 0xb2, 0x0e, 0x91, 0x66, 0x6a, 0x78, 0x61, 0xf2, 0x9a,
+ 0x70, 0x77, 0x72, 0xf5, 0x17, 0xbf, 0x3c, 0x5d, 0xfc, 0xa4, 0x69, 0xb8, 0xfb, 0xdd, 0xdd, 0x25,
+ 0xcd, 0x6a, 0x2f, 0xfb, 0xed, 0xa4, 0xef, 0x06, 0xbf, 0x97, 0x3b, 0x07, 0xcd, 0xe5, 0x5e, 0x1d,
+ 0x2d, 0x35, 0x8e, 0xcd, 0x3a, 0x7e, 0x2d, 0xfb, 0x12, 0xd7, 0x33, 0x59, 0x41, 0x4c, 0xad, 0x67,
+ 0xb2, 0x29, 0x31, 0x2d, 0xfd, 0x51, 0x0a, 0x0a, 0x32, 0x76, 0x3a, 0x96, 0xe9, 0x60, 0x5e, 0xf2,
+ 0xf7, 0x21, 0xed, 0x1e, 0x9b, 0xb4, 0xe4, 0xf9, 0x87, 0x57, 0x97, 0xfa, 0x7a, 0xc4, 0x52, 0xc3,
+ 0x56, 0x4d, 0x47, 0xd5, 0x48, 0xf5, 0x65, 0x92, 0x15, 0x7d, 0x04, 0x79, 0x1b, 0x3b, 0xdd, 0x36,
+ 0xa6, 0x8a, 0xa4, 0x95, 0xca, 0x3f, 0xbc, 0x1c, 0xc3, 0x59, 0xef, 0xa8, 0xa6, 0x0c, 0x2c, 0x2f,
+ 0xf9, 0x8d, 0xae, 0x40, 0xd6, 0xec, 0xb6, 0x89, 0x2a, 0x1c, 0x5a, 0xd1, 0xb4, 0x3c, 0x6d, 0x76,
+ 0xdb, 0x1b, 0xf8, 0xc4, 0x41, 0x75, 0x98, 0xe5, 0x42, 0x6d, 0xac, 0x3a, 0x96, 0xb9, 0x30, 0x7d,
+ 0x4d, 0xb8, 0x5b, 0x78, 0xb8, 0x14, 0x23, 0x36, 0x5a, 0x01, 0xf2, 0xd8, 0x6d, 0x63, 0x99, 0x72,
+ 0xc9, 0x33, 0x76, 0xe8, 0x09, 0xbd, 0x05, 0x39, 0xf2, 0xbe, 0xdd, 0x13, 0x17, 0x3b, 0x0b, 0x59,
+ 0xfa, 0x42, 0x52, 0x80, 0x55, 0xf2, 0x2c, 0x7d, 0x0a, 0x33, 0x61, 0x56, 0x84, 0xa0, 0x20, 0x57,
+ 0xea, 0x3b, 0x9b, 0x15, 0x65, 0x67, 0x6b, 0x63, 0xeb, 0xf9, 0xab, 0x2d, 0x71, 0x02, 0x5d, 0x00,
+ 0x91, 0xd3, 0x36, 0x2a, 0x9f, 0x29, 0xcf, 0x6a, 0x9b, 0xb5, 0x86, 0x28, 0x94, 0x32, 0xdf, 0xfd,
+ 0xe1, 0xd5, 0x89, 0xf5, 0x4c, 0x76, 0x4a, 0x9c, 0x96, 0x7e, 0x28, 0x00, 0x3c, 0xc5, 0x2e, 0xef,
+ 0x0d, 0x68, 0x15, 0xa6, 0xf6, 0x69, 0xb1, 0x16, 0x04, 0xaa, 0x96, 0x6b, 0xb1, 0xe5, 0x0f, 0xf5,
+ 0x9c, 0xd5, 0xec, 0x8f, 0x4f, 0x17, 0x27, 0x7e, 0x72, 0xba, 0x28, 0xc8, 0x9c, 0x13, 0xbd, 0x80,
+ 0xfc, 0x01, 0x3e, 0x51, 0xf8, 0x58, 0x5b, 0x48, 0x51, 0x45, 0xbc, 0x1f, 0x12, 0x74, 0x70, 0xb8,
+ 0xe4, 0x0d, 0xd1, 0xa5, 0xd0, 0x10, 0x5d, 0x22, 0x1c, 0x4b, 0x75, 0xd7, 0xc6, 0x66, 0xd3, 0xdd,
+ 0x97, 0xe1, 0x00, 0x9f, 0x3c, 0x63, 0x32, 0xa4, 0xdf, 0x17, 0x20, 0x4f, 0x4b, 0xc9, 0x34, 0x87,
+ 0xca, 0x3d, 0xc5, 0xbc, 0x3e, 0x52, 0xcd, 0x31, 0xe5, 0x5c, 0x82, 0xc9, 0x43, 0xb5, 0xd5, 0xc5,
+ 0xb4, 0x84, 0xf9, 0x87, 0x0b, 0x31, 0x32, 0x5e, 0x92, 0x74, 0x99, 0x65, 0x43, 0x8f, 0x61, 0xc6,
+ 0x30, 0x5d, 0x6c, 0xba, 0x0a, 0x63, 0x4b, 0x8f, 0x60, 0xcb, 0xb3, 0xdc, 0xf4, 0x41, 0xfa, 0xa7,
+ 0x02, 0xc0, 0x76, 0x37, 0x51, 0x3d, 0x7f, 0x63, 0xcc, 0xf2, 0xaf, 0x66, 0x08, 0xab, 0x57, 0x8b,
+ 0x4b, 0x30, 0x65, 0x98, 0x2d, 0xc3, 0x64, 0xe5, 0xcf, 0xca, 0xfc, 0x09, 0x5d, 0x80, 0xc9, 0xdd,
+ 0x96, 0x61, 0xea, 0x74, 0x3c, 0x64, 0x65, 0xf6, 0x20, 0xc9, 0x90, 0xa7, 0xa5, 0x4e, 0x50, 0xef,
+ 0xd2, 0x69, 0x0a, 0x2e, 0x96, 0x2d, 0x53, 0x37, 0xc8, 0x90, 0x54, 0x5b, 0x5f, 0x0b, 0xad, 0xac,
+ 0xc3, 0x05, 0x1d, 0x77, 0x6c, 0xac, 0xa9, 0x2e, 0xd6, 0x15, 0x7c, 0xdc, 0x19, 0xb3, 0x8d, 0x51,
+ 0xc0, 0x55, 0x39, 0xee, 0x50, 0x5a, 0xbc, 0x26, 0xd1, 0x37, 0xe0, 0xb2, 0xda, 0x6a, 0x59, 0x47,
+ 0x8a, 0xb1, 0xa7, 0xe8, 0x16, 0x76, 0x14, 0xd3, 0x72, 0x15, 0x7c, 0x6c, 0x38, 0x2e, 0x35, 0x25,
+ 0x59, 0x79, 0x9e, 0x26, 0xd7, 0xf6, 0xd6, 0x2c, 0xec, 0x6c, 0x59, 0x6e, 0x85, 0x24, 0x11, 0x0b,
+ 0x40, 0x0a, 0xc3, 0x2c, 0xc0, 0x14, 0x31, 0xbf, 0x72, 0x16, 0x1f, 0x77, 0xa8, 0x05, 0x08, 0x35,
+ 0xe5, 0x74, 0xb8, 0x29, 0xa5, 0x5f, 0x86, 0x4b, 0xbd, 0xfa, 0x4d, 0xb2, 0xfd, 0xfe, 0x50, 0x80,
+ 0x42, 0xcd, 0x34, 0xdc, 0xaf, 0x45, 0xc3, 0xf9, 0xca, 0x4e, 0x87, 0x95, 0x7d, 0x1f, 0xc4, 0x3d,
+ 0xd5, 0x68, 0x3d, 0x37, 0x1b, 0x56, 0x7b, 0xd7, 0x71, 0x2d, 0x13, 0x3b, 0xbc, 0x35, 0xfa, 0xe8,
+ 0xd2, 0x4b, 0x28, 0xfa, 0xb5, 0x49, 0x52, 0x4d, 0x2e, 0x88, 0x35, 0x53, 0xb3, 0x71, 0x1b, 0x9b,
+ 0x89, 0xea, 0xe9, 0x6d, 0xc8, 0x19, 0x9e, 0x5c, 0xaa, 0xab, 0xb4, 0x1c, 0x10, 0xa4, 0x2e, 0xcc,
+ 0x85, 0xde, 0x9a, 0xa4, 0xb9, 0x24, 0x93, 0x11, 0x3e, 0x52, 0x82, 0x36, 0x22, 0x93, 0x11, 0x3e,
+ 0x62, 0xe6, 0xad, 0x0e, 0xb3, 0x6b, 0xb8, 0x85, 0x5d, 0x9c, 0x60, 0x4d, 0xa5, 0x1d, 0x28, 0x78,
+ 0x42, 0x93, 0x6c, 0x98, 0xbf, 0x25, 0x00, 0xe2, 0x72, 0x55, 0xb3, 0x99, 0x64, 0x89, 0xd1, 0x22,
+ 0x71, 0x2d, 0xdc, 0xae, 0x6d, 0x32, 0x1f, 0x81, 0xf5, 0x49, 0x60, 0x24, 0xea, 0x26, 0x04, 0x43,
+ 0x36, 0x13, 0x1e, 0xb2, 0xdc, 0xbd, 0x39, 0x82, 0xf9, 0x48, 0xc1, 0x92, 0x6d, 0xbe, 0x0c, 0x2d,
+ 0x53, 0xea, 0x5a, 0x3a, 0xec, 0xc3, 0x51, 0xa2, 0xf4, 0x7d, 0x01, 0xe6, 0xca, 0x2d, 0xac, 0xda,
+ 0x89, 0x6b, 0xe4, 0x9b, 0x90, 0xd5, 0xb1, 0xaa, 0xd3, 0x2a, 0xb3, 0x81, 0xfd, 0x4e, 0x48, 0x0a,
+ 0xf1, 0x74, 0x97, 0xf6, 0x5b, 0xda, 0x52, 0xc3, 0xf3, 0x81, 0xf9, 0xe8, 0xf6, 0x99, 0xa4, 0xcf,
+ 0x00, 0x85, 0x4b, 0x96, 0x64, 0x47, 0xf8, 0xdf, 0x02, 0x20, 0x19, 0x1f, 0x62, 0xdb, 0x4d, 0xbc,
+ 0xda, 0x6b, 0x90, 0x77, 0x55, 0xbb, 0x89, 0x5d, 0x85, 0x78, 0xf7, 0xe7, 0xa9, 0x39, 0x30, 0x3e,
+ 0x42, 0x46, 0x0d, 0xb8, 0x83, 0x4d, 0x75, 0xb7, 0x85, 0xa9, 0x14, 0x65, 0xd7, 0xea, 0x9a, 0xba,
+ 0x62, 0xb8, 0xd8, 0x56, 0x5d, 0xcb, 0x56, 0xac, 0x8e, 0x6b, 0xb4, 0x8d, 0x2f, 0xa8, 0x63, 0xcf,
+ 0xbb, 0xda, 0x0d, 0x96, 0x9d, 0x30, 0xaf, 0x92, 0xcc, 0x35, 0x9e, 0xf7, 0x79, 0x28, 0xab, 0xf4,
+ 0x39, 0xcc, 0x47, 0x6a, 0x9d, 0xa4, 0x4a, 0xff, 0xa7, 0x00, 0xf9, 0xba, 0xa6, 0x9a, 0x49, 0xea,
+ 0xf2, 0x53, 0xc8, 0x3b, 0x9a, 0x6a, 0x2a, 0x7b, 0x96, 0xdd, 0x56, 0x5d, 0x3a, 0x70, 0x0a, 0x11,
+ 0x5d, 0xfa, 0xfe, 0xba, 0xa6, 0x9a, 0x4f, 0x68, 0x26, 0x19, 0x1c, 0xff, 0x77, 0xaf, 0x3f, 0x3a,
+ 0xf9, 0xd5, 0xfd, 0x51, 0x36, 0x5c, 0xd7, 0x33, 0xd9, 0xb4, 0x98, 0x91, 0xfe, 0x42, 0x80, 0x19,
+ 0x56, 0xe5, 0x24, 0x87, 0xeb, 0x07, 0x90, 0xb1, 0xad, 0x23, 0x36, 0x5c, 0xf3, 0x0f, 0xdf, 0x8a,
+ 0x11, 0xb1, 0x81, 0x4f, 0xc2, 0xf3, 0x21, 0xcd, 0x8e, 0x56, 0x81, 0x7b, 0x9d, 0x0a, 0xe5, 0x4e,
+ 0x8f, 0xcb, 0x0d, 0x8c, 0x4b, 0x26, 0x32, 0xee, 0x40, 0x71, 0x57, 0x75, 0xb5, 0x7d, 0xc5, 0xe6,
+ 0x85, 0x24, 0x73, 0x67, 0xfa, 0xee, 0x8c, 0x5c, 0xa0, 0x64, 0xaf, 0xe8, 0x0e, 0xa9, 0x39, 0x1b,
+ 0x3f, 0x0e, 0xfe, 0x4b, 0xd6, 0xe6, 0xff, 0x47, 0xe0, 0x63, 0xc8, 0xab, 0xf9, 0x5f, 0xb6, 0xa6,
+ 0xff, 0xad, 0x14, 0x5c, 0x2e, 0xef, 0x63, 0xed, 0xa0, 0x6c, 0x99, 0x8e, 0xe1, 0xb8, 0x44, 0x77,
+ 0x49, 0xb6, 0xff, 0x5b, 0x90, 0x3b, 0x32, 0xdc, 0x7d, 0x45, 0x37, 0xf6, 0xf6, 0xa8, 0xf5, 0xcc,
+ 0xca, 0x59, 0x42, 0x58, 0x33, 0xf6, 0xf6, 0xd0, 0x23, 0xc8, 0xb4, 0x2d, 0x9d, 0x39, 0xe7, 0x85,
+ 0x87, 0x8b, 0x31, 0xe2, 0x69, 0xd1, 0x9c, 0x6e, 0x7b, 0xd3, 0xd2, 0xb1, 0x4c, 0x33, 0xa3, 0xab,
+ 0x00, 0x1a, 0xa1, 0x76, 0x2c, 0xc3, 0x74, 0xf9, 0xec, 0x1b, 0xa2, 0xa0, 0x2a, 0xe4, 0x5c, 0x6c,
+ 0xb7, 0x0d, 0x53, 0x75, 0xf1, 0xc2, 0x24, 0x55, 0xde, 0xcd, 0xd8, 0x82, 0x77, 0x5a, 0x86, 0xa6,
+ 0xae, 0x61, 0x47, 0xb3, 0x8d, 0x8e, 0x6b, 0xd9, 0x5c, 0x8b, 0x01, 0xb3, 0xf4, 0x1b, 0x19, 0x58,
+ 0xe8, 0xd7, 0x4d, 0x92, 0x3d, 0x64, 0x1b, 0xa6, 0x6c, 0xec, 0x74, 0x5b, 0x2e, 0xef, 0x23, 0x0f,
+ 0x07, 0xa9, 0x20, 0xa6, 0x04, 0x74, 0xbd, 0xa1, 0xe5, 0xf2, 0x62, 0x73, 0x39, 0xa5, 0x7f, 0x2d,
+ 0xc0, 0x14, 0x4b, 0x40, 0x0f, 0x20, 0x6b, 0x93, 0x89, 0x41, 0x31, 0x74, 0x5a, 0xc6, 0xf4, 0xea,
+ 0xa5, 0xb3, 0xd3, 0xc5, 0x69, 0x3a, 0x59, 0xd4, 0xd6, 0xbe, 0x0c, 0x7e, 0xca, 0xd3, 0x34, 0x5f,
+ 0x4d, 0x27, 0xad, 0xe5, 0xb8, 0xaa, 0xed, 0xd2, 0x45, 0xa2, 0x14, 0x43, 0x29, 0x94, 0xb0, 0x81,
+ 0x4f, 0xd0, 0x3a, 0x4c, 0x39, 0xae, 0xea, 0x76, 0x1d, 0xde, 0x5e, 0xe7, 0x2a, 0x6c, 0x9d, 0x72,
+ 0xca, 0x5c, 0x02, 0x71, 0x9f, 0x74, 0xec, 0xaa, 0x46, 0x8b, 0x36, 0x60, 0x4e, 0xe6, 0x4f, 0xd2,
+ 0x6f, 0x0b, 0x30, 0xc5, 0xb2, 0xa2, 0xcb, 0x30, 0x2f, 0xaf, 0x6c, 0x3d, 0xad, 0x28, 0xb5, 0xad,
+ 0xb5, 0x4a, 0xa3, 0x22, 0x6f, 0xd6, 0xb6, 0x56, 0x1a, 0x15, 0x71, 0x02, 0x5d, 0x02, 0xe4, 0x25,
+ 0x94, 0x9f, 0x6f, 0xd5, 0x6b, 0xf5, 0x46, 0x65, 0xab, 0x21, 0x0a, 0x74, 0x8d, 0x84, 0xd2, 0x43,
+ 0xd4, 0x14, 0xba, 0x09, 0xd7, 0x7a, 0xa9, 0x4a, 0xbd, 0xb1, 0xd2, 0xa8, 0x2b, 0x95, 0x7a, 0xa3,
+ 0xb6, 0xb9, 0xd2, 0xa8, 0xac, 0x89, 0xe9, 0x21, 0xb9, 0xc8, 0x4b, 0x64, 0xb9, 0x52, 0x6e, 0x88,
+ 0x19, 0xc9, 0x85, 0x8b, 0x32, 0xd6, 0xac, 0x76, 0xa7, 0xeb, 0x62, 0x52, 0x4a, 0x27, 0xc9, 0x91,
+ 0x72, 0x19, 0xa6, 0x75, 0xfb, 0x44, 0xb1, 0xbb, 0x26, 0x1f, 0x27, 0x53, 0xba, 0x7d, 0x22, 0x77,
+ 0x4d, 0xe9, 0x1f, 0x0b, 0x70, 0xa9, 0xf7, 0xb5, 0x49, 0x76, 0xc2, 0x17, 0x90, 0x57, 0x75, 0x1d,
+ 0xeb, 0x8a, 0x8e, 0x5b, 0xae, 0xca, 0x5d, 0x9c, 0xfb, 0x21, 0x49, 0x7c, 0x69, 0x6f, 0xc9, 0x5f,
+ 0xda, 0xdb, 0x7c, 0x59, 0x2e, 0xd3, 0x82, 0xac, 0x11, 0x0e, 0xcf, 0xfc, 0x50, 0x21, 0x94, 0x22,
+ 0xfd, 0xf7, 0x0c, 0xcc, 0x56, 0x4c, 0xbd, 0x71, 0x9c, 0xe8, 0x5c, 0x72, 0x09, 0xa6, 0x34, 0xab,
+ 0xdd, 0x36, 0x5c, 0x4f, 0x41, 0xec, 0x09, 0xfd, 0x7c, 0xc8, 0x35, 0x4d, 0x8f, 0xe1, 0xa0, 0x05,
+ 0x4e, 0x29, 0xfa, 0x36, 0x5c, 0x26, 0x56, 0xd3, 0x36, 0xd5, 0x96, 0xc2, 0xa4, 0x29, 0xae, 0x6d,
+ 0x34, 0x9b, 0xd8, 0xe6, 0xcb, 0x89, 0x77, 0x63, 0xca, 0x59, 0xe3, 0x1c, 0x65, 0xca, 0xd0, 0x60,
+ 0xf9, 0xe5, 0x8b, 0x46, 0x1c, 0x19, 0x7d, 0x02, 0x40, 0xa6, 0x22, 0xba, 0x44, 0xe9, 0x70, 0x7b,
+ 0x34, 0x68, 0x8d, 0xd2, 0x33, 0x41, 0x84, 0x81, 0x3c, 0x3b, 0x68, 0x99, 0xe0, 0x90, 0xd7, 0x5d,
+ 0xc3, 0xc6, 0xca, 0x83, 0x8e, 0x46, 0x17, 0x0e, 0xb2, 0xab, 0x85, 0xb3, 0xd3, 0x45, 0x90, 0x19,
+ 0xf9, 0xc1, 0x76, 0x99, 0xe0, 0x12, 0xf6, 0xbb, 0xa3, 0xa1, 0x57, 0x70, 0x2f, 0xb4, 0xfe, 0x41,
+ 0x66, 0x5e, 0x5e, 0x2d, 0xd5, 0x55, 0xf6, 0x8d, 0xe6, 0x3e, 0xb6, 0x15, 0x7f, 0x99, 0x9a, 0xae,
+ 0x44, 0x66, 0xe5, 0x9b, 0x01, 0x43, 0x59, 0x35, 0x59, 0xe9, 0x57, 0xdc, 0x2a, 0xcd, 0xec, 0xeb,
+ 0x8c, 0x28, 0xbf, 0x63, 0x19, 0x8e, 0x65, 0x2e, 0xe4, 0x98, 0xf2, 0xd9, 0x13, 0xba, 0x07, 0xa2,
+ 0x7b, 0x6c, 0x2a, 0xfb, 0x58, 0xb5, 0xdd, 0x5d, 0xac, 0xba, 0x64, 0x96, 0x06, 0x9a, 0xa3, 0xe8,
+ 0x1e, 0x9b, 0xd5, 0x10, 0x19, 0xbd, 0x00, 0xd1, 0x30, 0x95, 0xbd, 0x96, 0xd1, 0xdc, 0x77, 0x95,
+ 0x23, 0xdb, 0x70, 0xb1, 0xb3, 0x30, 0x47, 0x15, 0x12, 0xd7, 0x6f, 0xeb, 0x7c, 0xdd, 0x58, 0x7f,
+ 0x45, 0x72, 0x72, 0xd5, 0x14, 0x0c, 0xf3, 0x09, 0xe5, 0xa7, 0x44, 0x67, 0x3d, 0x93, 0x9d, 0x16,
+ 0xb3, 0xd2, 0x7f, 0x16, 0xa0, 0xe0, 0x75, 0xb7, 0x24, 0x47, 0xc6, 0x5d, 0x10, 0x2d, 0x13, 0x2b,
+ 0x9d, 0x7d, 0xd5, 0xc1, 0x5c, 0x8f, 0x7c, 0xc2, 0x29, 0x58, 0x26, 0xde, 0x26, 0x64, 0xa6, 0x2e,
+ 0xb4, 0x0d, 0x73, 0x8e, 0xab, 0x36, 0x0d, 0xb3, 0x19, 0x52, 0xef, 0xe4, 0xf8, 0x60, 0x41, 0xe4,
+ 0xdc, 0x3e, 0x3d, 0xe2, 0xa5, 0xfc, 0xb1, 0x00, 0x73, 0x2b, 0x7a, 0xdb, 0x30, 0xeb, 0x9d, 0x96,
+ 0x91, 0xe8, 0x1a, 0xc4, 0x4d, 0xc8, 0x39, 0x44, 0x66, 0x60, 0xf0, 0x03, 0x44, 0x99, 0xa5, 0x29,
+ 0xc4, 0xf2, 0x3f, 0x83, 0x22, 0x3e, 0xee, 0x18, 0xec, 0xd3, 0x03, 0x03, 0x42, 0x99, 0xf1, 0xeb,
+ 0x56, 0x08, 0x78, 0x49, 0x12, 0xaf, 0xd3, 0x67, 0x80, 0xc2, 0x55, 0x4a, 0x12, 0xbb, 0x7c, 0x06,
+ 0xf3, 0x54, 0xf4, 0x8e, 0xe9, 0x24, 0xac, 0x2f, 0xe9, 0x97, 0xe0, 0x42, 0x54, 0x74, 0x92, 0xe5,
+ 0x7e, 0xc5, 0x5b, 0x79, 0x13, 0xdb, 0x89, 0x82, 0x58, 0x5f, 0xd7, 0x5c, 0x70, 0x92, 0x65, 0xfe,
+ 0x35, 0x01, 0xae, 0x50, 0xd9, 0xf4, 0xeb, 0xcc, 0x1e, 0xb6, 0x9f, 0x61, 0xd5, 0x49, 0x14, 0x81,
+ 0xdf, 0x80, 0x29, 0x86, 0xa4, 0x69, 0xff, 0x9c, 0x5c, 0xcd, 0x13, 0xcf, 0xa5, 0xee, 0x5a, 0x36,
+ 0xf1, 0x5c, 0x78, 0x92, 0xa4, 0x42, 0x29, 0xae, 0x14, 0x49, 0xd6, 0xf4, 0xef, 0x08, 0x30, 0xc7,
+ 0x9d, 0x46, 0xd2, 0x95, 0xcb, 0xfb, 0xc4, 0x67, 0x42, 0x15, 0xc8, 0x6b, 0xf4, 0x97, 0xe2, 0x9e,
+ 0x74, 0x30, 0x95, 0x5f, 0x18, 0xe6, 0x6f, 0x32, 0xb6, 0xc6, 0x49, 0x07, 0x13, 0xa7, 0xd5, 0xfb,
+ 0x4d, 0x14, 0x15, 0xaa, 0xe4, 0x50, 0x8f, 0x95, 0x8e, 0x23, 0x9a, 0xd7, 0x73, 0xfd, 0xb8, 0x0e,
+ 0xfe, 0x49, 0x9a, 0x2b, 0x81, 0xbd, 0x83, 0x67, 0x4f, 0xd4, 0x47, 0xf9, 0x1c, 0x2e, 0x85, 0x67,
+ 0x97, 0x50, 0xc5, 0x53, 0xe7, 0xa8, 0x78, 0x68, 0x85, 0x3e, 0xa0, 0xa2, 0xcf, 0x20, 0xb4, 0x06,
+ 0xaf, 0xb0, 0x3a, 0x79, 0xe8, 0xe7, 0x3c, 0xea, 0x98, 0x0b, 0xa4, 0x30, 0xba, 0x83, 0xca, 0x90,
+ 0xc5, 0xc7, 0x1d, 0x45, 0xc7, 0x8e, 0xc6, 0x0d, 0x97, 0x14, 0x27, 0x90, 0x14, 0xa5, 0x0f, 0x0f,
+ 0x4c, 0xe3, 0xe3, 0x0e, 0x21, 0xa2, 0x1d, 0x32, 0x7b, 0x79, 0xae, 0x02, 0x2d, 0xb6, 0x33, 0x1a,
+ 0x5e, 0x04, 0x3d, 0x85, 0x8b, 0x2b, 0xfa, 0x5e, 0x02, 0x13, 0x21, 0xfd, 0x40, 0x80, 0xb7, 0x62,
+ 0x5b, 0x2d, 0xc9, 0x89, 0xec, 0x13, 0xc8, 0xd0, 0xca, 0xa7, 0xce, 0x59, 0x79, 0xca, 0x25, 0x7d,
+ 0x37, 0xc5, 0xc7, 0xb8, 0x8c, 0x5b, 0x16, 0x51, 0x6c, 0xe2, 0xab, 0x6c, 0xcf, 0x61, 0xf6, 0xd0,
+ 0x72, 0x89, 0x6f, 0xc2, 0x9b, 0x3d, 0x75, 0xee, 0x66, 0x9f, 0xa1, 0x02, 0xbc, 0x16, 0x7f, 0x09,
+ 0x73, 0xa6, 0x65, 0x2a, 0x51, 0xa1, 0xe7, 0xef, 0x4b, 0x45, 0xd3, 0x32, 0x5f, 0x86, 0xe4, 0xfa,
+ 0x76, 0xa6, 0x47, 0x13, 0x49, 0xda, 0x99, 0xef, 0x09, 0x30, 0xef, 0xbb, 0x4d, 0x09, 0x7b, 0xd0,
+ 0x1f, 0x40, 0xda, 0xb4, 0x8e, 0xce, 0xb3, 0x8a, 0x49, 0xf2, 0x93, 0x59, 0x2f, 0x5a, 0xa2, 0x24,
+ 0xeb, 0xfb, 0x6f, 0x52, 0x90, 0x7b, 0x5a, 0x4e, 0xb2, 0x96, 0x9f, 0xf0, 0x15, 0x72, 0xd6, 0xde,
+ 0x71, 0xbd, 0xdd, 0x7f, 0xdf, 0xd2, 0xd3, 0xf2, 0x06, 0x3e, 0xf1, 0x7a, 0x3b, 0xe1, 0x42, 0x2b,
+ 0x90, 0x73, 0xf7, 0x6d, 0xec, 0xec, 0x5b, 0x2d, 0xfd, 0x3c, 0x6e, 0x4e, 0xc0, 0x55, 0xc2, 0x30,
+ 0x49, 0xe5, 0x7a, 0xd1, 0x18, 0x42, 0x4c, 0x34, 0x06, 0x79, 0x8d, 0xef, 0x29, 0xa6, 0xce, 0xf3,
+ 0x9a, 0x90, 0x8b, 0x38, 0x29, 0x4e, 0x49, 0x2f, 0x00, 0x48, 0x75, 0x92, 0x6c, 0x92, 0x5f, 0x4f,
+ 0x43, 0x61, 0xbb, 0xeb, 0xec, 0x27, 0xdc, 0xfb, 0xca, 0x00, 0x9d, 0xae, 0x43, 0x21, 0xc8, 0xb1,
+ 0xc9, 0xeb, 0x3c, 0x22, 0xd0, 0xc3, 0xab, 0x34, 0xe3, 0x6b, 0x1c, 0x9b, 0xa8, 0xca, 0x85, 0x60,
+ 0x25, 0x88, 0x16, 0xb9, 0x31, 0x0c, 0xac, 0x36, 0x8e, 0xcd, 0x4d, 0xec, 0xa3, 0x54, 0x26, 0x09,
+ 0x13, 0x49, 0x9f, 0xc0, 0x34, 0x79, 0x50, 0x5c, 0xeb, 0x3c, 0xcd, 0x3c, 0x45, 0x78, 0x1a, 0x16,
+ 0x7a, 0x0c, 0x39, 0xc6, 0x4d, 0x66, 0xbf, 0x29, 0x3a, 0xfb, 0xc5, 0xd5, 0x85, 0xab, 0x91, 0xce,
+ 0x7b, 0x59, 0xca, 0x4a, 0xe6, 0xba, 0x0b, 0x30, 0xb9, 0x67, 0xd9, 0x9a, 0xf7, 0xbd, 0x97, 0x3d,
+ 0xb0, 0xf6, 0x5c, 0xcf, 0x64, 0xb3, 0x62, 0x6e, 0x3d, 0x93, 0xcd, 0x89, 0x20, 0xfd, 0xb6, 0x00,
+ 0x45, 0xbf, 0x21, 0x92, 0x9c, 0x10, 0xca, 0x11, 0x2d, 0x9e, 0xbf, 0x29, 0x88, 0x02, 0xa5, 0x7f,
+ 0x4b, 0x3d, 0x22, 0xcd, 0x3a, 0xa4, 0x2d, 0x93, 0x64, 0x4f, 0x79, 0xcc, 0x62, 0x81, 0x52, 0xe7,
+ 0x6d, 0x5d, 0x1a, 0x16, 0xf4, 0x00, 0x2e, 0x18, 0x6d, 0x62, 0xcf, 0x0d, 0xb7, 0x75, 0xc2, 0x61,
+ 0x9b, 0x8b, 0xbd, 0x0f, 0xcb, 0xf3, 0x41, 0x5a, 0xd9, 0x4b, 0x92, 0xfe, 0x1e, 0x5d, 0x00, 0x0f,
+ 0x6a, 0x92, 0xa4, 0xaa, 0x6b, 0x30, 0x6b, 0x33, 0xd1, 0xc4, 0xad, 0x39, 0xa7, 0xb6, 0x67, 0x7c,
+ 0x56, 0xa2, 0xf0, 0xdf, 0x4d, 0x41, 0xf1, 0x45, 0x17, 0xdb, 0x27, 0x5f, 0x27, 0x75, 0xdf, 0x86,
+ 0xe2, 0x91, 0x6a, 0xb8, 0xca, 0x9e, 0x65, 0x2b, 0xdd, 0x8e, 0xae, 0xba, 0x5e, 0x40, 0xca, 0x2c,
+ 0x21, 0x3f, 0xb1, 0xec, 0x1d, 0x4a, 0x44, 0x18, 0xd0, 0x81, 0x69, 0x1d, 0x99, 0x0a, 0x21, 0x53,
+ 0xa0, 0x7c, 0x6c, 0xf2, 0x55, 0xe9, 0xd5, 0x0f, 0xff, 0xd3, 0xe9, 0xe2, 0xa3, 0xb1, 0xc2, 0xcc,
+ 0x68, 0x48, 0x5d, 0xb7, 0x6b, 0xe8, 0x4b, 0x3b, 0x3b, 0xb5, 0x35, 0x59, 0xa4, 0x22, 0x5f, 0x31,
+ 0x89, 0x8d, 0x63, 0xd3, 0x91, 0xfe, 0x7e, 0x0a, 0xc4, 0x40, 0x47, 0x49, 0x36, 0x64, 0x05, 0xf2,
+ 0xaf, 0xbb, 0xd8, 0x36, 0xde, 0xa0, 0x19, 0x81, 0x33, 0x12, 0xb3, 0xf3, 0x39, 0xcc, 0x44, 0x34,
+ 0x90, 0xfe, 0x6a, 0x1a, 0xc8, 0x1f, 0x05, 0x95, 0x47, 0xf7, 0x61, 0xce, 0x3d, 0x36, 0x15, 0x16,
+ 0x60, 0xc8, 0x82, 0x52, 0xbc, 0x78, 0x89, 0xa2, 0x4b, 0xf4, 0x41, 0xe8, 0x34, 0x20, 0xc5, 0x91,
+ 0x7e, 0x5f, 0x00, 0x44, 0x15, 0x55, 0x63, 0x9f, 0x0d, 0xbe, 0x2e, 0xfd, 0xe9, 0x2e, 0x88, 0x34,
+ 0x64, 0x53, 0x31, 0xf6, 0x94, 0xb6, 0xe1, 0x38, 0x86, 0xd9, 0xe4, 0x1d, 0xaa, 0x40, 0xe9, 0xb5,
+ 0xbd, 0x4d, 0x46, 0x95, 0xfe, 0x1a, 0xcc, 0x47, 0x2a, 0x90, 0x64, 0x63, 0x5f, 0x87, 0x99, 0x3d,
+ 0xf6, 0x95, 0x96, 0x0a, 0xe7, 0x2b, 0x8e, 0x79, 0x4a, 0x63, 0xef, 0x93, 0xfe, 0x3c, 0x05, 0x17,
+ 0x64, 0xec, 0x58, 0xad, 0x43, 0x9c, 0xbc, 0x0a, 0xab, 0xc0, 0x3f, 0xe7, 0x28, 0x6f, 0xa4, 0xc9,
+ 0x1c, 0x63, 0x66, 0xd3, 0x5c, 0x74, 0xd9, 0xfe, 0xe6, 0xf0, 0x1e, 0xdb, 0xbf, 0x50, 0xcf, 0x97,
+ 0xfd, 0x32, 0x91, 0x65, 0x3f, 0x0b, 0x8a, 0x46, 0xd3, 0xb4, 0x88, 0x4d, 0x73, 0xf0, 0x6b, 0xb3,
+ 0xdb, 0xf6, 0xc0, 0xd0, 0xd2, 0xb0, 0x42, 0xd6, 0x18, 0x4b, 0x1d, 0xbf, 0xde, 0xea, 0xb6, 0xa9,
+ 0xef, 0xbc, 0x7a, 0x89, 0x94, 0xf7, 0xec, 0x74, 0xb1, 0x10, 0x49, 0x73, 0xe4, 0x82, 0xe1, 0x3f,
+ 0x13, 0xe9, 0xd2, 0xb7, 0xe0, 0x62, 0x8f, 0xb2, 0x93, 0xf4, 0x78, 0xfe, 0x55, 0x1a, 0xae, 0x44,
+ 0xc5, 0x27, 0x0d, 0x71, 0xbe, 0xee, 0x0d, 0x5a, 0x85, 0xd9, 0xb6, 0x61, 0xbe, 0xd9, 0xea, 0xe5,
+ 0x4c, 0xdb, 0x30, 0x83, 0x95, 0xe2, 0x98, 0xae, 0x31, 0xf5, 0x33, 0xed, 0x1a, 0x2a, 0x94, 0xe2,
+ 0xda, 0x2e, 0xc9, 0xfe, 0xf1, 0x5d, 0x01, 0x66, 0x92, 0x5e, 0x96, 0x7b, 0xb3, 0x40, 0x39, 0xa9,
+ 0x01, 0xb3, 0x3f, 0x83, 0x75, 0xbc, 0xdf, 0x15, 0x00, 0x35, 0xec, 0xae, 0x49, 0x40, 0xed, 0x33,
+ 0xab, 0x99, 0x64, 0x35, 0x2f, 0xc0, 0xa4, 0x61, 0xea, 0xf8, 0x98, 0x56, 0x33, 0x23, 0xb3, 0x87,
+ 0xc8, 0xd7, 0xc9, 0xf4, 0x58, 0x5f, 0x27, 0xa5, 0xcf, 0x61, 0x3e, 0x52, 0xc4, 0x24, 0xeb, 0xff,
+ 0xdf, 0x52, 0x30, 0xcf, 0x2b, 0x92, 0xf8, 0x0a, 0xe6, 0x37, 0x60, 0xb2, 0x45, 0x64, 0x0e, 0x69,
+ 0x67, 0xfa, 0x4e, 0xaf, 0x9d, 0x69, 0x66, 0xf4, 0x0b, 0x00, 0x1d, 0x1b, 0x1f, 0x2a, 0x8c, 0x35,
+ 0x3d, 0x16, 0x6b, 0x8e, 0x70, 0x50, 0x02, 0xfa, 0xbe, 0x00, 0x45, 0x32, 0xa0, 0x3b, 0xb6, 0xd5,
+ 0xb1, 0x1c, 0xe2, 0xb3, 0x38, 0xe3, 0xc1, 0x9c, 0x17, 0x67, 0xa7, 0x8b, 0xb3, 0x9b, 0x86, 0xb9,
+ 0xcd, 0x19, 0x1b, 0xf5, 0xb1, 0xf7, 0x00, 0x78, 0x3b, 0x21, 0x96, 0xca, 0x2d, 0x4b, 0x3b, 0x08,
+ 0xbe, 0xb7, 0x11, 0xcb, 0xe2, 0x8b, 0x73, 0xa4, 0x3f, 0x12, 0xe0, 0xc2, 0xcf, 0x6c, 0xb9, 0xf8,
+ 0xff, 0x87, 0xb2, 0xa5, 0x97, 0x20, 0xd2, 0x1f, 0x35, 0x73, 0xcf, 0x4a, 0x72, 0xe1, 0xfe, 0x37,
+ 0x04, 0x98, 0x0b, 0x09, 0x4e, 0xd2, 0xc1, 0x79, 0x23, 0x3d, 0x49, 0xbf, 0x44, 0x5c, 0x9e, 0xf0,
+ 0x28, 0x49, 0x72, 0x0c, 0xfe, 0xf3, 0x14, 0x5c, 0x2a, 0xb3, 0xcf, 0xdc, 0x5e, 0xdc, 0x47, 0x92,
+ 0x3d, 0x63, 0x01, 0xa6, 0x0f, 0xb1, 0xed, 0x18, 0x16, 0x9b, 0x7e, 0x67, 0x65, 0xef, 0x11, 0x95,
+ 0x20, 0xeb, 0x98, 0x6a, 0xc7, 0xd9, 0xb7, 0xbc, 0xef, 0x7b, 0xfe, 0xb3, 0x1f, 0xa3, 0x32, 0xf9,
+ 0xe6, 0x31, 0x2a, 0x53, 0xc3, 0x63, 0x54, 0xa6, 0xbf, 0x42, 0x8c, 0x0a, 0xff, 0x98, 0xf6, 0xef,
+ 0x04, 0xb8, 0xdc, 0xa7, 0xb9, 0x24, 0x7b, 0xcb, 0x77, 0x20, 0xaf, 0x71, 0xc1, 0xc4, 0x60, 0xb3,
+ 0x2f, 0x85, 0x35, 0x92, 0xed, 0x0d, 0x71, 0xcb, 0xd9, 0xe9, 0x22, 0x78, 0x45, 0xad, 0xad, 0x71,
+ 0xe5, 0x90, 0xdf, 0xba, 0xf4, 0xab, 0xb3, 0x50, 0xac, 0x1c, 0xb3, 0x55, 0xf2, 0x3a, 0x73, 0x13,
+ 0xd0, 0x13, 0xc8, 0x76, 0x6c, 0xeb, 0xd0, 0xf0, 0xaa, 0x51, 0x88, 0x04, 0x28, 0x78, 0xd5, 0xe8,
+ 0xe1, 0xda, 0xe6, 0x1c, 0xb2, 0xcf, 0x8b, 0x1a, 0x90, 0x7b, 0x66, 0x69, 0x6a, 0xeb, 0x89, 0xd1,
+ 0xf2, 0x7a, 0xfe, 0xfb, 0xa3, 0x05, 0x2d, 0xf9, 0x3c, 0xdb, 0xaa, 0xbb, 0xef, 0x35, 0x82, 0x4f,
+ 0x44, 0x35, 0xc8, 0x56, 0x5d, 0xb7, 0x43, 0x12, 0xb9, 0xed, 0xb8, 0x33, 0x86, 0x50, 0xc2, 0xe2,
+ 0x45, 0xc9, 0x7a, 0xec, 0xa8, 0x01, 0x73, 0x4f, 0xe9, 0x9e, 0xaf, 0x72, 0xcb, 0xea, 0xea, 0x65,
+ 0xcb, 0xdc, 0x33, 0x9a, 0xdc, 0x6e, 0xdf, 0x1e, 0x43, 0xe6, 0xd3, 0x72, 0x5d, 0xee, 0x17, 0x80,
+ 0x56, 0x20, 0x5b, 0x7f, 0xc4, 0x85, 0x31, 0xbf, 0xee, 0xd6, 0x18, 0xc2, 0xea, 0x8f, 0x64, 0x9f,
+ 0x0d, 0xad, 0x43, 0x7e, 0xe5, 0x8b, 0xae, 0x8d, 0xb9, 0x94, 0xa9, 0x81, 0xd1, 0x11, 0xbd, 0x52,
+ 0x28, 0x97, 0x1c, 0x66, 0x46, 0x75, 0x28, 0xbc, 0xb2, 0xec, 0x83, 0x96, 0xa5, 0x7a, 0x35, 0x9c,
+ 0xa6, 0xe2, 0x7e, 0x6e, 0x0c, 0x71, 0x1e, 0xa3, 0xdc, 0x23, 0x02, 0x7d, 0x0b, 0x8a, 0xa4, 0x31,
+ 0x1a, 0xea, 0x6e, 0xcb, 0x2b, 0x64, 0x96, 0x4a, 0x7d, 0x77, 0x0c, 0xa9, 0x3e, 0xa7, 0xb7, 0xf0,
+ 0xdf, 0x23, 0xaa, 0x24, 0xc3, 0x6c, 0xa4, 0x13, 0x20, 0x04, 0x99, 0x0e, 0x69, 0x6f, 0x81, 0xc6,
+ 0x2f, 0xd1, 0xdf, 0xe8, 0x3d, 0x98, 0x36, 0x2d, 0x1d, 0x7b, 0x23, 0x64, 0x76, 0xf5, 0xc2, 0xd9,
+ 0xe9, 0xe2, 0xd4, 0x96, 0xa5, 0x33, 0x8f, 0x86, 0xff, 0x92, 0xa7, 0x48, 0xa6, 0x9a, 0x5e, 0xba,
+ 0x06, 0x19, 0xd2, 0xee, 0xc4, 0x30, 0xed, 0xaa, 0x0e, 0xde, 0xb1, 0x0d, 0x2e, 0xcd, 0x7b, 0x2c,
+ 0xfd, 0xa3, 0x14, 0xa4, 0xea, 0x8f, 0x88, 0xcf, 0xbe, 0xdb, 0xd5, 0x0e, 0xb0, 0xcb, 0xd3, 0xf9,
+ 0x13, 0xf5, 0xe5, 0x6d, 0xbc, 0x67, 0x30, 0xd7, 0x2a, 0x27, 0xf3, 0x27, 0xf4, 0x0e, 0x80, 0xaa,
+ 0x69, 0xd8, 0x71, 0x14, 0x6f, 0x2f, 0x60, 0x4e, 0xce, 0x31, 0xca, 0x06, 0x3e, 0x21, 0x6c, 0x0e,
+ 0xd6, 0x6c, 0xec, 0x7a, 0xc1, 0x57, 0xec, 0x89, 0xb0, 0xb9, 0xb8, 0xdd, 0x51, 0x5c, 0xeb, 0x00,
+ 0x9b, 0xb4, 0x9f, 0xe4, 0x88, 0xa9, 0x69, 0x77, 0x1a, 0x84, 0x40, 0xac, 0x24, 0x36, 0xf5, 0xc0,
+ 0xa4, 0xe5, 0x64, 0xff, 0x99, 0x88, 0xb4, 0x71, 0xd3, 0xe0, 0xdb, 0xe5, 0x72, 0x32, 0x7f, 0x22,
+ 0x5a, 0x52, 0xbb, 0xee, 0x3e, 0x6d, 0x89, 0x9c, 0x4c, 0x7f, 0xa3, 0xdb, 0x50, 0x64, 0xf1, 0x9a,
+ 0x0a, 0x36, 0x35, 0x85, 0x1a, 0xd7, 0x1c, 0x4d, 0x9e, 0x65, 0xe4, 0x8a, 0xa9, 0x11, 0x53, 0x8a,
+ 0x1e, 0x01, 0x27, 0x28, 0x07, 0x6d, 0x87, 0xe8, 0x14, 0x48, 0xae, 0xd5, 0xe2, 0xd9, 0xe9, 0x62,
+ 0xbe, 0x4e, 0x13, 0x36, 0x36, 0xeb, 0xb5, 0x35, 0x39, 0xcf, 0x72, 0x6d, 0xb4, 0x9d, 0x9a, 0x5e,
+ 0xfa, 0x4d, 0x01, 0xd2, 0x4f, 0xcb, 0xf5, 0x73, 0xab, 0xcc, 0x2b, 0x68, 0x3a, 0x54, 0xd0, 0x3b,
+ 0x50, 0xdc, 0x35, 0x5a, 0x2d, 0xc3, 0x6c, 0x12, 0x2f, 0xea, 0x3b, 0x58, 0xf3, 0x14, 0x56, 0xe0,
+ 0xe4, 0x6d, 0x46, 0x45, 0xd7, 0x20, 0xaf, 0xd9, 0x58, 0xc7, 0xa6, 0x6b, 0xa8, 0x2d, 0x87, 0x6b,
+ 0x2e, 0x4c, 0x2a, 0xfd, 0x8a, 0x00, 0x93, 0x74, 0x04, 0xa0, 0xb7, 0x21, 0xa7, 0x59, 0xa6, 0xab,
+ 0x1a, 0x26, 0x37, 0x65, 0x39, 0x39, 0x20, 0x0c, 0x2c, 0xde, 0x75, 0x98, 0x51, 0x35, 0xcd, 0xea,
+ 0x9a, 0xae, 0x62, 0xaa, 0x6d, 0xcc, 0x8b, 0x99, 0xe7, 0xb4, 0x2d, 0xb5, 0x8d, 0xd1, 0x22, 0x78,
+ 0x8f, 0xfe, 0x16, 0xcf, 0x9c, 0x0c, 0x9c, 0xb4, 0x81, 0x4f, 0x4a, 0x7f, 0x20, 0x40, 0xd6, 0x1b,
+ 0x33, 0xa4, 0x18, 0x4d, 0x6c, 0xb2, 0xa0, 0x72, 0xaf, 0x18, 0x3e, 0xa1, 0x77, 0xaa, 0xcc, 0x05,
+ 0x53, 0xe5, 0x05, 0x98, 0x74, 0xc9, 0xb0, 0xe0, 0x25, 0x60, 0x0f, 0x74, 0x3d, 0xbb, 0xa5, 0x36,
+ 0xd9, 0x72, 0x5e, 0x4e, 0x66, 0x0f, 0xa4, 0x32, 0x3c, 0xec, 0x97, 0x69, 0x84, 0x3f, 0x91, 0x92,
+ 0xb2, 0xe0, 0xd4, 0x5d, 0xdc, 0x34, 0x4c, 0xda, 0x97, 0xd2, 0x32, 0x50, 0xd2, 0x2a, 0xa1, 0xa0,
+ 0xb7, 0x20, 0xc7, 0x32, 0x60, 0x53, 0xa7, 0x1d, 0x2a, 0x2d, 0x67, 0x29, 0xa1, 0x62, 0xea, 0x25,
+ 0x0c, 0x39, 0x7f, 0x70, 0x92, 0x66, 0xeb, 0x3a, 0xbe, 0x22, 0xe9, 0x6f, 0xf4, 0x3e, 0x5c, 0x78,
+ 0xdd, 0x55, 0x5b, 0xc6, 0x1e, 0x5d, 0xa9, 0xa3, 0x51, 0xf7, 0x54, 0x67, 0xac, 0x26, 0xc8, 0x4f,
+ 0xa3, 0x12, 0xa8, 0xea, 0xbc, 0xb1, 0x9c, 0x0e, 0xc6, 0xb2, 0xf4, 0x7b, 0x02, 0xcc, 0xb1, 0xc8,
+ 0x23, 0x16, 0x30, 0x9b, 0x9c, 0x1f, 0xf2, 0x31, 0xe4, 0x74, 0xd5, 0x55, 0xd9, 0xa6, 0xd5, 0xd4,
+ 0xd0, 0x4d, 0xab, 0xfe, 0x26, 0x0a, 0xd5, 0x55, 0xe9, 0xc6, 0x55, 0x04, 0x19, 0xf2, 0x9b, 0xed,
+ 0xef, 0x95, 0xe9, 0x6f, 0xe9, 0x33, 0x40, 0xe1, 0x82, 0x26, 0xe9, 0x91, 0xdd, 0x83, 0x8b, 0x44,
+ 0xd7, 0x15, 0x53, 0xb3, 0x4f, 0x3a, 0xae, 0x61, 0x99, 0xcf, 0xe9, 0x5f, 0x07, 0x89, 0xa1, 0x0f,
+ 0x5b, 0xf4, 0x7b, 0x96, 0xf4, 0xa3, 0x29, 0x98, 0xad, 0x1c, 0x77, 0x2c, 0x3b, 0xd1, 0x65, 0xb0,
+ 0x55, 0x98, 0xe6, 0x2b, 0x05, 0x43, 0xbe, 0x5d, 0xf7, 0x18, 0x73, 0xef, 0xc3, 0x3d, 0x67, 0x44,
+ 0xab, 0x00, 0x2c, 0xa8, 0x95, 0x06, 0x2e, 0xa5, 0xcf, 0xf1, 0xa9, 0x8d, 0xb2, 0xd1, 0x0d, 0x1c,
+ 0x5b, 0x90, 0x6f, 0x1f, 0x6a, 0x9a, 0xb2, 0x67, 0xb4, 0x5c, 0x1e, 0x1b, 0x18, 0x1f, 0xc6, 0xbe,
+ 0xf9, 0xb2, 0x5c, 0x7e, 0x42, 0x33, 0xb1, 0x30, 0xbd, 0xe0, 0x59, 0x06, 0x22, 0x81, 0xfd, 0x46,
+ 0xef, 0x02, 0xdf, 0x4c, 0xa4, 0x38, 0xde, 0xbe, 0xc1, 0xd5, 0xd9, 0xb3, 0xd3, 0xc5, 0x9c, 0x4c,
+ 0xa9, 0xf5, 0x7a, 0x43, 0xce, 0xb1, 0x0c, 0x75, 0xc7, 0x45, 0x37, 0x60, 0xd6, 0x6a, 0x1b, 0xae,
+ 0xe2, 0x39, 0x49, 0xdc, 0xa3, 0x9c, 0x21, 0x44, 0xcf, 0x89, 0x3a, 0xcf, 0x1e, 0x93, 0xe9, 0xb1,
+ 0xf7, 0x98, 0xa0, 0xbf, 0x29, 0xc0, 0x25, 0xae, 0x48, 0x65, 0x97, 0xc6, 0xe1, 0xab, 0x2d, 0xc3,
+ 0x3d, 0x51, 0x0e, 0x0e, 0x17, 0xb2, 0xd4, 0x6f, 0xfd, 0xf9, 0xd8, 0x06, 0x09, 0xf5, 0x83, 0x25,
+ 0xaf, 0x59, 0x4e, 0x9e, 0x71, 0xe6, 0x8d, 0xc3, 0x8a, 0xe9, 0xda, 0x27, 0xab, 0x97, 0xcf, 0x4e,
+ 0x17, 0xe7, 0xfb, 0x53, 0x5f, 0xca, 0xf3, 0x4e, 0x3f, 0x0b, 0xaa, 0x02, 0x60, 0xbf, 0x1f, 0xd2,
+ 0x19, 0x23, 0xde, 0xff, 0x88, 0xed, 0xb0, 0x72, 0x88, 0x17, 0xdd, 0x05, 0x91, 0xef, 0xe9, 0xd9,
+ 0x33, 0x5a, 0x58, 0x71, 0x8c, 0x2f, 0x30, 0x9d, 0x5b, 0xd2, 0x72, 0x81, 0xd1, 0x89, 0x88, 0xba,
+ 0xf1, 0x05, 0x2e, 0x7d, 0x07, 0x16, 0x06, 0x95, 0x3e, 0x3c, 0x04, 0x72, 0xec, 0x93, 0xee, 0x47,
+ 0xd1, 0xf5, 0x9c, 0x31, 0xba, 0x2a, 0x5f, 0xd3, 0xf9, 0x38, 0xf5, 0x91, 0x20, 0xfd, 0x83, 0x14,
+ 0xcc, 0xae, 0x76, 0x5b, 0x07, 0xcf, 0x3b, 0xf5, 0x6e, 0xbb, 0xad, 0xda, 0x27, 0xc4, 0x0c, 0x32,
+ 0x43, 0x41, 0x0a, 0x28, 0x30, 0x33, 0x48, 0x2d, 0x81, 0xf1, 0x05, 0x26, 0x93, 0x53, 0x28, 0x5c,
+ 0x86, 0xef, 0x33, 0xa0, 0x75, 0x08, 0xc8, 0x74, 0x2b, 0xc0, 0x47, 0xb0, 0x10, 0xca, 0x48, 0x17,
+ 0x5f, 0x14, 0x6c, 0xba, 0xb6, 0x81, 0xd9, 0x02, 0x62, 0x5a, 0x0e, 0xc5, 0xf4, 0xd4, 0x48, 0x72,
+ 0x85, 0xa5, 0xa2, 0x06, 0xcc, 0x90, 0x8c, 0x27, 0x0a, 0x9d, 0x42, 0xbc, 0x05, 0xde, 0x07, 0x31,
+ 0xd5, 0x8a, 0x94, 0x7b, 0x89, 0xea, 0xa7, 0x4c, 0x79, 0xe8, 0x4f, 0x39, 0x8f, 0x03, 0x4a, 0xe9,
+ 0x53, 0x10, 0x7b, 0x33, 0x84, 0x75, 0x99, 0x61, 0xba, 0xbc, 0x10, 0xd6, 0x65, 0x3a, 0xa4, 0xa7,
+ 0xf5, 0x4c, 0x36, 0x23, 0x4e, 0x4a, 0x7f, 0x96, 0x86, 0x82, 0xd7, 0xcd, 0x92, 0x04, 0x3a, 0xab,
+ 0x30, 0x49, 0x3a, 0x85, 0x17, 0x81, 0x72, 0x7b, 0x48, 0xef, 0xe6, 0x91, 0xed, 0xa4, 0xb3, 0x78,
+ 0x20, 0x99, 0xb2, 0x26, 0x61, 0x70, 0x4a, 0xbf, 0x92, 0x82, 0x0c, 0xc5, 0x16, 0x0f, 0x20, 0x43,
+ 0x27, 0x0a, 0x61, 0x9c, 0x89, 0x82, 0x66, 0xf5, 0xa7, 0xb3, 0x54, 0xc8, 0x35, 0x25, 0x3e, 0xdf,
+ 0xbe, 0xfa, 0xc1, 0x83, 0x87, 0xd4, 0xd8, 0xcc, 0xc8, 0xfc, 0x09, 0xad, 0xd2, 0xd0, 0x28, 0xcb,
+ 0x76, 0xb1, 0xce, 0x7d, 0xfa, 0x6b, 0xa3, 0xda, 0xd7, 0x9b, 0x94, 0x3c, 0x3e, 0x74, 0x05, 0xd2,
+ 0xc4, 0x8a, 0x4d, 0xb3, 0x28, 0x87, 0xb3, 0xd3, 0xc5, 0x34, 0xb1, 0x5f, 0x84, 0x86, 0x96, 0x21,
+ 0x1f, 0x35, 0x19, 0xc4, 0x83, 0xa3, 0x86, 0x31, 0x34, 0xdc, 0xa1, 0xe5, 0x0f, 0x2d, 0x86, 0x67,
+ 0x79, 0x1b, 0xff, 0x8f, 0x0c, 0xcc, 0xd6, 0xda, 0x49, 0x4f, 0x29, 0x2b, 0xd1, 0x16, 0x8e, 0x03,
+ 0x42, 0x91, 0x97, 0xc6, 0x34, 0x70, 0x64, 0x06, 0x4f, 0x9f, 0x6f, 0x06, 0xaf, 0x11, 0x4f, 0x99,
+ 0x1f, 0x3c, 0x91, 0x1e, 0x80, 0x79, 0xa2, 0xef, 0xa7, 0x7e, 0x8a, 0x4c, 0x78, 0x82, 0xbd, 0x1e,
+ 0x34, 0x52, 0xe5, 0x53, 0xea, 0x90, 0xb3, 0x5e, 0x36, 0x35, 0x7e, 0x2f, 0x9b, 0xc6, 0xa6, 0x4e,
+ 0x27, 0xb5, 0xa8, 0x45, 0x9d, 0x7e, 0x73, 0x8b, 0x5a, 0x72, 0x79, 0x67, 0xfd, 0x18, 0xd2, 0xba,
+ 0xe1, 0x35, 0xce, 0xf8, 0x53, 0x35, 0x61, 0x1a, 0xd1, 0x6b, 0x33, 0xe1, 0x5e, 0xcb, 0x7a, 0x49,
+ 0xa9, 0x06, 0x10, 0xe8, 0x06, 0x5d, 0x83, 0x29, 0xab, 0xa5, 0x7b, 0x9b, 0x5d, 0x66, 0x57, 0x73,
+ 0x67, 0xa7, 0x8b, 0x93, 0xcf, 0x5b, 0x7a, 0x6d, 0x4d, 0x9e, 0xb4, 0x5a, 0x7a, 0x4d, 0xa7, 0xa7,
+ 0x7e, 0xe0, 0x23, 0xc5, 0x8f, 0x84, 0x9b, 0x91, 0xa7, 0x4d, 0x7c, 0xb4, 0x86, 0x1d, 0x8d, 0x77,
+ 0xb8, 0xdf, 0x11, 0xa0, 0xe0, 0xe9, 0x3e, 0x59, 0xa3, 0x92, 0x35, 0xda, 0x7c, 0x90, 0xa5, 0xcf,
+ 0x37, 0xc8, 0x3c, 0x3e, 0xbe, 0xb1, 0xf8, 0xd7, 0x04, 0x1e, 0xdb, 0x5c, 0xd7, 0x54, 0x97, 0x38,
+ 0x15, 0x09, 0x0e, 0x8c, 0x7b, 0x20, 0xda, 0xaa, 0xa9, 0x5b, 0x6d, 0xe3, 0x0b, 0xcc, 0x16, 0x42,
+ 0x1d, 0xfe, 0xd9, 0xb3, 0xe8, 0xd3, 0xe9, 0xaa, 0x9f, 0x23, 0xfd, 0x41, 0x8a, 0xc7, 0x41, 0xfb,
+ 0xc5, 0x48, 0x52, 0x5d, 0xdf, 0x86, 0xb9, 0xf0, 0xd4, 0xc6, 0x42, 0x2d, 0xd9, 0x68, 0x7d, 0x2f,
+ 0x46, 0x5e, 0x5c, 0x41, 0x58, 0x3c, 0xa3, 0x17, 0x5c, 0x1f, 0x9a, 0x11, 0xa9, 0x30, 0x54, 0x86,
+ 0x3c, 0xff, 0xf8, 0x60, 0xee, 0x59, 0x5e, 0xa0, 0xd8, 0xdb, 0x83, 0xc2, 0x22, 0x6b, 0xe6, 0x9e,
+ 0xe5, 0x7d, 0xc8, 0xb7, 0x3d, 0x82, 0x53, 0xfa, 0x45, 0x98, 0xa4, 0xc9, 0x6f, 0x60, 0xa2, 0x79,
+ 0x6b, 0xfe, 0x69, 0x0a, 0x6e, 0xd2, 0xd2, 0xbf, 0xc4, 0xb6, 0xb1, 0x77, 0xb2, 0x6d, 0x5b, 0x2e,
+ 0xd6, 0x5c, 0xac, 0x07, 0x2b, 0xe7, 0x89, 0xda, 0xbd, 0x5c, 0xc7, 0x7b, 0xc1, 0xb9, 0x02, 0xce,
+ 0x7c, 0x2e, 0xb4, 0x01, 0x45, 0x1e, 0x5a, 0xa0, 0xb6, 0x8c, 0x43, 0xac, 0xa8, 0xee, 0x79, 0x66,
+ 0xb7, 0x59, 0xc6, 0xbb, 0x42, 0x58, 0x57, 0x5c, 0xa4, 0x43, 0x8e, 0x0b, 0x33, 0x74, 0x7e, 0x20,
+ 0xd1, 0xd3, 0xaf, 0xb6, 0xa0, 0x98, 0x65, 0xf1, 0x0d, 0xb5, 0x35, 0x39, 0xcb, 0x24, 0xd7, 0x74,
+ 0xe9, 0x3f, 0x0a, 0x70, 0x6b, 0x84, 0x8a, 0x93, 0xec, 0xba, 0x25, 0xc8, 0x1e, 0x92, 0x17, 0x19,
+ 0x5c, 0xc7, 0x59, 0xd9, 0x7f, 0x46, 0x9b, 0x30, 0xbb, 0xa7, 0x1a, 0xad, 0xa0, 0x4b, 0x0f, 0x8e,
+ 0x4f, 0x8c, 0x8f, 0xc6, 0x9d, 0x61, 0xec, 0xac, 0x0f, 0x4b, 0xbf, 0x95, 0x82, 0xb9, 0x15, 0x5d,
+ 0xaf, 0xd7, 0xb9, 0x0d, 0x4c, 0xae, 0xa7, 0x78, 0x20, 0x33, 0x15, 0x80, 0x4c, 0xf4, 0x1e, 0x20,
+ 0xdd, 0x70, 0xd8, 0xc1, 0x27, 0xce, 0xbe, 0xaa, 0x5b, 0x47, 0x41, 0x5c, 0xc6, 0x9c, 0x97, 0x52,
+ 0xf7, 0x12, 0x50, 0x1d, 0x28, 0xda, 0x51, 0x1c, 0x57, 0xf5, 0xbf, 0x3b, 0xdd, 0x1a, 0x6b, 0x4b,
+ 0x19, 0x83, 0x41, 0xfe, 0xa3, 0x9c, 0x23, 0x72, 0xe8, 0x4f, 0xe2, 0xb7, 0x1b, 0xa4, 0xea, 0xae,
+ 0xa2, 0x3a, 0xde, 0xfe, 0x21, 0x76, 0xe4, 0x4a, 0x81, 0xd1, 0x57, 0x1c, 0xb6, 0x2d, 0x88, 0x6d,
+ 0x78, 0x08, 0x54, 0x93, 0x24, 0x24, 0xfe, 0xbb, 0x02, 0x14, 0x64, 0xbc, 0x67, 0x63, 0x27, 0xd1,
+ 0x45, 0x81, 0x27, 0x30, 0x63, 0x33, 0xa9, 0xca, 0x9e, 0x6d, 0xb5, 0xcf, 0x33, 0xae, 0xf2, 0x9c,
+ 0xf1, 0x89, 0x6d, 0xb5, 0xb9, 0x61, 0x79, 0x09, 0x45, 0xbf, 0x8c, 0x49, 0x56, 0xfe, 0xf7, 0xe8,
+ 0x76, 0x69, 0x26, 0x38, 0xe9, 0x00, 0x89, 0x64, 0x35, 0x40, 0x3f, 0x54, 0x85, 0x0b, 0x9a, 0xa4,
+ 0x1a, 0xfe, 0xab, 0x00, 0x85, 0x7a, 0x77, 0x97, 0x9d, 0xd9, 0x95, 0x9c, 0x06, 0x2a, 0x90, 0x6b,
+ 0xe1, 0x3d, 0x57, 0x79, 0xa3, 0x50, 0xfd, 0x2c, 0x61, 0xa5, 0x1b, 0x15, 0x9e, 0x02, 0xd8, 0x74,
+ 0x8b, 0x1d, 0x95, 0x93, 0x3e, 0xa7, 0x9c, 0x1c, 0xe5, 0x25, 0x64, 0xe9, 0x47, 0x69, 0x28, 0xfa,
+ 0xd5, 0x4c, 0xd2, 0x4a, 0xbe, 0x8a, 0x58, 0x87, 0xf4, 0x79, 0xac, 0xc3, 0x1c, 0x8f, 0x09, 0x89,
+ 0xb7, 0x10, 0x4b, 0x30, 0x4f, 0x1d, 0x17, 0x45, 0xed, 0x74, 0x5a, 0x86, 0x07, 0x77, 0xa9, 0xfd,
+ 0xc9, 0xc8, 0x73, 0x34, 0x69, 0x85, 0xa5, 0x50, 0xa0, 0x8b, 0x7e, 0x5d, 0x80, 0x99, 0x3d, 0x1b,
+ 0xe3, 0x2f, 0xb0, 0x42, 0xa1, 0xd7, 0x78, 0x41, 0x2f, 0x6b, 0xa4, 0x0c, 0x5f, 0xf9, 0xa3, 0x78,
+ 0x9e, 0xbd, 0xb8, 0x4e, 0xde, 0x8b, 0xb6, 0x40, 0xd4, 0x5a, 0xec, 0x33, 0xbd, 0x1f, 0x80, 0x73,
+ 0x0e, 0x97, 0xbe, 0xc8, 0x98, 0x7b, 0x76, 0x0f, 0x4a, 0xaf, 0x60, 0x8e, 0x36, 0x72, 0xd2, 0x7b,
+ 0x95, 0xa5, 0x1f, 0xa6, 0x00, 0x85, 0x25, 0xff, 0xec, 0x3a, 0x47, 0x2a, 0xb9, 0xce, 0xf1, 0x2e,
+ 0x20, 0x16, 0x86, 0xe9, 0x28, 0x1d, 0x6c, 0x2b, 0x0e, 0xd6, 0x2c, 0x7e, 0xdc, 0x94, 0x20, 0x8b,
+ 0x3c, 0x65, 0x1b, 0xdb, 0x75, 0x4a, 0x47, 0x2b, 0x00, 0x81, 0x8b, 0xc8, 0x67, 0xb0, 0x71, 0x3c,
+ 0xc4, 0x9c, 0xef, 0x21, 0x4a, 0xdf, 0x13, 0xa0, 0xb0, 0x69, 0x34, 0x6d, 0x35, 0xd1, 0xd3, 0x94,
+ 0xd0, 0xc7, 0xd1, 0xc5, 0xf9, 0xfc, 0xc3, 0x52, 0x5c, 0xe0, 0x10, 0xcb, 0xe1, 0x41, 0x3e, 0xce,
+ 0x40, 0x26, 0x06, 0xbf, 0x44, 0x49, 0x5a, 0xc4, 0x7f, 0x5f, 0x82, 0x19, 0x5e, 0xee, 0x1d, 0xd3,
+ 0xb0, 0x4c, 0xf4, 0x00, 0xd2, 0x4d, 0xfe, 0xf1, 0x25, 0x1f, 0xbb, 0x50, 0x1a, 0x9c, 0x55, 0x58,
+ 0x9d, 0x90, 0x49, 0x5e, 0xc2, 0xd2, 0xe9, 0xba, 0x31, 0xae, 0x69, 0x10, 0x4b, 0x1f, 0x66, 0xe9,
+ 0x74, 0x5d, 0x54, 0x87, 0xa2, 0x16, 0x1c, 0x90, 0xa6, 0x10, 0xf6, 0xf4, 0x40, 0x18, 0x1b, 0x7b,
+ 0x54, 0x5d, 0x75, 0x42, 0x2e, 0x68, 0x91, 0x04, 0x54, 0x0e, 0x9f, 0xcb, 0x95, 0xe9, 0x0b, 0xd4,
+ 0x0b, 0x76, 0x81, 0x47, 0xcf, 0x04, 0xab, 0x4e, 0x84, 0x8e, 0xef, 0x42, 0x1f, 0xc3, 0x94, 0x4e,
+ 0x4f, 0x80, 0xe2, 0x26, 0x25, 0xae, 0xa1, 0x23, 0x07, 0x6d, 0x55, 0x27, 0x64, 0xce, 0x81, 0xd6,
+ 0x61, 0x86, 0xfd, 0x62, 0x8e, 0x22, 0x37, 0x04, 0xb7, 0x06, 0x4b, 0x08, 0x4d, 0xc5, 0xd5, 0x09,
+ 0x39, 0xaf, 0x07, 0x54, 0xf4, 0x0d, 0xc8, 0x38, 0x9a, 0xea, 0xa1, 0xfb, 0xab, 0x03, 0x0e, 0x5e,
+ 0x09, 0x98, 0x69, 0x6e, 0xf4, 0x98, 0x1d, 0x15, 0xea, 0x1e, 0x7b, 0x0b, 0xad, 0x71, 0xc5, 0x8f,
+ 0x6c, 0xf0, 0x27, 0xc5, 0xc7, 0x94, 0x80, 0x9e, 0x42, 0x5e, 0x25, 0x1e, 0xb7, 0x42, 0xb7, 0xc8,
+ 0xd2, 0x95, 0xd5, 0xf8, 0xf0, 0x86, 0xbe, 0x2d, 0xcd, 0x55, 0x7a, 0x8a, 0x80, 0x47, 0x0c, 0x04,
+ 0xb5, 0xb1, 0xdd, 0xc4, 0x0b, 0xf9, 0xe1, 0x82, 0xc2, 0xe1, 0x79, 0xbe, 0x20, 0x4a, 0x24, 0x9e,
+ 0xb7, 0xbf, 0x3f, 0x9d, 0x56, 0x6a, 0x66, 0xe0, 0x07, 0xf5, 0x98, 0x9d, 0x57, 0xd5, 0x09, 0x79,
+ 0x66, 0x3f, 0x44, 0x46, 0x4b, 0x90, 0x6a, 0x6a, 0x0b, 0xb3, 0x03, 0x4d, 0x82, 0xbf, 0xbb, 0xa8,
+ 0x3a, 0x21, 0xa7, 0x9a, 0x1a, 0xfa, 0x14, 0xb2, 0x6c, 0xab, 0xc8, 0xb1, 0xb9, 0x50, 0x18, 0x38,
+ 0xc6, 0xa2, 0x1b, 0x6e, 0xaa, 0x13, 0x32, 0xdd, 0x9d, 0x42, 0xde, 0xb7, 0x0d, 0x05, 0x9b, 0xc5,
+ 0x37, 0x7a, 0xd1, 0xc8, 0xe2, 0xc0, 0x20, 0x83, 0xb8, 0x80, 0xe4, 0x2a, 0xc5, 0x5e, 0x21, 0x3a,
+ 0xfa, 0x36, 0x5c, 0x88, 0x4a, 0xe4, 0x3d, 0x6d, 0x6e, 0xe0, 0x07, 0xf3, 0x81, 0xc1, 0xb1, 0xd5,
+ 0x09, 0x19, 0xd9, 0x7d, 0x89, 0xe8, 0x43, 0x98, 0x64, 0xad, 0x86, 0xa8, 0xc8, 0xb8, 0xb8, 0x99,
+ 0x9e, 0x06, 0x63, 0xf9, 0x49, 0xe7, 0x77, 0x79, 0x90, 0x9f, 0xd2, 0xb2, 0x9a, 0x0b, 0xf3, 0x03,
+ 0x3b, 0x7f, 0x7f, 0xb8, 0x22, 0xe9, 0xfc, 0x6e, 0x40, 0x25, 0xed, 0x6e, 0xb3, 0x14, 0x1e, 0xd8,
+ 0x75, 0x61, 0x60, 0xbb, 0xc7, 0xc4, 0xfe, 0x55, 0xe9, 0xf6, 0x8b, 0x80, 0x4c, 0x8a, 0x66, 0xb3,
+ 0xb3, 0x82, 0x14, 0x3a, 0xa6, 0x2e, 0x0e, 0x2c, 0x5a, 0xff, 0x61, 0x4a, 0x55, 0xea, 0xa5, 0xfa,
+ 0x54, 0xf4, 0x12, 0x44, 0x7e, 0xa2, 0x47, 0xf0, 0x55, 0xe7, 0x12, 0x95, 0x77, 0x2f, 0xd6, 0x74,
+ 0xc5, 0x45, 0x45, 0x55, 0xc9, 0xc4, 0x1f, 0x4d, 0x41, 0x9f, 0xc1, 0x1c, 0x95, 0xa7, 0x68, 0xc1,
+ 0x21, 0x2c, 0x0b, 0x0b, 0x7d, 0x47, 0x7a, 0x0c, 0x3e, 0xaf, 0xc5, 0x93, 0x2c, 0x6a, 0x3d, 0x49,
+ 0xa4, 0x1b, 0x1b, 0xa6, 0xe1, 0x52, 0x2b, 0x5b, 0x1a, 0xd8, 0x8d, 0xa3, 0x07, 0x4a, 0x92, 0x6e,
+ 0x6c, 0x30, 0x0a, 0xe9, 0xc6, 0x2e, 0x8f, 0xfa, 0xe3, 0xcd, 0xf1, 0xf6, 0xc0, 0x6e, 0x1c, 0x17,
+ 0x1e, 0x48, 0xba, 0xb1, 0x1b, 0xa6, 0x93, 0x6e, 0xcc, 0x0c, 0x44, 0x8f, 0xdc, 0x77, 0x06, 0x76,
+ 0xe3, 0x81, 0x5b, 0xd5, 0x49, 0x37, 0x56, 0xfb, 0x12, 0xd1, 0x1a, 0x00, 0x73, 0x28, 0xa9, 0x17,
+ 0x70, 0x75, 0xe0, 0x64, 0xd0, 0x1b, 0xfd, 0x47, 0x26, 0x83, 0x96, 0x47, 0x23, 0x86, 0x8c, 0xc2,
+ 0x55, 0x85, 0x7e, 0xc4, 0x5e, 0x58, 0x1c, 0x68, 0xc8, 0xfa, 0x3e, 0x38, 0x13, 0x43, 0x76, 0xe4,
+ 0x13, 0xc9, 0xac, 0xc2, 0x56, 0xdd, 0x17, 0xae, 0x0d, 0x36, 0xcb, 0xe1, 0x8f, 0x6f, 0xd4, 0x2c,
+ 0x53, 0x02, 0x5a, 0x81, 0x1c, 0x71, 0x72, 0x4e, 0xa8, 0x19, 0xba, 0x3e, 0x10, 0x15, 0xf4, 0xec,
+ 0x2f, 0xaa, 0x4e, 0xc8, 0xd9, 0xd7, 0x9c, 0x44, 0x5e, 0xcf, 0xd6, 0x23, 0x17, 0xa4, 0x81, 0xaf,
+ 0x8f, 0xac, 0x5d, 0x93, 0xd7, 0x33, 0x0e, 0xa4, 0xc1, 0x45, 0xd6, 0x56, 0x7c, 0xd7, 0xb8, 0xcd,
+ 0x37, 0x3a, 0x2f, 0xdc, 0xa0, 0xa2, 0x06, 0x2e, 0xec, 0xc5, 0x6e, 0x66, 0xaf, 0x4e, 0xc8, 0xf3,
+ 0x6a, 0x7f, 0x2a, 0x19, 0xf0, 0x7c, 0xea, 0x61, 0xcb, 0x81, 0x0b, 0x37, 0x07, 0x0e, 0xf8, 0x98,
+ 0x55, 0x54, 0x32, 0xe0, 0xd5, 0x10, 0x99, 0x4d, 0x40, 0xba, 0xe2, 0x38, 0x2c, 0xe4, 0xe1, 0xd6,
+ 0x90, 0x09, 0xa8, 0x67, 0x1d, 0x86, 0x4d, 0x40, 0x7a, 0x9d, 0x71, 0x12, 0x41, 0x5a, 0x0b, 0xab,
+ 0x36, 0x37, 0xb3, 0xb7, 0x07, 0x0a, 0xea, 0x3b, 0xbb, 0x91, 0x08, 0xd2, 0x7c, 0x22, 0x71, 0x78,
+ 0x6c, 0xef, 0x28, 0x20, 0xee, 0x21, 0xdf, 0x19, 0xe8, 0xf0, 0xc4, 0x9e, 0x55, 0x44, 0x1c, 0x1e,
+ 0x3b, 0x92, 0x80, 0x7e, 0x01, 0xa6, 0x39, 0x80, 0x5e, 0xb8, 0x3b, 0xc4, 0x05, 0x0c, 0xaf, 0x79,
+ 0x90, 0x71, 0xcd, 0x79, 0x98, 0x95, 0x65, 0xc0, 0x9d, 0x55, 0xef, 0xde, 0x10, 0x2b, 0xdb, 0xb7,
+ 0x76, 0xc0, 0xac, 0x6c, 0x40, 0x26, 0x56, 0x96, 0xf5, 0x53, 0x3e, 0xd7, 0xdd, 0x1f, 0x68, 0x65,
+ 0xfb, 0x77, 0x2f, 0x11, 0x2b, 0xfb, 0x3a, 0xa0, 0x92, 0x9a, 0x39, 0x0c, 0xc0, 0x2e, 0xfc, 0xdc,
+ 0xc0, 0x9a, 0x45, 0x91, 0x3c, 0xa9, 0x19, 0xe7, 0x21, 0xcd, 0xc6, 0x30, 0x00, 0xd3, 0xf4, 0xbb,
+ 0x83, 0x8f, 0x66, 0xe8, 0x45, 0x59, 0x55, 0x6f, 0xa9, 0x98, 0x69, 0xd8, 0x37, 0x54, 0x36, 0xdf,
+ 0x37, 0xce, 0x35, 0xf5, 0xde, 0x70, 0x43, 0x15, 0xb7, 0xdf, 0xde, 0x37, 0x54, 0x91, 0x44, 0x5a,
+ 0x54, 0xb6, 0x55, 0x90, 0x8e, 0xef, 0xa5, 0x21, 0xa7, 0x48, 0xf4, 0x6c, 0xd8, 0xa4, 0x45, 0xf5,
+ 0x89, 0xc1, 0x10, 0xea, 0xb2, 0x23, 0x4e, 0x16, 0x96, 0x87, 0x0f, 0xa1, 0xe8, 0x21, 0x2b, 0xfe,
+ 0x10, 0xe2, 0x64, 0x7f, 0xce, 0xf4, 0x3c, 0x8c, 0xf7, 0x87, 0xcf, 0x99, 0xbd, 0xae, 0x05, 0x9b,
+ 0x33, 0xb9, 0x4f, 0xf1, 0x37, 0x04, 0xb8, 0xc6, 0xca, 0x46, 0xd7, 0x54, 0x4f, 0x14, 0x7f, 0x65,
+ 0x3a, 0x84, 0x9a, 0x1f, 0xd0, 0x17, 0x7c, 0x38, 0xa8, 0xb8, 0x23, 0x56, 0xda, 0xab, 0x13, 0xf2,
+ 0x3b, 0xea, 0xb0, 0x7c, 0xa4, 0x4b, 0xb5, 0x19, 0x82, 0x5a, 0x78, 0x38, 0xb0, 0x4b, 0x45, 0x51,
+ 0x1f, 0xe9, 0x52, 0x9c, 0x67, 0x75, 0x9a, 0x7f, 0xd7, 0xf6, 0xb7, 0xf9, 0x16, 0x45, 0x71, 0x3d,
+ 0x93, 0xbd, 0x2c, 0x2e, 0xac, 0x67, 0xb2, 0x57, 0xc4, 0xd2, 0x7a, 0x26, 0xfb, 0x96, 0xf8, 0xb6,
+ 0xf4, 0x0f, 0x4b, 0x30, 0xeb, 0x81, 0x2e, 0x06, 0xa8, 0x1e, 0x86, 0x01, 0xd5, 0xd5, 0x41, 0x80,
+ 0x8a, 0xc3, 0x34, 0x8e, 0xa8, 0x1e, 0x86, 0x11, 0xd5, 0xd5, 0x41, 0x88, 0x2a, 0xe0, 0x21, 0x90,
+ 0xaa, 0x31, 0x08, 0x52, 0xdd, 0x1b, 0x03, 0x52, 0xf9, 0xa2, 0x7a, 0x31, 0xd5, 0x5a, 0x3f, 0xa6,
+ 0xba, 0x39, 0x1c, 0x53, 0xf9, 0xa2, 0x42, 0xa0, 0xea, 0x71, 0x0f, 0xa8, 0xba, 0x3e, 0x04, 0x54,
+ 0xf9, 0xfc, 0x1e, 0xaa, 0xda, 0x88, 0x45, 0x55, 0xb7, 0x47, 0xa1, 0x2a, 0x5f, 0x4e, 0x04, 0x56,
+ 0x7d, 0x10, 0x81, 0x55, 0x8b, 0x03, 0x61, 0x95, 0xcf, 0xcd, 0x70, 0xd5, 0x27, 0xbd, 0xb8, 0xea,
+ 0xfa, 0x10, 0x5c, 0x15, 0xd4, 0x80, 0x03, 0xab, 0x6a, 0x1c, 0xb0, 0xba, 0x35, 0x02, 0x58, 0xf9,
+ 0x52, 0xc2, 0xc8, 0xaa, 0x1a, 0x87, 0xac, 0x6e, 0x8d, 0x40, 0x56, 0x3d, 0x92, 0x18, 0xb4, 0xda,
+ 0x8a, 0x87, 0x56, 0x77, 0x46, 0x42, 0x2b, 0x5f, 0x5a, 0x14, 0x5b, 0x2d, 0x87, 0xb0, 0xd5, 0x3b,
+ 0x03, 0xb0, 0x95, 0xcf, 0x4a, 0xc0, 0xd5, 0x37, 0xfb, 0xc0, 0x95, 0x34, 0x0c, 0x5c, 0xf9, 0xbc,
+ 0x3e, 0xba, 0x7a, 0x31, 0x00, 0x5d, 0xdd, 0x1d, 0x8d, 0xae, 0x7c, 0x61, 0x3d, 0xf0, 0x4a, 0x1d,
+ 0x0a, 0xaf, 0xde, 0x1b, 0x13, 0x5e, 0xf9, 0xd2, 0xe3, 0xf0, 0xd5, 0x47, 0x51, 0x7c, 0x75, 0x6d,
+ 0x30, 0xbe, 0xf2, 0xc5, 0x70, 0x80, 0xb5, 0x11, 0x0b, 0xb0, 0x6e, 0x8f, 0x02, 0x58, 0xc1, 0x38,
+ 0x08, 0x23, 0xac, 0xad, 0x78, 0x84, 0x75, 0x67, 0x24, 0xc2, 0x0a, 0x9a, 0x3f, 0x02, 0xb1, 0x36,
+ 0x62, 0x21, 0xd6, 0xed, 0x51, 0x10, 0x2b, 0x28, 0x5c, 0x18, 0x63, 0xbd, 0x1a, 0x88, 0xb1, 0xee,
+ 0x8f, 0x83, 0xb1, 0x7c, 0xa1, 0x7d, 0x20, 0xeb, 0xf3, 0xc1, 0x20, 0xeb, 0xe7, 0xce, 0x71, 0x28,
+ 0x66, 0x2c, 0xca, 0xfa, 0x66, 0x1f, 0xca, 0x92, 0x86, 0xa1, 0xac, 0xa0, 0x3f, 0x7b, 0x30, 0x4b,
+ 0x1d, 0x0a, 0x8a, 0xde, 0x1b, 0x13, 0x14, 0x05, 0x9d, 0x2f, 0x06, 0x15, 0x55, 0x62, 0x50, 0xd1,
+ 0xcd, 0xe1, 0xa8, 0x28, 0x30, 0xe7, 0x01, 0x2c, 0xaa, 0xc6, 0xc1, 0xa2, 0x5b, 0x23, 0x60, 0x51,
+ 0x60, 0x85, 0x42, 0xb8, 0xe8, 0x71, 0x0f, 0x2e, 0xba, 0x3e, 0x32, 0x6c, 0x2b, 0x04, 0x8c, 0x56,
+ 0xfb, 0x81, 0xd1, 0x8d, 0xa1, 0xc0, 0xc8, 0x97, 0x10, 0x20, 0xa3, 0xc7, 0x3d, 0xc8, 0xe8, 0xfa,
+ 0x10, 0x64, 0x14, 0x14, 0x80, 0x43, 0x23, 0x7d, 0x38, 0x34, 0x5a, 0x1a, 0x17, 0x1a, 0xf9, 0x82,
+ 0x63, 0xb1, 0xd1, 0x56, 0x3c, 0x36, 0xba, 0x33, 0x66, 0x44, 0x45, 0x1f, 0x38, 0xaa, 0xc6, 0x81,
+ 0xa3, 0x5b, 0x23, 0xc0, 0x51, 0x78, 0x0e, 0xf1, 0xd1, 0x51, 0x35, 0x0e, 0x1d, 0xdd, 0x1a, 0x81,
+ 0x8e, 0x02, 0x49, 0x21, 0x78, 0xd4, 0x18, 0x04, 0x8f, 0xee, 0x8d, 0x01, 0x8f, 0x02, 0xe7, 0xa5,
+ 0x07, 0x1f, 0x7d, 0xda, 0x8b, 0x8f, 0xa4, 0x61, 0xf8, 0x28, 0x18, 0x91, 0x1e, 0x40, 0xda, 0x8a,
+ 0x07, 0x48, 0x77, 0x46, 0x02, 0xa4, 0xb0, 0x91, 0x0c, 0x21, 0xa4, 0x8d, 0x58, 0x84, 0x74, 0x7b,
+ 0x14, 0x42, 0x0a, 0x8c, 0x64, 0x18, 0x22, 0x7d, 0xda, 0x0b, 0x91, 0xa4, 0x61, 0x10, 0x29, 0xa8,
+ 0x9c, 0x87, 0x91, 0xaa, 0x71, 0x18, 0xe9, 0xd6, 0x08, 0x8c, 0x14, 0x34, 0x5e, 0x08, 0x24, 0xa9,
+ 0x43, 0x41, 0xd2, 0x7b, 0x63, 0x82, 0xa4, 0x1e, 0xc3, 0x15, 0x45, 0x49, 0xd5, 0x38, 0x94, 0x74,
+ 0x6b, 0x04, 0x4a, 0x0a, 0x15, 0x36, 0x80, 0x49, 0x5b, 0xf1, 0x30, 0xe9, 0xce, 0x48, 0x98, 0xd4,
+ 0x33, 0x9a, 0x3c, 0x9c, 0xb4, 0x11, 0x8b, 0x93, 0x6e, 0x8f, 0xc2, 0x49, 0x3d, 0x13, 0x1f, 0x77,
+ 0x0e, 0x7e, 0x75, 0x7c, 0xa0, 0xf4, 0xd1, 0xf9, 0x81, 0x92, 0xff, 0xce, 0x11, 0x48, 0xe9, 0xd3,
+ 0x5e, 0xa4, 0x24, 0x0d, 0x43, 0x4a, 0x41, 0xcf, 0x3a, 0x1f, 0x54, 0x5a, 0xcf, 0x64, 0xdf, 0x16,
+ 0xdf, 0x91, 0xfe, 0x7c, 0x0a, 0xa6, 0xaa, 0x7e, 0xa0, 0x53, 0x50, 0x4b, 0xe1, 0x4d, 0x4e, 0xd6,
+ 0x42, 0x6b, 0x64, 0xc4, 0x53, 0xbb, 0x39, 0xfa, 0x3c, 0xc6, 0xfe, 0x13, 0x03, 0x39, 0xeb, 0x1b,
+ 0x6c, 0x71, 0x47, 0x1f, 0xc0, 0x6c, 0xd7, 0xc1, 0xb6, 0xd2, 0xb1, 0x0d, 0xcb, 0x36, 0x5c, 0xb6,
+ 0x8d, 0x47, 0x58, 0x15, 0xbf, 0x3c, 0x5d, 0x9c, 0xd9, 0x71, 0xb0, 0xbd, 0xcd, 0xe9, 0xf2, 0x4c,
+ 0x37, 0xf4, 0xe4, 0xdd, 0x9d, 0x36, 0x39, 0xfe, 0xdd, 0x69, 0x2f, 0x40, 0xb4, 0xb1, 0xaa, 0x47,
+ 0x3c, 0x18, 0x76, 0x8a, 0x55, 0x7c, 0x9f, 0xa3, 0xdb, 0xec, 0xbc, 0x9c, 0xf4, 0x34, 0xab, 0xa2,
+ 0x1d, 0x25, 0xa2, 0x07, 0x70, 0xb1, 0xad, 0x1e, 0xd3, 0xa0, 0x58, 0xc5, 0x73, 0x0a, 0x69, 0xa0,
+ 0x2b, 0xbb, 0xf0, 0x0c, 0xb5, 0xd5, 0x63, 0x7a, 0x11, 0x1b, 0x4b, 0xa2, 0xb7, 0xa8, 0xdc, 0x82,
+ 0x82, 0x6e, 0x38, 0xae, 0x61, 0x6a, 0x2e, 0x3f, 0x20, 0x99, 0x1d, 0x2e, 0x3c, 0xeb, 0x51, 0xd9,
+ 0x29, 0xc8, 0x65, 0x28, 0x36, 0x55, 0x17, 0x1f, 0xa9, 0x27, 0x8a, 0xb7, 0xbf, 0x2e, 0x4f, 0xcf,
+ 0x02, 0x7d, 0xeb, 0xec, 0x74, 0x71, 0xf6, 0x29, 0x4b, 0xea, 0xdb, 0x66, 0x37, 0xdb, 0x0c, 0x25,
+ 0xe8, 0xe8, 0x0e, 0x14, 0x55, 0xe7, 0xc4, 0xd4, 0x68, 0x95, 0xb1, 0xe9, 0x74, 0x1d, 0x0a, 0x33,
+ 0xb2, 0x72, 0x81, 0x92, 0xcb, 0x1e, 0x15, 0x5d, 0x87, 0x19, 0xbe, 0x3d, 0x80, 0xdd, 0xd6, 0x54,
+ 0xa4, 0xc5, 0xe7, 0xd7, 0x80, 0xb0, 0x0b, 0x9b, 0x1e, 0x43, 0x89, 0x5f, 0x6a, 0x70, 0xa4, 0xda,
+ 0xba, 0x42, 0x35, 0x19, 0xf4, 0x39, 0x91, 0x8a, 0xbd, 0xcc, 0x2e, 0x31, 0x20, 0x19, 0x88, 0xfa,
+ 0x82, 0x71, 0xd1, 0x80, 0x39, 0xad, 0x65, 0xf8, 0xa8, 0x80, 0x39, 0x51, 0x73, 0x03, 0x47, 0x48,
+ 0x99, 0xe6, 0xed, 0xfd, 0xcc, 0x5c, 0xd4, 0xa2, 0x64, 0x54, 0x07, 0x7a, 0x12, 0x90, 0xd2, 0xb1,
+ 0x5a, 0x86, 0x76, 0x42, 0x61, 0x41, 0xf4, 0x88, 0xf6, 0xa1, 0x17, 0x25, 0xbc, 0x52, 0x0d, 0x77,
+ 0x9b, 0x72, 0xca, 0x70, 0xe4, 0xff, 0x66, 0xc7, 0x2b, 0xaf, 0x67, 0xb2, 0x20, 0xe6, 0xd7, 0x33,
+ 0xd9, 0x19, 0x71, 0x76, 0x3d, 0x93, 0x2d, 0x88, 0x45, 0xe9, 0x37, 0x05, 0x98, 0x89, 0xec, 0x8b,
+ 0x7a, 0xdc, 0xf3, 0x11, 0xf9, 0x4a, 0x3c, 0xfe, 0x1b, 0x14, 0x99, 0x98, 0xe5, 0xfd, 0xc5, 0x0b,
+ 0xf3, 0x5c, 0x1c, 0x8c, 0x1f, 0xe8, 0x6a, 0x88, 0x17, 0xf3, 0xe2, 0xb1, 0x7d, 0x9c, 0xf9, 0xfe,
+ 0x0f, 0x16, 0x27, 0xa4, 0xbf, 0xc8, 0xc0, 0x6c, 0x74, 0x17, 0x54, 0xad, 0xa7, 0x5c, 0x71, 0xf6,
+ 0x39, 0xc2, 0xb1, 0x34, 0xe4, 0x26, 0x98, 0x5c, 0x70, 0x99, 0x02, 0x2b, 0xe6, 0xb5, 0x21, 0x9f,
+ 0xca, 0xc3, 0xe5, 0x0c, 0x18, 0x4b, 0xff, 0x21, 0xed, 0xdb, 0xa9, 0x25, 0x98, 0xa4, 0x07, 0x1a,
+ 0xf1, 0xa2, 0x2d, 0xf4, 0xb6, 0x15, 0xf1, 0x59, 0x49, 0xba, 0xcc, 0xb2, 0x11, 0xbb, 0xd6, 0x78,
+ 0xa3, 0x13, 0x03, 0x83, 0xae, 0x77, 0xfe, 0x3b, 0x16, 0xbb, 0xec, 0xc4, 0xc8, 0xff, 0x87, 0x71,
+ 0x31, 0xe4, 0x7d, 0xe8, 0x97, 0xa1, 0xa8, 0x59, 0xad, 0x16, 0x9b, 0xb3, 0x98, 0x65, 0xe8, 0x3f,
+ 0x43, 0x86, 0x16, 0x81, 0x5f, 0xab, 0xb9, 0xe4, 0x5f, 0xaf, 0xb9, 0x24, 0xf3, 0xeb, 0x35, 0x43,
+ 0x41, 0xb7, 0x05, 0x5f, 0x98, 0x67, 0x50, 0x22, 0xf1, 0xbf, 0xd3, 0x6f, 0x12, 0xff, 0xcb, 0x62,
+ 0xc6, 0x79, 0xcf, 0xfb, 0x63, 0x81, 0x07, 0xc4, 0x3c, 0xb3, 0xac, 0x83, 0xae, 0x1f, 0xb7, 0x5b,
+ 0x0a, 0x9f, 0xff, 0x98, 0xfd, 0xf2, 0x74, 0x31, 0x23, 0xfb, 0x07, 0x40, 0xc6, 0x59, 0xe0, 0xd4,
+ 0x57, 0xb3, 0xc0, 0xd7, 0x61, 0xa6, 0x63, 0xe3, 0x3d, 0xec, 0x6a, 0xfb, 0x8a, 0xd9, 0x6d, 0xf3,
+ 0xed, 0x3d, 0x79, 0x8f, 0xb6, 0xd5, 0x6d, 0xa3, 0x7b, 0x20, 0xfa, 0x59, 0x38, 0x56, 0xf6, 0x0e,
+ 0x08, 0xf3, 0xe8, 0x1c, 0x59, 0x4b, 0xff, 0x4b, 0x80, 0xf9, 0x48, 0x9d, 0xf8, 0x98, 0x5a, 0x87,
+ 0xbc, 0xee, 0xcf, 0x79, 0xce, 0x82, 0x70, 0xce, 0x28, 0xd6, 0x30, 0x33, 0x52, 0xe0, 0x92, 0xf7,
+ 0x5a, 0x7a, 0x01, 0x41, 0x20, 0x36, 0x75, 0x4e, 0xb1, 0x17, 0x03, 0x39, 0x6b, 0xa1, 0x17, 0xf8,
+ 0x83, 0x2c, 0x3d, 0xd6, 0x20, 0x93, 0x7e, 0x47, 0x00, 0x91, 0xbe, 0xe0, 0x09, 0xc6, 0x7a, 0x22,
+ 0xd6, 0xcd, 0x8b, 0x0e, 0x4f, 0x8d, 0xbf, 0x81, 0x27, 0x72, 0x69, 0x4a, 0x3a, 0x7a, 0x69, 0x8a,
+ 0xf4, 0x03, 0x01, 0x0a, 0x7e, 0x09, 0xd9, 0x45, 0x85, 0x43, 0x8e, 0x19, 0x7d, 0xb3, 0xcb, 0xf8,
+ 0xbc, 0xe3, 0x50, 0xc6, 0xba, 0x3b, 0x31, 0x7c, 0x1c, 0x0a, 0xbb, 0x44, 0xee, 0x6f, 0x7b, 0x3d,
+ 0x87, 0x14, 0xb1, 0x1c, 0x1c, 0x7b, 0xf1, 0x06, 0x7b, 0x99, 0x64, 0x7a, 0xc7, 0xab, 0xd5, 0x3a,
+ 0x64, 0x27, 0xd8, 0x8c, 0x65, 0xf6, 0x10, 0x0f, 0x03, 0x03, 0xbe, 0xaa, 0xa6, 0x37, 0xea, 0xf4,
+ 0xf6, 0x57, 0xf6, 0xdb, 0x91, 0x9e, 0x84, 0x14, 0x48, 0x1b, 0x9f, 0x68, 0x69, 0x2c, 0x53, 0xec,
+ 0x69, 0x89, 0xf5, 0x95, 0x3f, 0x0c, 0xb7, 0x44, 0xe5, 0x90, 0xa0, 0xa9, 0x47, 0x90, 0x3e, 0x54,
+ 0x5b, 0xc3, 0x22, 0xa9, 0x22, 0x2d, 0x27, 0x93, 0xdc, 0xe8, 0x49, 0xe4, 0xb4, 0x90, 0xd4, 0x60,
+ 0xcf, 0xbf, 0x5f, 0xa5, 0x91, 0x53, 0x45, 0x3e, 0x8c, 0xf6, 0xf5, 0xa1, 0xaf, 0x0f, 0x77, 0xfa,
+ 0x8f, 0x33, 0x3f, 0xfe, 0xc1, 0xa2, 0x20, 0x7d, 0x02, 0x48, 0xc6, 0x0e, 0x76, 0x5f, 0x74, 0x2d,
+ 0x3b, 0x38, 0x79, 0xe5, 0x76, 0xcf, 0x2d, 0x32, 0x93, 0xab, 0xf9, 0xb3, 0xb8, 0xc3, 0x99, 0x2e,
+ 0xc2, 0x7c, 0x84, 0x9b, 0x19, 0x0b, 0xe9, 0x43, 0xb8, 0xf2, 0xd4, 0x72, 0x1c, 0xa3, 0x43, 0x20,
+ 0x24, 0x1d, 0x95, 0x64, 0x6a, 0xf1, 0xcd, 0x63, 0xb6, 0x43, 0x17, 0x13, 0x4c, 0x66, 0x46, 0x72,
+ 0xb2, 0xff, 0x2c, 0xfd, 0x48, 0x80, 0xcb, 0xfd, 0x9c, 0x4c, 0xcb, 0x71, 0x5b, 0x2f, 0xa7, 0x35,
+ 0x2b, 0x38, 0xa9, 0x6f, 0x74, 0x6f, 0xf5, 0xb2, 0x13, 0xb7, 0x90, 0xbf, 0x53, 0x69, 0xab, 0xd4,
+ 0x7c, 0xf0, 0x6d, 0xe0, 0x05, 0x4e, 0xde, 0x64, 0xd4, 0xc0, 0x92, 0x64, 0xc6, 0xb3, 0x24, 0x0d,
+ 0x28, 0xae, 0x5b, 0x86, 0x49, 0xbc, 0x4f, 0xaf, 0xbe, 0x2b, 0x50, 0xd8, 0x35, 0x4c, 0xd5, 0x3e,
+ 0x51, 0xbc, 0x00, 0x3e, 0x61, 0x54, 0x00, 0x9f, 0x3c, 0xcb, 0x38, 0xf8, 0xa3, 0xf4, 0x13, 0x01,
+ 0xc4, 0x40, 0x2c, 0xb7, 0xc8, 0xef, 0x02, 0x68, 0xad, 0xae, 0xe3, 0x62, 0xdb, 0x6b, 0xa5, 0x19,
+ 0x16, 0x46, 0x5f, 0x66, 0xd4, 0xda, 0x9a, 0x9c, 0xe3, 0x19, 0x6a, 0x3a, 0xba, 0x11, 0x3d, 0xa5,
+ 0x62, 0x72, 0x15, 0xce, 0xfa, 0xce, 0xa6, 0x20, 0xcd, 0xee, 0xb8, 0x96, 0xed, 0x63, 0x17, 0xde,
+ 0xec, 0xde, 0xb9, 0xfb, 0x74, 0x73, 0x35, 0xc9, 0xb7, 0x02, 0x05, 0xe2, 0x2e, 0x1c, 0x62, 0xbf,
+ 0x4a, 0x99, 0xd1, 0x55, 0x62, 0x1c, 0x5e, 0x95, 0xfe, 0xa5, 0x00, 0xc5, 0x32, 0x6b, 0x0d, 0xbf,
+ 0x85, 0x87, 0x58, 0xb4, 0x35, 0xc8, 0xba, 0xc7, 0xa6, 0xd2, 0xc6, 0xfe, 0x5d, 0x35, 0xe7, 0x38,
+ 0x46, 0x6f, 0xda, 0x65, 0x8f, 0xf4, 0x3a, 0x43, 0x7e, 0x97, 0x36, 0x1f, 0x2e, 0x57, 0x96, 0xd8,
+ 0x65, 0xdb, 0x4b, 0xde, 0x65, 0xdb, 0x4b, 0x6b, 0x3c, 0x03, 0x33, 0xea, 0xdf, 0xff, 0x2f, 0x8b,
+ 0x82, 0xec, 0x33, 0xb1, 0x79, 0xff, 0x7e, 0x9d, 0xf4, 0xfa, 0xbe, 0x99, 0x19, 0x15, 0x00, 0x42,
+ 0x97, 0x10, 0xf1, 0xeb, 0x9b, 0x57, 0xd6, 0x94, 0x9d, 0xad, 0xf2, 0xf3, 0xcd, 0xcd, 0x5a, 0xa3,
+ 0x51, 0x59, 0x13, 0x05, 0x24, 0xc2, 0x4c, 0xe4, 0x0a, 0xa3, 0x14, 0xbb, 0xd0, 0xf9, 0xfe, 0x5f,
+ 0x01, 0x08, 0x6e, 0x43, 0x23, 0xb2, 0x36, 0x2a, 0x9f, 0x29, 0x2f, 0x57, 0x9e, 0xed, 0x54, 0xea,
+ 0xe2, 0x04, 0x42, 0x50, 0x58, 0x5d, 0x69, 0x94, 0xab, 0x8a, 0x5c, 0xa9, 0x6f, 0x3f, 0xdf, 0xaa,
+ 0x57, 0xbc, 0x8b, 0xa0, 0xef, 0xaf, 0xc1, 0x4c, 0xf8, 0x2c, 0x22, 0x34, 0x0f, 0xc5, 0x72, 0xb5,
+ 0x52, 0xde, 0x50, 0x5e, 0xd6, 0x56, 0x94, 0x17, 0x3b, 0x95, 0x9d, 0x8a, 0x38, 0x41, 0x8b, 0x46,
+ 0x89, 0x4f, 0x76, 0x9e, 0x3d, 0x13, 0x05, 0x54, 0x84, 0x3c, 0x7b, 0xa6, 0xd7, 0x1d, 0x89, 0xa9,
+ 0xfb, 0x9b, 0x90, 0x0f, 0x1d, 0x5a, 0x4c, 0x5e, 0xb7, 0xbd, 0x53, 0xaf, 0x2a, 0x8d, 0xda, 0x66,
+ 0xa5, 0xde, 0x58, 0xd9, 0xdc, 0x66, 0x32, 0x28, 0x6d, 0x65, 0xf5, 0xb9, 0xdc, 0x10, 0x05, 0xff,
+ 0xb9, 0xf1, 0x7c, 0xa7, 0x5c, 0xf5, 0xaa, 0x21, 0x65, 0xb2, 0x69, 0x31, 0x7d, 0xff, 0xaf, 0x0b,
+ 0x70, 0x79, 0xc0, 0xb9, 0x3c, 0x28, 0x0f, 0xd3, 0x3b, 0x26, 0x3d, 0xc1, 0x55, 0x9c, 0x40, 0xb3,
+ 0xa1, 0xa3, 0x79, 0x44, 0x01, 0x65, 0xd9, 0xe1, 0x28, 0x62, 0x0a, 0x4d, 0x41, 0xaa, 0xfe, 0x48,
+ 0x4c, 0x93, 0x92, 0x86, 0x4e, 0xb6, 0x11, 0x33, 0x28, 0xc7, 0xcf, 0xd4, 0x10, 0x27, 0xd1, 0x4c,
+ 0x70, 0xb4, 0x85, 0x38, 0x45, 0x44, 0xf9, 0x47, 0x44, 0x88, 0xd3, 0xf7, 0xaf, 0x43, 0x68, 0x1b,
+ 0x3e, 0x02, 0x98, 0x7a, 0xa6, 0xba, 0xd8, 0x71, 0xc5, 0x09, 0x34, 0x0d, 0xe9, 0x95, 0x56, 0x4b,
+ 0x14, 0x1e, 0xfe, 0x8b, 0x0c, 0x64, 0xbd, 0x6b, 0x7d, 0xd0, 0x33, 0x98, 0x64, 0xcb, 0xca, 0x8b,
+ 0x83, 0xd1, 0x02, 0x1d, 0xd0, 0xa5, 0x6b, 0xa3, 0xe0, 0x84, 0x34, 0x81, 0xfe, 0x2a, 0xe4, 0x43,
+ 0x5e, 0x14, 0x1a, 0xb8, 0x34, 0x16, 0xf1, 0x1c, 0x4b, 0xb7, 0x47, 0x65, 0xf3, 0xe5, 0xbf, 0x82,
+ 0x9c, 0x6f, 0xd5, 0xd1, 0x8d, 0x61, 0x36, 0xdf, 0x93, 0x3d, 0x7c, 0x62, 0x20, 0xe3, 0x4f, 0x9a,
+ 0x78, 0x5f, 0x40, 0x36, 0xa0, 0x7e, 0x03, 0x8c, 0xe2, 0x82, 0x15, 0x06, 0x5a, 0xf8, 0xd2, 0xfd,
+ 0xb1, 0x72, 0x07, 0xef, 0x24, 0xca, 0x0a, 0x66, 0x91, 0x78, 0x65, 0xf5, 0xcd, 0x51, 0xf1, 0xca,
+ 0x8a, 0x99, 0x8c, 0x26, 0xd0, 0x0b, 0xc8, 0x10, 0xeb, 0x89, 0xe2, 0xfc, 0xca, 0x1e, 0x6b, 0x5d,
+ 0xba, 0x31, 0x34, 0x8f, 0x27, 0x72, 0xf5, 0xde, 0x8f, 0xff, 0xec, 0xea, 0xc4, 0x8f, 0xcf, 0xae,
+ 0x0a, 0x3f, 0x39, 0xbb, 0x2a, 0xfc, 0xc9, 0xd9, 0x55, 0xe1, 0x4f, 0xcf, 0xae, 0x0a, 0xdf, 0xfb,
+ 0xe9, 0xd5, 0x89, 0x9f, 0xfc, 0xf4, 0xea, 0xc4, 0x9f, 0xfc, 0xf4, 0xea, 0xc4, 0xe7, 0xd3, 0x9c,
+ 0x7b, 0x77, 0x8a, 0x9a, 0x96, 0x47, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xd5, 0xdb, 0x79, 0x80,
+ 0x02, 0x81, 0x00, 0x00,
}
diff --git a/pkg/roachpb/api.proto b/pkg/roachpb/api.proto
index 9b7aca1b399f..3a9f4dfd4177 100644
--- a/pkg/roachpb/api.proto
+++ b/pkg/roachpb/api.proto
@@ -1665,6 +1665,21 @@ message SubsumeResponse {
// mark for the keys previously owned by the subsumed range.
util.hlc.Timestamp freeze_start = 5 [(gogoproto.nullable) = false,
(gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp"];
+
+ // closed_timestamp is the range's closed timestamp at the moment of the
+ // subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ util.hlc.Timestamp closed_timestamp = 6 [(gogoproto.nullable) = false];
}
// RangeStatsRequest is the argument to the RangeStats() method. It requests the
diff --git a/pkg/roachpb/data.pb.go b/pkg/roachpb/data.pb.go
index c2ac7657473e..9e2b1c658a2f 100644
--- a/pkg/roachpb/data.pb.go
+++ b/pkg/roachpb/data.pb.go
@@ -98,7 +98,7 @@ func (x ValueType) String() string {
return proto.EnumName(ValueType_name, int32(x))
}
func (ValueType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{0}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{0}
}
// ReplicaChangeType is a parameter of ChangeReplicasTrigger.
@@ -128,7 +128,7 @@ func (x ReplicaChangeType) String() string {
return proto.EnumName(ReplicaChangeType_name, int32(x))
}
func (ReplicaChangeType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{1}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{1}
}
// TransactionStatus specifies possible states for a transaction.
@@ -180,7 +180,7 @@ func (x TransactionStatus) String() string {
return proto.EnumName(TransactionStatus_name, int32(x))
}
func (TransactionStatus) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{2}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{2}
}
// RangeClosedTimestampPolicy represents the policy used by the leaseholder of a
@@ -216,7 +216,7 @@ func (x RangeClosedTimestampPolicy) String() string {
return proto.EnumName(RangeClosedTimestampPolicy_name, int32(x))
}
func (RangeClosedTimestampPolicy) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{3}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{3}
}
// Span is a key range with an inclusive start Key and an exclusive end Key.
@@ -233,7 +233,7 @@ type Span struct {
func (m *Span) Reset() { *m = Span{} }
func (*Span) ProtoMessage() {}
func (*Span) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{0}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{0}
}
func (m *Span) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -285,7 +285,7 @@ func (m *Value) Reset() { *m = Value{} }
func (m *Value) String() string { return proto.CompactTextString(m) }
func (*Value) ProtoMessage() {}
func (*Value) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{1}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{1}
}
func (m *Value) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -321,7 +321,7 @@ func (m *KeyValue) Reset() { *m = KeyValue{} }
func (m *KeyValue) String() string { return proto.CompactTextString(m) }
func (*KeyValue) ProtoMessage() {}
func (*KeyValue) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{2}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{2}
}
func (m *KeyValue) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -359,7 +359,7 @@ func (m *StoreIdent) Reset() { *m = StoreIdent{} }
func (m *StoreIdent) String() string { return proto.CompactTextString(m) }
func (*StoreIdent) ProtoMessage() {}
func (*StoreIdent) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{3}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{3}
}
func (m *StoreIdent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -399,7 +399,7 @@ func (m *SplitTrigger) Reset() { *m = SplitTrigger{} }
func (m *SplitTrigger) String() string { return proto.CompactTextString(m) }
func (*SplitTrigger) ProtoMessage() {}
func (*SplitTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{4}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{4}
}
func (m *SplitTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -436,18 +436,32 @@ type MergeTrigger struct {
RightDesc RangeDescriptor `protobuf:"bytes,2,opt,name=right_desc,json=rightDesc,proto3" json:"right_desc"`
RightMVCCStats enginepb.MVCCStats `protobuf:"bytes,4,opt,name=right_mvcc_stats,json=rightMvccStats,proto3" json:"right_mvcc_stats"`
// FreezeStart is a timestamp that is guaranteed to be greater than the
- // timestamps at which any requests were serviced by the responding replica
+ // timestamps at which any requests were serviced by the right-hand side range
// before it stopped responding to requests altogether (in anticipation of
// being subsumed). It is suitable for use as the timestamp cache's low water
// mark for the keys previously owned by the subsumed range.
FreezeStart github_com_cockroachdb_cockroach_pkg_util_hlc.ClockTimestamp `protobuf:"bytes,5,opt,name=freeze_start,json=freezeStart,proto3,casttype=github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp" json:"freeze_start"`
+ // right_closed_timestamp is the closed timestamp of the RHS at the moment of
+ // the subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the right_read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ RightClosedTimestamp hlc.Timestamp `protobuf:"bytes,6,opt,name=right_closed_timestamp,json=rightClosedTimestamp,proto3" json:"right_closed_timestamp"`
}
func (m *MergeTrigger) Reset() { *m = MergeTrigger{} }
func (m *MergeTrigger) String() string { return proto.CompactTextString(m) }
func (*MergeTrigger) ProtoMessage() {}
func (*MergeTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{5}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{5}
}
func (m *MergeTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -517,7 +531,7 @@ type ChangeReplicasTrigger struct {
func (m *ChangeReplicasTrigger) Reset() { *m = ChangeReplicasTrigger{} }
func (*ChangeReplicasTrigger) ProtoMessage() {}
func (*ChangeReplicasTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{6}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{6}
}
func (m *ChangeReplicasTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -559,7 +573,7 @@ func (m *ModifiedSpanTrigger) Reset() { *m = ModifiedSpanTrigger{} }
func (m *ModifiedSpanTrigger) String() string { return proto.CompactTextString(m) }
func (*ModifiedSpanTrigger) ProtoMessage() {}
func (*ModifiedSpanTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{7}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{7}
}
func (m *ModifiedSpanTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -605,7 +619,7 @@ func (m *StickyBitTrigger) Reset() { *m = StickyBitTrigger{} }
func (m *StickyBitTrigger) String() string { return proto.CompactTextString(m) }
func (*StickyBitTrigger) ProtoMessage() {}
func (*StickyBitTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{8}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{8}
}
func (m *StickyBitTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -644,7 +658,7 @@ func (m *InternalCommitTrigger) Reset() { *m = InternalCommitTrigger{} }
func (m *InternalCommitTrigger) String() string { return proto.CompactTextString(m) }
func (*InternalCommitTrigger) ProtoMessage() {}
func (*InternalCommitTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{9}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{9}
}
func (m *InternalCommitTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -713,7 +727,7 @@ func (m *ObservedTimestamp) Reset() { *m = ObservedTimestamp{} }
func (m *ObservedTimestamp) String() string { return proto.CompactTextString(m) }
func (*ObservedTimestamp) ProtoMessage() {}
func (*ObservedTimestamp) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{10}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{10}
}
func (m *ObservedTimestamp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -888,7 +902,7 @@ type Transaction struct {
func (m *Transaction) Reset() { *m = Transaction{} }
func (*Transaction) ProtoMessage() {}
func (*Transaction) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{11}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{11}
}
func (m *Transaction) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -939,7 +953,7 @@ func (m *TransactionRecord) Reset() { *m = TransactionRecord{} }
func (m *TransactionRecord) String() string { return proto.CompactTextString(m) }
func (*TransactionRecord) ProtoMessage() {}
func (*TransactionRecord) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{12}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{12}
}
func (m *TransactionRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -979,7 +993,7 @@ func (m *Intent) Reset() { *m = Intent{} }
func (m *Intent) String() string { return proto.CompactTextString(m) }
func (*Intent) ProtoMessage() {}
func (*Intent) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{13}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{13}
}
func (m *Intent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1016,7 +1030,7 @@ func (m *Intent_SingleKeySpan) Reset() { *m = Intent_SingleKeySpan{} }
func (m *Intent_SingleKeySpan) String() string { return proto.CompactTextString(m) }
func (*Intent_SingleKeySpan) ProtoMessage() {}
func (*Intent_SingleKeySpan) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{13, 0}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{13, 0}
}
func (m *Intent_SingleKeySpan) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1053,7 +1067,7 @@ func (m *LockAcquisition) Reset() { *m = LockAcquisition{} }
func (m *LockAcquisition) String() string { return proto.CompactTextString(m) }
func (*LockAcquisition) ProtoMessage() {}
func (*LockAcquisition) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{14}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{14}
}
func (m *LockAcquisition) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1094,7 +1108,7 @@ func (m *LockUpdate) Reset() { *m = LockUpdate{} }
func (m *LockUpdate) String() string { return proto.CompactTextString(m) }
func (*LockUpdate) ProtoMessage() {}
func (*LockUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{15}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{15}
}
func (m *LockUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1131,7 +1145,7 @@ func (m *SequencedWrite) Reset() { *m = SequencedWrite{} }
func (m *SequencedWrite) String() string { return proto.CompactTextString(m) }
func (*SequencedWrite) ProtoMessage() {}
func (*SequencedWrite) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{16}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{16}
}
func (m *SequencedWrite) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1196,7 +1210,7 @@ type Lease struct {
func (m *Lease) Reset() { *m = Lease{} }
func (*Lease) ProtoMessage() {}
func (*Lease) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{17}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{17}
}
func (m *Lease) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1241,7 +1255,7 @@ func (m *AbortSpanEntry) Reset() { *m = AbortSpanEntry{} }
func (m *AbortSpanEntry) String() string { return proto.CompactTextString(m) }
func (*AbortSpanEntry) ProtoMessage() {}
func (*AbortSpanEntry) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{18}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{18}
}
func (m *AbortSpanEntry) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1298,7 +1312,7 @@ func (m *LeafTxnInputState) Reset() { *m = LeafTxnInputState{} }
func (m *LeafTxnInputState) String() string { return proto.CompactTextString(m) }
func (*LeafTxnInputState) ProtoMessage() {}
func (*LeafTxnInputState) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{19}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{19}
}
func (m *LeafTxnInputState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1351,7 +1365,7 @@ func (m *LeafTxnFinalState) Reset() { *m = LeafTxnFinalState{} }
func (m *LeafTxnFinalState) String() string { return proto.CompactTextString(m) }
func (*LeafTxnFinalState) ProtoMessage() {}
func (*LeafTxnFinalState) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{20}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{20}
}
func (m *LeafTxnFinalState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1390,7 +1404,7 @@ func (m *ClientRangeInfo) Reset() { *m = ClientRangeInfo{} }
func (m *ClientRangeInfo) String() string { return proto.CompactTextString(m) }
func (*ClientRangeInfo) ProtoMessage() {}
func (*ClientRangeInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{21}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{21}
}
func (m *ClientRangeInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1427,7 +1441,7 @@ type RangeInfo struct {
func (m *RangeInfo) Reset() { *m = RangeInfo{} }
func (*RangeInfo) ProtoMessage() {}
func (*RangeInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{22}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{22}
}
func (m *RangeInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1540,6 +1554,9 @@ func (this *MergeTrigger) Equal(that interface{}) bool {
if !this.FreezeStart.Equal(&that1.FreezeStart) {
return false
}
+ if !this.RightClosedTimestamp.Equal(&that1.RightClosedTimestamp) {
+ return false
+ }
return true
}
func (this *AbortSpanEntry) Equal(that interface{}) bool {
@@ -1783,6 +1800,14 @@ func (m *MergeTrigger) MarshalTo(dAtA []byte) (int, error) {
return 0, err
}
i += n9
+ dAtA[i] = 0x32
+ i++
+ i = encodeVarintData(dAtA, i, uint64(m.RightClosedTimestamp.Size()))
+ n10, err := m.RightClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n10
return i, nil
}
@@ -1809,11 +1834,11 @@ func (m *ChangeReplicasTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.DeprecatedReplica.Size()))
- n10, err := m.DeprecatedReplica.MarshalTo(dAtA[i:])
+ n11, err := m.DeprecatedReplica.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n10
+ i += n11
if len(m.DeprecatedUpdatedReplicas) > 0 {
for _, msg := range m.DeprecatedUpdatedReplicas {
dAtA[i] = 0x1a
@@ -1835,11 +1860,11 @@ func (m *ChangeReplicasTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.Desc.Size()))
- n11, err := m.Desc.MarshalTo(dAtA[i:])
+ n12, err := m.Desc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n11
+ i += n12
}
if len(m.InternalAddedReplicas) > 0 {
for _, msg := range m.InternalAddedReplicas {
@@ -1897,11 +1922,11 @@ func (m *ModifiedSpanTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.NodeLivenessSpan.Size()))
- n12, err := m.NodeLivenessSpan.MarshalTo(dAtA[i:])
+ n13, err := m.NodeLivenessSpan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n12
+ i += n13
}
return i, nil
}
@@ -1924,11 +1949,11 @@ func (m *StickyBitTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.StickyBit.Size()))
- n13, err := m.StickyBit.MarshalTo(dAtA[i:])
+ n14, err := m.StickyBit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n13
+ i += n14
return i, nil
}
@@ -1951,51 +1976,51 @@ func (m *InternalCommitTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.SplitTrigger.Size()))
- n14, err := m.SplitTrigger.MarshalTo(dAtA[i:])
+ n15, err := m.SplitTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n14
+ i += n15
}
if m.MergeTrigger != nil {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.MergeTrigger.Size()))
- n15, err := m.MergeTrigger.MarshalTo(dAtA[i:])
+ n16, err := m.MergeTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n15
+ i += n16
}
if m.ChangeReplicasTrigger != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintData(dAtA, i, uint64(m.ChangeReplicasTrigger.Size()))
- n16, err := m.ChangeReplicasTrigger.MarshalTo(dAtA[i:])
+ n17, err := m.ChangeReplicasTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n16
+ i += n17
}
if m.ModifiedSpanTrigger != nil {
dAtA[i] = 0x22
i++
i = encodeVarintData(dAtA, i, uint64(m.ModifiedSpanTrigger.Size()))
- n17, err := m.ModifiedSpanTrigger.MarshalTo(dAtA[i:])
+ n18, err := m.ModifiedSpanTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n17
+ i += n18
}
if m.StickyBitTrigger != nil {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.StickyBitTrigger.Size()))
- n18, err := m.StickyBitTrigger.MarshalTo(dAtA[i:])
+ n19, err := m.StickyBitTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n18
+ i += n19
}
return i, nil
}
@@ -2023,11 +2048,11 @@ func (m *ObservedTimestamp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Timestamp.Size()))
- n19, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n20, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n19
+ i += n20
return i, nil
}
@@ -2049,11 +2074,11 @@ func (m *Transaction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.TxnMeta.Size()))
- n20, err := m.TxnMeta.MarshalTo(dAtA[i:])
+ n21, err := m.TxnMeta.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n20
+ i += n21
if len(m.Name) > 0 {
dAtA[i] = 0x12
i++
@@ -2068,19 +2093,19 @@ func (m *Transaction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.LastHeartbeat.Size()))
- n21, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
+ n22, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n21
+ i += n22
dAtA[i] = 0x3a
i++
i = encodeVarintData(dAtA, i, uint64(m.GlobalUncertaintyLimit.Size()))
- n22, err := m.GlobalUncertaintyLimit.MarshalTo(dAtA[i:])
+ n23, err := m.GlobalUncertaintyLimit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n22
+ i += n23
if len(m.ObservedTimestamps) > 0 {
for _, msg := range m.ObservedTimestamps {
dAtA[i] = 0x42
@@ -2118,11 +2143,11 @@ func (m *Transaction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x7a
i++
i = encodeVarintData(dAtA, i, uint64(m.ReadTimestamp.Size()))
- n23, err := m.ReadTimestamp.MarshalTo(dAtA[i:])
+ n24, err := m.ReadTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n23
+ i += n24
if m.CommitTimestampFixed {
dAtA[i] = 0x80
i++
@@ -2184,11 +2209,11 @@ func (m *TransactionRecord) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.TxnMeta.Size()))
- n24, err := m.TxnMeta.MarshalTo(dAtA[i:])
+ n25, err := m.TxnMeta.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n24
+ i += n25
if m.Status != 0 {
dAtA[i] = 0x20
i++
@@ -2197,11 +2222,11 @@ func (m *TransactionRecord) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.LastHeartbeat.Size()))
- n25, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
+ n26, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n25
+ i += n26
if len(m.LockSpans) > 0 {
for _, msg := range m.LockSpans {
dAtA[i] = 0x5a
@@ -2263,19 +2288,19 @@ func (m *Intent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Intent_SingleKeySpan.Size()))
- n26, err := m.Intent_SingleKeySpan.MarshalTo(dAtA[i:])
+ n27, err := m.Intent_SingleKeySpan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n26
+ i += n27
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n27, err := m.Txn.MarshalTo(dAtA[i:])
+ n28, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n27
+ i += n28
return i, nil
}
@@ -2321,19 +2346,19 @@ func (m *LockAcquisition) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Span.Size()))
- n28, err := m.Span.MarshalTo(dAtA[i:])
+ n29, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n28
+ i += n29
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n29, err := m.Txn.MarshalTo(dAtA[i:])
+ n30, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n29
+ i += n30
if m.Durability != 0 {
dAtA[i] = 0x18
i++
@@ -2360,19 +2385,19 @@ func (m *LockUpdate) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Span.Size()))
- n30, err := m.Span.MarshalTo(dAtA[i:])
+ n31, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n30
+ i += n31
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n31, err := m.Txn.MarshalTo(dAtA[i:])
+ n32, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n31
+ i += n32
if m.Status != 0 {
dAtA[i] = 0x18
i++
@@ -2440,48 +2465,48 @@ func (m *Lease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Start.Size()))
- n32, err := m.Start.MarshalTo(dAtA[i:])
+ n33, err := m.Start.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n32
+ i += n33
if m.Expiration != nil {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Expiration.Size()))
- n33, err := m.Expiration.MarshalTo(dAtA[i:])
+ n34, err := m.Expiration.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n33
+ i += n34
}
dAtA[i] = 0x1a
i++
i = encodeVarintData(dAtA, i, uint64(m.Replica.Size()))
- n34, err := m.Replica.MarshalTo(dAtA[i:])
+ n35, err := m.Replica.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n34
+ i += n35
if m.DeprecatedStartStasis != nil {
dAtA[i] = 0x22
i++
i = encodeVarintData(dAtA, i, uint64(m.DeprecatedStartStasis.Size()))
- n35, err := m.DeprecatedStartStasis.MarshalTo(dAtA[i:])
+ n36, err := m.DeprecatedStartStasis.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n35
+ i += n36
}
if m.ProposedTS != nil {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.ProposedTS.Size()))
- n36, err := m.ProposedTS.MarshalTo(dAtA[i:])
+ n37, err := m.ProposedTS.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n36
+ i += n37
}
if m.Epoch != 0 {
dAtA[i] = 0x30
@@ -2520,11 +2545,11 @@ func (m *AbortSpanEntry) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Timestamp.Size()))
- n37, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n38, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n37
+ i += n38
if m.Priority != 0 {
dAtA[i] = 0x18
i++
@@ -2551,11 +2576,11 @@ func (m *LeafTxnInputState) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n38, err := m.Txn.MarshalTo(dAtA[i:])
+ n39, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n38
+ i += n39
if m.RefreshInvalid {
dAtA[i] = 0x38
i++
@@ -2614,11 +2639,11 @@ func (m *LeafTxnFinalState) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n39, err := m.Txn.MarshalTo(dAtA[i:])
+ n40, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n39
+ i += n40
if m.DeprecatedCommandCount != 0 {
dAtA[i] = 0x18
i++
@@ -2700,19 +2725,19 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Desc.Size()))
- n40, err := m.Desc.MarshalTo(dAtA[i:])
+ n41, err := m.Desc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n40
+ i += n41
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Lease.Size()))
- n41, err := m.Lease.MarshalTo(dAtA[i:])
+ n42, err := m.Lease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n41
+ i += n42
if m.ClosedTimestampPolicy != 0 {
dAtA[i] = 0x18
i++
@@ -3072,6 +3097,8 @@ func (m *MergeTrigger) Size() (n int) {
n += 1 + l + sovData(uint64(l))
l = m.FreezeStart.Size()
n += 1 + l + sovData(uint64(l))
+ l = m.RightClosedTimestamp.Size()
+ n += 1 + l + sovData(uint64(l))
return n
}
@@ -4208,6 +4235,36 @@ func (m *MergeTrigger) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field RightClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowData
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthData
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.RightClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipData(dAtA[iNdEx:])
@@ -7192,170 +7249,171 @@ var (
ErrIntOverflowData = fmt.Errorf("proto: integer overflow")
)
-func init() { proto.RegisterFile("roachpb/data.proto", fileDescriptor_data_f7c076f1b3c5df9f) }
-
-var fileDescriptor_data_f7c076f1b3c5df9f = []byte{
- // 2591 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcd, 0x73, 0x23, 0x47,
- 0x15, 0xf7, 0x58, 0x23, 0x69, 0xf4, 0x2c, 0xc9, 0xe3, 0x5e, 0xdb, 0xab, 0x75, 0xc0, 0x5a, 0x14,
- 0x20, 0xcb, 0x16, 0x91, 0x0b, 0x27, 0xa4, 0x52, 0xcb, 0x52, 0x85, 0xbe, 0xd6, 0x91, 0x56, 0x96,
- 0x36, 0xa3, 0xf1, 0x06, 0x27, 0x50, 0xc3, 0x68, 0xa6, 0x2d, 0x0f, 0x1e, 0xcd, 0x68, 0x67, 0x46,
- 0x8e, 0xc5, 0x8d, 0x0b, 0x95, 0xca, 0x01, 0x38, 0x72, 0xe0, 0x90, 0x2a, 0x6e, 0x70, 0x80, 0x23,
- 0xc5, 0x81, 0x73, 0x0e, 0x1c, 0x72, 0x4b, 0x80, 0x2a, 0x15, 0x38, 0x97, 0x1c, 0xf8, 0x0b, 0x5c,
- 0x50, 0x45, 0x75, 0xf7, 0x7c, 0x79, 0x57, 0x36, 0x72, 0x76, 0x09, 0x29, 0x2e, 0xf6, 0xcc, 0xfb,
- 0xf8, 0xbd, 0xee, 0xd7, 0xef, 0xbd, 0x7e, 0xf3, 0x04, 0xc8, 0xb1, 0x55, 0xed, 0x70, 0xd4, 0xdf,
- 0xd2, 0x55, 0x4f, 0x2d, 0x8f, 0x1c, 0xdb, 0xb3, 0xd1, 0x8a, 0x66, 0x6b, 0x47, 0x94, 0x5e, 0xf6,
- 0xb9, 0x1b, 0xb7, 0x8f, 0x8e, 0xb7, 0x8e, 0x8e, 0x5d, 0xec, 0x1c, 0x63, 0x67, 0x4b, 0xb3, 0x2d,
- 0x6d, 0xec, 0x38, 0xd8, 0xd2, 0x26, 0x5b, 0xa6, 0xad, 0x1d, 0xd1, 0x3f, 0x86, 0x35, 0x60, 0xea,
- 0x1b, 0xeb, 0x01, 0xe4, 0x10, 0x7b, 0x6a, 0x04, 0xbb, 0xf1, 0x9c, 0xeb, 0xd9, 0x8e, 0x3a, 0xc0,
- 0x5b, 0xd8, 0x1a, 0x18, 0x16, 0x26, 0x02, 0xc7, 0x9a, 0xe6, 0x33, 0xbf, 0x30, 0x93, 0xf9, 0x92,
- 0xcf, 0x2d, 0x8c, 0x3d, 0xc3, 0xdc, 0x3a, 0x34, 0xb5, 0x2d, 0xcf, 0x18, 0x62, 0xd7, 0x53, 0x87,
- 0x23, 0x9f, 0xb3, 0x3a, 0xb0, 0x07, 0x36, 0x7d, 0xdc, 0x22, 0x4f, 0x8c, 0x5a, 0xda, 0x07, 0xbe,
- 0x37, 0x52, 0x2d, 0x74, 0x03, 0x12, 0x47, 0x78, 0x52, 0x48, 0xdc, 0xe4, 0x6e, 0x65, 0xab, 0xe9,
- 0xb3, 0x69, 0x31, 0x71, 0x1f, 0x4f, 0x24, 0x42, 0x43, 0x37, 0x21, 0x8d, 0x2d, 0x5d, 0x21, 0x6c,
- 0xfe, 0x3c, 0x3b, 0x85, 0x2d, 0xfd, 0x3e, 0x9e, 0xdc, 0x11, 0x7e, 0xf1, 0x5e, 0x71, 0xe1, 0xf7,
- 0xef, 0x15, 0xb9, 0x16, 0x2f, 0x70, 0xe2, 0x62, 0x8b, 0x17, 0x16, 0xc5, 0x44, 0x69, 0x00, 0xc9,
- 0x87, 0xaa, 0x39, 0xc6, 0xe8, 0x39, 0xc8, 0x38, 0xea, 0xdb, 0x4a, 0x7f, 0xe2, 0x61, 0xb7, 0xc0,
- 0x11, 0x08, 0x49, 0x70, 0xd4, 0xb7, 0xab, 0xe4, 0x1d, 0x55, 0x20, 0x13, 0xae, 0xb4, 0xb0, 0x78,
- 0x93, 0xbb, 0xb5, 0xb4, 0xfd, 0xc5, 0x72, 0xe4, 0x56, 0xb2, 0x9d, 0xf2, 0xa1, 0xa9, 0x95, 0xe5,
- 0x40, 0xa8, 0xca, 0xbf, 0x3f, 0x2d, 0x2e, 0x48, 0x91, 0x56, 0xe9, 0x2d, 0x10, 0xee, 0xe3, 0x09,
- 0xb3, 0xe5, 0xef, 0x83, 0x9b, 0xb1, 0x8f, 0x97, 0x21, 0x79, 0x4c, 0x64, 0x7c, 0x2b, 0x85, 0xf2,
- 0x13, 0x87, 0x57, 0xa6, 0x18, 0xbe, 0x01, 0x26, 0x5c, 0xfa, 0x90, 0x03, 0xe8, 0x79, 0xb6, 0x83,
- 0x9b, 0x3a, 0xb6, 0x3c, 0x34, 0x00, 0xd0, 0xcc, 0xb1, 0xeb, 0x61, 0x47, 0x31, 0x74, 0xdf, 0xcc,
- 0x6b, 0x44, 0xfe, 0x2f, 0xd3, 0xe2, 0x4b, 0x03, 0xc3, 0x3b, 0x1c, 0xf7, 0xcb, 0x9a, 0x3d, 0xdc,
- 0x0a, 0xb1, 0xf5, 0x7e, 0xf4, 0xbc, 0x35, 0x3a, 0x1a, 0x6c, 0xd1, 0x03, 0x1a, 0x8f, 0x0d, 0xbd,
- 0xbc, 0xb7, 0xd7, 0xac, 0x9f, 0x4e, 0x8b, 0x99, 0x1a, 0x03, 0x6c, 0xd6, 0xa5, 0x8c, 0x8f, 0xdd,
- 0xd4, 0xd1, 0x8b, 0x90, 0xb6, 0x6c, 0x1d, 0x13, 0x2b, 0x64, 0xbd, 0xc9, 0xea, 0xea, 0xe9, 0xb4,
- 0x98, 0xea, 0xd8, 0x3a, 0x6e, 0xd6, 0xcf, 0xc2, 0x27, 0x29, 0x45, 0x84, 0x9a, 0x3a, 0xfa, 0x06,
- 0x08, 0x24, 0x2e, 0xa8, 0x7c, 0x82, 0xca, 0xaf, 0x9f, 0x4e, 0x8b, 0x69, 0xb6, 0x72, 0xa2, 0x10,
- 0x3c, 0x4a, 0x69, 0x97, 0xed, 0xa6, 0xf4, 0x6b, 0x0e, 0xb2, 0xbd, 0x91, 0x69, 0x78, 0xb2, 0x63,
- 0x0c, 0x06, 0xd8, 0x41, 0x0d, 0xc8, 0x98, 0xf8, 0xc0, 0x53, 0x74, 0xec, 0x6a, 0x74, 0x6b, 0x4b,
- 0xdb, 0xa5, 0x19, 0x4e, 0x92, 0x54, 0x6b, 0x80, 0xeb, 0xd8, 0xd5, 0x1c, 0x63, 0xe4, 0xd9, 0x8e,
- 0xef, 0x2e, 0x81, 0xa8, 0x12, 0x2a, 0xda, 0x01, 0x70, 0x8c, 0xc1, 0xa1, 0x8f, 0xb3, 0x78, 0x45,
- 0x9c, 0x0c, 0xd5, 0x25, 0xe4, 0x3b, 0xfc, 0x27, 0x2c, 0xa4, 0x12, 0x22, 0x5f, 0xfa, 0x65, 0x02,
- 0xb2, 0xbb, 0xd8, 0x19, 0xe0, 0xcf, 0xe9, 0x62, 0xd1, 0x00, 0x44, 0x06, 0x44, 0xb2, 0x51, 0x71,
- 0x3d, 0xd5, 0x73, 0x69, 0xba, 0x2c, 0x6d, 0x7f, 0x25, 0x06, 0xe7, 0xe7, 0x6e, 0x39, 0xc8, 0xdd,
- 0xf2, 0xee, 0xc3, 0x5a, 0xad, 0x47, 0x84, 0xab, 0xeb, 0x04, 0xf1, 0x74, 0x5a, 0xcc, 0x4b, 0x04,
- 0x26, 0xa4, 0x4b, 0x79, 0x0a, 0xbb, 0x7b, 0xac, 0x69, 0xf4, 0x1d, 0xfd, 0x84, 0x83, 0xec, 0x81,
- 0x83, 0xf1, 0x8f, 0x30, 0xb1, 0xe2, 0x78, 0x85, 0xe4, 0x3c, 0x49, 0x53, 0x27, 0xe8, 0x67, 0xd3,
- 0xe2, 0xdd, 0xf9, 0x63, 0x94, 0x00, 0xd4, 0x48, 0xc1, 0x0a, 0x51, 0xa4, 0x25, 0x66, 0xb8, 0x47,
- 0xec, 0x9e, 0x3b, 0x9e, 0xdf, 0x24, 0x61, 0xad, 0x76, 0x48, 0x7c, 0x24, 0xe1, 0x91, 0x69, 0x68,
- 0xaa, 0x1b, 0x9c, 0xd3, 0x9b, 0xb0, 0xae, 0xe3, 0x91, 0x83, 0x35, 0xd5, 0xc3, 0xba, 0xa2, 0x51,
- 0x19, 0xc5, 0x9b, 0x8c, 0x30, 0x3d, 0xb4, 0xfc, 0xf6, 0x97, 0x67, 0x39, 0x9b, 0x61, 0x30, 0x40,
- 0x79, 0x32, 0xc2, 0xd2, 0x6a, 0x84, 0x11, 0x51, 0xd1, 0x3e, 0xa0, 0x18, 0xb6, 0xc3, 0xb4, 0xfc,
- 0x43, 0xbc, 0x04, 0xf7, 0x89, 0x63, 0x5c, 0x89, 0x50, 0x7c, 0x11, 0xf4, 0x43, 0x78, 0x2e, 0x06,
- 0x3d, 0x1e, 0xe9, 0x71, 0x13, 0x6e, 0x21, 0x71, 0x33, 0x71, 0x45, 0x1b, 0x37, 0x22, 0xb8, 0x3d,
- 0x86, 0x16, 0x78, 0x0a, 0x61, 0xd8, 0x88, 0xd9, 0xb2, 0xf0, 0x89, 0x17, 0x18, 0x22, 0xd9, 0xcc,
- 0xd3, 0x6c, 0xbe, 0x75, 0x3a, 0x2d, 0x5e, 0xaf, 0x87, 0x52, 0x1d, 0x7c, 0xe2, 0xf9, 0xfa, 0x34,
- 0xbb, 0x33, 0xe1, 0x8b, 0x74, 0x5d, 0x9f, 0x29, 0xa5, 0xa3, 0x57, 0x80, 0xa7, 0x41, 0x9e, 0x9c,
- 0x37, 0xc8, 0x25, 0x2a, 0x8f, 0xfa, 0x70, 0xdd, 0xb0, 0x3c, 0xec, 0x58, 0xaa, 0xa9, 0xa8, 0xba,
- 0x1e, 0x77, 0x43, 0xea, 0xca, 0x6e, 0x58, 0x0b, 0xa0, 0x2a, 0x04, 0x29, 0x74, 0xc1, 0x01, 0xdc,
- 0x08, 0x6d, 0x38, 0x78, 0x68, 0x1f, 0xc7, 0xad, 0xa4, 0xaf, 0x6c, 0x25, 0x5c, 0xb0, 0xc4, 0xb0,
- 0x02, 0x3b, 0x77, 0x78, 0x72, 0x53, 0x95, 0xde, 0xe5, 0xe0, 0xda, 0xae, 0xad, 0x1b, 0x07, 0x06,
- 0xd6, 0xc9, 0xed, 0x17, 0xc4, 0xea, 0xd7, 0x01, 0xb9, 0x13, 0xd7, 0xc3, 0x43, 0x45, 0xb3, 0xad,
- 0x03, 0x63, 0xa0, 0xb8, 0x23, 0xd5, 0xa2, 0x71, 0x2a, 0x48, 0x22, 0xe3, 0xd4, 0x28, 0x83, 0x5e,
- 0x99, 0x0d, 0x40, 0xb4, 0x42, 0x9b, 0xc6, 0x31, 0xb6, 0xb0, 0xeb, 0x32, 0x69, 0x16, 0x7d, 0xd7,
- 0x67, 0x2c, 0x96, 0x28, 0x49, 0x22, 0x51, 0x69, 0xfb, 0x1a, 0x84, 0x52, 0x7a, 0x08, 0x62, 0xcf,
- 0x33, 0xb4, 0xa3, 0x49, 0x35, 0xaa, 0xc4, 0x55, 0x00, 0x97, 0xd2, 0x94, 0xbe, 0xe1, 0xf9, 0xd5,
- 0x6d, 0xbe, 0x5b, 0xd1, 0x0d, 0xa0, 0x4a, 0x7f, 0x48, 0xc0, 0x5a, 0xd3, 0x77, 0x43, 0xcd, 0x1e,
- 0x0e, 0x23, 0xf4, 0x3a, 0xe4, 0x5c, 0x52, 0xf7, 0x15, 0x8f, 0x11, 0x7c, 0x03, 0xc5, 0x99, 0x6b,
- 0x8e, 0xee, 0x07, 0x29, 0xeb, 0xc6, 0x6f, 0x8b, 0x3a, 0xe4, 0x86, 0xa4, 0x20, 0x87, 0x28, 0x8b,
- 0x17, 0xa2, 0xc4, 0x0b, 0xb7, 0x94, 0x1d, 0xc6, 0xcb, 0xf8, 0x0f, 0xe0, 0xba, 0x5f, 0x13, 0x82,
- 0xe3, 0x0e, 0xf1, 0x12, 0x14, 0xef, 0xd6, 0x0c, 0xbc, 0x99, 0x95, 0x46, 0x5a, 0xd3, 0x2e, 0x28,
- 0x40, 0x6b, 0x43, 0xff, 0xac, 0xe9, 0x09, 0x85, 0xf8, 0xac, 0x3a, 0x7f, 0x75, 0xd6, 0x7a, 0x9f,
- 0x8c, 0x0d, 0xe9, 0xda, 0x70, 0x46, 0xc0, 0xbc, 0x0e, 0x28, 0x3a, 0xa7, 0x10, 0x98, 0x25, 0xd8,
- 0xf3, 0xb3, 0xdc, 0xf9, 0xd8, 0x41, 0x4b, 0xa2, 0xfb, 0x18, 0xe5, 0x0e, 0xff, 0xce, 0x7b, 0x45,
- 0xae, 0xf4, 0x27, 0x0e, 0x56, 0xba, 0x7d, 0xda, 0x45, 0xea, 0xe1, 0x19, 0xc7, 0x7b, 0x02, 0x6e,
- 0x8e, 0x9e, 0xe0, 0xc7, 0xdc, 0x95, 0x7b, 0xab, 0x67, 0x73, 0x4d, 0x44, 0x56, 0xef, 0xf0, 0xa4,
- 0x2d, 0x2c, 0x9d, 0xa5, 0x60, 0x49, 0x76, 0x54, 0xcb, 0x55, 0x35, 0xcf, 0xb0, 0x2d, 0x54, 0x01,
- 0x9e, 0xb4, 0xbc, 0x7e, 0xe0, 0x3d, 0x7f, 0xd9, 0x05, 0x29, 0x9f, 0x58, 0xbb, 0xd8, 0x53, 0xab,
- 0x02, 0x59, 0xd9, 0x07, 0xd3, 0x22, 0x27, 0x51, 0x55, 0x84, 0x80, 0xb7, 0xd4, 0x21, 0x6b, 0xe6,
- 0x32, 0x12, 0x7d, 0x46, 0x77, 0x21, 0x45, 0x2e, 0xde, 0x31, 0xbb, 0x79, 0x67, 0xdf, 0x2d, 0xb1,
- 0x65, 0xf4, 0xa8, 0xac, 0xe4, 0xeb, 0xa0, 0x16, 0xe4, 0x4d, 0xd5, 0xf5, 0x94, 0x43, 0xac, 0x3a,
- 0x5e, 0x1f, 0xab, 0x73, 0xde, 0xac, 0x2c, 0xf1, 0x72, 0x44, 0xf5, 0xb5, 0x40, 0x13, 0x7d, 0x1f,
- 0x0a, 0x03, 0xd3, 0xee, 0xab, 0xa6, 0x32, 0xb6, 0x34, 0xec, 0x78, 0xaa, 0x61, 0x79, 0x13, 0xc5,
- 0x34, 0x86, 0x86, 0x57, 0x48, 0xcf, 0x8f, 0xba, 0xce, 0x40, 0xf6, 0x22, 0x8c, 0x36, 0x81, 0x40,
- 0x6f, 0xc1, 0x35, 0xdb, 0x8f, 0x0e, 0x25, 0xf4, 0xb5, 0x5b, 0x10, 0x2e, 0x2c, 0x94, 0x4f, 0xc4,
- 0x92, 0x6f, 0x00, 0xd9, 0x8f, 0x33, 0x5c, 0x74, 0x17, 0x80, 0x1c, 0x27, 0x4d, 0x16, 0xb7, 0xb0,
- 0x44, 0x31, 0x2f, 0xaa, 0x67, 0x41, 0xd9, 0x21, 0x0a, 0xe4, 0xdd, 0x45, 0x25, 0xc8, 0xbd, 0xed,
- 0x18, 0x1e, 0x56, 0x3c, 0xdb, 0x56, 0x6c, 0x53, 0x2f, 0x64, 0x69, 0xf9, 0x5c, 0xa2, 0x44, 0xd9,
- 0xb6, 0xbb, 0xa6, 0x4e, 0x3c, 0xed, 0x60, 0x35, 0xb6, 0xf4, 0xc2, 0xf2, 0x15, 0x3c, 0x4d, 0x54,
- 0xa3, 0x9c, 0x78, 0x19, 0xd6, 0x35, 0x5a, 0xdd, 0x22, 0x34, 0xe5, 0xc0, 0x38, 0xc1, 0x7a, 0x41,
- 0xa4, 0x86, 0x57, 0x19, 0x37, 0x54, 0xb8, 0x47, 0x78, 0xe8, 0x75, 0x10, 0x0d, 0x4b, 0x39, 0x30,
- 0x69, 0xc7, 0x46, 0x97, 0xe6, 0x16, 0x56, 0xe8, 0x4e, 0xbf, 0x34, 0x6b, 0xa7, 0xf8, 0xd1, 0x18,
- 0x5b, 0x1a, 0xd6, 0xdf, 0x20, 0x92, 0xfe, 0x3a, 0xf2, 0x86, 0x75, 0x8f, 0xea, 0x53, 0xa2, 0x8b,
- 0x6c, 0x58, 0x36, 0x06, 0x96, 0xed, 0x90, 0x32, 0x83, 0x1f, 0x59, 0xe3, 0xa1, 0x5b, 0x40, 0x14,
- 0xb1, 0x7c, 0x59, 0x78, 0x37, 0x99, 0x4a, 0x0f, 0x3f, 0xea, 0x8c, 0x87, 0xf4, 0xfe, 0x8d, 0x1a,
- 0xc1, 0x73, 0x3c, 0x57, 0xca, 0x1b, 0xe1, 0x3b, 0x41, 0x3f, 0xf7, 0xd5, 0x95, 0x10, 0xf9, 0x16,
- 0x2f, 0xa4, 0xc4, 0x74, 0x8b, 0x17, 0x32, 0x22, 0xb4, 0x78, 0x21, 0x27, 0xe6, 0x5b, 0xbc, 0x90,
- 0x17, 0x97, 0x4b, 0xbf, 0xe3, 0x61, 0x25, 0x16, 0xf5, 0x12, 0xd6, 0x6c, 0x47, 0x7f, 0x16, 0x29,
- 0xf8, 0xf9, 0x49, 0xb7, 0xa7, 0x0b, 0xd9, 0xff, 0x87, 0x60, 0xe0, 0xfd, 0x40, 0x58, 0x14, 0x13,
- 0x8f, 0x85, 0x43, 0x5a, 0x14, 0x5a, 0xbc, 0x20, 0x88, 0x99, 0x30, 0x34, 0x40, 0x5c, 0x6a, 0xf1,
- 0x42, 0x56, 0xcc, 0xc5, 0xc3, 0xa4, 0xc5, 0x0b, 0xcb, 0xa2, 0xd8, 0xe2, 0x05, 0x51, 0x5c, 0x29,
- 0x4d, 0x39, 0x48, 0x91, 0xde, 0xc1, 0xf2, 0xd0, 0x3e, 0x2c, 0xbb, 0x86, 0x35, 0x30, 0xb1, 0x72,
- 0x84, 0x27, 0x51, 0x43, 0xb4, 0xb4, 0xfd, 0xc2, 0x0c, 0xdf, 0x30, 0x9d, 0x72, 0x8f, 0x2a, 0xdc,
- 0xc7, 0x13, 0xea, 0xef, 0x28, 0x6c, 0x72, 0x6e, 0x9c, 0x81, 0xbe, 0x05, 0x09, 0xef, 0x24, 0xe8,
- 0x98, 0xe6, 0x8a, 0x40, 0xe6, 0x6c, 0xa2, 0xb5, 0x71, 0x17, 0x72, 0xe7, 0xcc, 0x5c, 0x32, 0xc1,
- 0x88, 0x4f, 0x25, 0x5a, 0xbc, 0xc0, 0x8b, 0xc9, 0xd2, 0x9f, 0x39, 0x58, 0x6e, 0xdb, 0xda, 0x51,
- 0x45, 0x7b, 0x34, 0x36, 0x5c, 0x83, 0x5e, 0x4a, 0xdf, 0x04, 0x3e, 0xb6, 0xbd, 0x0b, 0xc3, 0x27,
- 0x96, 0x05, 0xee, 0xd3, 0xee, 0x02, 0x49, 0x00, 0xfa, 0xd8, 0x51, 0xfb, 0x86, 0x69, 0x78, 0x6c,
- 0xed, 0xf9, 0xed, 0xed, 0x18, 0xc6, 0xd1, 0x71, 0x39, 0x18, 0x26, 0x95, 0x63, 0xc3, 0xa4, 0x32,
- 0x09, 0xde, 0x72, 0x3d, 0xd4, 0x94, 0x62, 0x28, 0xa5, 0xdf, 0x2e, 0x02, 0x90, 0xbd, 0xb1, 0xcf,
- 0x8c, 0xff, 0xc9, 0xb6, 0xa2, 0xca, 0x90, 0xf8, 0x14, 0x95, 0x61, 0x46, 0xf2, 0xf0, 0xff, 0xcd,
- 0xe4, 0x29, 0xfd, 0x8c, 0x83, 0xfc, 0xf9, 0xb4, 0xbe, 0x6c, 0x8e, 0xf4, 0x3d, 0x10, 0x5c, 0x5f,
- 0xd8, 0x1f, 0xcd, 0x7c, 0x67, 0xee, 0x8e, 0xe9, 0xf1, 0xd9, 0x1d, 0x71, 0x5e, 0x0f, 0x3f, 0x92,
- 0x42, 0x44, 0xbf, 0x61, 0xfa, 0x23, 0x0f, 0xc9, 0x36, 0x56, 0x5d, 0x8c, 0x26, 0x90, 0x64, 0x9f,
- 0xf9, 0xdc, 0x67, 0xd7, 0xbf, 0x31, 0x8b, 0xe8, 0xdb, 0x00, 0xf8, 0x64, 0x64, 0x38, 0x2a, 0x39,
- 0xa3, 0xb9, 0xfa, 0x47, 0x29, 0xa6, 0x80, 0xea, 0x90, 0x0e, 0x3e, 0xc9, 0x13, 0x57, 0xfe, 0x24,
- 0x0f, 0x54, 0xd1, 0x1e, 0xc4, 0x3e, 0x68, 0xd9, 0xc4, 0x83, 0xfc, 0x75, 0x8d, 0x60, 0xbc, 0xf2,
- 0x1f, 0x56, 0xb4, 0x16, 0x69, 0xd3, 0xb1, 0x45, 0x8f, 0xea, 0xa2, 0x9f, 0x72, 0xb0, 0x34, 0x72,
- 0xec, 0x91, 0xed, 0x92, 0x16, 0xca, 0x9d, 0xef, 0xee, 0xe9, 0x9c, 0x4e, 0x8b, 0xf0, 0xc0, 0xd7,
- 0x92, 0x7b, 0x4f, 0xed, 0x67, 0x08, 0x56, 0x20, 0xbb, 0x68, 0x15, 0x92, 0x78, 0x64, 0x6b, 0x87,
- 0x85, 0xd4, 0x4d, 0xee, 0x56, 0x42, 0x62, 0x2f, 0xe8, 0xc5, 0x58, 0xac, 0x91, 0xbe, 0x31, 0x51,
- 0x5d, 0x39, 0x9b, 0x16, 0x73, 0x34, 0x34, 0x82, 0x88, 0x8d, 0x05, 0x4f, 0xd8, 0x12, 0x94, 0xfe,
- 0xca, 0x41, 0xbe, 0xd2, 0xb7, 0x1d, 0x8f, 0x24, 0x77, 0xc3, 0xf2, 0x9c, 0xc9, 0x65, 0x21, 0xfd,
- 0xf4, 0x43, 0x58, 0xa4, 0x82, 0x30, 0x72, 0x0c, 0xdb, 0x09, 0xea, 0x58, 0xb2, 0xda, 0x38, 0x9b,
- 0x16, 0x2b, 0x9f, 0x3a, 0x2b, 0x1e, 0xf8, 0x60, 0x52, 0x08, 0x7b, 0x47, 0x20, 0x3b, 0xfb, 0x84,
- 0xec, 0xee, 0x5f, 0x8b, 0xb0, 0xd2, 0xc6, 0xea, 0x81, 0x7c, 0x62, 0x35, 0xad, 0xd1, 0x98, 0x1c,
- 0xaa, 0x87, 0xd1, 0x2b, 0xac, 0x64, 0xb1, 0x44, 0xd9, 0xbc, 0xbc, 0xe4, 0xc4, 0xab, 0xd5, 0x0b,
- 0xb0, 0xec, 0xe0, 0x03, 0x07, 0xbb, 0x87, 0x8a, 0x61, 0x1d, 0xab, 0xa6, 0xa1, 0x53, 0x5f, 0x0b,
- 0x52, 0xde, 0x27, 0x37, 0x19, 0x75, 0x66, 0xa3, 0x20, 0x3c, 0x5d, 0xa3, 0xb0, 0x0d, 0x6b, 0xae,
- 0x87, 0x47, 0x23, 0xc3, 0x1a, 0x28, 0x43, 0xf2, 0x6d, 0x87, 0x2d, 0xb5, 0x6f, 0x62, 0xbd, 0x90,
- 0xa1, 0x2b, 0xb8, 0x16, 0x30, 0x77, 0x6d, 0x1d, 0x37, 0x18, 0x0b, 0xf5, 0x21, 0x4b, 0xdb, 0x67,
- 0x17, 0x3f, 0x52, 0xac, 0xf1, 0xb0, 0x00, 0xcf, 0xa8, 0x08, 0x01, 0x41, 0x65, 0x35, 0xf2, 0xb1,
- 0x4e, 0x82, 0x17, 0x93, 0x2d, 0x5e, 0x48, 0x8a, 0x29, 0xd6, 0x55, 0x94, 0xde, 0x8d, 0xfc, 0x7f,
- 0xcf, 0xb0, 0x54, 0xf3, 0xe9, 0xfc, 0xff, 0x2a, 0x14, 0xe2, 0x23, 0x42, 0x7b, 0x38, 0x54, 0x2d,
- 0xf2, 0x7f, 0x6c, 0x79, 0x2c, 0x94, 0xa4, 0xd8, 0x08, 0xb1, 0xc6, 0xd8, 0x35, 0xc2, 0x45, 0x55,
- 0xc8, 0x05, 0x27, 0xc7, 0x5a, 0x3f, 0x7e, 0x9e, 0xd6, 0x2f, 0xeb, 0xeb, 0xb0, 0xee, 0x6f, 0xde,
- 0xd3, 0x0f, 0x5d, 0x12, 0xba, 0x81, 0xb5, 0x55, 0xa5, 0x7f, 0x72, 0xb0, 0x5c, 0x33, 0x0d, 0x6c,
- 0x79, 0xf4, 0xd6, 0x69, 0x5a, 0x07, 0x36, 0x7a, 0x0d, 0xd6, 0xf4, 0xb0, 0xa4, 0x29, 0x03, 0x6c,
- 0x61, 0xbf, 0x8a, 0x72, 0x34, 0x89, 0xaf, 0x9d, 0x4d, 0x8b, 0xcb, 0x54, 0x7a, 0x27, 0x64, 0x49,
- 0xab, 0x91, 0x46, 0x44, 0x45, 0xaf, 0x42, 0xde, 0x24, 0xd9, 0xae, 0x9c, 0xbb, 0x73, 0x66, 0xd6,
- 0x81, 0x9c, 0x19, 0x7f, 0x45, 0x18, 0xae, 0x6b, 0x26, 0xab, 0x6f, 0xe1, 0x97, 0xd1, 0xc8, 0x36,
- 0x0d, 0x2d, 0x68, 0x34, 0x5e, 0xbc, 0x68, 0x04, 0x58, 0xa3, 0x6a, 0x61, 0xb2, 0x3f, 0xa0, 0x4a,
- 0xd2, 0x9a, 0x36, 0x8b, 0x5c, 0xfa, 0x07, 0x07, 0x99, 0x68, 0xe3, 0x77, 0xfd, 0x21, 0xe3, 0x55,
- 0x27, 0xf2, 0x6c, 0xd4, 0xf8, 0x32, 0x24, 0xe9, 0x1e, 0x2e, 0xf9, 0x89, 0x86, 0x6e, 0x39, 0xf8,
- 0x89, 0x86, 0x0a, 0x7f, 0x46, 0x1b, 0x65, 0xb3, 0xc3, 0xdb, 0x1f, 0x72, 0x90, 0xa1, 0x3f, 0x13,
- 0xd1, 0x09, 0xf4, 0x12, 0xa4, 0xf7, 0x3a, 0xf7, 0x3b, 0xdd, 0x37, 0x3a, 0xe2, 0x02, 0x4a, 0x43,
- 0xa2, 0xd9, 0x91, 0x45, 0x0e, 0x65, 0x20, 0x79, 0xaf, 0xdd, 0xad, 0xc8, 0xe2, 0x22, 0x79, 0xac,
- 0xee, 0xcb, 0x8d, 0x9e, 0x98, 0x40, 0xd7, 0x60, 0xb9, 0xde, 0x68, 0x37, 0x77, 0x9b, 0x72, 0xa3,
- 0xae, 0x30, 0xa2, 0x80, 0x04, 0xe0, 0xe5, 0xe6, 0x6e, 0x43, 0xe4, 0x09, 0x54, 0xbd, 0x51, 0x6b,
- 0xee, 0x56, 0xda, 0x62, 0x12, 0xad, 0xc1, 0x4a, 0x24, 0x1b, 0x90, 0x33, 0x28, 0x0b, 0x42, 0x7d,
- 0x4f, 0xaa, 0xc8, 0xcd, 0x6e, 0x47, 0x4c, 0x21, 0x80, 0x14, 0xd1, 0x95, 0xdf, 0x14, 0xb3, 0xc4,
- 0xf6, 0x4e, 0xa3, 0x2b, 0xe6, 0xa8, 0xc1, 0xee, 0x77, 0xb7, 0xeb, 0x62, 0x9e, 0x3c, 0xca, 0x7b,
- 0x0f, 0xda, 0x0d, 0x11, 0x88, 0x62, 0xb5, 0x29, 0x57, 0x24, 0xa9, 0xb2, 0x2f, 0x2e, 0xa1, 0x3c,
- 0x00, 0x51, 0xec, 0x35, 0xa4, 0x66, 0xa3, 0x27, 0xea, 0x25, 0xf2, 0x91, 0x90, 0xbe, 0xad, 0xc1,
- 0xca, 0x13, 0x83, 0x77, 0x94, 0x83, 0x4c, 0xa5, 0x5e, 0x57, 0x1e, 0x76, 0xe5, 0x86, 0x24, 0x2e,
- 0x20, 0x11, 0xb2, 0x52, 0x63, 0xb7, 0xfb, 0xb0, 0xe1, 0x53, 0x38, 0xb4, 0x02, 0x39, 0x22, 0xd0,
- 0xe9, 0x76, 0x7c, 0xd2, 0x22, 0x5a, 0x05, 0xd1, 0x17, 0x8a, 0xa8, 0x89, 0x0d, 0xfe, 0x9d, 0x5f,
- 0x6d, 0x2e, 0xdc, 0xee, 0x9e, 0xfb, 0x16, 0x65, 0x8d, 0x1f, 0xd9, 0xfa, 0x83, 0x46, 0xa7, 0xde,
- 0xec, 0xec, 0x88, 0x0b, 0xe4, 0xa5, 0x27, 0x57, 0x76, 0xc8, 0x4b, 0x82, 0x98, 0xaf, 0x75, 0x77,
- 0x77, 0x9b, 0xb2, 0xdc, 0xa8, 0x8b, 0x1c, 0xe1, 0x55, 0xaa, 0x5d, 0x89, 0xbc, 0x2c, 0xfa, 0x80,
- 0xfb, 0xb0, 0x71, 0xf1, 0x51, 0xa2, 0x0d, 0x58, 0x6f, 0x57, 0x76, 0x94, 0xea, 0xbe, 0x52, 0x6b,
- 0xef, 0xf5, 0xe4, 0x86, 0xa4, 0xf4, 0x1a, 0xb2, 0xcc, 0x0c, 0xdd, 0x80, 0xb5, 0x76, 0xa3, 0x52,
- 0x57, 0xee, 0x75, 0x25, 0x65, 0xa7, 0xdd, 0xad, 0x56, 0xda, 0x8a, 0xd4, 0xa8, 0xd4, 0x7b, 0x22,
- 0xc7, 0xa0, 0xab, 0x5f, 0x7b, 0xff, 0xef, 0x9b, 0x0b, 0xef, 0x9f, 0x6e, 0x72, 0x1f, 0x9c, 0x6e,
- 0x72, 0x1f, 0x9d, 0x6e, 0x72, 0x7f, 0x3b, 0xdd, 0xe4, 0x7e, 0xfe, 0xf1, 0xe6, 0xc2, 0x07, 0x1f,
- 0x6f, 0x2e, 0x7c, 0xf4, 0xf1, 0xe6, 0xc2, 0x9b, 0x69, 0x3f, 0x9a, 0xfa, 0x29, 0xfa, 0x6b, 0xea,
- 0x4b, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x77, 0x72, 0x88, 0x5c, 0x25, 0x1e, 0x00, 0x00,
+func init() { proto.RegisterFile("roachpb/data.proto", fileDescriptor_data_9fe3b4298c3b6243) }
+
+var fileDescriptor_data_9fe3b4298c3b6243 = []byte{
+ // 2606 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0x4f, 0x70, 0x23, 0x47,
+ 0xd5, 0xf7, 0x58, 0x23, 0x69, 0xf4, 0x2c, 0xc9, 0xe3, 0x5e, 0xdb, 0xab, 0x75, 0xbe, 0xcf, 0xda,
+ 0x4f, 0xf9, 0x20, 0xcb, 0x16, 0x91, 0x0b, 0x27, 0xa4, 0x52, 0xcb, 0x52, 0x85, 0xfe, 0xad, 0x23,
+ 0xad, 0x2c, 0x6d, 0x46, 0xe3, 0x0d, 0x4e, 0xa0, 0x86, 0xd1, 0x4c, 0x5b, 0x1e, 0x3c, 0x9a, 0xd1,
+ 0xce, 0x8c, 0x1c, 0x8b, 0x1b, 0x17, 0x2a, 0x95, 0x03, 0x70, 0xe4, 0x98, 0x2a, 0x6e, 0x70, 0x80,
+ 0x23, 0xc5, 0x81, 0x73, 0x0e, 0x1c, 0x72, 0x4b, 0x80, 0x2a, 0x15, 0x38, 0x97, 0x1c, 0xb8, 0x53,
+ 0xe5, 0x82, 0x2a, 0xaa, 0xbb, 0xe7, 0x9f, 0xbd, 0xb2, 0x91, 0xb3, 0x21, 0xa4, 0xb8, 0xd8, 0x33,
+ 0xaf, 0xdf, 0xfb, 0xbd, 0xee, 0xd7, 0xef, 0xdf, 0x3c, 0x01, 0x72, 0x6c, 0x55, 0x3b, 0x1c, 0xf5,
+ 0xb7, 0x74, 0xd5, 0x53, 0xcb, 0x23, 0xc7, 0xf6, 0x6c, 0xb4, 0xa2, 0xd9, 0xda, 0x11, 0xa5, 0x97,
+ 0xfd, 0xd5, 0x8d, 0xbb, 0x47, 0xc7, 0x5b, 0x47, 0xc7, 0x2e, 0x76, 0x8e, 0xb1, 0xb3, 0xa5, 0xd9,
+ 0x96, 0x36, 0x76, 0x1c, 0x6c, 0x69, 0x93, 0x2d, 0xd3, 0xd6, 0x8e, 0xe8, 0x1f, 0xc3, 0x1a, 0x30,
+ 0xf1, 0x8d, 0xf5, 0x00, 0x72, 0x88, 0x3d, 0x35, 0x82, 0xdd, 0x78, 0xce, 0xf5, 0x6c, 0x47, 0x1d,
+ 0xe0, 0x2d, 0x6c, 0x0d, 0x0c, 0x0b, 0x13, 0x86, 0x63, 0x4d, 0xf3, 0x17, 0xff, 0x67, 0xe6, 0xe2,
+ 0x4b, 0xfe, 0x6a, 0x61, 0xec, 0x19, 0xe6, 0xd6, 0xa1, 0xa9, 0x6d, 0x79, 0xc6, 0x10, 0xbb, 0x9e,
+ 0x3a, 0x1c, 0xf9, 0x2b, 0xab, 0x03, 0x7b, 0x60, 0xd3, 0xc7, 0x2d, 0xf2, 0xc4, 0xa8, 0xa5, 0x7d,
+ 0xe0, 0x7b, 0x23, 0xd5, 0x42, 0xb7, 0x20, 0x71, 0x84, 0x27, 0x85, 0xc4, 0x6d, 0xee, 0x4e, 0xb6,
+ 0x9a, 0x3e, 0x9b, 0x16, 0x13, 0x0f, 0xf1, 0x44, 0x22, 0x34, 0x74, 0x1b, 0xd2, 0xd8, 0xd2, 0x15,
+ 0xb2, 0xcc, 0x9f, 0x5f, 0x4e, 0x61, 0x4b, 0x7f, 0x88, 0x27, 0xf7, 0x84, 0x9f, 0xbd, 0x57, 0x5c,
+ 0xf8, 0xcd, 0x7b, 0x45, 0xae, 0xc5, 0x0b, 0x9c, 0xb8, 0xd8, 0xe2, 0x85, 0x45, 0x31, 0x51, 0x1a,
+ 0x40, 0xf2, 0xb1, 0x6a, 0x8e, 0x31, 0x7a, 0x0e, 0x32, 0x8e, 0xfa, 0xb6, 0xd2, 0x9f, 0x78, 0xd8,
+ 0x2d, 0x70, 0x04, 0x42, 0x12, 0x1c, 0xf5, 0xed, 0x2a, 0x79, 0x47, 0x15, 0xc8, 0x84, 0x3b, 0x2d,
+ 0x2c, 0xde, 0xe6, 0xee, 0x2c, 0x6d, 0xff, 0x6f, 0x39, 0x32, 0x2b, 0x39, 0x4e, 0xf9, 0xd0, 0xd4,
+ 0xca, 0x72, 0xc0, 0x54, 0xe5, 0xdf, 0x9f, 0x16, 0x17, 0xa4, 0x48, 0xaa, 0xf4, 0x16, 0x08, 0x0f,
+ 0xf1, 0x84, 0xe9, 0xf2, 0xcf, 0xc1, 0xcd, 0x38, 0xc7, 0xcb, 0x90, 0x3c, 0x26, 0x3c, 0xbe, 0x96,
+ 0x42, 0xf9, 0xa9, 0xcb, 0x2b, 0x53, 0x0c, 0x5f, 0x01, 0x63, 0x2e, 0x7d, 0xc8, 0x01, 0xf4, 0x3c,
+ 0xdb, 0xc1, 0x4d, 0x1d, 0x5b, 0x1e, 0x1a, 0x00, 0x68, 0xe6, 0xd8, 0xf5, 0xb0, 0xa3, 0x18, 0xba,
+ 0xaf, 0xe6, 0x35, 0xc2, 0xff, 0xc7, 0x69, 0xf1, 0xa5, 0x81, 0xe1, 0x1d, 0x8e, 0xfb, 0x65, 0xcd,
+ 0x1e, 0x6e, 0x85, 0xd8, 0x7a, 0x3f, 0x7a, 0xde, 0x1a, 0x1d, 0x0d, 0xb6, 0xe8, 0x05, 0x8d, 0xc7,
+ 0x86, 0x5e, 0xde, 0xdb, 0x6b, 0xd6, 0x4f, 0xa7, 0xc5, 0x4c, 0x8d, 0x01, 0x36, 0xeb, 0x52, 0xc6,
+ 0xc7, 0x6e, 0xea, 0xe8, 0x45, 0x48, 0x5b, 0xb6, 0x8e, 0x89, 0x16, 0xb2, 0xdf, 0x64, 0x75, 0xf5,
+ 0x74, 0x5a, 0x4c, 0x75, 0x6c, 0x1d, 0x37, 0xeb, 0x67, 0xe1, 0x93, 0x94, 0x22, 0x4c, 0x4d, 0x1d,
+ 0x7d, 0x0d, 0x04, 0xe2, 0x17, 0x94, 0x3f, 0x41, 0xf9, 0xd7, 0x4f, 0xa7, 0xc5, 0x34, 0xdb, 0x39,
+ 0x11, 0x08, 0x1e, 0xa5, 0xb4, 0xcb, 0x4e, 0x53, 0xfa, 0x05, 0x07, 0xd9, 0xde, 0xc8, 0x34, 0x3c,
+ 0xd9, 0x31, 0x06, 0x03, 0xec, 0xa0, 0x06, 0x64, 0x4c, 0x7c, 0xe0, 0x29, 0x3a, 0x76, 0x35, 0x7a,
+ 0xb4, 0xa5, 0xed, 0xd2, 0x0c, 0x23, 0x49, 0xaa, 0x35, 0xc0, 0x75, 0xec, 0x6a, 0x8e, 0x31, 0xf2,
+ 0x6c, 0xc7, 0x37, 0x97, 0x40, 0x44, 0x09, 0x15, 0xed, 0x00, 0x38, 0xc6, 0xe0, 0xd0, 0xc7, 0x59,
+ 0xbc, 0x26, 0x4e, 0x86, 0xca, 0x12, 0xf2, 0x3d, 0xfe, 0x13, 0xe6, 0x52, 0x09, 0x91, 0x2f, 0xfd,
+ 0x2d, 0x01, 0xd9, 0x5d, 0xec, 0x0c, 0xf0, 0x17, 0x74, 0xb3, 0x68, 0x00, 0x22, 0x03, 0x22, 0xd1,
+ 0xa8, 0xb8, 0x9e, 0xea, 0xb9, 0x34, 0x5c, 0x96, 0xb6, 0xbf, 0x14, 0x83, 0xf3, 0x63, 0xb7, 0x1c,
+ 0xc4, 0x6e, 0x79, 0xf7, 0x71, 0xad, 0xd6, 0x23, 0xcc, 0xd5, 0x75, 0x82, 0x78, 0x3a, 0x2d, 0xe6,
+ 0x25, 0x02, 0x13, 0xd2, 0xa5, 0x3c, 0x85, 0xdd, 0x3d, 0xd6, 0x34, 0xfa, 0x8e, 0x7e, 0xc4, 0x41,
+ 0xf6, 0xc0, 0xc1, 0xf8, 0x07, 0x98, 0x68, 0x71, 0xbc, 0x42, 0x72, 0x9e, 0xa0, 0xa9, 0x13, 0xf4,
+ 0xb3, 0x69, 0xf1, 0xfe, 0xfc, 0x3e, 0x4a, 0x00, 0x6a, 0x24, 0x61, 0x85, 0x28, 0xd2, 0x12, 0x53,
+ 0xdc, 0x23, 0x7a, 0xd1, 0x3e, 0xac, 0xb3, 0x13, 0x6b, 0xa6, 0xed, 0x62, 0x5d, 0x89, 0xc2, 0x38,
+ 0x35, 0x7f, 0x18, 0xaf, 0x52, 0x88, 0x1a, 0x45, 0x08, 0xd7, 0xce, 0xdd, 0xfc, 0x2f, 0x93, 0xb0,
+ 0x56, 0x3b, 0x24, 0xe6, 0x97, 0xf0, 0xc8, 0x34, 0x34, 0xd5, 0x0d, 0x5c, 0xe0, 0x4d, 0x58, 0xd7,
+ 0xf1, 0xc8, 0xc1, 0x9a, 0xea, 0x61, 0x5d, 0xd1, 0x28, 0x8f, 0xe2, 0x4d, 0x46, 0x98, 0xfa, 0x43,
+ 0x7e, 0xfb, 0xff, 0x67, 0xdd, 0x23, 0xc3, 0x60, 0x80, 0xf2, 0x64, 0x84, 0xa5, 0xd5, 0x08, 0x23,
+ 0xa2, 0xa2, 0x7d, 0x40, 0x31, 0x6c, 0x87, 0x49, 0xf9, 0xfe, 0x71, 0x05, 0xee, 0x53, 0x1e, 0xb2,
+ 0x12, 0xa1, 0xf8, 0x2c, 0xe8, 0xfb, 0xf0, 0x5c, 0x0c, 0x7a, 0x3c, 0xd2, 0xe3, 0x2a, 0xdc, 0x42,
+ 0xe2, 0x76, 0xe2, 0x9a, 0x3a, 0x6e, 0x45, 0x70, 0x7b, 0x0c, 0x2d, 0xb0, 0x14, 0xc2, 0xb0, 0x11,
+ 0xd3, 0x65, 0xe1, 0x13, 0x2f, 0x50, 0x44, 0x12, 0x05, 0x4f, 0x13, 0xc5, 0x9d, 0xd3, 0x69, 0xf1,
+ 0x66, 0x3d, 0xe4, 0xea, 0xe0, 0x13, 0xcf, 0x97, 0xa7, 0x89, 0x23, 0x13, 0xbe, 0x48, 0x37, 0xf5,
+ 0x99, 0x5c, 0x3a, 0x7a, 0x05, 0x78, 0x1a, 0x3f, 0xc9, 0x79, 0xe3, 0x47, 0xa2, 0xfc, 0xa8, 0x0f,
+ 0x37, 0x0d, 0xcb, 0xc3, 0x8e, 0xa5, 0x9a, 0x8a, 0xaa, 0xeb, 0x71, 0x33, 0xa4, 0xae, 0x6d, 0x86,
+ 0xb5, 0x00, 0xaa, 0x42, 0x90, 0x42, 0x13, 0x1c, 0xc0, 0xad, 0x50, 0x87, 0x83, 0x87, 0xf6, 0x71,
+ 0x5c, 0x4b, 0xfa, 0xda, 0x5a, 0xc2, 0x0d, 0x4b, 0x0c, 0x2b, 0xd0, 0x73, 0x8f, 0x27, 0x45, 0xb0,
+ 0xf4, 0x2e, 0x07, 0x37, 0x76, 0x6d, 0xdd, 0x38, 0x30, 0xb0, 0x4e, 0x0a, 0x6b, 0xe0, 0xab, 0x5f,
+ 0x05, 0xe4, 0x4e, 0x5c, 0x0f, 0x0f, 0x15, 0xcd, 0xb6, 0x0e, 0x8c, 0x81, 0xe2, 0x8e, 0x54, 0x8b,
+ 0xfa, 0xa9, 0x20, 0x89, 0x6c, 0xa5, 0x46, 0x17, 0x68, 0x35, 0x6e, 0x00, 0xa2, 0xc9, 0xdf, 0x34,
+ 0x8e, 0xb1, 0x85, 0x5d, 0x97, 0x71, 0x33, 0xef, 0xbb, 0x39, 0x63, 0xb3, 0x44, 0x48, 0x12, 0x89,
+ 0x48, 0xdb, 0x97, 0x20, 0x94, 0xd2, 0x63, 0x10, 0x7b, 0x9e, 0xa1, 0x1d, 0x4d, 0xaa, 0x51, 0x92,
+ 0xaf, 0x02, 0xb8, 0x94, 0xa6, 0xf4, 0x0d, 0xcf, 0x4f, 0x9c, 0xf3, 0x15, 0x5c, 0x37, 0x80, 0x2a,
+ 0xfd, 0x36, 0x01, 0x6b, 0x4d, 0xdf, 0x0c, 0x35, 0x7b, 0x38, 0x8c, 0xd0, 0xeb, 0x90, 0x73, 0x49,
+ 0x49, 0x51, 0x3c, 0x46, 0xf0, 0x15, 0x14, 0x67, 0xee, 0x39, 0x2a, 0x3d, 0x52, 0xd6, 0x8d, 0x17,
+ 0xa2, 0x3a, 0xe4, 0x86, 0x24, 0xd7, 0x87, 0x28, 0x8b, 0x97, 0xa2, 0xc4, 0x6b, 0x82, 0x94, 0x1d,
+ 0xc6, 0x2b, 0xc4, 0xf7, 0xe0, 0xa6, 0x9f, 0x13, 0x82, 0xeb, 0x0e, 0xf1, 0x12, 0x14, 0xef, 0xce,
+ 0x0c, 0xbc, 0x99, 0x99, 0x46, 0x5a, 0xd3, 0x2e, 0x49, 0x40, 0x6b, 0x43, 0xff, 0xae, 0xe9, 0x0d,
+ 0x85, 0xf8, 0x2c, 0xf1, 0x7f, 0x79, 0xd6, 0x7e, 0x9f, 0xf6, 0x0d, 0xe9, 0xc6, 0x70, 0x86, 0xc3,
+ 0xbc, 0x0e, 0x28, 0xba, 0xa7, 0x10, 0x98, 0x05, 0xd8, 0xf3, 0xb3, 0xcc, 0x79, 0xe1, 0xa2, 0x25,
+ 0xd1, 0xbd, 0x40, 0xb9, 0xc7, 0xbf, 0xf3, 0x5e, 0x91, 0x2b, 0xfd, 0x9e, 0x83, 0x95, 0x6e, 0x9f,
+ 0x36, 0xa8, 0x51, 0xc6, 0x8d, 0xb7, 0x1b, 0xdc, 0x1c, 0xed, 0xc6, 0x0f, 0xb9, 0x6b, 0xb7, 0x6d,
+ 0x9f, 0x4d, 0x05, 0x8a, 0xb4, 0xde, 0xe3, 0x49, 0xc7, 0x59, 0x3a, 0x4b, 0xc1, 0x92, 0xec, 0xa8,
+ 0x96, 0xab, 0x6a, 0x9e, 0x61, 0x5b, 0xa8, 0x02, 0x3c, 0xe9, 0xa6, 0x7d, 0xc7, 0x7b, 0xfe, 0xaa,
+ 0xda, 0x2b, 0x9f, 0x58, 0xbb, 0xd8, 0x53, 0xab, 0x02, 0xd9, 0xd9, 0x07, 0xd3, 0x22, 0x27, 0x51,
+ 0x51, 0x84, 0x80, 0xb7, 0xd4, 0x21, 0xeb, 0x13, 0x33, 0x12, 0x7d, 0x46, 0xf7, 0x21, 0x45, 0x6a,
+ 0xfa, 0x98, 0x15, 0xf5, 0xd9, 0xb5, 0x25, 0xb6, 0x8d, 0x1e, 0xe5, 0x95, 0x7c, 0x19, 0xd4, 0x82,
+ 0xbc, 0xa9, 0xba, 0x9e, 0x72, 0x88, 0x55, 0xc7, 0xeb, 0x63, 0x75, 0xce, 0xa2, 0xcd, 0x02, 0x2f,
+ 0x47, 0x44, 0x5f, 0x0b, 0x24, 0xd1, 0x77, 0xa1, 0x30, 0x30, 0xed, 0xbe, 0x6a, 0x2a, 0x63, 0x4b,
+ 0xc3, 0x8e, 0xa7, 0x1a, 0x96, 0x37, 0x51, 0x4c, 0x63, 0x68, 0x78, 0x85, 0xf4, 0xfc, 0xa8, 0xeb,
+ 0x0c, 0x64, 0x2f, 0xc2, 0x68, 0x13, 0x08, 0xf4, 0x16, 0xdc, 0xb0, 0x7d, 0xef, 0x88, 0x2a, 0xba,
+ 0x5b, 0x10, 0x2e, 0x4d, 0x94, 0x4f, 0xf9, 0x92, 0xaf, 0x00, 0xd9, 0x17, 0x17, 0x5c, 0x74, 0x1f,
+ 0x80, 0x5c, 0x27, 0x0d, 0x16, 0xb7, 0xb0, 0x44, 0x31, 0x2f, 0xcb, 0x67, 0x41, 0xda, 0x21, 0x02,
+ 0xe4, 0xdd, 0x45, 0x25, 0xc8, 0xbd, 0xed, 0x18, 0x1e, 0x56, 0x3c, 0xdb, 0x56, 0x6c, 0x53, 0x2f,
+ 0x64, 0x69, 0xfa, 0x5c, 0xa2, 0x44, 0xd9, 0xb6, 0xbb, 0xa6, 0x4e, 0x2c, 0xed, 0x60, 0x35, 0xde,
+ 0x8c, 0x2c, 0x5f, 0xc3, 0xd2, 0x44, 0x34, 0x8a, 0x89, 0x97, 0x61, 0x5d, 0xa3, 0xd9, 0x2d, 0x42,
+ 0x53, 0x0e, 0x8c, 0x13, 0xac, 0x17, 0x44, 0xaa, 0x78, 0x95, 0xad, 0x86, 0x02, 0x0f, 0xc8, 0x1a,
+ 0x7a, 0x1d, 0x44, 0xc3, 0x52, 0x0e, 0x4c, 0xda, 0x1a, 0xd1, 0xad, 0xb9, 0x85, 0x15, 0x7a, 0xd2,
+ 0xff, 0x9b, 0x75, 0x52, 0xfc, 0x64, 0x8c, 0x2d, 0x0d, 0xeb, 0x6f, 0x10, 0x4e, 0x7f, 0x1f, 0x79,
+ 0xc3, 0x7a, 0x40, 0xe5, 0x29, 0xd1, 0x45, 0x36, 0x2c, 0x1b, 0x03, 0xcb, 0x76, 0x48, 0x9a, 0xc1,
+ 0x4f, 0xac, 0xf1, 0xd0, 0x2d, 0x20, 0x8a, 0x58, 0xbe, 0xca, 0xbd, 0x9b, 0x4c, 0xa4, 0x87, 0x9f,
+ 0x74, 0xc6, 0x43, 0x5a, 0x7f, 0xa3, 0x1e, 0xf3, 0xdc, 0x9a, 0x2b, 0xe5, 0x8d, 0xf0, 0x9d, 0xa0,
+ 0x9f, 0xfb, 0xa0, 0x4b, 0x88, 0x7c, 0x8b, 0x17, 0x52, 0x62, 0xba, 0xc5, 0x0b, 0x19, 0x11, 0x5a,
+ 0xbc, 0x90, 0x13, 0xf3, 0x2d, 0x5e, 0xc8, 0x8b, 0xcb, 0xa5, 0x5f, 0xf3, 0xb0, 0x12, 0xf3, 0x7a,
+ 0x09, 0x6b, 0xb6, 0xa3, 0x7f, 0x16, 0x21, 0xf8, 0xc5, 0x09, 0xb7, 0x67, 0x73, 0xd9, 0xff, 0x06,
+ 0x67, 0xe0, 0x7d, 0x47, 0x58, 0x14, 0x13, 0x17, 0xdc, 0x21, 0x2d, 0x0a, 0x2d, 0x5e, 0x10, 0xc4,
+ 0x4c, 0xe8, 0x1a, 0x20, 0x2e, 0xb5, 0x78, 0x21, 0x2b, 0xe6, 0xe2, 0x6e, 0xd2, 0xe2, 0x85, 0x65,
+ 0x51, 0x6c, 0xf1, 0x82, 0x28, 0xae, 0x94, 0xa6, 0x1c, 0xa4, 0x48, 0xef, 0x60, 0x91, 0x0f, 0x88,
+ 0x65, 0xd7, 0xb0, 0x06, 0x26, 0x56, 0x8e, 0xf0, 0x24, 0x6a, 0x88, 0x96, 0xb6, 0x5f, 0x98, 0x61,
+ 0x1b, 0x26, 0x53, 0xee, 0x51, 0x81, 0x87, 0x78, 0x42, 0xed, 0x1d, 0xb9, 0x4d, 0xce, 0x8d, 0x2f,
+ 0xa0, 0x6f, 0x40, 0xc2, 0x3b, 0x09, 0x3a, 0xa6, 0xb9, 0x3c, 0x90, 0x19, 0x9b, 0x48, 0x6d, 0xdc,
+ 0x87, 0xdc, 0x39, 0x35, 0x57, 0x0c, 0x47, 0xe2, 0x03, 0x8f, 0x16, 0x2f, 0xf0, 0x62, 0xb2, 0xf4,
+ 0x07, 0x0e, 0x96, 0xdb, 0xb6, 0x76, 0x54, 0xd1, 0x9e, 0x8c, 0x0d, 0xd7, 0xa0, 0x45, 0xe9, 0xeb,
+ 0xc0, 0xc7, 0x8e, 0x77, 0xa9, 0xfb, 0xc4, 0xa2, 0xc0, 0x7d, 0xd6, 0x53, 0x20, 0x09, 0x40, 0x1f,
+ 0x3b, 0x6a, 0xdf, 0x30, 0x0d, 0x8f, 0xed, 0x3d, 0xbf, 0xbd, 0x1d, 0xc3, 0x38, 0x3a, 0x2e, 0x07,
+ 0x73, 0xaa, 0x72, 0x6c, 0x4e, 0x55, 0x26, 0xce, 0x5b, 0xae, 0x87, 0x92, 0x52, 0x0c, 0xa5, 0xf4,
+ 0xab, 0x45, 0x00, 0x72, 0x36, 0xf6, 0x99, 0xf1, 0x1f, 0x39, 0x56, 0x94, 0x19, 0x12, 0x9f, 0x22,
+ 0x33, 0xcc, 0x08, 0x1e, 0xfe, 0xdf, 0x19, 0x3c, 0xa5, 0x9f, 0x70, 0x90, 0x3f, 0x1f, 0xd6, 0x57,
+ 0x8d, 0xa8, 0xbe, 0x03, 0x82, 0xeb, 0x33, 0xfb, 0x53, 0x9f, 0x6f, 0xcd, 0xdd, 0x31, 0x5d, 0x1c,
+ 0x0b, 0x12, 0xe3, 0xf5, 0xf0, 0x13, 0x29, 0x44, 0xf4, 0x1b, 0xa6, 0xdf, 0xf1, 0x90, 0x6c, 0x63,
+ 0xd5, 0xc5, 0x68, 0x02, 0x49, 0x36, 0x41, 0xe0, 0x3e, 0xbf, 0xfe, 0x8d, 0x69, 0x44, 0xdf, 0x04,
+ 0xc0, 0x27, 0x23, 0xc3, 0x51, 0xc9, 0x1d, 0xcd, 0xd5, 0x3f, 0x4a, 0x31, 0x01, 0x54, 0x87, 0x74,
+ 0xf0, 0x49, 0x9e, 0xb8, 0xf6, 0x27, 0x79, 0x20, 0x8a, 0xf6, 0x20, 0xf6, 0x41, 0xcb, 0x86, 0x29,
+ 0xe4, 0xaf, 0x6b, 0x04, 0x93, 0x9b, 0x7f, 0xb1, 0xa3, 0xb5, 0x48, 0x9a, 0x4e, 0x44, 0x7a, 0x54,
+ 0x16, 0xfd, 0x98, 0x83, 0xa5, 0x91, 0x63, 0x8f, 0xd8, 0x50, 0xc4, 0x9d, 0xaf, 0xf6, 0x74, 0x4e,
+ 0xa7, 0x45, 0x78, 0xe4, 0x4b, 0xc9, 0xbd, 0x67, 0xb6, 0x33, 0x04, 0x3b, 0x90, 0x5d, 0xb4, 0x0a,
+ 0x49, 0x3c, 0xb2, 0xb5, 0x43, 0x3a, 0x97, 0x49, 0x48, 0xec, 0x05, 0xbd, 0x18, 0xf3, 0x35, 0xd2,
+ 0x37, 0x26, 0xaa, 0x2b, 0x67, 0xd3, 0x62, 0x8e, 0xba, 0x46, 0xe0, 0xb1, 0x31, 0xe7, 0x09, 0x5b,
+ 0x82, 0xd2, 0x9f, 0x38, 0xc8, 0x57, 0xfa, 0xb6, 0xe3, 0x91, 0xe0, 0x6e, 0x58, 0x9e, 0x33, 0xb9,
+ 0xca, 0xa5, 0x9f, 0x7d, 0xbe, 0x8b, 0x54, 0x10, 0x46, 0x8e, 0x61, 0x3b, 0x41, 0x1e, 0x4b, 0x56,
+ 0x1b, 0x67, 0xd3, 0x62, 0xe5, 0x53, 0x47, 0xc5, 0x23, 0x1f, 0x4c, 0x0a, 0x61, 0xef, 0x09, 0xe4,
+ 0x64, 0x9f, 0x90, 0xd3, 0xfd, 0x63, 0x11, 0x56, 0xda, 0x58, 0x3d, 0x90, 0x4f, 0xac, 0xa6, 0x35,
+ 0x1a, 0x93, 0x4b, 0xf5, 0x30, 0x7a, 0x85, 0xa5, 0x2c, 0x16, 0x28, 0x9b, 0x57, 0xa7, 0x9c, 0x78,
+ 0xb6, 0x7a, 0x01, 0x96, 0x1d, 0x7c, 0xe0, 0x60, 0xf7, 0x50, 0x31, 0xac, 0x63, 0xd5, 0x34, 0x74,
+ 0x6a, 0x6b, 0x41, 0xca, 0xfb, 0xe4, 0x26, 0xa3, 0xce, 0x6c, 0x14, 0x84, 0x67, 0x6b, 0x14, 0xb6,
+ 0x61, 0xcd, 0xf5, 0xf0, 0x68, 0x64, 0x58, 0x03, 0x65, 0x48, 0xbe, 0xed, 0xb0, 0xa5, 0xf6, 0x4d,
+ 0xac, 0x17, 0x32, 0x74, 0x07, 0x37, 0x82, 0xc5, 0x5d, 0x5b, 0xc7, 0x0d, 0xb6, 0x84, 0xfa, 0x90,
+ 0xa5, 0xed, 0xb3, 0x8b, 0x9f, 0x28, 0xd6, 0x78, 0x58, 0x80, 0xcf, 0x28, 0x09, 0x01, 0x41, 0x65,
+ 0x39, 0xf2, 0x42, 0x27, 0xc1, 0x8b, 0xc9, 0x16, 0x2f, 0x24, 0xc5, 0x14, 0xeb, 0x2a, 0x4a, 0xef,
+ 0x46, 0xf6, 0x7f, 0x60, 0x58, 0xaa, 0xf9, 0x6c, 0xf6, 0x7f, 0x15, 0x0a, 0xf1, 0x11, 0xa1, 0x3d,
+ 0x1c, 0xaa, 0x16, 0xf9, 0x3f, 0xb6, 0x3c, 0xe6, 0x4a, 0x52, 0x6c, 0x84, 0x58, 0x63, 0xcb, 0x35,
+ 0xb2, 0x8a, 0xaa, 0x90, 0x0b, 0x6e, 0x8e, 0xb5, 0x7e, 0xfc, 0x3c, 0xad, 0x5f, 0xd6, 0x97, 0x61,
+ 0xdd, 0xdf, 0xbc, 0xb7, 0x1f, 0x9a, 0x24, 0x34, 0x03, 0x6b, 0xab, 0x4a, 0x7f, 0xe7, 0x60, 0xb9,
+ 0x66, 0x1a, 0xd8, 0xf2, 0x68, 0xd5, 0x69, 0x5a, 0x07, 0x36, 0x7a, 0x0d, 0xd6, 0xf4, 0x30, 0xa5,
+ 0x29, 0x03, 0x6c, 0x61, 0x3f, 0x8b, 0x72, 0x34, 0x88, 0x6f, 0x9c, 0x4d, 0x8b, 0xcb, 0x94, 0x7b,
+ 0x27, 0x5c, 0x92, 0x56, 0x23, 0x89, 0x88, 0x8a, 0x5e, 0x85, 0xbc, 0x49, 0xa2, 0x5d, 0x39, 0x57,
+ 0x73, 0x66, 0xe6, 0x81, 0x9c, 0x19, 0x7f, 0x45, 0x18, 0x6e, 0x5e, 0x1c, 0xfa, 0x2a, 0x23, 0xdb,
+ 0x34, 0xb4, 0xa0, 0xd1, 0x78, 0xf1, 0xb2, 0x11, 0xe0, 0x85, 0x49, 0xef, 0x23, 0x2a, 0x24, 0xad,
+ 0x69, 0xb3, 0xc8, 0xa5, 0xbf, 0x72, 0x90, 0x89, 0x0e, 0x7e, 0xdf, 0x1f, 0x32, 0x5e, 0x77, 0xd8,
+ 0xcf, 0x46, 0x8d, 0x2f, 0x43, 0x92, 0x9e, 0xe1, 0x8a, 0x5f, 0x7f, 0xe8, 0x91, 0x83, 0x5f, 0x7f,
+ 0x28, 0xf3, 0xe7, 0x74, 0x50, 0x36, 0x3b, 0xbc, 0xfb, 0x21, 0x07, 0x19, 0xfa, 0x0b, 0x14, 0x9d,
+ 0x40, 0x2f, 0x41, 0x7a, 0xaf, 0xf3, 0xb0, 0xd3, 0x7d, 0xa3, 0x23, 0x2e, 0xa0, 0x34, 0x24, 0x9a,
+ 0x1d, 0x59, 0xe4, 0x50, 0x06, 0x92, 0x0f, 0xda, 0xdd, 0x8a, 0x2c, 0x2e, 0x92, 0xc7, 0xea, 0xbe,
+ 0xdc, 0xe8, 0x89, 0x09, 0x74, 0x03, 0x96, 0xeb, 0x8d, 0x76, 0x73, 0xb7, 0x29, 0x37, 0xea, 0x0a,
+ 0x23, 0x0a, 0x48, 0x00, 0x5e, 0x6e, 0xee, 0x36, 0x44, 0x9e, 0x40, 0xd5, 0x1b, 0xb5, 0xe6, 0x6e,
+ 0xa5, 0x2d, 0x26, 0xd1, 0x1a, 0xac, 0x44, 0xbc, 0x01, 0x39, 0x83, 0xb2, 0x20, 0xd4, 0xf7, 0xa4,
+ 0x8a, 0xdc, 0xec, 0x76, 0xc4, 0x14, 0x02, 0x48, 0x11, 0x59, 0xf9, 0x4d, 0x31, 0x4b, 0x74, 0xef,
+ 0x34, 0xba, 0x62, 0x8e, 0x2a, 0xec, 0x7e, 0x7b, 0xbb, 0x2e, 0xe6, 0xc9, 0xa3, 0xbc, 0xf7, 0xa8,
+ 0xdd, 0x10, 0x81, 0x08, 0x56, 0x9b, 0x72, 0x45, 0x92, 0x2a, 0xfb, 0xe2, 0x12, 0xca, 0x03, 0x10,
+ 0xc1, 0x5e, 0x43, 0x6a, 0x36, 0x7a, 0xa2, 0x5e, 0x22, 0x1f, 0x09, 0xe9, 0xbb, 0x1a, 0xac, 0x3c,
+ 0x35, 0x78, 0x47, 0x39, 0xc8, 0x54, 0xea, 0x75, 0xe5, 0x71, 0x57, 0x6e, 0x48, 0xe2, 0x02, 0x12,
+ 0x21, 0x2b, 0x35, 0x76, 0xbb, 0x8f, 0x1b, 0x3e, 0x85, 0x43, 0x2b, 0x90, 0x23, 0x0c, 0x9d, 0x6e,
+ 0xc7, 0x27, 0x2d, 0xa2, 0x55, 0x10, 0x7d, 0xa6, 0x88, 0x9a, 0xd8, 0xe0, 0xdf, 0xf9, 0xf9, 0xe6,
+ 0xc2, 0xdd, 0xee, 0xb9, 0x6f, 0x51, 0xd6, 0xf8, 0x91, 0xa3, 0x3f, 0x6a, 0x74, 0xea, 0xcd, 0xce,
+ 0x8e, 0xb8, 0x40, 0x5e, 0x7a, 0x72, 0x65, 0x87, 0xbc, 0x24, 0x88, 0xfa, 0x5a, 0x77, 0x77, 0xb7,
+ 0x29, 0xcb, 0x8d, 0xba, 0xc8, 0x91, 0xb5, 0x4a, 0xb5, 0x2b, 0x91, 0x97, 0x45, 0x1f, 0x70, 0x1f,
+ 0x36, 0x2e, 0xbf, 0x4a, 0xb4, 0x01, 0xeb, 0xed, 0xca, 0x8e, 0x52, 0xdd, 0x57, 0x6a, 0xed, 0xbd,
+ 0x9e, 0xdc, 0x90, 0x94, 0x5e, 0x43, 0x96, 0x99, 0xa2, 0x5b, 0xb0, 0xd6, 0x6e, 0x54, 0xea, 0xca,
+ 0x83, 0xae, 0xa4, 0xec, 0xb4, 0xbb, 0xd5, 0x4a, 0x5b, 0x91, 0x1a, 0x95, 0x7a, 0x4f, 0xe4, 0x18,
+ 0x74, 0xf5, 0x2b, 0xef, 0xff, 0x65, 0x73, 0xe1, 0xfd, 0xd3, 0x4d, 0xee, 0x83, 0xd3, 0x4d, 0xee,
+ 0xa3, 0xd3, 0x4d, 0xee, 0xcf, 0xa7, 0x9b, 0xdc, 0x4f, 0x3f, 0xde, 0x5c, 0xf8, 0xe0, 0xe3, 0xcd,
+ 0x85, 0x8f, 0x3e, 0xde, 0x5c, 0x78, 0x33, 0xed, 0x7b, 0x53, 0x3f, 0x45, 0x7f, 0xa8, 0x7d, 0xe9,
+ 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x08, 0xe1, 0x66, 0xfa, 0x80, 0x1e, 0x00, 0x00,
}
diff --git a/pkg/roachpb/data.proto b/pkg/roachpb/data.proto
index 6e730fcabc73..61fc48f443d6 100644
--- a/pkg/roachpb/data.proto
+++ b/pkg/roachpb/data.proto
@@ -144,12 +144,27 @@ message MergeTrigger {
];
// FreezeStart is a timestamp that is guaranteed to be greater than the
- // timestamps at which any requests were serviced by the responding replica
+ // timestamps at which any requests were serviced by the right-hand side range
// before it stopped responding to requests altogether (in anticipation of
// being subsumed). It is suitable for use as the timestamp cache's low water
// mark for the keys previously owned by the subsumed range.
util.hlc.Timestamp freeze_start = 5 [(gogoproto.nullable) = false,
(gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp"];
+
+ // right_closed_timestamp is the closed timestamp of the RHS at the moment of
+ // the subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the right_read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ util.hlc.Timestamp right_closed_timestamp = 6 [(gogoproto.nullable) = false];
}
// ReplicaChangeType is a parameter of ChangeReplicasTrigger.
From 1183dc866b1167e89765450882194283e5f53c7c Mon Sep 17 00:00:00 2001
From: Nathan VanBenschoten
Date: Thu, 18 Feb 2021 16:38:19 -0500
Subject: [PATCH 6/6] kv: add TestStoreRangeSplitAndMergeWithGlobalReads
Made possible by #60567.
This commit adds a new test called TestStoreRangeSplitAndMergeWithGlobalReads
that tests that a range configured to serve global reads can be split and
merged. In essence, this tests whether the split and merge transactions can
handle having their timestamp bumped by the closed timestamp on the ranges
they're operating on.
The test revealed that range merges did have issues in these cases, because
SubsumeRequests assumed that the intent on the RHS's local descriptor was below
the node's HLC clock. This is no longer always true, so we now perform the
inconsistent scan at hlc.MaxTimestamp, just like QueryIntent requests do.
---
pkg/kv/kvserver/batcheval/cmd_subsume.go | 9 ++--
pkg/kv/kvserver/client_split_test.go | 57 ++++++++++++++++++++++++
pkg/kv/kvserver/helpers_test.go | 8 ++++
pkg/kv/kvserver/replica.go | 4 ++
4 files changed, 75 insertions(+), 3 deletions(-)
diff --git a/pkg/kv/kvserver/batcheval/cmd_subsume.go b/pkg/kv/kvserver/batcheval/cmd_subsume.go
index 77797e62b7c4..c66db6b426d5 100644
--- a/pkg/kv/kvserver/batcheval/cmd_subsume.go
+++ b/pkg/kv/kvserver/batcheval/cmd_subsume.go
@@ -20,6 +20,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/spanset"
"github.com/cockroachdb/cockroach/pkg/roachpb"
"github.com/cockroachdb/cockroach/pkg/storage"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/errors"
)
@@ -90,16 +91,18 @@ func Subsume(
}
// Sanity check the caller has initiated a merge transaction by checking for
- // a deletion intent on the local range descriptor.
+ // a deletion intent on the local range descriptor. Read inconsistently at
+ // the maximum timestamp to ensure that we see an intent if one exists,
+ // regardless of what timestamp it is written at.
descKey := keys.RangeDescriptorKey(desc.StartKey)
- _, intent, err := storage.MVCCGet(ctx, readWriter, descKey, cArgs.Header.Timestamp,
+ _, intent, err := storage.MVCCGet(ctx, readWriter, descKey, hlc.MaxTimestamp,
storage.MVCCGetOptions{Inconsistent: true})
if err != nil {
return result.Result{}, errors.Errorf("fetching local range descriptor: %s", err)
} else if intent == nil {
return result.Result{}, errors.AssertionFailedf("range missing intent on its local descriptor")
}
- val, _, err := storage.MVCCGetAsTxn(ctx, readWriter, descKey, cArgs.Header.Timestamp, intent.Txn)
+ val, _, err := storage.MVCCGetAsTxn(ctx, readWriter, descKey, intent.Txn.WriteTimestamp, intent.Txn)
if err != nil {
return result.Result{}, errors.Errorf("fetching local range descriptor as txn: %s", err)
} else if val != nil {
diff --git a/pkg/kv/kvserver/client_split_test.go b/pkg/kv/kvserver/client_split_test.go
index dca3120999b8..3cff9b9eef7a 100644
--- a/pkg/kv/kvserver/client_split_test.go
+++ b/pkg/kv/kvserver/client_split_test.go
@@ -3545,3 +3545,60 @@ func TestSplitBlocksReadsToRHS(t *testing.T) {
}
require.Nil(t, g.Wait())
}
+
+// TestStoreRangeSplitAndMergeWithGlobalReads tests that a range configured to
+// serve global reads can be split and merged. In essence, this tests whether
+// the split and merge transactions can handle having their timestamp bumped by
+// the closed timestamp on the ranges they're operating on.
+func TestStoreRangeSplitAndMergeWithGlobalReads(t *testing.T) {
+ defer leaktest.AfterTest(t)()
+ defer log.Scope(t).Close(t)
+
+ ctx := context.Background()
+ serv, _, _ := serverutils.StartServer(t, base.TestServerArgs{
+ Knobs: base.TestingKnobs{
+ Store: &kvserver.StoreTestingKnobs{
+ DisableMergeQueue: true,
+ },
+ },
+ })
+ s := serv.(*server.TestServer)
+ defer s.Stopper().Stop(ctx)
+ store, err := s.Stores().GetStore(s.GetFirstStoreID())
+ require.NoError(t, err)
+ config.TestingSetupZoneConfigHook(s.Stopper())
+
+ // Set global reads.
+ descID := uint32(keys.MinUserDescID)
+ descKey := keys.SystemSQLCodec.TablePrefix(descID)
+ zoneConfig := zonepb.DefaultZoneConfig()
+ zoneConfig.GlobalReads = proto.Bool(true)
+ config.TestingSetZoneConfig(config.SystemTenantObjectID(descID), zoneConfig)
+
+ // Trigger gossip callback and wait for propagation
+ require.NoError(t, store.Gossip().AddInfoProto(gossip.KeySystemConfig, &config.SystemConfigEntries{}, 0))
+ testutils.SucceedsSoon(t, func() error {
+ repl := store.LookupReplica(roachpb.RKey(descKey))
+ if repl.ClosedTimestampPolicy() != roachpb.LEAD_FOR_GLOBAL_READS {
+ return errors.Errorf("expected LEAD_FOR_GLOBAL_READS policy")
+ }
+ return nil
+ })
+
+ // Split the range. Should succeed.
+ splitKey := append(descKey, []byte("split")...)
+ splitArgs := adminSplitArgs(splitKey)
+ _, pErr := kv.SendWrapped(ctx, store.TestSender(), splitArgs)
+ require.Nil(t, pErr)
+
+ repl := store.LookupReplica(roachpb.RKey(splitKey))
+ require.Equal(t, splitKey, repl.Desc().StartKey.AsRawKey())
+
+ // Merge the range. Should succeed.
+ mergeArgs := adminMergeArgs(descKey)
+ _, pErr = kv.SendWrapped(ctx, store.TestSender(), mergeArgs)
+ require.Nil(t, pErr)
+
+ repl = store.LookupReplica(roachpb.RKey(splitKey))
+ require.Equal(t, descKey, repl.Desc().StartKey.AsRawKey())
+}
diff --git a/pkg/kv/kvserver/helpers_test.go b/pkg/kv/kvserver/helpers_test.go
index 4a2e6053a20e..deb964182d95 100644
--- a/pkg/kv/kvserver/helpers_test.go
+++ b/pkg/kv/kvserver/helpers_test.go
@@ -514,6 +514,14 @@ func (r *Replica) ReadProtectedTimestamps(ctx context.Context) {
ts = r.readProtectedTimestampsRLocked(ctx, nil /* f */)
}
+// ClosedTimestampPolicy returns the closed timestamp policy of the range, which
+// is updated asynchronously through gossip of zone configurations.
+func (r *Replica) ClosedTimestampPolicy() roachpb.RangeClosedTimestampPolicy {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+ return r.closedTimestampPolicyRLocked()
+}
+
// GetCircuitBreaker returns the circuit breaker controlling
// connection attempts to the specified node.
func (t *RaftTransport) GetCircuitBreaker(
diff --git a/pkg/kv/kvserver/replica.go b/pkg/kv/kvserver/replica.go
index e602af9193b0..556950e17266 100644
--- a/pkg/kv/kvserver/replica.go
+++ b/pkg/kv/kvserver/replica.go
@@ -722,6 +722,10 @@ func (r *Replica) descRLocked() *roachpb.RangeDescriptor {
return r.mu.state.Desc
}
+// closedTimestampPolicyRLocked returns the closed timestamp policy of the
+// range, which is updated asynchronously through gossip of zone configurations.
+// NOTE: an exported version of this method which does not require the replica
+// lock exists in helpers_test.go. Move here if needed.
func (r *Replica) closedTimestampPolicyRLocked() roachpb.RangeClosedTimestampPolicy {
if r.mu.zone.GlobalReads != nil && *r.mu.zone.GlobalReads {
return roachpb.LEAD_FOR_GLOBAL_READS
|