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.’

overlay(input: string, overlay_val: string, start_pos: int, end_pos: int) → string

Deletes the characters in input between start_pos and end_pos (count starts at 1), and then insert overlay_val at start_pos.

+parse_timestamp(string: string) → timestamp

Convert a string containing an absolute timestamp to the corresponding timestamp.

+
pg_collation_for(str: anyelement) → string

Returns the collation of the argument

quote_ident(val: string) → string

Return val suitably quoted to serve as identifier in a SQL statement.

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 87b05130ad42..c54b1e4b7d88 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 750904afb215..cefe194ebc49 100644 --- a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row +++ b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row @@ -183,6 +183,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/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/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/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/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/batcheval/cmd_subsume.go b/pkg/kv/kvserver/batcheval/cmd_subsume.go index 77797e62b7c4..fad63a0f2b55 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 { @@ -151,6 +154,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/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/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/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/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/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..d21fad488468 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. @@ -722,6 +726,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 diff --git a/pkg/kv/kvserver/replica_application_result.go b/pkg/kv/kvserver/replica_application_result.go index a2761aa41bbd..90c9d0247bf1 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 } @@ -246,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_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_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 cdc35c0b3778..fdc55e0dad92 100644 --- a/pkg/kv/kvserver/replica_follower_read.go +++ b/pkg/kv/kvserver/replica_follower_read.go @@ -141,13 +141,34 @@ 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 } + +// 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/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_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/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/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/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/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. 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/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/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 { 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(), 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/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 { 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 {