From f6a4dc5aa6cd21f535336580f0c8282a9f208a77 Mon Sep 17 00:00:00 2001 From: Raphael 'kena' Poss Date: Mon, 4 Nov 2019 18:20:09 +0100 Subject: [PATCH] libroach,storage: extend MVCC to support ignored seqnum ranges The MVCC code already had rudimentary understanding of sequence numbers to allow reads to ignore writes at greater seqnums. To implement SQL savepoint rollbacks, we must also support ignoring writes that fall in ignored ranges of seqnums. To achieve this, this commit extends the `mvccScanner` for RocksDB (Pebble code remains to be done) to account for ignored seqnum ranges, and also extends `MVCCResolveWriteIntent` to collapse an intent to the last write that has not been marked to be ignored by a savepoint rollback. Release note: None --- c-deps/libroach/include/libroach.h | 14 + c-deps/libroach/mvcc.h | 80 +- c-deps/libroach/protos/roachpb/api.pb.cc | 99 +- c-deps/libroach/protos/roachpb/api.pb.h | 76 + c-deps/libroach/protos/roachpb/data.pb.cc | 141 +- c-deps/libroach/protos/roachpb/data.pb.h | 114 ++ c-deps/libroach/protos/roachpb/errors.pb.cc | 4 +- .../storage/engine/enginepb/mvcc3.pb.cc | 235 +++ .../protos/storage/engine/enginepb/mvcc3.pb.h | 164 ++- pkg/roachpb/api.go | 21 + pkg/roachpb/api.pb.go | 1278 +++++++++-------- pkg/roachpb/api.proto | 10 + pkg/roachpb/data.go | 45 +- pkg/roachpb/data.pb.go | 618 +++++--- pkg/roachpb/data.proto | 22 + pkg/roachpb/data_test.go | 45 +- pkg/storage/batcheval/cmd_end_transaction.go | 22 +- .../batcheval/cmd_end_transaction_test.go | 117 ++ .../batcheval/cmd_refresh_range_test.go | 8 +- pkg/storage/batcheval/cmd_resolve_intent.go | 6 +- .../batcheval/cmd_resolve_intent_range.go | 6 +- .../batcheval/cmd_resolve_intent_test.go | 130 ++ pkg/storage/batcheval/transaction.go | 25 +- pkg/storage/client_metrics_test.go | 8 +- pkg/storage/engine/enginepb/mvcc.go | 67 +- pkg/storage/engine/enginepb/mvcc3.pb.go | 381 +++-- pkg/storage/engine/enginepb/mvcc3.proto | 9 + pkg/storage/engine/enginepb/mvcc_test.go | 30 + pkg/storage/engine/mvcc.go | 267 +++- pkg/storage/engine/mvcc_history_test.go | 59 +- .../engine/mvcc_incremental_iterator.go | 8 +- .../engine/mvcc_incremental_iterator_test.go | 12 +- pkg/storage/engine/mvcc_logical_ops_test.go | 36 +- pkg/storage/engine/mvcc_stats_test.go | 58 +- pkg/storage/engine/mvcc_test.go | 131 +- pkg/storage/engine/rocksdb.go | 11 + .../mvcc_histories/conditional_put_with_txn | 46 +- .../mvcc_histories/idempotent_transactions | 2 +- .../testdata/mvcc_histories/ignored_seq_nums | 140 ++ .../mvcc_histories/ignored_seq_nums_commit | 80 ++ .../mvcc_histories/ignored_seq_nums_cput | 208 +++ .../intentresolver/contention_queue.go | 6 +- pkg/storage/intentresolver/intent_resolver.go | 27 +- .../intentresolver/intent_resolver_test.go | 123 +- pkg/storage/replica_test.go | 33 +- pkg/storage/store_test.go | 9 +- 46 files changed, 3755 insertions(+), 1276 deletions(-) create mode 100644 pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums create mode 100644 pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_commit create mode 100644 pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_cput diff --git a/c-deps/libroach/include/libroach.h b/c-deps/libroach/include/libroach.h index 0fbd3f0ca603..ea91f8eb7ee4 100644 --- a/c-deps/libroach/include/libroach.h +++ b/c-deps/libroach/include/libroach.h @@ -63,6 +63,19 @@ typedef struct { DBStatus status; } DBIterState; +// A DBIgnoredSeqNumRange is an alias for the Go struct +// IgnoredSeqNumRange. It must have exactly the same memory +// layout. +typedef struct { + int32_t start_seqnum; + int32_t end_seqnum; +} DBIgnoredSeqNumRange; + +typedef struct { + DBIgnoredSeqNumRange* ranges; + int len; +} DBIgnoredSeqNums; + typedef struct DBCache DBCache; typedef struct DBEngine DBEngine; typedef struct DBIterator DBIterator; @@ -328,6 +341,7 @@ typedef struct { uint32_t epoch; int32_t sequence; DBTimestamp max_timestamp; + DBIgnoredSeqNums ignored_seqnums; } DBTxn; typedef struct { diff --git a/c-deps/libroach/mvcc.h b/c-deps/libroach/mvcc.h index 90e35532a95a..a6c66721d8eb 100644 --- a/c-deps/libroach/mvcc.h +++ b/c-deps/libroach/mvcc.h @@ -59,6 +59,7 @@ template class mvccScanner { txn_epoch_(txn.epoch), txn_sequence_(txn.sequence), txn_max_timestamp_(txn.max_timestamp), + txn_ignored_seqnums_(txn.ignored_seqnums), inconsistent_(inconsistent), tombstones_(tombstones), check_uncertainty_(timestamp < txn.max_timestamp), @@ -163,27 +164,89 @@ template class mvccScanner { return results_; } + bool seqNumIsIgnored(int32_t sequence) const { + // The ignored seqnum ranges are guaranteed to be + // non-overlapping, non-contiguous, and guaranteed to be + // sorted in seqnum order. We're going to look from the end to + // see if the current intent seqnum is ignored. + // + // TODO(nvanbenschoten): this can use use binary search to improve + // the complexity. Worth looking into if this loop takes a while, due to + // long lists of ignored sequence where the ones near the specified sequence + // number are near the start. Until then, the current implementation is + // simpler and correct. + for (int i = txn_ignored_seqnums_.len - 1; i >= 0; i--) { + if (sequence < txn_ignored_seqnums_.ranges[i].start_seqnum) { + // The history entry's sequence number is lower/older than + // the current ignored range. Go to the previous range + // and try again. + continue; + } + + // Here we have a range where the start seqnum is lower than the current + // intent seqnum. Does it include it? + if (sequence > txn_ignored_seqnums_.ranges[i].end_seqnum) { + // Here we have a range where the current history entry's seqnum + // is higher than the range's end seqnum. Given that the + // ranges are storted, we're guaranteed that there won't + // be any further overlapping range at a lower value of i. + return false; + } + // Yes, it's included. We're going to skip over this + // intent seqnum and retry the search above. + return true; + } + + // Exhausted the ignore list. Not ignored. + return false; + } + bool getFromIntentHistory() { cockroach::storage::engine::enginepb::MVCCMetadata_SequencedIntent readIntent; readIntent.set_sequence(txn_sequence_); + + auto end = meta_.intent_history().end(); + cockroach::storage::engine::enginepb::MVCCMetadata_SequencedIntent intent; + // Look for the intent with the sequence number less than or equal to the // read sequence. To do so, search using upper_bound, which returns an // iterator pointing to the first element in the range [first, last) that is // greater than value, or last if no such element is found. Then, return the // previous value. auto up = std::upper_bound( - meta_.intent_history().begin(), meta_.intent_history().end(), readIntent, + meta_.intent_history().begin(), end, readIntent, [](const cockroach::storage::engine::enginepb::MVCCMetadata_SequencedIntent& a, const cockroach::storage::engine::enginepb::MVCCMetadata_SequencedIntent& b) -> bool { - return a.sequence() < b.sequence(); + return a.sequence() < b.sequence(); }); + while (up != meta_.intent_history().begin()) { + const auto intent_pos = up - 1; + // Here we have found a history entry with the highest seqnum that's + // equal or lower to the txn seqnum. + // + // However this entry may also be part of an ignored range + // (partially rolled back). We'll check this next. If it is, + // we'll try the previous sequence in the intent history. + if (seqNumIsIgnored(intent_pos->sequence())) { + // This entry was part of an ignored range. Iterate back in intent + // history to the previous sequence, and check if that one + // is ignored. + up--; + continue; + } + // This history entry has not been ignored, so we're going to + // select this version. + intent = *intent_pos; + break; + } + if (up == meta_.intent_history().begin()) { - // It is possible that no intent exists such that the sequence is less - // than the read sequence. In this case, we cannot read a value from the - // intent history. - return false; + // It is possible that no intent exists such that the sequence is less + // than the read sequence. In this case, we cannot read a value from the + // intent history. + return false; } - const auto intent = *(up - 1); + rocksdb::Slice value = intent.value(); if (value.size() > 0 || tombstones_) { kvs_->Put(cur_raw_key_, value); @@ -301,7 +364,7 @@ template class mvccScanner { } if (txn_epoch_ == meta_.txn().epoch()) { - if (txn_sequence_ >= meta_.txn().sequence()) { + if (txn_sequence_ >= meta_.txn().sequence() && !seqNumIsIgnored(meta_.txn().sequence())) { // 8. We're reading our own txn's intent at an equal or higher sequence. // Note that we read at the intent timestamp, not at our read timestamp // as the intent timestamp may have been pushed forward by another @@ -663,6 +726,7 @@ template class mvccScanner { const uint32_t txn_epoch_; const int32_t txn_sequence_; const DBTimestamp txn_max_timestamp_; + const DBIgnoredSeqNums txn_ignored_seqnums_; const bool inconsistent_; const bool tombstones_; const bool check_uncertainty_; diff --git a/c-deps/libroach/protos/roachpb/api.pb.cc b/c-deps/libroach/protos/roachpb/api.pb.cc index 7b796d4e3e09..061f78dc7bb2 100644 --- a/c-deps/libroach/protos/roachpb/api.pb.cc +++ b/c-deps/libroach/protos/roachpb/api.pb.cc @@ -108,7 +108,6 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobu extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_RecoverTxnResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_RefreshRangeRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_RefreshRequest; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ResolveIntentRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ReverseScanResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_RevertRangeRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ScanResponse; @@ -118,7 +117,7 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobu extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_ExportResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_GCRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_RequestLeaseRequest; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_ResolveIntentRangeRequest; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_ResolveIntentRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_ResponseHeader; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_SubsumeResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<43> scc_info_ResponseUnion; @@ -128,6 +127,7 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobu extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<4> scc_info_ExportRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<4> scc_info_Header; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<4> scc_info_PushTxnRequest; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<4> scc_info_ResolveIntentRangeRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<5> scc_info_EndTxnRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<5> scc_info_ImportRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<6> scc_info_ExternalStorage; @@ -139,7 +139,7 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protob extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_Value; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_Lease; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<5> scc_info_InternalCommitTrigger; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<5> scc_info_Transaction; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<6> scc_info_Transaction; } // namespace protobuf_roachpb_2fdata_2eproto namespace protobuf_roachpb_2ferrors_2eproto { extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2ferrors_2eproto ::google::protobuf::internal::SCCInfo<31> scc_info_AmbiguousResultError; @@ -150,6 +150,7 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fmetadata_2eproto ::google::pr extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fmetadata_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_RangeDescriptor; } // namespace protobuf_roachpb_2fmetadata_2eproto namespace protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto { +extern PROTOBUF_INTERNAL_EXPORT_protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_IgnoredSeqNumRange; extern PROTOBUF_INTERNAL_EXPORT_protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_MVCCStatsDelta; extern PROTOBUF_INTERNAL_EXPORT_protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_TxnMeta; } // namespace protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto @@ -1773,10 +1774,11 @@ static void InitDefaultsResolveIntentRequest() { ::cockroach::roachpb::ResolveIntentRequest::InitAsDefaultInstance(); } -::google::protobuf::internal::SCCInfo<2> scc_info_ResolveIntentRequest = - {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 2, InitDefaultsResolveIntentRequest}, { +::google::protobuf::internal::SCCInfo<3> scc_info_ResolveIntentRequest = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 3, InitDefaultsResolveIntentRequest}, { &protobuf_roachpb_2fapi_2eproto::scc_info_RequestHeader.base, - &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_TxnMeta.base,}}; + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_TxnMeta.base, + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_IgnoredSeqNumRange.base,}}; static void InitDefaultsResolveIntentResponse() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -1804,11 +1806,12 @@ static void InitDefaultsResolveIntentRangeRequest() { ::cockroach::roachpb::ResolveIntentRangeRequest::InitAsDefaultInstance(); } -::google::protobuf::internal::SCCInfo<3> scc_info_ResolveIntentRangeRequest = - {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 3, InitDefaultsResolveIntentRangeRequest}, { +::google::protobuf::internal::SCCInfo<4> scc_info_ResolveIntentRangeRequest = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 4, InitDefaultsResolveIntentRangeRequest}, { &protobuf_roachpb_2fapi_2eproto::scc_info_RequestHeader.base, &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_TxnMeta.base, - &protobuf_util_2fhlc_2ftimestamp_2eproto::scc_info_Timestamp.base,}}; + &protobuf_util_2fhlc_2ftimestamp_2eproto::scc_info_Timestamp.base, + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_IgnoredSeqNumRange.base,}}; static void InitDefaultsResolveIntentRangeResponse() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -17296,11 +17299,15 @@ void ResolveIntentRequest::clear_intent_txn() { } intent_txn_ = NULL; } +void ResolveIntentRequest::clear_ignored_seqnums() { + ignored_seqnums_.Clear(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int ResolveIntentRequest::kHeaderFieldNumber; const int ResolveIntentRequest::kIntentTxnFieldNumber; const int ResolveIntentRequest::kStatusFieldNumber; const int ResolveIntentRequest::kPoisonFieldNumber; +const int ResolveIntentRequest::kIgnoredSeqnumsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 ResolveIntentRequest::ResolveIntentRequest() @@ -17312,7 +17319,8 @@ ResolveIntentRequest::ResolveIntentRequest() } ResolveIntentRequest::ResolveIntentRequest(const ResolveIntentRequest& from) : ::google::protobuf::MessageLite(), - _internal_metadata_(NULL) { + _internal_metadata_(NULL), + ignored_seqnums_(from.ignored_seqnums_) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_header()) { header_ = new ::cockroach::roachpb::RequestHeader(*from.header_); @@ -17361,6 +17369,7 @@ void ResolveIntentRequest::Clear() { // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; + ignored_seqnums_.Clear(); if (GetArenaNoVirtual() == NULL && header_ != NULL) { delete header_; } @@ -17442,6 +17451,17 @@ bool ResolveIntentRequest::MergePartialFromCodedStream( break; } + case 5: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_ignored_seqnums())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -17489,6 +17509,14 @@ void ResolveIntentRequest::SerializeWithCachedSizes( ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->poison(), output); } + for (unsigned int i = 0, + n = static_cast(this->ignored_seqnums_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, + this->ignored_seqnums(static_cast(i)), + output); + } + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); // @@protoc_insertion_point(serialize_end:cockroach.roachpb.ResolveIntentRequest) @@ -17500,6 +17528,16 @@ size_t ResolveIntentRequest::ByteSizeLong() const { total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + { + unsigned int count = static_cast(this->ignored_seqnums_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->ignored_seqnums(static_cast(i))); + } + } + if (this->has_header()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( @@ -17540,6 +17578,7 @@ void ResolveIntentRequest::MergeFrom(const ResolveIntentRequest& from) { ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; + ignored_seqnums_.MergeFrom(from.ignored_seqnums_); if (from.has_header()) { mutable_header()->::cockroach::roachpb::RequestHeader::MergeFrom(from.header()); } @@ -17571,6 +17610,7 @@ void ResolveIntentRequest::Swap(ResolveIntentRequest* other) { } void ResolveIntentRequest::InternalSwap(ResolveIntentRequest* other) { using std::swap; + CastToBase(&ignored_seqnums_)->InternalSwap(CastToBase(&other->ignored_seqnums_)); swap(header_, other->header_); swap(intent_txn_, other->intent_txn_); swap(status_, other->status_); @@ -17792,12 +17832,16 @@ void ResolveIntentRangeRequest::clear_min_timestamp() { } min_timestamp_ = NULL; } +void ResolveIntentRangeRequest::clear_ignored_seqnums() { + ignored_seqnums_.Clear(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int ResolveIntentRangeRequest::kHeaderFieldNumber; const int ResolveIntentRangeRequest::kIntentTxnFieldNumber; const int ResolveIntentRangeRequest::kStatusFieldNumber; const int ResolveIntentRangeRequest::kPoisonFieldNumber; const int ResolveIntentRangeRequest::kMinTimestampFieldNumber; +const int ResolveIntentRangeRequest::kIgnoredSeqnumsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 ResolveIntentRangeRequest::ResolveIntentRangeRequest() @@ -17809,7 +17853,8 @@ ResolveIntentRangeRequest::ResolveIntentRangeRequest() } ResolveIntentRangeRequest::ResolveIntentRangeRequest(const ResolveIntentRangeRequest& from) : ::google::protobuf::MessageLite(), - _internal_metadata_(NULL) { + _internal_metadata_(NULL), + ignored_seqnums_(from.ignored_seqnums_) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_header()) { header_ = new ::cockroach::roachpb::RequestHeader(*from.header_); @@ -17864,6 +17909,7 @@ void ResolveIntentRangeRequest::Clear() { // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; + ignored_seqnums_.Clear(); if (GetArenaNoVirtual() == NULL && header_ != NULL) { delete header_; } @@ -17960,6 +18006,17 @@ bool ResolveIntentRangeRequest::MergePartialFromCodedStream( break; } + case 6: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_ignored_seqnums())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -18012,6 +18069,14 @@ void ResolveIntentRangeRequest::SerializeWithCachedSizes( 5, this->_internal_min_timestamp(), output); } + for (unsigned int i = 0, + n = static_cast(this->ignored_seqnums_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 6, + this->ignored_seqnums(static_cast(i)), + output); + } + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); // @@protoc_insertion_point(serialize_end:cockroach.roachpb.ResolveIntentRangeRequest) @@ -18023,6 +18088,16 @@ size_t ResolveIntentRangeRequest::ByteSizeLong() const { total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + { + unsigned int count = static_cast(this->ignored_seqnums_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->ignored_seqnums(static_cast(i))); + } + } + if (this->has_header()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( @@ -18069,6 +18144,7 @@ void ResolveIntentRangeRequest::MergeFrom(const ResolveIntentRangeRequest& from) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; + ignored_seqnums_.MergeFrom(from.ignored_seqnums_); if (from.has_header()) { mutable_header()->::cockroach::roachpb::RequestHeader::MergeFrom(from.header()); } @@ -18103,6 +18179,7 @@ void ResolveIntentRangeRequest::Swap(ResolveIntentRangeRequest* other) { } void ResolveIntentRangeRequest::InternalSwap(ResolveIntentRangeRequest* other) { using std::swap; + CastToBase(&ignored_seqnums_)->InternalSwap(CastToBase(&other->ignored_seqnums_)); swap(header_, other->header_); swap(intent_txn_, other->intent_txn_); swap(min_timestamp_, other->min_timestamp_); diff --git a/c-deps/libroach/protos/roachpb/api.pb.h b/c-deps/libroach/protos/roachpb/api.pb.h index c449328aa205..83d9c32fdbad 100644 --- a/c-deps/libroach/protos/roachpb/api.pb.h +++ b/c-deps/libroach/protos/roachpb/api.pb.h @@ -7924,6 +7924,17 @@ class ResolveIntentRequest : public ::google::protobuf::MessageLite /* @@protoc_ // accessors ------------------------------------------------------- + int ignored_seqnums_size() const; + void clear_ignored_seqnums(); + static const int kIgnoredSeqnumsFieldNumber = 5; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* mutable_ignored_seqnums(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* + mutable_ignored_seqnums(); + const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& ignored_seqnums(int index) const; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* add_ignored_seqnums(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& + ignored_seqnums() const; + bool has_header() const; void clear_header(); static const int kHeaderFieldNumber = 1; @@ -7962,6 +7973,7 @@ class ResolveIntentRequest : public ::google::protobuf::MessageLite /* @@protoc_ private: ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange > ignored_seqnums_; ::cockroach::roachpb::RequestHeader* header_; ::cockroach::storage::engine::enginepb::TxnMeta* intent_txn_; int status_; @@ -8162,6 +8174,17 @@ class ResolveIntentRangeRequest : public ::google::protobuf::MessageLite /* @@pr // accessors ------------------------------------------------------- + int ignored_seqnums_size() const; + void clear_ignored_seqnums(); + static const int kIgnoredSeqnumsFieldNumber = 6; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* mutable_ignored_seqnums(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* + mutable_ignored_seqnums(); + const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& ignored_seqnums(int index) const; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* add_ignored_seqnums(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& + ignored_seqnums() const; + bool has_header() const; void clear_header(); static const int kHeaderFieldNumber = 1; @@ -8211,6 +8234,7 @@ class ResolveIntentRangeRequest : public ::google::protobuf::MessageLite /* @@pr private: ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange > ignored_seqnums_; ::cockroach::roachpb::RequestHeader* header_; ::cockroach::storage::engine::enginepb::TxnMeta* intent_txn_; ::cockroach::util::hlc::Timestamp* min_timestamp_; @@ -22818,6 +22842,32 @@ inline void ResolveIntentRequest::set_poison(bool value) { // @@protoc_insertion_point(field_set:cockroach.roachpb.ResolveIntentRequest.poison) } +inline int ResolveIntentRequest::ignored_seqnums_size() const { + return ignored_seqnums_.size(); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* ResolveIntentRequest::mutable_ignored_seqnums(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.ResolveIntentRequest.ignored_seqnums) + return ignored_seqnums_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* +ResolveIntentRequest::mutable_ignored_seqnums() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.ResolveIntentRequest.ignored_seqnums) + return &ignored_seqnums_; +} +inline const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& ResolveIntentRequest::ignored_seqnums(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.ResolveIntentRequest.ignored_seqnums) + return ignored_seqnums_.Get(index); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* ResolveIntentRequest::add_ignored_seqnums() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.ResolveIntentRequest.ignored_seqnums) + return ignored_seqnums_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& +ResolveIntentRequest::ignored_seqnums() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.ResolveIntentRequest.ignored_seqnums) + return ignored_seqnums_; +} + // ------------------------------------------------------------------- // ResolveIntentResponse @@ -23054,6 +23104,32 @@ inline void ResolveIntentRangeRequest::set_allocated_min_timestamp(::cockroach:: // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.ResolveIntentRangeRequest.min_timestamp) } +inline int ResolveIntentRangeRequest::ignored_seqnums_size() const { + return ignored_seqnums_.size(); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* ResolveIntentRangeRequest::mutable_ignored_seqnums(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.ResolveIntentRangeRequest.ignored_seqnums) + return ignored_seqnums_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* +ResolveIntentRangeRequest::mutable_ignored_seqnums() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.ResolveIntentRangeRequest.ignored_seqnums) + return &ignored_seqnums_; +} +inline const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& ResolveIntentRangeRequest::ignored_seqnums(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.ResolveIntentRangeRequest.ignored_seqnums) + return ignored_seqnums_.Get(index); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* ResolveIntentRangeRequest::add_ignored_seqnums() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.ResolveIntentRangeRequest.ignored_seqnums) + return ignored_seqnums_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& +ResolveIntentRangeRequest::ignored_seqnums() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.ResolveIntentRangeRequest.ignored_seqnums) + return ignored_seqnums_; +} + // ------------------------------------------------------------------- // ResolveIntentRangeResponse diff --git a/c-deps/libroach/protos/roachpb/data.pb.cc b/c-deps/libroach/protos/roachpb/data.pb.cc index 6d45b6d38507..a7508c937e39 100644 --- a/c-deps/libroach/protos/roachpb/data.pb.cc +++ b/c-deps/libroach/protos/roachpb/data.pb.cc @@ -26,13 +26,14 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protob extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_Value; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ChangeReplicasTrigger; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_MergeTrigger; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<5> scc_info_Transaction; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<6> scc_info_Transaction; } // namespace protobuf_roachpb_2fdata_2eproto namespace protobuf_roachpb_2fmetadata_2eproto { extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fmetadata_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_ReplicaDescriptor; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fmetadata_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_RangeDescriptor; } // namespace protobuf_roachpb_2fmetadata_2eproto namespace protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto { +extern PROTOBUF_INTERNAL_EXPORT_protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_IgnoredSeqNumRange; extern PROTOBUF_INTERNAL_EXPORT_protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_TxnMeta; } // namespace protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto namespace protobuf_storage_2fengine_2fenginepb_2fmvcc_2eproto { @@ -322,13 +323,14 @@ static void InitDefaultsTransaction() { ::cockroach::roachpb::Transaction::InitAsDefaultInstance(); } -::google::protobuf::internal::SCCInfo<5> scc_info_Transaction = - {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 5, InitDefaultsTransaction}, { +::google::protobuf::internal::SCCInfo<6> scc_info_Transaction = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 6, InitDefaultsTransaction}, { &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_TxnMeta.base, &protobuf_util_2fhlc_2ftimestamp_2eproto::scc_info_Timestamp.base, &protobuf_roachpb_2fdata_2eproto::scc_info_ObservedTimestamp.base, &protobuf_roachpb_2fdata_2eproto::scc_info_Span.base, - &protobuf_roachpb_2fdata_2eproto::scc_info_SequencedWrite.base,}}; + &protobuf_roachpb_2fdata_2eproto::scc_info_SequencedWrite.base, + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_IgnoredSeqNumRange.base,}}; static void InitDefaultsTransactionRecord() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -341,12 +343,13 @@ static void InitDefaultsTransactionRecord() { ::cockroach::roachpb::TransactionRecord::InitAsDefaultInstance(); } -::google::protobuf::internal::SCCInfo<4> scc_info_TransactionRecord = - {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 4, InitDefaultsTransactionRecord}, { +::google::protobuf::internal::SCCInfo<5> scc_info_TransactionRecord = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 5, InitDefaultsTransactionRecord}, { &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_TxnMeta.base, &protobuf_util_2fhlc_2ftimestamp_2eproto::scc_info_Timestamp.base, &protobuf_roachpb_2fdata_2eproto::scc_info_Span.base, - &protobuf_roachpb_2fdata_2eproto::scc_info_SequencedWrite.base,}}; + &protobuf_roachpb_2fdata_2eproto::scc_info_SequencedWrite.base, + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_IgnoredSeqNumRange.base,}}; static void InitDefaultsIntent() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -359,10 +362,11 @@ static void InitDefaultsIntent() { ::cockroach::roachpb::Intent::InitAsDefaultInstance(); } -::google::protobuf::internal::SCCInfo<2> scc_info_Intent = - {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 2, InitDefaultsIntent}, { +::google::protobuf::internal::SCCInfo<3> scc_info_Intent = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 3, InitDefaultsIntent}, { &protobuf_roachpb_2fdata_2eproto::scc_info_Span.base, - &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_TxnMeta.base,}}; + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_TxnMeta.base, + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_IgnoredSeqNumRange.base,}}; static void InitDefaultsSequencedWrite() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -3467,6 +3471,9 @@ void Transaction::clear_max_timestamp() { } max_timestamp_ = NULL; } +void Transaction::clear_ignored_seqnums() { + ignored_seqnums_.Clear(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Transaction::kMetaFieldNumber; const int Transaction::kNameFieldNumber; @@ -3480,6 +3487,7 @@ const int Transaction::kObservedTimestampsFieldNumber; const int Transaction::kWriteTooOldFieldNumber; const int Transaction::kIntentSpansFieldNumber; const int Transaction::kInFlightWritesFieldNumber; +const int Transaction::kIgnoredSeqnumsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Transaction::Transaction() @@ -3494,7 +3502,8 @@ Transaction::Transaction(const Transaction& from) _internal_metadata_(NULL), observed_timestamps_(from.observed_timestamps_), intent_spans_(from.intent_spans_), - in_flight_writes_(from.in_flight_writes_) { + in_flight_writes_(from.in_flight_writes_), + ignored_seqnums_(from.ignored_seqnums_) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.name().size() > 0) { @@ -3570,6 +3579,7 @@ void Transaction::Clear() { observed_timestamps_.Clear(); intent_spans_.Clear(); in_flight_writes_.Clear(); + ignored_seqnums_.Clear(); name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (GetArenaNoVirtual() == NULL && meta_ != NULL) { delete meta_; @@ -3760,6 +3770,17 @@ bool Transaction::MergePartialFromCodedStream( break; } + case 18: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(146u /* 146 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_ignored_seqnums())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -3861,6 +3882,14 @@ void Transaction::SerializeWithCachedSizes( output); } + for (unsigned int i = 0, + n = static_cast(this->ignored_seqnums_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 18, + this->ignored_seqnums(static_cast(i)), + output); + } + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); // @@protoc_insertion_point(serialize_end:cockroach.roachpb.Transaction) @@ -3902,6 +3931,16 @@ size_t Transaction::ByteSizeLong() const { } } + { + unsigned int count = static_cast(this->ignored_seqnums_size()); + total_size += 2UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->ignored_seqnums(static_cast(i))); + } + } + // string name = 2; if (this->name().size() > 0) { total_size += 1 + @@ -3975,6 +4014,7 @@ void Transaction::MergeFrom(const Transaction& from) { observed_timestamps_.MergeFrom(from.observed_timestamps_); intent_spans_.MergeFrom(from.intent_spans_); in_flight_writes_.MergeFrom(from.in_flight_writes_); + ignored_seqnums_.MergeFrom(from.ignored_seqnums_); if (from.name().size() > 0) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); @@ -4025,6 +4065,7 @@ void Transaction::InternalSwap(Transaction* other) { CastToBase(&observed_timestamps_)->InternalSwap(CastToBase(&other->observed_timestamps_)); CastToBase(&intent_spans_)->InternalSwap(CastToBase(&other->intent_spans_)); CastToBase(&in_flight_writes_)->InternalSwap(CastToBase(&other->in_flight_writes_)); + CastToBase(&ignored_seqnums_)->InternalSwap(CastToBase(&other->ignored_seqnums_)); name_.Swap(&other->name_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); swap(meta_, other->meta_); @@ -4063,12 +4104,16 @@ void TransactionRecord::clear_last_heartbeat() { } last_heartbeat_ = NULL; } +void TransactionRecord::clear_ignored_seqnums() { + ignored_seqnums_.Clear(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int TransactionRecord::kMetaFieldNumber; const int TransactionRecord::kStatusFieldNumber; const int TransactionRecord::kLastHeartbeatFieldNumber; const int TransactionRecord::kIntentSpansFieldNumber; const int TransactionRecord::kInFlightWritesFieldNumber; +const int TransactionRecord::kIgnoredSeqnumsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 TransactionRecord::TransactionRecord() @@ -4082,7 +4127,8 @@ TransactionRecord::TransactionRecord(const TransactionRecord& from) : ::google::protobuf::MessageLite(), _internal_metadata_(NULL), intent_spans_(from.intent_spans_), - in_flight_writes_(from.in_flight_writes_) { + in_flight_writes_(from.in_flight_writes_), + ignored_seqnums_(from.ignored_seqnums_) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_meta()) { meta_ = new ::cockroach::storage::engine::enginepb::TxnMeta(*from.meta_); @@ -4131,6 +4177,7 @@ void TransactionRecord::Clear() { intent_spans_.Clear(); in_flight_writes_.Clear(); + ignored_seqnums_.Clear(); if (GetArenaNoVirtual() == NULL && meta_ != NULL) { delete meta_; } @@ -4218,6 +4265,17 @@ bool TransactionRecord::MergePartialFromCodedStream( break; } + case 18: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(146u /* 146 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_ignored_seqnums())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -4276,6 +4334,14 @@ void TransactionRecord::SerializeWithCachedSizes( output); } + for (unsigned int i = 0, + n = static_cast(this->ignored_seqnums_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 18, + this->ignored_seqnums(static_cast(i)), + output); + } + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); // @@protoc_insertion_point(serialize_end:cockroach.roachpb.TransactionRecord) @@ -4307,6 +4373,16 @@ size_t TransactionRecord::ByteSizeLong() const { } } + { + unsigned int count = static_cast(this->ignored_seqnums_size()); + total_size += 2UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->ignored_seqnums(static_cast(i))); + } + } + if (this->has_meta()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( @@ -4344,6 +4420,7 @@ void TransactionRecord::MergeFrom(const TransactionRecord& from) { intent_spans_.MergeFrom(from.intent_spans_); in_flight_writes_.MergeFrom(from.in_flight_writes_); + ignored_seqnums_.MergeFrom(from.ignored_seqnums_); if (from.has_meta()) { mutable_meta()->::cockroach::storage::engine::enginepb::TxnMeta::MergeFrom(from.meta()); } @@ -4374,6 +4451,7 @@ void TransactionRecord::InternalSwap(TransactionRecord* other) { using std::swap; CastToBase(&intent_spans_)->InternalSwap(CastToBase(&other->intent_spans_)); CastToBase(&in_flight_writes_)->InternalSwap(CastToBase(&other->in_flight_writes_)); + CastToBase(&ignored_seqnums_)->InternalSwap(CastToBase(&other->ignored_seqnums_)); swap(meta_, other->meta_); swap(last_heartbeat_, other->last_heartbeat_); swap(status_, other->status_); @@ -4399,10 +4477,14 @@ void Intent::clear_txn() { } txn_ = NULL; } +void Intent::clear_ignored_seqnums() { + ignored_seqnums_.Clear(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Intent::kSpanFieldNumber; const int Intent::kTxnFieldNumber; const int Intent::kStatusFieldNumber; +const int Intent::kIgnoredSeqnumsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Intent::Intent() @@ -4414,7 +4496,8 @@ Intent::Intent() } Intent::Intent(const Intent& from) : ::google::protobuf::MessageLite(), - _internal_metadata_(NULL) { + _internal_metadata_(NULL), + ignored_seqnums_(from.ignored_seqnums_) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_span()) { span_ = new ::cockroach::roachpb::Span(*from.span_); @@ -4461,6 +4544,7 @@ void Intent::Clear() { // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; + ignored_seqnums_.Clear(); if (GetArenaNoVirtual() == NULL && span_ != NULL) { delete span_; } @@ -4526,6 +4610,17 @@ bool Intent::MergePartialFromCodedStream( break; } + case 4: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_ignored_seqnums())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -4568,6 +4663,14 @@ void Intent::SerializeWithCachedSizes( 3, this->status(), output); } + for (unsigned int i = 0, + n = static_cast(this->ignored_seqnums_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, + this->ignored_seqnums(static_cast(i)), + output); + } + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); // @@protoc_insertion_point(serialize_end:cockroach.roachpb.Intent) @@ -4579,6 +4682,16 @@ size_t Intent::ByteSizeLong() const { total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + { + unsigned int count = static_cast(this->ignored_seqnums_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->ignored_seqnums(static_cast(i))); + } + } + if (this->has_span()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( @@ -4614,6 +4727,7 @@ void Intent::MergeFrom(const Intent& from) { ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; + ignored_seqnums_.MergeFrom(from.ignored_seqnums_); if (from.has_span()) { mutable_span()->::cockroach::roachpb::Span::MergeFrom(from.span()); } @@ -4642,6 +4756,7 @@ void Intent::Swap(Intent* other) { } void Intent::InternalSwap(Intent* other) { using std::swap; + CastToBase(&ignored_seqnums_)->InternalSwap(CastToBase(&other->ignored_seqnums_)); swap(span_, other->span_); swap(txn_, other->txn_); swap(status_, other->status_); diff --git a/c-deps/libroach/protos/roachpb/data.pb.h b/c-deps/libroach/protos/roachpb/data.pb.h index 79486aa9d457..020e625ce091 100644 --- a/c-deps/libroach/protos/roachpb/data.pb.h +++ b/c-deps/libroach/protos/roachpb/data.pb.h @@ -1703,6 +1703,17 @@ class Transaction : public ::google::protobuf::MessageLite /* @@protoc_insertion const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::SequencedWrite >& in_flight_writes() const; + int ignored_seqnums_size() const; + void clear_ignored_seqnums(); + static const int kIgnoredSeqnumsFieldNumber = 18; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* mutable_ignored_seqnums(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* + mutable_ignored_seqnums(); + const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& ignored_seqnums(int index) const; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* add_ignored_seqnums(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& + ignored_seqnums() const; + // string name = 2; void clear_name(); static const int kNameFieldNumber = 2; @@ -1797,6 +1808,7 @@ class Transaction : public ::google::protobuf::MessageLite /* @@protoc_insertion ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ObservedTimestamp > observed_timestamps_; ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::Span > intent_spans_; ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::SequencedWrite > in_flight_writes_; + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange > ignored_seqnums_; ::google::protobuf::internal::ArenaStringPtr name_; ::cockroach::storage::engine::enginepb::TxnMeta* meta_; ::cockroach::util::hlc::Timestamp* last_heartbeat_; @@ -1918,6 +1930,17 @@ class TransactionRecord : public ::google::protobuf::MessageLite /* @@protoc_ins const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::SequencedWrite >& in_flight_writes() const; + int ignored_seqnums_size() const; + void clear_ignored_seqnums(); + static const int kIgnoredSeqnumsFieldNumber = 18; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* mutable_ignored_seqnums(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* + mutable_ignored_seqnums(); + const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& ignored_seqnums(int index) const; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* add_ignored_seqnums(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& + ignored_seqnums() const; + bool has_meta() const; void clear_meta(); static const int kMetaFieldNumber = 1; @@ -1952,6 +1975,7 @@ class TransactionRecord : public ::google::protobuf::MessageLite /* @@protoc_ins ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::Span > intent_spans_; ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::SequencedWrite > in_flight_writes_; + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange > ignored_seqnums_; ::cockroach::storage::engine::enginepb::TxnMeta* meta_; ::cockroach::util::hlc::Timestamp* last_heartbeat_; int status_; @@ -2045,6 +2069,17 @@ class Intent : public ::google::protobuf::MessageLite /* @@protoc_insertion_poin // accessors ------------------------------------------------------- + int ignored_seqnums_size() const; + void clear_ignored_seqnums(); + static const int kIgnoredSeqnumsFieldNumber = 4; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* mutable_ignored_seqnums(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* + mutable_ignored_seqnums(); + const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& ignored_seqnums(int index) const; + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* add_ignored_seqnums(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& + ignored_seqnums() const; + bool has_span() const; void clear_span(); static const int kSpanFieldNumber = 1; @@ -2077,6 +2112,7 @@ class Intent : public ::google::protobuf::MessageLite /* @@protoc_insertion_poin private: ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange > ignored_seqnums_; ::cockroach::roachpb::Span* span_; ::cockroach::storage::engine::enginepb::TxnMeta* txn_; int status_; @@ -4546,6 +4582,32 @@ Transaction::in_flight_writes() const { return in_flight_writes_; } +inline int Transaction::ignored_seqnums_size() const { + return ignored_seqnums_.size(); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* Transaction::mutable_ignored_seqnums(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.Transaction.ignored_seqnums) + return ignored_seqnums_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* +Transaction::mutable_ignored_seqnums() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.Transaction.ignored_seqnums) + return &ignored_seqnums_; +} +inline const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& Transaction::ignored_seqnums(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.Transaction.ignored_seqnums) + return ignored_seqnums_.Get(index); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* Transaction::add_ignored_seqnums() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.Transaction.ignored_seqnums) + return ignored_seqnums_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& +Transaction::ignored_seqnums() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.Transaction.ignored_seqnums) + return ignored_seqnums_; +} + // ------------------------------------------------------------------- // TransactionRecord @@ -4716,6 +4778,32 @@ TransactionRecord::in_flight_writes() const { return in_flight_writes_; } +inline int TransactionRecord::ignored_seqnums_size() const { + return ignored_seqnums_.size(); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* TransactionRecord::mutable_ignored_seqnums(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.TransactionRecord.ignored_seqnums) + return ignored_seqnums_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* +TransactionRecord::mutable_ignored_seqnums() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.TransactionRecord.ignored_seqnums) + return &ignored_seqnums_; +} +inline const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& TransactionRecord::ignored_seqnums(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.TransactionRecord.ignored_seqnums) + return ignored_seqnums_.Get(index); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* TransactionRecord::add_ignored_seqnums() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.TransactionRecord.ignored_seqnums) + return ignored_seqnums_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& +TransactionRecord::ignored_seqnums() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.TransactionRecord.ignored_seqnums) + return ignored_seqnums_; +} + // ------------------------------------------------------------------- // Intent @@ -4834,6 +4922,32 @@ inline void Intent::set_status(::cockroach::roachpb::TransactionStatus value) { // @@protoc_insertion_point(field_set:cockroach.roachpb.Intent.status) } +inline int Intent::ignored_seqnums_size() const { + return ignored_seqnums_.size(); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* Intent::mutable_ignored_seqnums(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.Intent.ignored_seqnums) + return ignored_seqnums_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >* +Intent::mutable_ignored_seqnums() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.Intent.ignored_seqnums) + return &ignored_seqnums_; +} +inline const ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange& Intent::ignored_seqnums(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.Intent.ignored_seqnums) + return ignored_seqnums_.Get(index); +} +inline ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* Intent::add_ignored_seqnums() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.Intent.ignored_seqnums) + return ignored_seqnums_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >& +Intent::ignored_seqnums() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.Intent.ignored_seqnums) + return ignored_seqnums_; +} + // ------------------------------------------------------------------- // SequencedWrite diff --git a/c-deps/libroach/protos/roachpb/errors.pb.cc b/c-deps/libroach/protos/roachpb/errors.pb.cc index 1a34ce583f11..27668fb8333f 100644 --- a/c-deps/libroach/protos/roachpb/errors.pb.cc +++ b/c-deps/libroach/protos/roachpb/errors.pb.cc @@ -19,9 +19,9 @@ namespace protobuf_roachpb_2fdata_2eproto { extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_ObservedTimestamp; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_Value; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_Intent; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_Lease; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<5> scc_info_Transaction; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<3> scc_info_Intent; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fdata_2eproto ::google::protobuf::internal::SCCInfo<6> scc_info_Transaction; } // namespace protobuf_roachpb_2fdata_2eproto namespace protobuf_roachpb_2ferrors_2eproto { extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2ferrors_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_ErrPosition; diff --git a/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.cc b/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.cc index 6d9250965f86..692f1605a77e 100644 --- a/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.cc +++ b/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.cc @@ -37,6 +37,11 @@ class TxnMetaDefaultTypeInternal { ::google::protobuf::internal::ExplicitlyConstructed _instance; } _TxnMeta_default_instance_; +class IgnoredSeqNumRangeDefaultTypeInternal { + public: + ::google::protobuf::internal::ExplicitlyConstructed + _instance; +} _IgnoredSeqNumRange_default_instance_; class MVCCStatsDeltaDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed @@ -107,6 +112,20 @@ ::google::protobuf::internal::SCCInfo<1> scc_info_TxnMeta = {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsTxnMeta}, { &protobuf_util_2fhlc_2ftimestamp_2eproto::scc_info_Timestamp.base,}}; +static void InitDefaultsIgnoredSeqNumRange() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::cockroach::storage::engine::enginepb::_IgnoredSeqNumRange_default_instance_; + new (ptr) ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange(); + ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); + } + ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange::InitAsDefaultInstance(); +} + +::google::protobuf::internal::SCCInfo<0> scc_info_IgnoredSeqNumRange = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsIgnoredSeqNumRange}, {}}; + static void InitDefaultsMVCCStatsDelta() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -260,6 +279,7 @@ ::google::protobuf::internal::SCCInfo<6> scc_info_MVCCLogicalOp = void InitDefaults() { ::google::protobuf::internal::InitSCC(&scc_info_TxnMeta.base); + ::google::protobuf::internal::InitSCC(&scc_info_IgnoredSeqNumRange.base); ::google::protobuf::internal::InitSCC(&scc_info_MVCCStatsDelta.base); ::google::protobuf::internal::InitSCC(&scc_info_MVCCPersistentStats.base); ::google::protobuf::internal::InitSCC(&scc_info_RangeAppliedState.base); @@ -683,6 +703,218 @@ ::std::string TxnMeta::GetTypeName() const { } +// =================================================================== + +void IgnoredSeqNumRange::InitAsDefaultInstance() { +} +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int IgnoredSeqNumRange::kStartFieldNumber; +const int IgnoredSeqNumRange::kEndFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +IgnoredSeqNumRange::IgnoredSeqNumRange() + : ::google::protobuf::MessageLite(), _internal_metadata_(NULL) { + ::google::protobuf::internal::InitSCC( + &protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_IgnoredSeqNumRange.base); + SharedCtor(); + // @@protoc_insertion_point(constructor:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) +} +IgnoredSeqNumRange::IgnoredSeqNumRange(const IgnoredSeqNumRange& from) + : ::google::protobuf::MessageLite(), + _internal_metadata_(NULL) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::memcpy(&start_, &from.start_, + static_cast(reinterpret_cast(&end_) - + reinterpret_cast(&start_)) + sizeof(end_)); + // @@protoc_insertion_point(copy_constructor:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) +} + +void IgnoredSeqNumRange::SharedCtor() { + ::memset(&start_, 0, static_cast( + reinterpret_cast(&end_) - + reinterpret_cast(&start_)) + sizeof(end_)); +} + +IgnoredSeqNumRange::~IgnoredSeqNumRange() { + // @@protoc_insertion_point(destructor:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + SharedDtor(); +} + +void IgnoredSeqNumRange::SharedDtor() { +} + +void IgnoredSeqNumRange::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const IgnoredSeqNumRange& IgnoredSeqNumRange::default_instance() { + ::google::protobuf::internal::InitSCC(&protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::scc_info_IgnoredSeqNumRange.base); + return *internal_default_instance(); +} + + +void IgnoredSeqNumRange::Clear() { +// @@protoc_insertion_point(message_clear_start:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + ::google::protobuf::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + ::memset(&start_, 0, static_cast( + reinterpret_cast(&end_) - + reinterpret_cast(&start_)) + sizeof(end_)); + _internal_metadata_.Clear(); +} + +bool IgnoredSeqNumRange::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::internal::LiteUnknownFieldSetter unknown_fields_setter( + &_internal_metadata_); + ::google::protobuf::io::StringOutputStream unknown_fields_output( + unknown_fields_setter.buffer()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_output, false); + // @@protoc_insertion_point(parse_start:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + for (;;) { + ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + case 1: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { + + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &start_))); + } else { + goto handle_unusual; + } + break; + } + + case 2: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { + + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &end_))); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + return true; +failure: + // @@protoc_insertion_point(parse_failure:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + return false; +#undef DO_ +} + +void IgnoredSeqNumRange::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (this->start() != 0) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output); + } + + if (this->end() != 0) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output); + } + + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), + static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); + // @@protoc_insertion_point(serialize_end:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) +} + +size_t IgnoredSeqNumRange::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + size_t total_size = 0; + + total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + + if (this->start() != 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->start()); + } + + if (this->end() != 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->end()); + } + + int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void IgnoredSeqNumRange::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void IgnoredSeqNumRange::MergeFrom(const IgnoredSeqNumRange& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.start() != 0) { + set_start(from.start()); + } + if (from.end() != 0) { + set_end(from.end()); + } +} + +void IgnoredSeqNumRange::CopyFrom(const IgnoredSeqNumRange& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool IgnoredSeqNumRange::IsInitialized() const { + return true; +} + +void IgnoredSeqNumRange::Swap(IgnoredSeqNumRange* other) { + if (other == this) return; + InternalSwap(other); +} +void IgnoredSeqNumRange::InternalSwap(IgnoredSeqNumRange* other) { + using std::swap; + swap(start_, other->start_); + swap(end_, other->end_); + _internal_metadata_.Swap(&other->_internal_metadata_); +} + +::std::string IgnoredSeqNumRange::GetTypeName() const { + return "cockroach.storage.engine.enginepb.IgnoredSeqNumRange"; +} + + // =================================================================== void MVCCStatsDelta::InitAsDefaultInstance() { @@ -4080,6 +4312,9 @@ namespace protobuf { template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::storage::engine::enginepb::TxnMeta* Arena::CreateMaybeMessage< ::cockroach::storage::engine::enginepb::TxnMeta >(Arena* arena) { return Arena::CreateInternal< ::cockroach::storage::engine::enginepb::TxnMeta >(arena); } +template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* Arena::CreateMaybeMessage< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >(Arena* arena) { + return Arena::CreateInternal< ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange >(arena); +} template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::storage::engine::enginepb::MVCCStatsDelta* Arena::CreateMaybeMessage< ::cockroach::storage::engine::enginepb::MVCCStatsDelta >(Arena* arena) { return Arena::CreateInternal< ::cockroach::storage::engine::enginepb::MVCCStatsDelta >(arena); } diff --git a/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.h b/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.h index a2e372a4df91..2c05597a0208 100644 --- a/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.h +++ b/c-deps/libroach/protos/storage/engine/enginepb/mvcc3.pb.h @@ -38,7 +38,7 @@ namespace protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto { struct TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; - static const ::google::protobuf::internal::ParseTable schema[11]; + static const ::google::protobuf::internal::ParseTable schema[12]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; @@ -48,6 +48,9 @@ namespace cockroach { namespace storage { namespace engine { namespace enginepb { +class IgnoredSeqNumRange; +class IgnoredSeqNumRangeDefaultTypeInternal; +extern IgnoredSeqNumRangeDefaultTypeInternal _IgnoredSeqNumRange_default_instance_; class MVCCAbortIntentOp; class MVCCAbortIntentOpDefaultTypeInternal; extern MVCCAbortIntentOpDefaultTypeInternal _MVCCAbortIntentOp_default_instance_; @@ -87,6 +90,7 @@ extern TxnMetaDefaultTypeInternal _TxnMeta_default_instance_; } // namespace cockroach namespace google { namespace protobuf { +template<> ::cockroach::storage::engine::enginepb::IgnoredSeqNumRange* Arena::CreateMaybeMessage<::cockroach::storage::engine::enginepb::IgnoredSeqNumRange>(Arena*); template<> ::cockroach::storage::engine::enginepb::MVCCAbortIntentOp* Arena::CreateMaybeMessage<::cockroach::storage::engine::enginepb::MVCCAbortIntentOp>(Arena*); template<> ::cockroach::storage::engine::enginepb::MVCCAbortTxnOp* Arena::CreateMaybeMessage<::cockroach::storage::engine::enginepb::MVCCAbortTxnOp>(Arena*); template<> ::cockroach::storage::engine::enginepb::MVCCCommitIntentOp* Arena::CreateMaybeMessage<::cockroach::storage::engine::enginepb::MVCCCommitIntentOp>(Arena*); @@ -272,6 +276,112 @@ class TxnMeta : public ::google::protobuf::MessageLite /* @@protoc_insertion_poi }; // ------------------------------------------------------------------- +class IgnoredSeqNumRange : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) */ { + public: + IgnoredSeqNumRange(); + virtual ~IgnoredSeqNumRange(); + + IgnoredSeqNumRange(const IgnoredSeqNumRange& from); + + inline IgnoredSeqNumRange& operator=(const IgnoredSeqNumRange& from) { + CopyFrom(from); + return *this; + } + #if LANG_CXX11 + IgnoredSeqNumRange(IgnoredSeqNumRange&& from) noexcept + : IgnoredSeqNumRange() { + *this = ::std::move(from); + } + + inline IgnoredSeqNumRange& operator=(IgnoredSeqNumRange&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + #endif + static const IgnoredSeqNumRange& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const IgnoredSeqNumRange* internal_default_instance() { + return reinterpret_cast( + &_IgnoredSeqNumRange_default_instance_); + } + static constexpr int kIndexInFileMessages = + 1; + + void Swap(IgnoredSeqNumRange* other); + friend void swap(IgnoredSeqNumRange& a, IgnoredSeqNumRange& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline IgnoredSeqNumRange* New() const final { + return CreateMaybeMessage(NULL); + } + + IgnoredSeqNumRange* New(::google::protobuf::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from) + final; + void CopyFrom(const IgnoredSeqNumRange& from); + void MergeFrom(const IgnoredSeqNumRange& from); + void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) final; + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const final; + void DiscardUnknownFields(); + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + void InternalSwap(IgnoredSeqNumRange* other); + private: + inline ::google::protobuf::Arena* GetArenaNoVirtual() const { + return NULL; + } + inline void* MaybeArenaPtr() const { + return NULL; + } + public: + + ::std::string GetTypeName() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + void clear_start(); + static const int kStartFieldNumber = 1; + ::google::protobuf::int32 start() const; + void set_start(::google::protobuf::int32 value); + + void clear_end(); + static const int kEndFieldNumber = 2; + ::google::protobuf::int32 end() const; + void set_end(::google::protobuf::int32 value); + + // @@protoc_insertion_point(class_scope:cockroach.storage.engine.enginepb.IgnoredSeqNumRange) + private: + + ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::int32 start_; + ::google::protobuf::int32 end_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + friend struct ::protobuf_storage_2fengine_2fenginepb_2fmvcc3_2eproto::TableStruct; +}; +// ------------------------------------------------------------------- + class MVCCStatsDelta : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:cockroach.storage.engine.enginepb.MVCCStatsDelta) */ { public: MVCCStatsDelta(); @@ -306,7 +416,7 @@ class MVCCStatsDelta : public ::google::protobuf::MessageLite /* @@protoc_insert &_MVCCStatsDelta_default_instance_); } static constexpr int kIndexInFileMessages = - 1; + 2; void Swap(MVCCStatsDelta* other); friend void swap(MVCCStatsDelta& a, MVCCStatsDelta& b) { @@ -497,7 +607,7 @@ class MVCCPersistentStats : public ::google::protobuf::MessageLite /* @@protoc_i &_MVCCPersistentStats_default_instance_); } static constexpr int kIndexInFileMessages = - 2; + 3; void Swap(MVCCPersistentStats* other); friend void swap(MVCCPersistentStats& a, MVCCPersistentStats& b) { @@ -688,7 +798,7 @@ class RangeAppliedState : public ::google::protobuf::MessageLite /* @@protoc_ins &_RangeAppliedState_default_instance_); } static constexpr int kIndexInFileMessages = - 3; + 4; void Swap(RangeAppliedState* other); friend void swap(RangeAppliedState& a, RangeAppliedState& b) { @@ -808,7 +918,7 @@ class MVCCWriteValueOp : public ::google::protobuf::MessageLite /* @@protoc_inse &_MVCCWriteValueOp_default_instance_); } static constexpr int kIndexInFileMessages = - 4; + 5; void Swap(MVCCWriteValueOp* other); friend void swap(MVCCWriteValueOp& a, MVCCWriteValueOp& b) { @@ -959,7 +1069,7 @@ class MVCCWriteIntentOp : public ::google::protobuf::MessageLite /* @@protoc_ins &_MVCCWriteIntentOp_default_instance_); } static constexpr int kIndexInFileMessages = - 5; + 6; void Swap(MVCCWriteIntentOp* other); friend void swap(MVCCWriteIntentOp& a, MVCCWriteIntentOp& b) { @@ -1106,7 +1216,7 @@ class MVCCUpdateIntentOp : public ::google::protobuf::MessageLite /* @@protoc_in &_MVCCUpdateIntentOp_default_instance_); } static constexpr int kIndexInFileMessages = - 6; + 7; void Swap(MVCCUpdateIntentOp* other); friend void swap(MVCCUpdateIntentOp& a, MVCCUpdateIntentOp& b) { @@ -1226,7 +1336,7 @@ class MVCCCommitIntentOp : public ::google::protobuf::MessageLite /* @@protoc_in &_MVCCCommitIntentOp_default_instance_); } static constexpr int kIndexInFileMessages = - 7; + 8; void Swap(MVCCCommitIntentOp* other); friend void swap(MVCCCommitIntentOp& a, MVCCCommitIntentOp& b) { @@ -1391,7 +1501,7 @@ class MVCCAbortIntentOp : public ::google::protobuf::MessageLite /* @@protoc_ins &_MVCCAbortIntentOp_default_instance_); } static constexpr int kIndexInFileMessages = - 8; + 9; void Swap(MVCCAbortIntentOp* other); friend void swap(MVCCAbortIntentOp& a, MVCCAbortIntentOp& b) { @@ -1499,7 +1609,7 @@ class MVCCAbortTxnOp : public ::google::protobuf::MessageLite /* @@protoc_insert &_MVCCAbortTxnOp_default_instance_); } static constexpr int kIndexInFileMessages = - 9; + 10; void Swap(MVCCAbortTxnOp* other); friend void swap(MVCCAbortTxnOp& a, MVCCAbortTxnOp& b) { @@ -1607,7 +1717,7 @@ class MVCCLogicalOp : public ::google::protobuf::MessageLite /* @@protoc_inserti &_MVCCLogicalOp_default_instance_); } static constexpr int kIndexInFileMessages = - 10; + 11; void Swap(MVCCLogicalOp* other); friend void swap(MVCCLogicalOp& a, MVCCLogicalOp& b) { @@ -1994,6 +2104,36 @@ inline void TxnMeta::set_sequence(::google::protobuf::int32 value) { // ------------------------------------------------------------------- +// IgnoredSeqNumRange + +inline void IgnoredSeqNumRange::clear_start() { + start_ = 0; +} +inline ::google::protobuf::int32 IgnoredSeqNumRange::start() const { + // @@protoc_insertion_point(field_get:cockroach.storage.engine.enginepb.IgnoredSeqNumRange.start) + return start_; +} +inline void IgnoredSeqNumRange::set_start(::google::protobuf::int32 value) { + + start_ = value; + // @@protoc_insertion_point(field_set:cockroach.storage.engine.enginepb.IgnoredSeqNumRange.start) +} + +inline void IgnoredSeqNumRange::clear_end() { + end_ = 0; +} +inline ::google::protobuf::int32 IgnoredSeqNumRange::end() const { + // @@protoc_insertion_point(field_get:cockroach.storage.engine.enginepb.IgnoredSeqNumRange.end) + return end_; +} +inline void IgnoredSeqNumRange::set_end(::google::protobuf::int32 value) { + + end_ = value; + // @@protoc_insertion_point(field_set:cockroach.storage.engine.enginepb.IgnoredSeqNumRange.end) +} + +// ------------------------------------------------------------------- + // MVCCStatsDelta // int64 contains_estimates = 14; @@ -3716,6 +3856,8 @@ inline void MVCCLogicalOp::set_allocated_abort_txn(::cockroach::storage::engine: // ------------------------------------------------------------------- +// ------------------------------------------------------------------- + // @@protoc_insertion_point(namespace_scope) diff --git a/pkg/roachpb/api.go b/pkg/roachpb/api.go index 5c30e2c6ede0..cc8d12885ebf 100644 --- a/pkg/roachpb/api.go +++ b/pkg/roachpb/api.go @@ -1252,3 +1252,24 @@ func (acrr *AdminChangeReplicasRequest) Changes() []ReplicationChange { } return sl } + +// AsIntent creates an intent corresponding to the given resolve intent request. +func (rir *ResolveIntentRequest) AsIntent() Intent { + return Intent{ + Span: rir.Span(), + Txn: rir.IntentTxn, + Status: rir.Status, + IgnoredSeqNums: rir.IgnoredSeqNums, + } +} + +// AsIntent creates an intent corresponding to the given resolve +// intent range request. +func (rirr *ResolveIntentRangeRequest) AsIntent() Intent { + return Intent{ + Span: rirr.Span(), + Txn: rirr.IntentTxn, + Status: rirr.Status, + IgnoredSeqNums: rirr.IgnoredSeqNums, + } +} diff --git a/pkg/roachpb/api.pb.go b/pkg/roachpb/api.pb.go index e2a03daf30c0..2e933e71ae6a 100644 --- a/pkg/roachpb/api.pb.go +++ b/pkg/roachpb/api.pb.go @@ -71,7 +71,7 @@ func (x ReadConsistencyType) String() string { return proto.EnumName(ReadConsistencyType_name, int32(x)) } func (ReadConsistencyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{0} + return fileDescriptor_api_b15d24b83d75a88d, []int{0} } // ScanFormat is an enumeration of the available response formats for MVCCScan @@ -99,7 +99,7 @@ func (x ScanFormat) String() string { return proto.EnumName(ScanFormat_name, int32(x)) } func (ScanFormat) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{1} + return fileDescriptor_api_b15d24b83d75a88d, []int{1} } type ChecksumMode int32 @@ -146,7 +146,7 @@ func (x ChecksumMode) String() string { return proto.EnumName(ChecksumMode_name, int32(x)) } func (ChecksumMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{2} + return fileDescriptor_api_b15d24b83d75a88d, []int{2} } // PushTxnType determines what action to take when pushing a transaction. @@ -177,7 +177,7 @@ func (x PushTxnType) String() string { return proto.EnumName(PushTxnType_name, int32(x)) } func (PushTxnType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{3} + return fileDescriptor_api_b15d24b83d75a88d, []int{3} } type ExternalStorageProvider int32 @@ -215,7 +215,7 @@ func (x ExternalStorageProvider) String() string { return proto.EnumName(ExternalStorageProvider_name, int32(x)) } func (ExternalStorageProvider) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{4} + return fileDescriptor_api_b15d24b83d75a88d, []int{4} } type MVCCFilter int32 @@ -238,7 +238,7 @@ func (x MVCCFilter) String() string { return proto.EnumName(MVCCFilter_name, int32(x)) } func (MVCCFilter) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{5} + return fileDescriptor_api_b15d24b83d75a88d, []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_81f49381168fdb11, []int{2, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{2, 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_81f49381168fdb11, []int{27, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{27, 0} } // RangeInfo describes a range which executed a request. It contains @@ -326,7 +326,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_api_81f49381168fdb11, []int{0} + return fileDescriptor_api_b15d24b83d75a88d, []int{0} } func (m *RangeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -369,7 +369,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_81f49381168fdb11, []int{1} + return fileDescriptor_api_b15d24b83d75a88d, []int{1} } func (m *RequestHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -431,7 +431,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_81f49381168fdb11, []int{2} + return fileDescriptor_api_b15d24b83d75a88d, []int{2} } func (m *ResponseHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -465,7 +465,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_81f49381168fdb11, []int{3} + return fileDescriptor_api_b15d24b83d75a88d, []int{3} } func (m *GetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -503,7 +503,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_81f49381168fdb11, []int{4} + return fileDescriptor_api_b15d24b83d75a88d, []int{4} } func (m *GetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -546,7 +546,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_81f49381168fdb11, []int{5} + return fileDescriptor_api_b15d24b83d75a88d, []int{5} } func (m *PutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -580,7 +580,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_81f49381168fdb11, []int{6} + return fileDescriptor_api_b15d24b83d75a88d, []int{6} } func (m *PutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +634,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_81f49381168fdb11, []int{7} + return fileDescriptor_api_b15d24b83d75a88d, []int{7} } func (m *ConditionalPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -669,7 +669,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_81f49381168fdb11, []int{8} + return fileDescriptor_api_b15d24b83d75a88d, []int{8} } func (m *ConditionalPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -715,7 +715,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_81f49381168fdb11, []int{9} + return fileDescriptor_api_b15d24b83d75a88d, []int{9} } func (m *InitPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -749,7 +749,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_81f49381168fdb11, []int{10} + return fileDescriptor_api_b15d24b83d75a88d, []int{10} } func (m *InitPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -789,7 +789,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_81f49381168fdb11, []int{11} + return fileDescriptor_api_b15d24b83d75a88d, []int{11} } func (m *IncrementRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -826,7 +826,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_81f49381168fdb11, []int{12} + return fileDescriptor_api_b15d24b83d75a88d, []int{12} } func (m *IncrementResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -860,7 +860,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_81f49381168fdb11, []int{13} + return fileDescriptor_api_b15d24b83d75a88d, []int{13} } func (m *DeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -894,7 +894,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_81f49381168fdb11, []int{14} + return fileDescriptor_api_b15d24b83d75a88d, []int{14} } func (m *DeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -946,7 +946,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_81f49381168fdb11, []int{15} + return fileDescriptor_api_b15d24b83d75a88d, []int{15} } func (m *DeleteRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -983,7 +983,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_81f49381168fdb11, []int{16} + return fileDescriptor_api_b15d24b83d75a88d, []int{16} } func (m *DeleteRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1030,7 +1030,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_81f49381168fdb11, []int{17} + return fileDescriptor_api_b15d24b83d75a88d, []int{17} } func (m *ClearRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1064,7 +1064,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_81f49381168fdb11, []int{18} + return fileDescriptor_api_b15d24b83d75a88d, []int{18} } func (m *ClearRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1105,7 +1105,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_81f49381168fdb11, []int{19} + return fileDescriptor_api_b15d24b83d75a88d, []int{19} } func (m *RevertRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1139,7 +1139,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_81f49381168fdb11, []int{20} + return fileDescriptor_api_b15d24b83d75a88d, []int{20} } func (m *RevertRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1207,7 +1207,7 @@ func (m *ScanOptions) Reset() { *m = ScanOptions{} } func (m *ScanOptions) String() string { return proto.CompactTextString(m) } func (*ScanOptions) ProtoMessage() {} func (*ScanOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{21} + return fileDescriptor_api_b15d24b83d75a88d, []int{21} } func (m *ScanOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1247,7 +1247,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_81f49381168fdb11, []int{22} + return fileDescriptor_api_b15d24b83d75a88d, []int{22} } func (m *ScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1294,7 +1294,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_81f49381168fdb11, []int{23} + return fileDescriptor_api_b15d24b83d75a88d, []int{23} } func (m *ScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1334,7 +1334,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_81f49381168fdb11, []int{24} + return fileDescriptor_api_b15d24b83d75a88d, []int{24} } func (m *ReverseScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1381,7 +1381,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_81f49381168fdb11, []int{25} + return fileDescriptor_api_b15d24b83d75a88d, []int{25} } func (m *ReverseScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1434,7 +1434,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_81f49381168fdb11, []int{26} + return fileDescriptor_api_b15d24b83d75a88d, []int{26} } func (m *CheckConsistencyRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1471,7 +1471,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_81f49381168fdb11, []int{27} + return fileDescriptor_api_b15d24b83d75a88d, []int{27} } func (m *CheckConsistencyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1515,7 +1515,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_81f49381168fdb11, []int{27, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{27, 0} } func (m *CheckConsistencyResponse_Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1563,7 +1563,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_81f49381168fdb11, []int{28} + return fileDescriptor_api_b15d24b83d75a88d, []int{28} } func (m *RecomputeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1599,7 +1599,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_81f49381168fdb11, []int{29} + return fileDescriptor_api_b15d24b83d75a88d, []int{29} } func (m *RecomputeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1687,7 +1687,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_81f49381168fdb11, []int{30} + return fileDescriptor_api_b15d24b83d75a88d, []int{30} } func (m *EndTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1733,7 +1733,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_81f49381168fdb11, []int{31} + return fileDescriptor_api_b15d24b83d75a88d, []int{31} } func (m *EndTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1794,7 +1794,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_81f49381168fdb11, []int{32} + return fileDescriptor_api_b15d24b83d75a88d, []int{32} } func (m *AdminSplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1829,7 +1829,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_81f49381168fdb11, []int{33} + return fileDescriptor_api_b15d24b83d75a88d, []int{33} } func (m *AdminSplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1868,7 +1868,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_81f49381168fdb11, []int{34} + return fileDescriptor_api_b15d24b83d75a88d, []int{34} } func (m *AdminUnsplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1903,7 +1903,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_81f49381168fdb11, []int{35} + return fileDescriptor_api_b15d24b83d75a88d, []int{35} } func (m *AdminUnsplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1946,7 +1946,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_81f49381168fdb11, []int{36} + return fileDescriptor_api_b15d24b83d75a88d, []int{36} } func (m *AdminMergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1981,7 +1981,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_81f49381168fdb11, []int{37} + return fileDescriptor_api_b15d24b83d75a88d, []int{37} } func (m *AdminMergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2019,7 +2019,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_81f49381168fdb11, []int{38} + return fileDescriptor_api_b15d24b83d75a88d, []int{38} } func (m *AdminTransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2052,7 +2052,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_81f49381168fdb11, []int{39} + return fileDescriptor_api_b15d24b83d75a88d, []int{39} } func (m *AdminTransferLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2087,7 +2087,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_81f49381168fdb11, []int{40} + return fileDescriptor_api_b15d24b83d75a88d, []int{40} } func (m *ReplicationChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2145,7 +2145,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_81f49381168fdb11, []int{41} + return fileDescriptor_api_b15d24b83d75a88d, []int{41} } func (m *AdminChangeReplicasRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2180,7 +2180,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_81f49381168fdb11, []int{42} + return fileDescriptor_api_b15d24b83d75a88d, []int{42} } func (m *AdminChangeReplicasResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2217,7 +2217,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_81f49381168fdb11, []int{43} + return fileDescriptor_api_b15d24b83d75a88d, []int{43} } func (m *AdminRelocateRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2250,7 +2250,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_81f49381168fdb11, []int{44} + return fileDescriptor_api_b15d24b83d75a88d, []int{44} } func (m *AdminRelocateRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2289,7 +2289,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_81f49381168fdb11, []int{45} + return fileDescriptor_api_b15d24b83d75a88d, []int{45} } func (m *HeartbeatTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2326,7 +2326,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_81f49381168fdb11, []int{46} + return fileDescriptor_api_b15d24b83d75a88d, []int{46} } func (m *HeartbeatTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2364,7 +2364,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_81f49381168fdb11, []int{47} + return fileDescriptor_api_b15d24b83d75a88d, []int{47} } func (m *GCRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2398,7 +2398,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_81f49381168fdb11, []int{47, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{47, 0} } func (m *GCRequest_GCKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2432,7 +2432,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_81f49381168fdb11, []int{48} + return fileDescriptor_api_b15d24b83d75a88d, []int{48} } func (m *GCResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2501,7 +2501,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_81f49381168fdb11, []int{49} + return fileDescriptor_api_b15d24b83d75a88d, []int{49} } func (m *PushTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2544,7 +2544,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_81f49381168fdb11, []int{50} + return fileDescriptor_api_b15d24b83d75a88d, []int{50} } func (m *PushTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2591,7 +2591,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_81f49381168fdb11, []int{51} + return fileDescriptor_api_b15d24b83d75a88d, []int{51} } func (m *RecoverTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2627,7 +2627,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_81f49381168fdb11, []int{52} + return fileDescriptor_api_b15d24b83d75a88d, []int{52} } func (m *RecoverTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2671,7 +2671,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_81f49381168fdb11, []int{53} + return fileDescriptor_api_b15d24b83d75a88d, []int{53} } func (m *QueryTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2710,7 +2710,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_81f49381168fdb11, []int{54} + return fileDescriptor_api_b15d24b83d75a88d, []int{54} } func (m *QueryTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2770,7 +2770,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_81f49381168fdb11, []int{55} + return fileDescriptor_api_b15d24b83d75a88d, []int{55} } func (m *QueryIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2806,7 +2806,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_81f49381168fdb11, []int{56} + return fileDescriptor_api_b15d24b83d75a88d, []int{56} } func (m *QueryIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2844,13 +2844,15 @@ type ResolveIntentRequest struct { // Optionally poison the abort span for the transaction the intent's // range. Poison bool `protobuf:"varint,4,opt,name=poison,proto3" json:"poison,omitempty"` + // The list of ignored seqnum ranges as per the Transaction record. + IgnoredSeqNums []enginepb.IgnoredSeqNumRange `protobuf:"bytes,5,rep,name=ignored_seqnums,json=ignoredSeqnums,proto3" json:"ignored_seqnums"` } 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_81f49381168fdb11, []int{57} + return fileDescriptor_api_b15d24b83d75a88d, []int{57} } func (m *ResolveIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2885,7 +2887,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_81f49381168fdb11, []int{58} + return fileDescriptor_api_b15d24b83d75a88d, []int{58} } func (m *ResolveIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2927,13 +2929,15 @@ type ResolveIntentRangeRequest struct { // transaction. If present, this value can be used to optimize the // iteration over the span to find intents to resolve. MinTimestamp hlc.Timestamp `protobuf:"bytes,5,opt,name=min_timestamp,json=minTimestamp,proto3" json:"min_timestamp"` + // The list of ignored seqnum ranges as per the Transaction record. + IgnoredSeqNums []enginepb.IgnoredSeqNumRange `protobuf:"bytes,6,rep,name=ignored_seqnums,json=ignoredSeqnums,proto3" json:"ignored_seqnums"` } func (m *ResolveIntentRangeRequest) Reset() { *m = ResolveIntentRangeRequest{} } func (m *ResolveIntentRangeRequest) String() string { return proto.CompactTextString(m) } func (*ResolveIntentRangeRequest) ProtoMessage() {} func (*ResolveIntentRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{59} + return fileDescriptor_api_b15d24b83d75a88d, []int{59} } func (m *ResolveIntentRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2968,7 +2972,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_81f49381168fdb11, []int{60} + return fileDescriptor_api_b15d24b83d75a88d, []int{60} } func (m *ResolveIntentRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3005,7 +3009,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_81f49381168fdb11, []int{61} + return fileDescriptor_api_b15d24b83d75a88d, []int{61} } func (m *MergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3039,7 +3043,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_81f49381168fdb11, []int{62} + return fileDescriptor_api_b15d24b83d75a88d, []int{62} } func (m *MergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3084,7 +3088,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_81f49381168fdb11, []int{63} + return fileDescriptor_api_b15d24b83d75a88d, []int{63} } func (m *TruncateLogRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3118,7 +3122,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_81f49381168fdb11, []int{64} + return fileDescriptor_api_b15d24b83d75a88d, []int{64} } func (m *TruncateLogResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3162,7 +3166,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_81f49381168fdb11, []int{65} + return fileDescriptor_api_b15d24b83d75a88d, []int{65} } func (m *RequestLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3211,7 +3215,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_81f49381168fdb11, []int{66} + return fileDescriptor_api_b15d24b83d75a88d, []int{66} } func (m *TransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3248,7 +3252,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_81f49381168fdb11, []int{67} + return fileDescriptor_api_b15d24b83d75a88d, []int{67} } func (m *LeaseInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3285,7 +3289,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_81f49381168fdb11, []int{68} + return fileDescriptor_api_b15d24b83d75a88d, []int{68} } func (m *LeaseInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3320,7 +3324,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_81f49381168fdb11, []int{69} + return fileDescriptor_api_b15d24b83d75a88d, []int{69} } func (m *RequestLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3375,7 +3379,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_81f49381168fdb11, []int{70} + return fileDescriptor_api_b15d24b83d75a88d, []int{70} } func (m *ComputeChecksumRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3412,7 +3416,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_81f49381168fdb11, []int{71} + return fileDescriptor_api_b15d24b83d75a88d, []int{71} } func (m *ComputeChecksumResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3451,7 +3455,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_81f49381168fdb11, []int{72} + return fileDescriptor_api_b15d24b83d75a88d, []int{72} } func (m *ExternalStorage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3485,7 +3489,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_81f49381168fdb11, []int{72, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{72, 0} } func (m *ExternalStorage_LocalFilePath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3518,7 +3522,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_81f49381168fdb11, []int{72, 1} + return fileDescriptor_api_b15d24b83d75a88d, []int{72, 1} } func (m *ExternalStorage_Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3558,7 +3562,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_81f49381168fdb11, []int{72, 2} + return fileDescriptor_api_b15d24b83d75a88d, []int{72, 2} } func (m *ExternalStorage_S3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3597,7 +3601,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_81f49381168fdb11, []int{72, 3} + return fileDescriptor_api_b15d24b83d75a88d, []int{72, 3} } func (m *ExternalStorage_GCS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3633,7 +3637,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_81f49381168fdb11, []int{72, 4} + return fileDescriptor_api_b15d24b83d75a88d, []int{72, 4} } func (m *ExternalStorage_Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3672,7 +3676,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_81f49381168fdb11, []int{72, 5} + return fileDescriptor_api_b15d24b83d75a88d, []int{72, 5} } func (m *ExternalStorage_Workload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3712,7 +3716,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_81f49381168fdb11, []int{73} + return fileDescriptor_api_b15d24b83d75a88d, []int{73} } func (m *WriteBatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3746,7 +3750,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_81f49381168fdb11, []int{74} + return fileDescriptor_api_b15d24b83d75a88d, []int{74} } func (m *WriteBatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3808,7 +3812,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_81f49381168fdb11, []int{75} + return fileDescriptor_api_b15d24b83d75a88d, []int{75} } func (m *ExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3844,7 +3848,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_81f49381168fdb11, []int{76} + return fileDescriptor_api_b15d24b83d75a88d, []int{76} } func (m *BulkOpSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3880,7 +3884,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_81f49381168fdb11, []int{77} + return fileDescriptor_api_b15d24b83d75a88d, []int{77} } func (m *ExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3920,7 +3924,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_81f49381168fdb11, []int{77, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{77, 0} } func (m *ExportResponse_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3970,7 +3974,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_81f49381168fdb11, []int{78} + return fileDescriptor_api_b15d24b83d75a88d, []int{78} } func (m *ImportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4005,7 +4009,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_81f49381168fdb11, []int{78, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{78, 0} } func (m *ImportRequest_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4041,7 +4045,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_81f49381168fdb11, []int{78, 1} + return fileDescriptor_api_b15d24b83d75a88d, []int{78, 1} } func (m *ImportRequest_TableRekey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4076,7 +4080,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_81f49381168fdb11, []int{79} + return fileDescriptor_api_b15d24b83d75a88d, []int{79} } func (m *ImportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4114,7 +4118,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_81f49381168fdb11, []int{80} + return fileDescriptor_api_b15d24b83d75a88d, []int{80} } func (m *AdminScatterRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4149,7 +4153,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_81f49381168fdb11, []int{81} + return fileDescriptor_api_b15d24b83d75a88d, []int{81} } func (m *AdminScatterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4182,7 +4186,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_81f49381168fdb11, []int{81, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{81, 0} } func (m *AdminScatterResponse_Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4227,7 +4231,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_81f49381168fdb11, []int{82} + return fileDescriptor_api_b15d24b83d75a88d, []int{82} } func (m *AdminVerifyProtectedTimestampRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4265,7 +4269,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_81f49381168fdb11, []int{83} + return fileDescriptor_api_b15d24b83d75a88d, []int{83} } func (m *AdminVerifyProtectedTimestampResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4318,7 +4322,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_81f49381168fdb11, []int{84} + return fileDescriptor_api_b15d24b83d75a88d, []int{84} } func (m *AddSSTableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4352,7 +4356,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_81f49381168fdb11, []int{85} + return fileDescriptor_api_b15d24b83d75a88d, []int{85} } func (m *AddSSTableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4396,7 +4400,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_81f49381168fdb11, []int{86} + return fileDescriptor_api_b15d24b83d75a88d, []int{86} } func (m *RefreshRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4430,7 +4434,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_81f49381168fdb11, []int{87} + return fileDescriptor_api_b15d24b83d75a88d, []int{87} } func (m *RefreshResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4469,7 +4473,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_81f49381168fdb11, []int{88} + return fileDescriptor_api_b15d24b83d75a88d, []int{88} } func (m *RefreshRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4503,7 +4507,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_81f49381168fdb11, []int{89} + return fileDescriptor_api_b15d24b83d75a88d, []int{89} } func (m *RefreshRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4552,7 +4556,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_81f49381168fdb11, []int{90} + return fileDescriptor_api_b15d24b83d75a88d, []int{90} } func (m *SubsumeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4601,7 +4605,7 @@ 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_81f49381168fdb11, []int{91} + return fileDescriptor_api_b15d24b83d75a88d, []int{91} } func (m *SubsumeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4636,7 +4640,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_81f49381168fdb11, []int{92} + return fileDescriptor_api_b15d24b83d75a88d, []int{92} } func (m *RangeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4675,7 +4679,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_81f49381168fdb11, []int{93} + return fileDescriptor_api_b15d24b83d75a88d, []int{93} } func (m *RangeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4758,7 +4762,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_81f49381168fdb11, []int{94} + return fileDescriptor_api_b15d24b83d75a88d, []int{94} } func (m *RequestUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6208,7 +6212,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_81f49381168fdb11, []int{95} + return fileDescriptor_api_b15d24b83d75a88d, []int{95} } func (m *ResponseUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7654,7 +7658,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_81f49381168fdb11, []int{96} + return fileDescriptor_api_b15d24b83d75a88d, []int{96} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7690,7 +7694,7 @@ type BatchRequest struct { func (m *BatchRequest) Reset() { *m = BatchRequest{} } func (*BatchRequest) ProtoMessage() {} func (*BatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{97} + return fileDescriptor_api_b15d24b83d75a88d, []int{97} } func (m *BatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7727,7 +7731,7 @@ type BatchResponse struct { func (m *BatchResponse) Reset() { *m = BatchResponse{} } func (*BatchResponse) ProtoMessage() {} func (*BatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_81f49381168fdb11, []int{98} + return fileDescriptor_api_b15d24b83d75a88d, []int{98} } func (m *BatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7786,7 +7790,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_81f49381168fdb11, []int{98, 0} + return fileDescriptor_api_b15d24b83d75a88d, []int{98, 0} } func (m *BatchResponse_Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7825,7 +7829,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_81f49381168fdb11, []int{99} + return fileDescriptor_api_b15d24b83d75a88d, []int{99} } func (m *RangeFeedRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7866,7 +7870,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_81f49381168fdb11, []int{100} + return fileDescriptor_api_b15d24b83d75a88d, []int{100} } func (m *RangeFeedValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7907,7 +7911,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_81f49381168fdb11, []int{101} + return fileDescriptor_api_b15d24b83d75a88d, []int{101} } func (m *RangeFeedCheckpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7944,7 +7948,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_81f49381168fdb11, []int{102} + return fileDescriptor_api_b15d24b83d75a88d, []int{102} } func (m *RangeFeedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7981,7 +7985,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_81f49381168fdb11, []int{103} + return fileDescriptor_api_b15d24b83d75a88d, []int{103} } func (m *RangeFeedEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9096,6 +9100,14 @@ func (this *ResolveIntentRequest) Equal(that interface{}) bool { if this.Poison != that1.Poison { return false } + if len(this.IgnoredSeqNums) != len(that1.IgnoredSeqNums) { + return false + } + for i := range this.IgnoredSeqNums { + if !this.IgnoredSeqNums[i].Equal(&that1.IgnoredSeqNums[i]) { + return false + } + } return true } func (this *ResolveIntentRangeRequest) Equal(that interface{}) bool { @@ -9132,6 +9144,14 @@ func (this *ResolveIntentRangeRequest) Equal(that interface{}) bool { if !this.MinTimestamp.Equal(&that1.MinTimestamp) { return false } + if len(this.IgnoredSeqNums) != len(that1.IgnoredSeqNums) { + return false + } + for i := range this.IgnoredSeqNums { + if !this.IgnoredSeqNums[i].Equal(&that1.IgnoredSeqNums[i]) { + return false + } + } return true } func (this *MergeRequest) Equal(that interface{}) bool { @@ -12420,6 +12440,18 @@ func (m *ResolveIntentRequest) MarshalTo(dAtA []byte) (int, error) { } i++ } + if len(m.IgnoredSeqNums) > 0 { + for _, msg := range m.IgnoredSeqNums { + dAtA[i] = 0x2a + i++ + i = encodeVarintApi(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -12503,6 +12535,18 @@ func (m *ResolveIntentRangeRequest) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n89 + if len(m.IgnoredSeqNums) > 0 { + for _, msg := range m.IgnoredSeqNums { + dAtA[i] = 0x32 + i++ + i = encodeVarintApi(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -17160,6 +17204,12 @@ func (m *ResolveIntentRequest) Size() (n int) { if m.Poison { n += 2 } + if len(m.IgnoredSeqNums) > 0 { + for _, e := range m.IgnoredSeqNums { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } return n } @@ -17192,6 +17242,12 @@ func (m *ResolveIntentRangeRequest) Size() (n int) { } l = m.MinTimestamp.Size() n += 1 + l + sovApi(uint64(l)) + if len(m.IgnoredSeqNums) > 0 { + for _, e := range m.IgnoredSeqNums { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } return n } @@ -26343,6 +26399,37 @@ func (m *ResolveIntentRequest) Unmarshal(dAtA []byte) error { } } m.Poison = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoredSeqNums", 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 + } + m.IgnoredSeqNums = append(m.IgnoredSeqNums, enginepb.IgnoredSeqNumRange{}) + if err := m.IgnoredSeqNums[len(m.IgnoredSeqNums)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -26602,6 +26689,37 @@ func (m *ResolveIntentRangeRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoredSeqNums", 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 + } + m.IgnoredSeqNums = append(m.IgnoredSeqNums, enginepb.IgnoredSeqNumRange{}) + if err := m.IgnoredSeqNums[len(m.IgnoredSeqNums)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -37006,457 +37124,461 @@ var ( ErrIntOverflowApi = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_81f49381168fdb11) } - -var fileDescriptor_api_81f49381168fdb11 = []byte{ - // 7178 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5b, 0x6c, 0x24, 0xc7, - 0x75, 0x36, 0x7b, 0x66, 0x38, 0x9c, 0x39, 0x73, 0x61, 0xb3, 0xc8, 0xdd, 0x9d, 0xa5, 0x24, 0x92, - 0x3b, 0x7b, 0xd5, 0x5a, 0xe2, 0x6a, 0x77, 0xad, 0x5f, 0xb2, 0x24, 0xcb, 0x26, 0x87, 0xb3, 0x3b, - 0xb3, 0x5c, 0x5e, 0xd4, 0x33, 0x5c, 0x79, 0xe5, 0x5f, 0x7f, 0xbb, 0xd9, 0x5d, 0x24, 0xdb, 0x3b, - 0xd3, 0x3d, 0xdb, 0xdd, 0xc3, 0xcb, 0x02, 0x3f, 0x7e, 0xfc, 0xc9, 0x83, 0x03, 0xc7, 0x10, 0x02, - 0x24, 0x08, 0x02, 0xdb, 0x81, 0x05, 0x38, 0x48, 0x82, 0x04, 0x36, 0x10, 0x20, 0x48, 0x90, 0x20, - 0x81, 0x1f, 0xf2, 0xa2, 0x18, 0x7e, 0x10, 0x82, 0x24, 0x36, 0x02, 0x84, 0x88, 0xd7, 0x40, 0x62, - 0xf8, 0x21, 0xaf, 0x06, 0xf4, 0x10, 0x04, 0x75, 0xe9, 0xcb, 0xcc, 0xf4, 0x5c, 0x48, 0xb5, 0x10, - 0x05, 0x79, 0x9a, 0xe9, 0x53, 0x75, 0x4e, 0x57, 0x9d, 0xaa, 0x3a, 0x75, 0xbe, 0xaa, 0x53, 0xd5, - 0x30, 0x65, 0x99, 0x8a, 0xba, 0xd7, 0xda, 0xbe, 0xa1, 0xb4, 0xf4, 0xc5, 0x96, 0x65, 0x3a, 0x26, - 0x9a, 0x52, 0x4d, 0xf5, 0x11, 0x25, 0x2f, 0xf2, 0xc4, 0x59, 0xe4, 0xe6, 0xd2, 0x14, 0x47, 0x61, - 0xd9, 0x66, 0x67, 0x5c, 0x1a, 0xb6, 0x2c, 0xd3, 0xb2, 0x39, 0xf5, 0xac, 0x4b, 0x6d, 0x62, 0x47, - 0x09, 0xe4, 0x2e, 0xda, 0x8e, 0x69, 0x29, 0xbb, 0xf8, 0x06, 0x36, 0x76, 0x75, 0xc3, 0xfd, 0x21, - 0xf9, 0xf6, 0x55, 0x95, 0xe7, 0xb9, 0x38, 0x28, 0xcf, 0x6d, 0x9e, 0xa9, 0xd0, 0x76, 0xf4, 0xc6, - 0x8d, 0xbd, 0x86, 0x7a, 0xc3, 0xd1, 0x9b, 0xd8, 0x76, 0x94, 0x66, 0x8b, 0xa7, 0x2c, 0xd0, 0x14, - 0xc7, 0x52, 0x54, 0xdd, 0xd8, 0xbd, 0x61, 0x61, 0xd5, 0xb4, 0x34, 0xac, 0xc9, 0x76, 0x4b, 0x31, - 0xdc, 0x22, 0xef, 0x9a, 0xbb, 0x26, 0xfd, 0x7b, 0x83, 0xfc, 0x63, 0xd4, 0xe2, 0xff, 0x83, 0xb4, - 0xa4, 0x18, 0xbb, 0xb8, 0x6a, 0xec, 0x98, 0xe8, 0x0d, 0x48, 0x68, 0xd8, 0x56, 0x0b, 0xc2, 0x82, - 0x70, 0x2d, 0x73, 0xab, 0xb8, 0xd8, 0xa3, 0x8b, 0x45, 0x9a, 0x77, 0x05, 0xdb, 0xaa, 0xa5, 0xb7, - 0x1c, 0xd3, 0x5a, 0x4e, 0x7c, 0x70, 0x3c, 0x3f, 0x26, 0x51, 0x2e, 0xf4, 0x59, 0x18, 0x6f, 0x60, - 0xc5, 0xc6, 0x85, 0x18, 0x65, 0x2f, 0x84, 0xb0, 0xdf, 0x27, 0xe9, 0x9c, 0x89, 0x65, 0x2e, 0xfe, - 0x8d, 0x00, 0x39, 0x09, 0x3f, 0x6e, 0x63, 0xdb, 0xa9, 0x60, 0x45, 0xc3, 0x16, 0x3a, 0x0f, 0xf1, - 0x47, 0xf8, 0xa8, 0x10, 0x5f, 0x10, 0xae, 0x65, 0x97, 0x27, 0x3e, 0x3a, 0x9e, 0x8f, 0xaf, 0xe2, - 0x23, 0x89, 0xd0, 0xd0, 0x02, 0x4c, 0x60, 0x43, 0x93, 0x49, 0x72, 0xa2, 0x33, 0x39, 0x89, 0x0d, - 0x6d, 0x15, 0x1f, 0x21, 0x15, 0x52, 0x36, 0x91, 0x66, 0xa8, 0xb8, 0x30, 0xbe, 0x20, 0x5c, 0x1b, - 0x5f, 0xbe, 0xfb, 0xd1, 0xf1, 0x7c, 0x69, 0x57, 0x77, 0xf6, 0xda, 0xdb, 0x8b, 0xaa, 0xd9, 0xbc, - 0xe1, 0x95, 0x4a, 0xdb, 0xf6, 0xff, 0xdf, 0x68, 0x3d, 0xda, 0xbd, 0xd1, 0xa7, 0x05, 0x16, 0xeb, - 0x87, 0x46, 0x0d, 0x3f, 0x96, 0x3c, 0xc1, 0xaf, 0x25, 0x7e, 0xfe, 0xfe, 0xbc, 0x70, 0x2f, 0x91, - 0x12, 0xc4, 0xd8, 0xbd, 0x44, 0x2a, 0x26, 0xc6, 0x8b, 0xdf, 0x88, 0x43, 0x5e, 0xc2, 0x76, 0xcb, - 0x34, 0x6c, 0xcc, 0xab, 0xf1, 0x12, 0xc4, 0x9d, 0x43, 0x83, 0x56, 0x23, 0x73, 0x6b, 0x2e, 0x44, - 0x19, 0x75, 0x4b, 0x31, 0x6c, 0x45, 0x75, 0x74, 0xd3, 0x90, 0x48, 0x56, 0xf4, 0x2a, 0x64, 0x2c, - 0x6c, 0xb7, 0x9b, 0x98, 0x36, 0x1b, 0xad, 0x61, 0xe6, 0xd6, 0xb9, 0x10, 0xce, 0x5a, 0x4b, 0x31, - 0x24, 0x60, 0x79, 0xc9, 0x7f, 0x74, 0x1e, 0x52, 0x46, 0xbb, 0x49, 0xf4, 0x62, 0xd3, 0x5a, 0xc7, - 0xa5, 0x09, 0xa3, 0xdd, 0x5c, 0xc5, 0x47, 0x36, 0x2a, 0x41, 0xc6, 0x22, 0x8d, 0x26, 0xeb, 0xc6, - 0x8e, 0x69, 0x17, 0x92, 0x0b, 0xf1, 0x6b, 0x99, 0x5b, 0xcf, 0xf6, 0x6b, 0x5a, 0xd2, 0x0d, 0x78, - 0xfb, 0x80, 0xe5, 0x12, 0x6c, 0x54, 0x83, 0x1c, 0x2f, 0x99, 0x85, 0x15, 0xdb, 0x34, 0x0a, 0x13, - 0x0b, 0xc2, 0xb5, 0xfc, 0xad, 0xc5, 0x30, 0x31, 0x1d, 0x5a, 0x20, 0x8f, 0xed, 0x26, 0x96, 0x28, - 0x97, 0x94, 0xb5, 0x02, 0x4f, 0xc5, 0x87, 0x90, 0x0d, 0xa6, 0x22, 0x04, 0x79, 0xa9, 0x5c, 0xdb, - 0x5a, 0x2b, 0xcb, 0x5b, 0xeb, 0xab, 0xeb, 0x1b, 0x6f, 0xaf, 0x8b, 0x63, 0x68, 0x06, 0x44, 0x4e, - 0x5b, 0x2d, 0x3f, 0x94, 0xef, 0x57, 0xd7, 0xaa, 0x75, 0x51, 0x40, 0xe7, 0xe1, 0x0c, 0xa7, 0x4a, - 0x4b, 0xeb, 0x77, 0xcb, 0xf2, 0xf2, 0xc6, 0xd6, 0xfa, 0xca, 0x92, 0xf4, 0x50, 0x8c, 0xcd, 0x26, - 0x7e, 0xed, 0xbb, 0x73, 0x63, 0xc5, 0x07, 0x00, 0x77, 0xb1, 0xc3, 0xbb, 0x15, 0x5a, 0x86, 0xe4, - 0x1e, 0x2d, 0x0d, 0xef, 0xd8, 0x0b, 0xa1, 0xc5, 0x0e, 0x74, 0xc1, 0xe5, 0x14, 0xd1, 0xc0, 0x87, - 0xc7, 0xf3, 0x82, 0xc4, 0x39, 0x59, 0x93, 0x17, 0x7f, 0x20, 0x40, 0x86, 0x0a, 0x66, 0x75, 0x44, - 0xa5, 0x2e, 0xc9, 0x17, 0x86, 0x2a, 0xa4, 0x57, 0x34, 0x5a, 0x84, 0xf1, 0x7d, 0xa5, 0xd1, 0x1e, - 0x34, 0x6e, 0x1e, 0x90, 0x74, 0x89, 0x65, 0x43, 0xaf, 0x43, 0x56, 0x37, 0x1c, 0x6c, 0x38, 0x32, - 0x63, 0x8b, 0x0f, 0x61, 0xcb, 0xb0, 0xdc, 0xf4, 0xa1, 0xf8, 0x97, 0x02, 0xc0, 0x66, 0x3b, 0x4a, - 0xd5, 0x90, 0x71, 0x3f, 0x52, 0xf9, 0xdd, 0x71, 0xcf, 0x6a, 0x71, 0x16, 0x92, 0xba, 0xd1, 0xd0, - 0x0d, 0x56, 0xfe, 0x94, 0xc4, 0x9f, 0xd0, 0x0c, 0x8c, 0x6f, 0x37, 0x74, 0x43, 0xa3, 0xdd, 0x3f, - 0x25, 0xb1, 0x07, 0xae, 0x7e, 0x09, 0x32, 0xb4, 0xec, 0x11, 0x6a, 0xbf, 0xf8, 0xcd, 0x18, 0x9c, - 0x29, 0x99, 0x86, 0xa6, 0x93, 0x71, 0xa8, 0x34, 0x3e, 0x15, 0xba, 0x79, 0x19, 0xd2, 0xf8, 0xb0, - 0x35, 0x62, 0xf3, 0xa6, 0xf0, 0x61, 0x8b, 0xfe, 0x0b, 0x57, 0x1d, 0xfa, 0x2c, 0x9c, 0x53, 0x1a, - 0x0d, 0xf3, 0x40, 0xd6, 0x77, 0x64, 0xcd, 0xc4, 0xb6, 0x6c, 0x98, 0x8e, 0x8c, 0x0f, 0x75, 0xdb, - 0xa1, 0xa6, 0x22, 0x25, 0x4d, 0xd3, 0xe4, 0xea, 0xce, 0x8a, 0x89, 0xed, 0x75, 0xd3, 0x29, 0x93, - 0x24, 0xae, 0xf0, 0x77, 0xe1, 0x6c, 0xb7, 0x6e, 0xa2, 0xd4, 0xfd, 0xdf, 0x09, 0x90, 0xaf, 0x1a, - 0xba, 0xf3, 0xa9, 0x50, 0xba, 0xa7, 0xbd, 0x78, 0x50, 0x7b, 0xd7, 0x41, 0xdc, 0x51, 0xf4, 0xc6, - 0x86, 0x51, 0x37, 0x9b, 0xdb, 0xb6, 0x63, 0x1a, 0xd8, 0xe6, 0xea, 0xed, 0xa1, 0x73, 0x9d, 0x3d, - 0x80, 0x49, 0xaf, 0x4e, 0x51, 0x2a, 0xeb, 0x09, 0x88, 0x55, 0x43, 0xb5, 0x70, 0x13, 0x1b, 0x91, - 0x6a, 0xeb, 0x59, 0x48, 0xeb, 0xae, 0x5c, 0xaa, 0xb1, 0xb8, 0xe4, 0x13, 0x78, 0x9d, 0xda, 0x30, - 0x15, 0x78, 0x77, 0x94, 0xc6, 0xef, 0x19, 0x48, 0x1b, 0xf8, 0x40, 0xf6, 0xdb, 0x2b, 0x2e, 0xa5, - 0x0c, 0x7c, 0xc0, 0x8c, 0xd5, 0x43, 0xc8, 0xad, 0xe0, 0x06, 0x76, 0x70, 0xf4, 0x96, 0x7c, 0x0b, - 0xf2, 0xae, 0xe8, 0x28, 0x1b, 0xe9, 0x77, 0x05, 0x40, 0x5c, 0x2e, 0x99, 0x3d, 0xa3, 0x6c, 0xa7, - 0x79, 0xe2, 0x1d, 0x38, 0x6d, 0xcb, 0x60, 0xd3, 0x3c, 0xeb, 0xa5, 0xc0, 0x48, 0x74, 0xa6, 0xf7, - 0x2d, 0x6a, 0x22, 0x68, 0x51, 0x3d, 0x6f, 0x85, 0xf8, 0x29, 0x07, 0x30, 0xdd, 0x51, 0xbc, 0x68, - 0x9b, 0x32, 0x41, 0x4b, 0x16, 0x5b, 0x88, 0x07, 0x3d, 0x33, 0x4a, 0x2c, 0xbe, 0x0b, 0x53, 0xa5, - 0x06, 0x56, 0xac, 0xa8, 0xd5, 0xc2, 0x9b, 0xf3, 0x21, 0xa0, 0xa0, 0xf8, 0x28, 0x9b, 0xf4, 0xf7, - 0x04, 0x40, 0x12, 0xde, 0xc7, 0x96, 0x13, 0x79, 0x93, 0xae, 0x40, 0xc6, 0x51, 0xac, 0x5d, 0xec, - 0xc8, 0xc4, 0x9d, 0xe7, 0xe6, 0xea, 0xb9, 0x80, 0x20, 0xe2, 0xd4, 0x2f, 0xee, 0x35, 0xd4, 0xc5, - 0xba, 0xeb, 0xee, 0xbb, 0xce, 0x19, 0xe3, 0x23, 0x64, 0xae, 0x81, 0x77, 0x60, 0xba, 0xa3, 0x94, - 0x51, 0xaa, 0x40, 0x87, 0x4c, 0x4d, 0x55, 0x8c, 0x8d, 0x16, 0x99, 0x07, 0x6c, 0x74, 0x1b, 0xce, - 0xda, 0x8e, 0xd9, 0x92, 0x15, 0x47, 0x66, 0xae, 0xe5, 0xb6, 0xd9, 0x36, 0x34, 0xc5, 0x3a, 0xa2, - 0xef, 0x48, 0x49, 0xd3, 0x24, 0x75, 0x89, 0x15, 0x64, 0x99, 0x27, 0x91, 0xee, 0xdb, 0xd4, 0x0d, - 0x99, 0x78, 0x80, 0x0d, 0xc7, 0xe6, 0x43, 0x1d, 0x9a, 0xba, 0x21, 0x31, 0x0a, 0xaf, 0xc6, 0x77, - 0x05, 0xf6, 0xae, 0x28, 0xd5, 0xfc, 0x26, 0x64, 0x6c, 0x55, 0x31, 0xe4, 0x1d, 0xd3, 0x6a, 0x2a, - 0x0e, 0x1d, 0x1d, 0xf9, 0x0e, 0x35, 0x7b, 0x7e, 0xb5, 0xaa, 0x18, 0x77, 0x68, 0x26, 0x09, 0x6c, - 0xef, 0x7f, 0x70, 0x00, 0xdd, 0x4b, 0xa4, 0xe2, 0x62, 0xa2, 0xf8, 0x4b, 0x01, 0xb2, 0xac, 0x94, - 0x51, 0x0e, 0xa0, 0x97, 0x21, 0x61, 0x99, 0x07, 0x6c, 0x00, 0x65, 0x6e, 0x3d, 0x13, 0x22, 0x62, - 0x15, 0x1f, 0x05, 0x67, 0x2e, 0x9a, 0x1d, 0x2d, 0x03, 0xf7, 0xf0, 0x64, 0xca, 0x1d, 0x1f, 0x95, - 0x1b, 0x18, 0x97, 0x44, 0x64, 0x5c, 0x85, 0xc9, 0x6d, 0xc5, 0x51, 0xf7, 0x48, 0xfb, 0xd0, 0x42, - 0x92, 0x59, 0x2e, 0x7e, 0x2d, 0x2b, 0xe5, 0x29, 0xd9, 0x2d, 0xba, 0x5d, 0xfc, 0x23, 0x77, 0x34, - 0xd8, 0xf8, 0xd3, 0xdf, 0x4c, 0xff, 0x21, 0xf0, 0x41, 0xe1, 0x16, 0xf6, 0x7f, 0x5a, 0x6b, 0x7d, - 0x27, 0x06, 0xe7, 0x4a, 0x7b, 0x58, 0x7d, 0x54, 0x32, 0x0d, 0x5b, 0xb7, 0x1d, 0x6c, 0xa8, 0x47, - 0x51, 0x36, 0xd9, 0x33, 0x90, 0x3e, 0xd0, 0x9d, 0x3d, 0x59, 0xd3, 0x77, 0x76, 0xe8, 0x90, 0x4e, - 0x49, 0x29, 0x42, 0x58, 0xd1, 0x77, 0x76, 0xd0, 0x6d, 0x48, 0x34, 0x4d, 0x8d, 0x39, 0xb0, 0xf9, - 0x5b, 0xf3, 0x21, 0xe2, 0x69, 0xd1, 0xec, 0x76, 0x73, 0xcd, 0xd4, 0xb0, 0x44, 0x33, 0xa3, 0x39, - 0x00, 0x95, 0x50, 0x5b, 0xa6, 0x6e, 0x38, 0x7c, 0x22, 0x0b, 0x50, 0x50, 0x05, 0xd2, 0x0e, 0xb6, - 0x9a, 0xba, 0xa1, 0x38, 0x04, 0xe0, 0x13, 0xe5, 0x5d, 0x0a, 0x2d, 0x78, 0xab, 0xa1, 0xab, 0x4a, - 0xcf, 0x4a, 0x85, 0xcf, 0xcc, 0xed, 0xcd, 0x7b, 0x09, 0x28, 0xf4, 0x6a, 0x28, 0xca, 0x7e, 0xb2, - 0x09, 0x49, 0x66, 0xf4, 0x78, 0x4f, 0xb9, 0xd5, 0x4f, 0x11, 0x21, 0x25, 0x58, 0x64, 0xc6, 0x91, - 0x17, 0x9e, 0xcb, 0x99, 0xfd, 0x2b, 0x01, 0x92, 0x2c, 0x01, 0xdd, 0x84, 0x14, 0x47, 0xf7, 0x1a, - 0x2d, 0x63, 0x7c, 0xf9, 0xec, 0xd3, 0xe3, 0xf9, 0x09, 0x86, 0xe5, 0x57, 0x3e, 0xf2, 0xff, 0x4a, - 0x13, 0x0c, 0xce, 0x6b, 0xa4, 0xcd, 0x6c, 0x47, 0xb1, 0x1c, 0xba, 0x8a, 0x42, 0xda, 0x2c, 0x2b, - 0xa5, 0x28, 0x61, 0x15, 0x1f, 0xa1, 0x7b, 0x90, 0xb4, 0x1d, 0xc5, 0x69, 0xdb, 0xbc, 0xd5, 0x4e, - 0x54, 0xd8, 0x1a, 0xe5, 0x94, 0xb8, 0x04, 0xe2, 0x8f, 0x68, 0xd8, 0x51, 0xf4, 0x06, 0x6d, 0xc6, - 0xb4, 0xc4, 0x9f, 0x8a, 0xdf, 0x12, 0x20, 0xc9, 0xb2, 0xa2, 0x73, 0x30, 0xcd, 0x10, 0x7c, 0x75, - 0x7d, 0xa5, 0x5c, 0x2f, 0x4b, 0x6b, 0xd5, 0xf5, 0xa5, 0x7a, 0x59, 0x1c, 0x43, 0x67, 0x01, 0xb9, - 0x09, 0xa5, 0x8d, 0xf5, 0x5a, 0xb5, 0x56, 0x2f, 0xaf, 0x13, 0xe4, 0x3f, 0x03, 0x22, 0xa3, 0x07, - 0xa8, 0x31, 0x74, 0x09, 0x16, 0xba, 0xa9, 0x72, 0xad, 0xbe, 0x54, 0xaf, 0xc9, 0xe5, 0x5a, 0xbd, - 0xba, 0xb6, 0x54, 0x2f, 0xaf, 0x88, 0xf1, 0x01, 0xb9, 0xc8, 0x4b, 0x24, 0xa9, 0x5c, 0xaa, 0x8b, - 0x89, 0xe2, 0x13, 0x38, 0x23, 0x61, 0xd5, 0x6c, 0xb6, 0xda, 0x0e, 0x26, 0xa5, 0xb4, 0xa3, 0x1c, - 0x2f, 0xe7, 0x60, 0x42, 0xb3, 0x8e, 0x64, 0xab, 0x6d, 0xf0, 0xd1, 0x92, 0xd4, 0xac, 0x23, 0xa9, - 0x6d, 0xf0, 0xce, 0xf8, 0xe7, 0x02, 0x9c, 0xed, 0x7e, 0x79, 0x94, 0x5d, 0xf1, 0x4b, 0x90, 0x51, - 0x34, 0x0d, 0x6b, 0xb2, 0x86, 0x1b, 0x8e, 0xc2, 0xfd, 0x8d, 0x9b, 0x01, 0x49, 0x7c, 0x05, 0x6c, - 0x91, 0x2d, 0x7d, 0x2d, 0x7a, 0x2b, 0x60, 0x6b, 0x0f, 0x4a, 0x25, 0x5a, 0x9e, 0x15, 0xc2, 0xe8, - 0x5a, 0x24, 0x2a, 0x8b, 0x52, 0x8a, 0xdf, 0x4e, 0x40, 0xae, 0x6c, 0x68, 0xf5, 0xc3, 0x48, 0x67, - 0x84, 0xb3, 0x90, 0x54, 0xcd, 0x66, 0x53, 0x77, 0x5c, 0x6d, 0xb1, 0x27, 0xf4, 0x39, 0x48, 0x69, - 0x58, 0xd1, 0xbc, 0xd5, 0x83, 0x61, 0x4e, 0x93, 0xe4, 0x65, 0x47, 0x5f, 0x81, 0x73, 0xc4, 0x90, - 0x5a, 0x86, 0xd2, 0x90, 0x99, 0x34, 0xd9, 0xb1, 0xf4, 0xdd, 0x5d, 0x6c, 0xf1, 0xf5, 0xb6, 0x6b, - 0x21, 0xe5, 0xac, 0x72, 0x8e, 0x12, 0x65, 0xa8, 0xb3, 0xfc, 0xd2, 0x19, 0x3d, 0x8c, 0x8c, 0xbe, - 0xe8, 0x2d, 0xcf, 0xd8, 0x2d, 0xc5, 0xb0, 0xb9, 0x91, 0xea, 0xb7, 0x8c, 0xc7, 0x75, 0xc9, 0xe7, - 0x04, 0x42, 0xb1, 0xd1, 0x0d, 0xe2, 0xe9, 0x3f, 0x6e, 0xeb, 0x16, 0x96, 0x6f, 0xb6, 0xd4, 0x42, - 0x92, 0xd4, 0x7d, 0x39, 0xff, 0xf4, 0x78, 0x1e, 0x24, 0x46, 0xbe, 0xb9, 0x59, 0x22, 0x9e, 0x3f, - 0xfb, 0xdf, 0x52, 0xd1, 0x35, 0x10, 0x0d, 0x53, 0xb6, 0xf0, 0x8e, 0x85, 0xed, 0x3d, 0xfe, 0xda, - 0x14, 0xd5, 0x58, 0xde, 0x30, 0x25, 0x46, 0x66, 0xa2, 0xcf, 0x42, 0xb2, 0x65, 0xea, 0xb6, 0x69, - 0x14, 0xd2, 0x4c, 0xa3, 0xec, 0x09, 0xbd, 0x05, 0xa2, 0x6e, 0xc8, 0x3b, 0x0d, 0x7d, 0x77, 0xcf, - 0x91, 0x0f, 0x2c, 0xdd, 0xc1, 0x76, 0x61, 0x8a, 0x16, 0x3c, 0xac, 0xa3, 0xd5, 0xf8, 0x42, 0xa8, - 0xf6, 0x36, 0xc9, 0xc9, 0xab, 0x90, 0xd7, 0x8d, 0x3b, 0x94, 0x9f, 0x12, 0x6d, 0x6f, 0x3a, 0x9e, - 0x10, 0x53, 0xc5, 0x7f, 0x16, 0x20, 0xef, 0x76, 0x8f, 0x28, 0x3b, 0xf4, 0x35, 0x10, 0x4d, 0x03, - 0xcb, 0xad, 0x3d, 0xc5, 0xc6, 0xbc, 0x39, 0xf9, 0x9c, 0x91, 0x37, 0x0d, 0xbc, 0x49, 0xc8, 0xac, - 0x71, 0xd0, 0x26, 0x4c, 0xd9, 0x8e, 0xb2, 0xab, 0x1b, 0xbb, 0xb2, 0xb7, 0x74, 0x4e, 0xd7, 0x3f, - 0x46, 0x74, 0xb8, 0x45, 0xce, 0xed, 0xd1, 0x3b, 0x1c, 0x8d, 0x1f, 0x0b, 0x30, 0xb5, 0xa4, 0x35, - 0x75, 0xa3, 0xd6, 0x6a, 0xe8, 0x91, 0xa2, 0xf3, 0x4b, 0x90, 0xb6, 0x89, 0x4c, 0xdf, 0x5a, 0xfb, - 0xc8, 0x2a, 0x45, 0x53, 0x88, 0xd9, 0xbe, 0x0f, 0x93, 0xf8, 0xb0, 0xa5, 0x5b, 0x0a, 0x71, 0xd0, - 0x19, 0x98, 0x48, 0x8c, 0x5e, 0xb7, 0xbc, 0xcf, 0xeb, 0x03, 0x0a, 0x5e, 0xb3, 0x87, 0x80, 0x82, - 0x15, 0x8b, 0x12, 0x55, 0xc8, 0x30, 0x4d, 0x45, 0x6f, 0x19, 0x76, 0xc4, 0x5a, 0xe3, 0xe6, 0xf4, - 0xcb, 0x30, 0xd3, 0xf9, 0x82, 0x28, 0x4b, 0xff, 0x2e, 0x6f, 0xf1, 0x35, 0x6c, 0x7d, 0x42, 0x80, - 0x36, 0x28, 0x3e, 0xca, 0x92, 0x7f, 0x5d, 0x80, 0xf3, 0x54, 0x36, 0xdd, 0x80, 0xd8, 0xc1, 0x16, - 0xdd, 0x95, 0x89, 0xb2, 0xd3, 0x5e, 0x84, 0x24, 0xc3, 0xa7, 0xb4, 0xc7, 0x8e, 0x2f, 0x67, 0x88, - 0x23, 0x52, 0x73, 0x4c, 0x8b, 0x38, 0x22, 0x3c, 0x89, 0xd7, 0x53, 0x81, 0xd9, 0xb0, 0xb2, 0x44, - 0x0c, 0xe0, 0xa7, 0xb8, 0x3f, 0x48, 0xba, 0x78, 0x69, 0x8f, 0x38, 0x42, 0xa8, 0x0c, 0x19, 0x95, - 0xfe, 0x93, 0x9d, 0xa3, 0x16, 0xa6, 0xf2, 0xf3, 0x83, 0x5c, 0x49, 0xc6, 0x56, 0x3f, 0x6a, 0x61, - 0xe2, 0x8f, 0xba, 0xff, 0x89, 0xba, 0x02, 0x55, 0x1d, 0xe8, 0x8c, 0xd2, 0xf1, 0x45, 0xf3, 0xba, - 0xfe, 0x5c, 0x87, 0x26, 0xfe, 0x22, 0xce, 0x55, 0xc1, 0xde, 0xc4, 0x99, 0x22, 0x75, 0x3f, 0xde, - 0x81, 0xb3, 0x1a, 0x6e, 0x59, 0x58, 0x55, 0x1c, 0xac, 0xc9, 0xc1, 0xea, 0xc7, 0x4e, 0x50, 0xfd, - 0x19, 0x5f, 0x86, 0x4f, 0x45, 0x0f, 0x01, 0x05, 0x64, 0xb3, 0x9a, 0xb9, 0xf0, 0xe6, 0x24, 0x4a, - 0x99, 0xf2, 0xa5, 0x30, 0xba, 0x8d, 0x4a, 0x90, 0xc2, 0x87, 0x2d, 0x99, 0x6e, 0x4d, 0x26, 0x4e, - 0xb8, 0x35, 0x39, 0x81, 0x0f, 0x5b, 0x84, 0x88, 0xb6, 0xc8, 0x0c, 0xe7, 0x4e, 0xfc, 0xb4, 0xd8, - 0xf6, 0x70, 0xfc, 0xe0, 0xf7, 0x17, 0x2e, 0x6e, 0xd2, 0x9b, 0xf3, 0x99, 0x08, 0xde, 0x76, 0xef, - 0x0b, 0xf0, 0x4c, 0x68, 0xdb, 0x45, 0x39, 0xd9, 0xb9, 0xbb, 0xb3, 0xb1, 0xd3, 0xec, 0xce, 0x16, - 0xff, 0xd8, 0x1d, 0xf5, 0x12, 0x6e, 0x98, 0x44, 0xbd, 0x9f, 0xc0, 0x6a, 0xd6, 0x84, 0xdb, 0xec, - 0xb1, 0x13, 0x37, 0xbb, 0xcb, 0xda, 0x65, 0x16, 0xba, 0x0a, 0x1b, 0xa5, 0x59, 0xf8, 0x6d, 0x01, - 0xa6, 0x2b, 0x58, 0xb1, 0x9c, 0x6d, 0xac, 0x38, 0x11, 0x3b, 0xae, 0x2f, 0x43, 0xdc, 0x30, 0x0f, - 0x4e, 0xb2, 0xa0, 0x47, 0xf2, 0xfb, 0xd3, 0x56, 0x67, 0xb9, 0xa2, 0xac, 0xf5, 0xdf, 0xc6, 0x20, - 0x7d, 0xb7, 0x14, 0x65, 0x5d, 0xdf, 0xe0, 0xcb, 0xbe, 0x6c, 0xa8, 0x87, 0x75, 0x4b, 0xef, 0x7d, - 0x8b, 0x77, 0x4b, 0xab, 0xf8, 0xc8, 0xed, 0x96, 0x84, 0x0b, 0x2d, 0x41, 0xda, 0xd9, 0x23, 0xfe, - 0xa9, 0xd9, 0xd0, 0x4e, 0xe2, 0xb3, 0xf8, 0x5c, 0xb3, 0x8f, 0x60, 0x9c, 0xca, 0x75, 0x03, 0x07, - 0x84, 0x90, 0xc0, 0x01, 0xf2, 0x1a, 0xcf, 0xed, 0x8b, 0x9d, 0xe4, 0x35, 0x2e, 0x81, 0x35, 0x8e, - 0xe7, 0x1b, 0x8d, 0x8b, 0xc9, 0xe2, 0x5b, 0x00, 0xa4, 0x6a, 0x51, 0x36, 0xcf, 0x6f, 0xc6, 0x21, - 0xbf, 0xd9, 0xb6, 0xf7, 0x22, 0xee, 0x8f, 0x25, 0x80, 0x56, 0xdb, 0xde, 0xc3, 0x96, 0xec, 0x1c, - 0x1a, 0xbc, 0xfe, 0x43, 0x42, 0x12, 0x5c, 0x05, 0x30, 0xbe, 0xfa, 0xa1, 0x81, 0x36, 0xb8, 0x10, - 0x2c, 0xfb, 0x71, 0x0d, 0xd7, 0x47, 0x00, 0x8f, 0xf5, 0x43, 0x63, 0x0d, 0x7b, 0xa8, 0x91, 0x09, - 0xc4, 0x44, 0xe0, 0x1b, 0x30, 0x41, 0x1e, 0x64, 0xc7, 0x3c, 0x49, 0xcb, 0x27, 0x09, 0x4f, 0xdd, - 0x44, 0xaf, 0x43, 0x9a, 0x71, 0x93, 0xf9, 0x2b, 0x49, 0xe7, 0xaf, 0xb0, 0x2a, 0x71, 0x6d, 0xd2, - 0x99, 0x2b, 0x45, 0x59, 0xc9, 0x6c, 0x35, 0x03, 0xe3, 0x3b, 0xa6, 0xa5, 0x62, 0x1a, 0xc8, 0x90, - 0x92, 0xd8, 0x43, 0xb0, 0x71, 0xef, 0x25, 0x52, 0x29, 0x31, 0x7d, 0x2f, 0x91, 0x4a, 0x8b, 0x50, - 0xfc, 0x96, 0x00, 0x93, 0x5e, 0xab, 0x44, 0x69, 0xd2, 0x4b, 0x1d, 0x2a, 0x3d, 0x79, 0xbb, 0x10, - 0x35, 0x16, 0xff, 0x9e, 0xfa, 0x37, 0xaa, 0xb9, 0x4f, 0x9b, 0x29, 0xca, 0x6e, 0xb3, 0xcc, 0x42, - 0x58, 0x62, 0xa7, 0x6c, 0x6a, 0x1a, 0xd4, 0x72, 0x13, 0x66, 0xf4, 0x26, 0xb1, 0xf9, 0xba, 0xd3, - 0x38, 0xe2, 0x18, 0xcd, 0xc1, 0xee, 0x2e, 0xeb, 0xb4, 0x9f, 0x56, 0x72, 0x93, 0xb8, 0x19, 0x64, - 0xfb, 0x2e, 0x7e, 0xb5, 0xa2, 0xd4, 0x7b, 0x15, 0x72, 0x16, 0x13, 0x4d, 0x7c, 0x95, 0x13, 0xaa, - 0x3e, 0xeb, 0xb1, 0x12, 0xed, 0x7f, 0x3f, 0x06, 0x93, 0x6f, 0xb5, 0xb1, 0x75, 0xf4, 0x29, 0xd4, - 0xfd, 0x15, 0x98, 0x3c, 0x50, 0x74, 0x47, 0xde, 0x31, 0x2d, 0xb9, 0xdd, 0xd2, 0x14, 0xc7, 0x0d, - 0xb6, 0xc8, 0x11, 0xf2, 0x1d, 0xd3, 0xda, 0xa2, 0x44, 0x84, 0x01, 0x3d, 0x32, 0xcc, 0x03, 0x43, - 0x26, 0x64, 0x0a, 0x91, 0x0f, 0x0d, 0xbe, 0xa4, 0xbc, 0xfc, 0xca, 0x3f, 0x1d, 0xcf, 0xdf, 0x1e, - 0x29, 0x7c, 0x8a, 0x46, 0xa0, 0xb5, 0xdb, 0xba, 0xb6, 0xb8, 0xb5, 0x55, 0x5d, 0x91, 0x44, 0x2a, - 0xf2, 0x6d, 0x26, 0xb1, 0x7e, 0x68, 0xb8, 0x53, 0xfb, 0x47, 0x02, 0x88, 0xbe, 0xc2, 0xa2, 0x6c, - 0xd5, 0x32, 0x64, 0x1e, 0xb7, 0xb1, 0xa5, 0x9f, 0xa2, 0x4d, 0x81, 0x33, 0x12, 0xb3, 0xf4, 0x0e, - 0x64, 0x3b, 0xf4, 0x10, 0xff, 0x78, 0x7a, 0xc8, 0x1c, 0xf8, 0x2a, 0x28, 0xfe, 0x48, 0x00, 0x44, - 0x2b, 0x5f, 0x65, 0xab, 0xf9, 0x9f, 0xb2, 0x0e, 0x73, 0x0d, 0x44, 0x1a, 0xd0, 0x28, 0xeb, 0x3b, - 0x72, 0x53, 0xb7, 0x6d, 0xdd, 0xd8, 0xe5, 0x3d, 0x26, 0x4f, 0xe9, 0xd5, 0x9d, 0x35, 0x46, 0xe5, - 0x6d, 0xf9, 0x7f, 0x61, 0xba, 0xa3, 0x36, 0x51, 0xb6, 0xe6, 0x05, 0xc8, 0xee, 0x98, 0x6d, 0x43, - 0x93, 0xd9, 0xd2, 0x18, 0x5f, 0x02, 0xcc, 0x50, 0x1a, 0x7b, 0x5f, 0xf1, 0x6b, 0x31, 0x98, 0x91, - 0xb0, 0x6d, 0x36, 0xf6, 0x71, 0xf4, 0xfa, 0xdc, 0x00, 0xbe, 0xe5, 0x22, 0x7f, 0x1c, 0xb5, 0xa6, - 0x99, 0x0c, 0x36, 0xdd, 0x75, 0xae, 0xad, 0x5f, 0x1a, 0xdc, 0x33, 0x7b, 0x57, 0xd3, 0xf9, 0xca, - 0x5d, 0x22, 0xb8, 0x72, 0xc7, 0x1b, 0xe2, 0x7f, 0xc3, 0x99, 0x2e, 0x45, 0x44, 0xe9, 0x95, 0xfc, - 0x63, 0x0c, 0xce, 0x77, 0x8a, 0x8f, 0x1a, 0x3b, 0xfc, 0xf7, 0x50, 0x36, 0xaa, 0x40, 0xae, 0xa9, - 0x1b, 0xa7, 0x5b, 0x41, 0xcc, 0x36, 0x75, 0xa3, 0xde, 0xe9, 0x4d, 0x12, 0x98, 0x13, 0xa6, 0xd7, - 0x28, 0xdb, 0xee, 0x3d, 0x01, 0xb2, 0x51, 0xaf, 0x51, 0x9d, 0x2e, 0xc2, 0x8a, 0xd7, 0xb9, 0x0e, - 0xb9, 0x4f, 0x60, 0x51, 0xeb, 0x0f, 0x04, 0x40, 0x75, 0xab, 0x6d, 0x10, 0xb0, 0x78, 0xdf, 0xdc, - 0x8d, 0xb2, 0xb2, 0x33, 0x30, 0xae, 0x1b, 0x1a, 0x3e, 0xa4, 0x95, 0x4d, 0x48, 0xec, 0xa1, 0x63, - 0xe7, 0x2d, 0x3e, 0xd2, 0xce, 0x9b, 0x1f, 0xa8, 0xd1, 0x51, 0xd0, 0x28, 0xb5, 0xf0, 0xfd, 0x18, - 0x4c, 0xf3, 0xea, 0x44, 0xbe, 0xa8, 0x77, 0xaa, 0xf0, 0x6e, 0xf4, 0x79, 0x80, 0x96, 0x85, 0xf7, - 0x65, 0xc6, 0x1a, 0x1f, 0x89, 0x35, 0x4d, 0x38, 0x28, 0x01, 0x7d, 0x09, 0x26, 0xc9, 0x80, 0x6b, - 0x59, 0x66, 0xcb, 0xb4, 0xc9, 0xbc, 0x6e, 0x8f, 0x06, 0x15, 0xa6, 0x9e, 0x1e, 0xcf, 0xe7, 0xd6, - 0x74, 0x63, 0x93, 0x33, 0xd6, 0x6b, 0x12, 0x19, 0xb9, 0xde, 0xa3, 0xeb, 0x8c, 0xfc, 0x83, 0x00, - 0x33, 0x9f, 0xd8, 0x32, 0xe8, 0x7f, 0x85, 0xc6, 0xbc, 0xf9, 0x40, 0xa4, 0x8f, 0x55, 0x63, 0xc7, - 0x8c, 0x7e, 0x71, 0xfa, 0x3d, 0x01, 0xa6, 0x02, 0xe2, 0xa3, 0x9c, 0xf5, 0x4f, 0x77, 0x88, 0xe0, - 0xcb, 0xc4, 0x0f, 0x08, 0x76, 0xfb, 0x28, 0x07, 0xd5, 0x5f, 0xc7, 0xe0, 0x6c, 0x89, 0xed, 0xc9, - 0xba, 0x01, 0x0b, 0x51, 0xf6, 0x92, 0x02, 0x4c, 0xec, 0x63, 0xcb, 0xd6, 0x4d, 0x36, 0xef, 0xe5, - 0x24, 0xf7, 0x11, 0xcd, 0x42, 0xca, 0x36, 0x94, 0x96, 0xbd, 0x67, 0xba, 0xbb, 0x5a, 0xde, 0xb3, - 0x17, 0x5c, 0x31, 0x7e, 0xfa, 0xe0, 0x8a, 0xe4, 0xe0, 0xe0, 0x8a, 0x89, 0x8f, 0x1d, 0x5c, 0xc1, - 0xb7, 0x90, 0x7e, 0x28, 0xc0, 0xb9, 0x1e, 0xfd, 0x45, 0xd9, 0x67, 0xbe, 0x0a, 0x19, 0x95, 0x0b, - 0x26, 0xd6, 0x98, 0xed, 0x92, 0x55, 0x49, 0xb6, 0x53, 0xfa, 0xec, 0x4f, 0x8f, 0xe7, 0xc1, 0x2d, - 0x6a, 0x75, 0x85, 0xab, 0x88, 0xfc, 0xd7, 0x8a, 0xbf, 0x9e, 0x81, 0xc9, 0xf2, 0x21, 0x5b, 0x03, - 0xae, 0x31, 0xa7, 0x04, 0xdd, 0x81, 0x54, 0xcb, 0x32, 0xf7, 0x75, 0xb7, 0x1a, 0xf9, 0x0e, 0xd7, - 0xc5, 0xad, 0x46, 0x17, 0xd7, 0x26, 0xe7, 0x90, 0x3c, 0x5e, 0x54, 0x87, 0xf4, 0x7d, 0x53, 0x55, - 0x1a, 0x77, 0xf4, 0x86, 0xdb, 0xff, 0x5f, 0x1a, 0x2e, 0x68, 0xd1, 0xe3, 0xd9, 0x54, 0x9c, 0x3d, - 0xb7, 0x29, 0x3c, 0x22, 0xaa, 0x42, 0xaa, 0xe2, 0x38, 0x2d, 0x92, 0xc8, 0xad, 0xc9, 0xd5, 0x11, - 0x84, 0x12, 0x16, 0x2e, 0xcb, 0x63, 0x47, 0x75, 0x98, 0xba, 0x6b, 0x9a, 0xbb, 0x0d, 0x5c, 0x6a, - 0x98, 0x6d, 0xad, 0x64, 0x1a, 0x3b, 0xfa, 0x2e, 0xb7, 0xc7, 0x57, 0x46, 0x90, 0x79, 0xb7, 0x54, - 0x93, 0x7a, 0x05, 0xa0, 0x25, 0x48, 0xd5, 0x6e, 0x73, 0x61, 0xcc, 0x9f, 0xba, 0x3c, 0x82, 0xb0, - 0xda, 0x6d, 0xc9, 0x63, 0x43, 0xf7, 0x20, 0xb3, 0xf4, 0xa4, 0x6d, 0x61, 0x2e, 0x25, 0xd9, 0x77, - 0x27, 0xbf, 0x5b, 0x0a, 0xe5, 0x92, 0x82, 0xcc, 0xa8, 0x06, 0xf9, 0xb7, 0x4d, 0xeb, 0x51, 0xc3, - 0x54, 0xdc, 0x1a, 0x4e, 0x50, 0x71, 0x9f, 0x19, 0x41, 0x9c, 0xcb, 0x28, 0x75, 0x89, 0x98, 0xfd, - 0x12, 0xe4, 0x3a, 0x9a, 0x09, 0x21, 0x48, 0xb4, 0x48, 0x8b, 0x08, 0x34, 0x34, 0x86, 0xfe, 0x47, - 0x2f, 0xc2, 0x84, 0x61, 0x6a, 0xd8, 0xed, 0xc3, 0xb9, 0xe5, 0x99, 0xa7, 0xc7, 0xf3, 0xc9, 0x75, - 0x53, 0x63, 0x0e, 0x05, 0xff, 0x27, 0x25, 0x49, 0x26, 0xd7, 0x9d, 0x98, 0xbd, 0x02, 0x09, 0xd2, - 0x3e, 0xc4, 0x8c, 0x6c, 0x2b, 0x36, 0xde, 0xb2, 0x74, 0x2e, 0xd3, 0x7d, 0xe4, 0xf9, 0x7e, 0x22, - 0x40, 0xac, 0x76, 0x9b, 0x78, 0xb6, 0xdb, 0x6d, 0xf5, 0x11, 0x76, 0x78, 0x2e, 0xfe, 0x44, 0x3d, - 0x5e, 0x0b, 0xef, 0xe8, 0xcc, 0xcb, 0x49, 0x4b, 0xfc, 0x09, 0x3d, 0x07, 0xa0, 0xa8, 0x2a, 0xb6, - 0x6d, 0xd9, 0x3d, 0x93, 0x95, 0x96, 0xd2, 0x8c, 0xb2, 0x8a, 0x8f, 0x08, 0x9b, 0x8d, 0x55, 0x0b, - 0x3b, 0x6e, 0x8c, 0x0f, 0x7b, 0x22, 0x6c, 0x0e, 0x6e, 0xb6, 0x64, 0xc7, 0x7c, 0x84, 0x0d, 0xda, - 0xaa, 0x69, 0x62, 0x1e, 0x9a, 0xad, 0x3a, 0x21, 0x10, 0xcb, 0x86, 0x0d, 0xcd, 0x37, 0x43, 0x69, - 0xc9, 0x7b, 0x26, 0x22, 0x2d, 0xbc, 0xab, 0xf3, 0x43, 0x46, 0x69, 0x89, 0x3f, 0x11, 0x8d, 0x29, - 0x6d, 0x67, 0x8f, 0x06, 0x36, 0xa4, 0x25, 0xfa, 0x9f, 0x57, 0xed, 0x9b, 0x02, 0xc4, 0xef, 0x96, - 0x6a, 0x27, 0xae, 0x9b, 0x2b, 0x31, 0xee, 0x4b, 0xa4, 0xa1, 0x75, 0x7a, 0xa3, 0x41, 0xc0, 0x7f, - 0xcb, 0x32, 0xbf, 0x8a, 0x55, 0xb7, 0x66, 0x79, 0x4e, 0xde, 0x64, 0x54, 0xb4, 0x00, 0x19, 0xd5, - 0xc2, 0x1a, 0x36, 0x1c, 0x5d, 0x69, 0xd8, 0xbc, 0x8a, 0x41, 0x12, 0x2f, 0xdc, 0xd7, 0x04, 0x18, - 0xa7, 0xdd, 0x0b, 0x3d, 0x0b, 0x69, 0xd5, 0x34, 0x1c, 0x45, 0x37, 0xb8, 0x9d, 0x48, 0x4b, 0x3e, - 0xa1, 0x6f, 0x21, 0x2f, 0x40, 0x56, 0x51, 0x55, 0xb3, 0x6d, 0x38, 0xb2, 0xa1, 0x34, 0x31, 0x2f, - 0x6c, 0x86, 0xd3, 0xd6, 0x95, 0x26, 0x46, 0xf3, 0xe0, 0x3e, 0x7a, 0x27, 0xe3, 0xd2, 0x12, 0x70, - 0xd2, 0x2a, 0x3e, 0xe2, 0x25, 0xf9, 0xa1, 0x00, 0x29, 0xb7, 0x5b, 0x92, 0xc2, 0xec, 0x62, 0x03, - 0x5b, 0x8a, 0x63, 0x7a, 0x85, 0xf1, 0x08, 0xdd, 0x73, 0x52, 0xda, 0x9f, 0x93, 0x66, 0x60, 0xdc, - 0x51, 0xb6, 0x1b, 0x6e, 0x39, 0xd8, 0x03, 0x5d, 0x4e, 0x6d, 0x28, 0xbb, 0x6c, 0xcd, 0x28, 0x2d, - 0xb1, 0x07, 0x52, 0x25, 0x1e, 0xcb, 0xc9, 0xb4, 0xc3, 0x9f, 0x48, 0x79, 0x59, 0xf8, 0xe2, 0x36, - 0xde, 0xd5, 0x0d, 0xda, 0x01, 0xe2, 0x12, 0x50, 0xd2, 0x32, 0xa1, 0xa0, 0x67, 0x20, 0xcd, 0x32, - 0x60, 0x43, 0xa3, 0xbd, 0x20, 0x2e, 0xa5, 0x28, 0xa1, 0xec, 0x1e, 0x05, 0xe2, 0x8e, 0xc8, 0xf7, - 0x04, 0x98, 0x62, 0x31, 0x28, 0x2c, 0xee, 0x31, 0xba, 0x59, 0xf9, 0x35, 0x48, 0x6b, 0x8a, 0xa3, - 0xb0, 0x93, 0x78, 0xb1, 0x81, 0x27, 0xf1, 0x5c, 0x33, 0x49, 0xf2, 0xd3, 0xd3, 0x78, 0x08, 0x12, - 0xe4, 0x3f, 0x3b, 0xc1, 0x28, 0xd1, 0xff, 0xfe, 0xae, 0x7e, 0xb0, 0xb8, 0x51, 0x7a, 0x29, 0x1f, - 0x8e, 0x43, 0xae, 0x7c, 0xd8, 0x32, 0xad, 0x88, 0x17, 0x95, 0x26, 0x38, 0xf4, 0x1e, 0xb0, 0xed, - 0xd8, 0x65, 0x05, 0xdd, 0x1d, 0x3d, 0xce, 0x88, 0x96, 0x01, 0x58, 0xc0, 0x21, 0x8d, 0x4b, 0x89, - 0x9f, 0x60, 0xf3, 0x85, 0xb2, 0x11, 0x2a, 0x5a, 0x87, 0x4c, 0x73, 0x5f, 0x55, 0xe5, 0x1d, 0xbd, - 0xe1, 0xf0, 0x50, 0xad, 0xf0, 0xd8, 0xe0, 0xb5, 0x07, 0xa5, 0xd2, 0x1d, 0x9a, 0x89, 0x45, 0x4c, - 0xf9, 0xcf, 0x12, 0x10, 0x09, 0xec, 0x3f, 0x7a, 0x01, 0xf8, 0xc9, 0x09, 0xd9, 0x76, 0xcf, 0x41, - 0x2d, 0xe7, 0x9e, 0x1e, 0xcf, 0xa7, 0x25, 0x4a, 0xad, 0xd5, 0xea, 0x52, 0x9a, 0x65, 0xa8, 0xd9, - 0x0e, 0xba, 0x08, 0x39, 0xb3, 0xa9, 0x3b, 0xb2, 0xeb, 0x07, 0x70, 0xd7, 0x29, 0x4b, 0x88, 0xae, - 0x9f, 0x80, 0xea, 0x70, 0x15, 0x1b, 0x64, 0x34, 0xd0, 0x7a, 0xb2, 0x98, 0x78, 0x59, 0x77, 0xd8, - 0x88, 0x92, 0xcd, 0x96, 0xa3, 0x37, 0xf5, 0x27, 0x74, 0xe3, 0x93, 0x6f, 0x3a, 0x5c, 0x64, 0xd9, - 0x49, 0xfd, 0x68, 0x94, 0x7c, 0x95, 0xe7, 0xdd, 0x08, 0x64, 0x45, 0x5f, 0x13, 0x68, 0xb0, 0x3d, - 0x51, 0xa4, 0xbc, 0x7d, 0x24, 0x37, 0xc8, 0x24, 0xa2, 0x3b, 0x47, 0xf2, 0xa3, 0xfd, 0x42, 0x8a, - 0x3a, 0x68, 0x9f, 0x0b, 0x6d, 0x90, 0x40, 0x3f, 0x58, 0x74, 0x9b, 0xe5, 0xe8, 0x3e, 0x67, 0x5e, - 0xdd, 0x2f, 0x1b, 0x8e, 0x75, 0xb4, 0x7c, 0xee, 0xe9, 0xf1, 0xfc, 0x74, 0x6f, 0xea, 0x03, 0x1a, - 0xc0, 0xdf, 0xcd, 0x32, 0xfb, 0x55, 0x28, 0xf4, 0x93, 0x84, 0x44, 0x7f, 0xe7, 0x2d, 0xcd, 0x36, - 0xdc, 0x5e, 0xed, 0x5c, 0x21, 0x18, 0xa1, 0xdb, 0xb8, 0xab, 0x04, 0xb1, 0x57, 0xdd, 0xd1, 0xfd, - 0x0d, 0x01, 0x72, 0xcb, 0xed, 0xc6, 0xa3, 0x8d, 0x56, 0xad, 0xdd, 0x6c, 0x2a, 0xd6, 0x11, 0x31, - 0x0c, 0x6c, 0x54, 0xea, 0x4f, 0x58, 0xc8, 0x46, 0x9c, 0x0f, 0x3b, 0xfd, 0x09, 0x26, 0xc3, 0x8e, - 0x07, 0x64, 0x13, 0x3a, 0x8b, 0xb6, 0xbe, 0x08, 0x39, 0x0a, 0xd7, 0x65, 0x6c, 0x38, 0x96, 0x8e, - 0xd9, 0x6a, 0x50, 0x5c, 0xca, 0x52, 0x62, 0x99, 0xd1, 0xd0, 0x65, 0xc8, 0xdb, 0x47, 0xb6, 0x83, - 0x9b, 0x32, 0x3b, 0x37, 0xcd, 0x30, 0x66, 0x5c, 0xca, 0x31, 0xaa, 0xc4, 0x88, 0xc5, 0x9f, 0xc6, - 0x21, 0xef, 0x6a, 0x36, 0x4a, 0xf7, 0x75, 0x19, 0xc6, 0x77, 0xf4, 0x06, 0x76, 0x77, 0xcd, 0xaf, - 0x0c, 0x68, 0x50, 0x1e, 0x68, 0x4b, 0xbc, 0x08, 0x17, 0x00, 0x51, 0xd6, 0x28, 0xc6, 0xd8, 0xec, - 0xff, 0x8f, 0x41, 0x82, 0x7a, 0x8c, 0x37, 0x21, 0x41, 0xcd, 0x9e, 0x30, 0x8a, 0xd9, 0xa3, 0x59, - 0x3d, 0x77, 0x26, 0x16, 0x70, 0x67, 0x88, 0x6f, 0xb0, 0xa7, 0xbc, 0x7c, 0xf3, 0x16, 0x1d, 0x5f, - 0x59, 0x89, 0x3f, 0xa1, 0x65, 0x1a, 0xce, 0x61, 0x5a, 0x0e, 0xd6, 0xb8, 0xa7, 0x16, 0x66, 0x99, - 0x3a, 0x1a, 0xde, 0x35, 0xb1, 0x2e, 0x1f, 0x3a, 0x0f, 0x71, 0x32, 0x70, 0x27, 0xd8, 0x56, 0xef, - 0xd3, 0xe3, 0xf9, 0x38, 0x19, 0xb2, 0x84, 0x86, 0x6e, 0x40, 0xa6, 0x73, 0x94, 0x08, 0xd7, 0xd2, - 0xcc, 0x16, 0x04, 0x7a, 0x38, 0x34, 0xbc, 0x1e, 0xcc, 0x50, 0xca, 0xbd, 0x44, 0x2a, 0x21, 0x8e, - 0x17, 0xff, 0x2c, 0x01, 0xb9, 0x6a, 0x33, 0x6a, 0x2b, 0xba, 0xd4, 0xd9, 0xc2, 0x61, 0xee, 0x6d, - 0xc7, 0x4b, 0x43, 0x1a, 0xb8, 0x63, 0x3e, 0x8a, 0x9f, 0x6c, 0x3e, 0xaa, 0x12, 0x8f, 0x8a, 0x9f, - 0x0d, 0x8f, 0xf7, 0xf1, 0x64, 0x3b, 0xdf, 0x5f, 0x27, 0x86, 0x49, 0x22, 0x3c, 0x7e, 0xe8, 0x39, - 0xdd, 0xae, 0x7f, 0x93, 0x3a, 0x6e, 0xac, 0x97, 0x25, 0x47, 0xef, 0x65, 0x13, 0xd8, 0xd0, 0x68, - 0x1f, 0x7b, 0xc2, 0xbb, 0xd8, 0x6b, 0x10, 0xd7, 0x74, 0x6b, 0xc0, 0x45, 0x03, 0xe1, 0x73, 0x0a, - 0x61, 0x1a, 0xd2, 0xd7, 0x12, 0xc1, 0xbe, 0x16, 0xc4, 0xa1, 0xb3, 0x1b, 0x00, 0x7e, 0xbd, 0xd0, - 0x02, 0x24, 0xcd, 0x86, 0xe6, 0xc6, 0xcd, 0xe7, 0x96, 0xd3, 0x4f, 0x8f, 0xe7, 0xc7, 0x37, 0x1a, - 0x5a, 0x75, 0x45, 0x1a, 0x37, 0x1b, 0x5a, 0x55, 0xa3, 0x87, 0xea, 0xf1, 0x81, 0xec, 0xc5, 0xdc, - 0x64, 0xa5, 0x09, 0x03, 0x1f, 0x10, 0xd4, 0xdb, 0x15, 0x0b, 0x40, 0x3a, 0xce, 0x77, 0x04, 0xc8, - 0xbb, 0x3a, 0x8c, 0xd6, 0x38, 0xa4, 0xf4, 0x26, 0x1f, 0x2c, 0xf1, 0x93, 0x0d, 0x16, 0x97, 0x8f, - 0x1f, 0xfd, 0xfb, 0xba, 0xc0, 0xe3, 0x2d, 0x6b, 0xaa, 0xe2, 0x90, 0xf9, 0x30, 0xc2, 0x0e, 0xfe, - 0x3c, 0x88, 0x96, 0x62, 0x68, 0x66, 0x53, 0x7f, 0x82, 0xd9, 0xc2, 0x95, 0xcd, 0xf7, 0x6b, 0x26, - 0x3d, 0x3a, 0x5d, 0x99, 0x71, 0xd7, 0xdd, 0x7e, 0x21, 0xf0, 0xd8, 0x4c, 0xaf, 0x30, 0x51, 0x2a, - 0x6d, 0x15, 0x92, 0x16, 0x8b, 0xf0, 0x62, 0x03, 0xee, 0xc5, 0x10, 0x21, 0x61, 0x6f, 0x67, 0x01, - 0x54, 0x5e, 0x97, 0xa7, 0x22, 0x66, 0xbf, 0x08, 0xe3, 0x94, 0x7c, 0x0a, 0xb3, 0xc8, 0x35, 0xff, - 0xaf, 0x31, 0xb8, 0x44, 0x5f, 0xf7, 0x00, 0x5b, 0xfa, 0xce, 0xd1, 0xa6, 0x65, 0x3a, 0x58, 0x75, - 0xb0, 0xe6, 0xc7, 0xa7, 0x47, 0x6a, 0x6b, 0xd2, 0x2d, 0xf7, 0x05, 0x27, 0x8a, 0x74, 0xf1, 0xb8, - 0xd0, 0x2a, 0x4c, 0xb2, 0x89, 0x50, 0x56, 0x1a, 0xfa, 0x3e, 0x96, 0x15, 0xe7, 0x24, 0x33, 0x4a, - 0x8e, 0xf1, 0x2e, 0x11, 0xd6, 0x25, 0x07, 0x69, 0x90, 0xe6, 0xc2, 0x74, 0x8d, 0x5f, 0xda, 0x71, - 0xf7, 0xe3, 0x2d, 0xcd, 0xa4, 0xd8, 0x84, 0x5c, 0x5d, 0x91, 0x52, 0x4c, 0xb2, 0xb7, 0xb4, 0xfe, - 0x63, 0x01, 0x2e, 0x0f, 0x51, 0x74, 0x94, 0xdd, 0x6c, 0x16, 0x52, 0xfb, 0xe4, 0x45, 0x3a, 0xd7, - 0x74, 0x4a, 0xf2, 0x9e, 0xd1, 0x1a, 0xe4, 0x76, 0x14, 0xbd, 0x81, 0x35, 0x99, 0xf7, 0xc4, 0xfe, - 0xe1, 0x51, 0xe1, 0x51, 0x7b, 0x59, 0xc6, 0x4e, 0x13, 0xed, 0xe2, 0xef, 0xc7, 0x60, 0x6a, 0x49, - 0xd3, 0x6a, 0x35, 0x6e, 0xc1, 0xa2, 0xeb, 0x2f, 0x2e, 0x58, 0x89, 0xf9, 0x60, 0x05, 0xbd, 0x08, - 0x48, 0xd3, 0x6d, 0x76, 0x6b, 0x80, 0xbd, 0xa7, 0x68, 0xe6, 0x81, 0xbf, 0x11, 0x3c, 0xe5, 0xa6, - 0xd4, 0xdc, 0x04, 0xf4, 0x0e, 0x50, 0xd7, 0x5a, 0xb6, 0x1d, 0xc5, 0x5b, 0x9f, 0x7f, 0xe1, 0x24, - 0xa7, 0x4a, 0x98, 0xeb, 0xed, 0x3d, 0x4a, 0x69, 0x22, 0x8e, 0xfe, 0x45, 0xd7, 0x40, 0xd4, 0x89, - 0x06, 0x1c, 0x59, 0xb1, 0xdd, 0x83, 0x09, 0xec, 0xda, 0x82, 0x3c, 0xa3, 0x2f, 0xd9, 0xc1, 0xf3, - 0x06, 0x2c, 0x6e, 0xda, 0xd7, 0x53, 0x94, 0x08, 0xeb, 0x0f, 0x05, 0xc8, 0xf3, 0xc3, 0x14, 0x51, - 0x36, 0xc0, 0x1d, 0xc8, 0xba, 0x27, 0x37, 0x76, 0x2c, 0xb3, 0x79, 0x92, 0xa1, 0x96, 0xe1, 0x8c, - 0x77, 0x2c, 0xb3, 0xd9, 0x71, 0xcc, 0xfb, 0x01, 0x4c, 0x7a, 0x25, 0x8d, 0x52, 0x05, 0xdf, 0xa3, - 0x07, 0x2a, 0x99, 0xe0, 0xa8, 0xb7, 0x80, 0x3f, 0x09, 0x3d, 0xd0, 0x7d, 0x81, 0x60, 0x71, 0xa3, - 0x54, 0xc6, 0x2f, 0x04, 0xc8, 0xd7, 0xda, 0xdb, 0xec, 0x06, 0x9b, 0xe8, 0xf4, 0x50, 0x86, 0x74, - 0x03, 0xef, 0x38, 0xf2, 0xa9, 0x62, 0x7d, 0x53, 0x84, 0x95, 0xc6, 0x3b, 0xdf, 0x05, 0xb0, 0xe8, - 0x69, 0x1e, 0x2a, 0x27, 0x7e, 0x42, 0x39, 0x69, 0xca, 0xeb, 0xfb, 0x3a, 0xc5, 0x3f, 0x8d, 0xc1, - 0xa4, 0x57, 0xd9, 0x28, 0x8d, 0xe8, 0xff, 0xe9, 0x30, 0x1e, 0xf1, 0x53, 0x18, 0x8f, 0x29, 0x22, - 0xb3, 0xaf, 0x01, 0x59, 0x84, 0x69, 0xea, 0x90, 0xc8, 0x4a, 0xab, 0xd5, 0xd0, 0xb1, 0x26, 0xb3, - 0xbd, 0xdc, 0x04, 0xdd, 0xcb, 0x9d, 0xa2, 0x49, 0x4b, 0x2c, 0xa5, 0x4a, 0xf7, 0x75, 0xef, 0x40, - 0x76, 0xc7, 0xc2, 0xf8, 0x09, 0x96, 0x29, 0x32, 0x3a, 0xc9, 0x0e, 0x7f, 0x86, 0x31, 0xd6, 0x08, - 0x1f, 0xef, 0x80, 0xef, 0xc2, 0x14, 0x55, 0x70, 0xd4, 0x27, 0x09, 0x79, 0xab, 0xfc, 0x9b, 0x00, - 0x28, 0x28, 0xff, 0x93, 0x6b, 0x98, 0x58, 0xe4, 0x0d, 0xf3, 0x02, 0x20, 0x16, 0x74, 0x65, 0xcb, - 0x2d, 0x6c, 0xc9, 0x36, 0x56, 0x4d, 0x7e, 0xf9, 0x8a, 0x20, 0x89, 0x3c, 0x65, 0x13, 0x5b, 0x35, - 0x4a, 0x2f, 0xbe, 0x37, 0x0b, 0x59, 0xae, 0x93, 0x2d, 0x43, 0x37, 0x0d, 0x74, 0x13, 0xe2, 0xbb, - 0x7c, 0xa5, 0x37, 0x13, 0xba, 0x12, 0xe4, 0x5f, 0x00, 0x55, 0x19, 0x93, 0x48, 0x5e, 0xc2, 0xd2, - 0x6a, 0x3b, 0x21, 0x4e, 0x91, 0x1f, 0x2b, 0x1a, 0x64, 0x69, 0xb5, 0x1d, 0x54, 0x83, 0x49, 0xd5, - 0xbf, 0x00, 0x47, 0x26, 0xec, 0xf1, 0xbe, 0x9b, 0x0b, 0xa1, 0xd7, 0x08, 0x55, 0xc6, 0xa4, 0xbc, - 0xda, 0x91, 0x80, 0x4a, 0xc1, 0x1b, 0x57, 0xd8, 0x74, 0x79, 0x31, 0xf4, 0xd4, 0x61, 0xe7, 0x6d, - 0x2f, 0x95, 0xb1, 0xc0, 0xc5, 0x2c, 0xe8, 0x35, 0x48, 0x6a, 0xf4, 0x26, 0x0f, 0xde, 0x43, 0xc3, - 0x3a, 0x51, 0xc7, 0xe5, 0x29, 0x95, 0x31, 0x89, 0x73, 0xa0, 0x7b, 0x90, 0x65, 0xff, 0x98, 0x73, - 0xc2, 0x91, 0xdc, 0xe5, 0xfe, 0x12, 0x02, 0xb6, 0xbe, 0x32, 0x26, 0x65, 0x34, 0x9f, 0x8a, 0x3e, - 0x0b, 0x09, 0x5b, 0x55, 0x0c, 0xbe, 0x49, 0x32, 0xd7, 0xe7, 0xb8, 0xbe, 0xcf, 0x4c, 0x73, 0xa3, - 0xd7, 0xd9, 0x45, 0x6e, 0xce, 0x21, 0x3b, 0x88, 0x18, 0x5e, 0xfc, 0x8e, 0x03, 0xa5, 0xa4, 0xf8, - 0x98, 0x12, 0xd0, 0x5d, 0xc8, 0x28, 0xc4, 0xcb, 0x93, 0xe9, 0xb1, 0xae, 0x02, 0xf4, 0x3d, 0x78, - 0xd3, 0x73, 0x24, 0xaf, 0x42, 0x4f, 0xad, 0xba, 0x44, 0x5f, 0x50, 0x13, 0x5b, 0xbb, 0xb8, 0x90, - 0x19, 0x2c, 0x28, 0x18, 0x45, 0xe3, 0x09, 0xa2, 0x44, 0xe2, 0xed, 0xed, 0xb9, 0x21, 0xfb, 0xb4, - 0x52, 0xd9, 0xbe, 0x9b, 0x62, 0x21, 0x47, 0x0e, 0x2a, 0x63, 0x52, 0x76, 0x2f, 0x40, 0x46, 0x8b, - 0x10, 0xdb, 0x55, 0x0b, 0x39, 0x2a, 0xe3, 0xd9, 0x41, 0x01, 0xf5, 0x95, 0x31, 0x29, 0xb6, 0xab, - 0x12, 0x54, 0xce, 0x42, 0xa1, 0x0f, 0x8d, 0x42, 0xbe, 0xef, 0x88, 0xef, 0x8c, 0x2b, 0xaf, 0x8c, - 0x49, 0x34, 0xfa, 0x9a, 0xbc, 0x6f, 0x13, 0xf2, 0x16, 0x0b, 0x43, 0x72, 0x83, 0xed, 0xc4, 0xbe, - 0x1b, 0x85, 0x61, 0xf1, 0x76, 0x15, 0xea, 0xf5, 0x07, 0xe8, 0xe8, 0x2b, 0x30, 0xd3, 0x29, 0x91, - 0xf7, 0xb4, 0xa9, 0x1e, 0x33, 0x12, 0x2e, 0xb7, 0xb3, 0xc3, 0x21, 0xab, 0x27, 0x11, 0xbd, 0x02, - 0xe3, 0xac, 0xd5, 0x10, 0x15, 0x19, 0xb6, 0x03, 0xde, 0xd5, 0x60, 0x2c, 0x3f, 0xe9, 0xfc, 0x0e, - 0x8f, 0xbf, 0x91, 0x1b, 0xe6, 0x6e, 0x61, 0xba, 0x6f, 0xe7, 0xef, 0x8d, 0x27, 0x22, 0x9d, 0xdf, - 0xf1, 0xa9, 0xa4, 0xdd, 0x2d, 0x96, 0xc2, 0xc3, 0x35, 0x66, 0xfa, 0xb6, 0x7b, 0x48, 0x58, 0x4e, - 0x85, 0xc6, 0x12, 0xfb, 0x64, 0x52, 0x34, 0x8b, 0x5d, 0x57, 0x21, 0xd3, 0x31, 0x75, 0xa6, 0x6f, - 0xd1, 0x7a, 0xaf, 0xe0, 0xa8, 0x50, 0x37, 0xc8, 0xa3, 0xa2, 0x07, 0x20, 0xf2, 0x83, 0xe4, 0xfe, - 0xb2, 0xf5, 0x59, 0x2a, 0xef, 0xf9, 0x50, 0xd3, 0x15, 0x16, 0xdf, 0x50, 0x19, 0x93, 0x26, 0xd5, - 0xce, 0x14, 0xf4, 0x10, 0xa6, 0xa8, 0x3c, 0x59, 0xf5, 0x6f, 0x00, 0x28, 0x14, 0x7a, 0x02, 0xf6, - 0xfa, 0x5f, 0x16, 0xe0, 0x4a, 0x16, 0xd5, 0xae, 0x24, 0xd2, 0x8d, 0x75, 0x43, 0x77, 0xa8, 0x95, - 0x9d, 0xed, 0xdb, 0x8d, 0x3b, 0x2f, 0x0c, 0x23, 0xdd, 0x58, 0x67, 0x14, 0xd2, 0x8d, 0x1d, 0x1e, - 0xcb, 0xc3, 0x9b, 0xe3, 0xd9, 0xbe, 0xdd, 0x38, 0x2c, 0xe8, 0x87, 0x74, 0x63, 0x27, 0x48, 0x27, - 0xdd, 0x98, 0x19, 0x88, 0x2e, 0xb9, 0xcf, 0xf5, 0xed, 0xc6, 0x7d, 0x0f, 0x56, 0x92, 0x6e, 0xac, - 0xf4, 0x24, 0xa2, 0x15, 0x00, 0xe6, 0x9e, 0xe8, 0xc6, 0x8e, 0x59, 0x98, 0xeb, 0x3b, 0x19, 0x74, - 0x47, 0xf3, 0x90, 0xc9, 0xa0, 0xe1, 0xd2, 0x88, 0x21, 0xa3, 0xd8, 0x48, 0xa6, 0xbb, 0x64, 0x85, - 0xf9, 0xbe, 0x86, 0xac, 0x67, 0xb3, 0x8c, 0x18, 0xb2, 0x03, 0x8f, 0x48, 0x66, 0x15, 0xb6, 0xc6, - 0x5a, 0x58, 0xe8, 0x6f, 0x96, 0x83, 0xbb, 0x0b, 0xd4, 0x2c, 0x53, 0x02, 0x5a, 0x82, 0x34, 0x99, - 0xb6, 0x8f, 0xa8, 0x19, 0xba, 0xd0, 0xd7, 0xe1, 0xec, 0x0a, 0x96, 0xaf, 0x8c, 0x49, 0xa9, 0xc7, - 0x9c, 0x44, 0x5e, 0xcf, 0x56, 0xad, 0x0a, 0xc5, 0xbe, 0xaf, 0xef, 0x58, 0xa9, 0x24, 0xaf, 0x67, - 0x1c, 0x48, 0x85, 0x33, 0xac, 0xad, 0xf8, 0xb9, 0x46, 0x8b, 0x1f, 0xc2, 0x2b, 0x5c, 0xa4, 0xa2, - 0xfa, 0xae, 0x01, 0x85, 0x1e, 0xb7, 0xac, 0x8c, 0x49, 0xd3, 0x4a, 0x6f, 0x2a, 0x19, 0xf0, 0x7c, - 0xea, 0x61, 0x2b, 0x47, 0x85, 0x4b, 0x7d, 0x07, 0x7c, 0xc8, 0x5a, 0x1b, 0x19, 0xf0, 0x4a, 0x80, - 0xcc, 0x26, 0x20, 0x4d, 0xb6, 0x6d, 0xb6, 0xa7, 0x7a, 0x79, 0xc0, 0x04, 0xd4, 0x85, 0xfd, 0xd9, - 0x04, 0xa4, 0xd5, 0x18, 0x27, 0x11, 0xa4, 0x36, 0xb0, 0x62, 0x71, 0x33, 0x7b, 0xa5, 0xaf, 0xa0, - 0x9e, 0x4b, 0xb8, 0x88, 0x20, 0xd5, 0x23, 0x12, 0x87, 0xc7, 0x72, 0x6f, 0xa0, 0xe0, 0xae, 0xdf, - 0xd5, 0xbe, 0x0e, 0x4f, 0xe8, 0x45, 0x19, 0xc4, 0xe1, 0xb1, 0x3a, 0x12, 0xd0, 0xe7, 0x61, 0x82, - 0x23, 0xb4, 0xc2, 0xb5, 0x01, 0x0e, 0x69, 0x10, 0x5a, 0x93, 0x71, 0xcd, 0x79, 0x98, 0x95, 0x65, - 0xc8, 0x90, 0x55, 0xef, 0xf9, 0x01, 0x56, 0xb6, 0x07, 0x9c, 0x32, 0x2b, 0xeb, 0x93, 0x89, 0x95, - 0x65, 0xfd, 0x94, 0xcf, 0x75, 0xd7, 0xfb, 0x5a, 0xd9, 0xde, 0x48, 0x7d, 0x62, 0x65, 0x1f, 0xfb, - 0x54, 0x52, 0x33, 0x9b, 0xa1, 0xa2, 0xc2, 0x67, 0xfa, 0xd6, 0xac, 0x13, 0x24, 0x92, 0x9a, 0x71, - 0x1e, 0xd2, 0x6c, 0x2c, 0x88, 0x94, 0x69, 0xfa, 0x85, 0xfe, 0x47, 0x88, 0xbb, 0x41, 0x44, 0xc5, - 0xbd, 0xa0, 0x95, 0x69, 0xd8, 0x33, 0x54, 0x16, 0x3f, 0x30, 0xc9, 0x35, 0xf5, 0xe2, 0x60, 0x43, - 0x15, 0x76, 0x16, 0xd4, 0x33, 0x54, 0x1d, 0x89, 0xb4, 0xa8, 0xec, 0xdc, 0x0b, 0x1d, 0xdf, 0x8b, - 0x03, 0x4e, 0x3b, 0x77, 0x1d, 0x45, 0xa2, 0x45, 0xf5, 0x88, 0xfe, 0x10, 0x6a, 0xb3, 0x63, 0xf9, - 0x85, 0x1b, 0x83, 0x87, 0x50, 0xe7, 0xf5, 0x00, 0xde, 0x10, 0xe2, 0x64, 0x6f, 0xce, 0x74, 0x3d, - 0x8c, 0x97, 0x06, 0xcf, 0x99, 0xdd, 0xae, 0x05, 0x9b, 0x33, 0xb9, 0x4f, 0xf1, 0x2b, 0x02, 0x2c, - 0xb0, 0xb2, 0xd1, 0x75, 0xbc, 0x23, 0xd9, 0x5b, 0x13, 0x0d, 0x84, 0x7c, 0xdf, 0xa4, 0x2f, 0x78, - 0xa5, 0x5f, 0x71, 0x87, 0xac, 0xf1, 0x56, 0xc6, 0xa4, 0xe7, 0x94, 0x41, 0xf9, 0x96, 0x27, 0xf8, - 0xce, 0xa9, 0x77, 0x02, 0x6d, 0x52, 0x14, 0xef, 0x25, 0x52, 0xe7, 0xc4, 0xc2, 0xbd, 0x44, 0xea, - 0xbc, 0x38, 0x7b, 0x2f, 0x91, 0x7a, 0x46, 0x7c, 0xb6, 0xf8, 0xef, 0xe7, 0x21, 0xe7, 0x62, 0x38, - 0x86, 0x88, 0x6e, 0x05, 0x11, 0xd1, 0x5c, 0x3f, 0x44, 0xc4, 0x51, 0x1f, 0x87, 0x44, 0xb7, 0x82, - 0x90, 0x68, 0xae, 0x1f, 0x24, 0xf2, 0x79, 0x08, 0x26, 0xaa, 0xf7, 0xc3, 0x44, 0xcf, 0x8f, 0x80, - 0x89, 0x3c, 0x51, 0xdd, 0xa0, 0x68, 0xa5, 0x17, 0x14, 0x5d, 0x1a, 0x0c, 0x8a, 0x3c, 0x51, 0x01, - 0x54, 0xf4, 0x7a, 0x17, 0x2a, 0xba, 0x30, 0x00, 0x15, 0x79, 0xfc, 0x2e, 0x2c, 0x5a, 0x0d, 0x85, - 0x45, 0x57, 0x86, 0xc1, 0x22, 0x4f, 0x4e, 0x07, 0x2e, 0x7a, 0xb9, 0x03, 0x17, 0xcd, 0xf7, 0xc5, - 0x45, 0x1e, 0x37, 0x03, 0x46, 0x6f, 0x74, 0x03, 0xa3, 0x0b, 0x03, 0x80, 0x91, 0x5f, 0x03, 0x8e, - 0x8c, 0x2a, 0x61, 0xc8, 0xe8, 0xf2, 0x10, 0x64, 0xe4, 0x49, 0x09, 0x42, 0xa3, 0x4a, 0x18, 0x34, - 0xba, 0x3c, 0x04, 0x1a, 0x75, 0x49, 0x62, 0xd8, 0x68, 0x3d, 0x1c, 0x1b, 0x5d, 0x1d, 0x8a, 0x8d, - 0x3c, 0x69, 0x9d, 0xe0, 0xe8, 0x46, 0x00, 0x1c, 0x3d, 0xd7, 0x07, 0x1c, 0x79, 0xac, 0x04, 0x1d, - 0x7d, 0xa1, 0x07, 0x1d, 0x15, 0x07, 0xa1, 0x23, 0x8f, 0xd7, 0x83, 0x47, 0x6f, 0xf5, 0x81, 0x47, - 0xd7, 0x86, 0xc3, 0x23, 0x4f, 0x58, 0x17, 0x3e, 0x52, 0x06, 0xe2, 0xa3, 0x17, 0x47, 0xc4, 0x47, - 0x9e, 0xf4, 0x30, 0x80, 0xf4, 0x6a, 0x27, 0x40, 0x5a, 0xe8, 0x0f, 0x90, 0x3c, 0x31, 0x1c, 0x21, - 0xad, 0x86, 0x22, 0xa4, 0x2b, 0xc3, 0x10, 0x92, 0x3f, 0x0e, 0x82, 0x10, 0x69, 0x3d, 0x1c, 0x22, - 0x5d, 0x1d, 0x0a, 0x91, 0xfc, 0xe6, 0xef, 0xc0, 0x48, 0xab, 0xa1, 0x18, 0xe9, 0xca, 0x30, 0x8c, - 0xe4, 0x17, 0x2e, 0x08, 0x92, 0xde, 0xee, 0x0b, 0x92, 0xae, 0x8f, 0x02, 0x92, 0x3c, 0xa1, 0x3d, - 0x28, 0xe9, 0x9d, 0xfe, 0x28, 0xe9, 0x33, 0x27, 0xb8, 0x52, 0x2d, 0x14, 0x26, 0x7d, 0xa1, 0x07, - 0x26, 0x15, 0x07, 0xc1, 0x24, 0xbf, 0x3f, 0xbb, 0x38, 0x49, 0x19, 0x88, 0x6a, 0x5e, 0x1c, 0x11, - 0xd5, 0xf8, 0x9d, 0x2f, 0x04, 0xd6, 0x94, 0x43, 0x60, 0xcd, 0xa5, 0xc1, 0xb0, 0xc6, 0x37, 0xe7, - 0x3e, 0xae, 0xa9, 0x84, 0xe1, 0x9a, 0xcb, 0x43, 0x70, 0x8d, 0x6f, 0x85, 0x02, 0xc0, 0xe6, 0xf5, - 0x2e, 0x60, 0x73, 0x61, 0x68, 0x94, 0x4d, 0x00, 0xd9, 0x2c, 0xf7, 0x22, 0x9b, 0x8b, 0x03, 0x91, - 0x8d, 0x27, 0xc1, 0x87, 0x36, 0xaf, 0x77, 0x41, 0x9b, 0x0b, 0x03, 0xa0, 0x8d, 0x5f, 0x00, 0x8e, - 0x6d, 0xb4, 0xc1, 0xd8, 0x66, 0x71, 0x54, 0x6c, 0xe3, 0x09, 0x0e, 0x05, 0x37, 0xeb, 0xe1, 0xe0, - 0xe6, 0xea, 0x88, 0xbb, 0xe7, 0x3d, 0xe8, 0xa6, 0x12, 0x86, 0x6e, 0x2e, 0x0f, 0x41, 0x37, 0xc1, - 0x39, 0xc4, 0x83, 0x37, 0x95, 0x30, 0x78, 0x73, 0x79, 0x08, 0xbc, 0xf1, 0x25, 0x05, 0xf0, 0x4d, - 0xbd, 0x1f, 0xbe, 0x79, 0x7e, 0x04, 0x7c, 0xe3, 0x3b, 0x2f, 0x5d, 0x00, 0xe7, 0xcd, 0x6e, 0x80, - 0x53, 0x1c, 0x04, 0x70, 0xfc, 0x11, 0xe9, 0x22, 0x9c, 0xf5, 0x70, 0x84, 0x73, 0x75, 0x28, 0xc2, - 0x09, 0x1a, 0xc9, 0x00, 0xc4, 0x59, 0x0d, 0x85, 0x38, 0x57, 0x86, 0x41, 0x1c, 0xdf, 0x48, 0x06, - 0x31, 0xce, 0x9b, 0xdd, 0x18, 0xa7, 0x38, 0x08, 0xe3, 0xf8, 0x95, 0x73, 0x41, 0x4e, 0x25, 0x0c, - 0xe4, 0x5c, 0x1e, 0x02, 0x72, 0xfc, 0xc6, 0x0b, 0xa0, 0x1c, 0x65, 0x20, 0xca, 0x79, 0x71, 0x44, - 0x94, 0xd3, 0x65, 0xb8, 0x3a, 0x61, 0x4e, 0x25, 0x0c, 0xe6, 0x5c, 0x1e, 0x02, 0x73, 0x02, 0x85, - 0xf5, 0x71, 0xce, 0x7a, 0x38, 0xce, 0xb9, 0x3a, 0x14, 0xe7, 0x74, 0x8d, 0x26, 0x17, 0xe8, 0xac, - 0x86, 0x02, 0x9d, 0x2b, 0xc3, 0x80, 0x4e, 0xd7, 0xc4, 0xc7, 0x9d, 0x83, 0x5f, 0x1d, 0x1d, 0xe9, - 0xbc, 0x7a, 0x72, 0xa4, 0xe3, 0xbd, 0x33, 0x12, 0xa8, 0x73, 0x2f, 0x91, 0x7a, 0x56, 0x7c, 0xae, - 0xf8, 0xcb, 0x71, 0x48, 0x56, 0xbc, 0x18, 0x17, 0xbf, 0x94, 0xc2, 0x69, 0x6e, 0x73, 0x41, 0x2b, - 0x64, 0xc4, 0x52, 0xbb, 0x37, 0xfc, 0xe2, 0xae, 0xde, 0x4b, 0xa5, 0x38, 0xeb, 0x29, 0x0e, 0x81, - 0xa2, 0x97, 0x21, 0xd7, 0xb6, 0xb1, 0x25, 0xb7, 0x2c, 0xdd, 0xb4, 0x74, 0x87, 0x85, 0xeb, 0x0b, - 0xcb, 0xe2, 0x47, 0xc7, 0xf3, 0xd9, 0x2d, 0x1b, 0x5b, 0x9b, 0x9c, 0x2e, 0x65, 0xdb, 0x81, 0x27, - 0xf7, 0x6b, 0x32, 0xe3, 0xa3, 0x7f, 0x4d, 0xe6, 0x2d, 0x10, 0x2d, 0xac, 0x68, 0x1d, 0x1e, 0x08, - 0xbb, 0x26, 0x25, 0xbc, 0xcf, 0xd0, 0xb3, 0x2a, 0x6e, 0x4e, 0x7a, 0x5d, 0xca, 0xa4, 0xd5, 0x49, - 0x44, 0x37, 0xe1, 0x4c, 0x53, 0x39, 0xa4, 0x31, 0x88, 0xb2, 0xeb, 0xd4, 0xd1, 0xb8, 0xc2, 0x14, - 0x8d, 0x97, 0x45, 0x4d, 0xe5, 0x90, 0x7e, 0x9a, 0x86, 0x25, 0xd1, 0x4b, 0xe9, 0x2f, 0x43, 0x5e, - 0xd3, 0x6d, 0x47, 0x37, 0x54, 0xf7, 0x3e, 0x4c, 0x76, 0xf1, 0x64, 0xce, 0xa5, 0xb2, 0x7b, 0x29, - 0xaf, 0xc3, 0x14, 0x8f, 0xc7, 0xf6, 0x3f, 0x56, 0x43, 0xe1, 0x4b, 0x8a, 0x94, 0x82, 0x24, 0xf8, - 0x5f, 0x29, 0x2a, 0xc1, 0xe4, 0xae, 0xe2, 0xe0, 0x03, 0xe5, 0x48, 0x76, 0x8f, 0xcb, 0x64, 0xe8, - 0x35, 0x73, 0xcf, 0x3c, 0x3d, 0x9e, 0xcf, 0xdd, 0x65, 0x49, 0x3d, 0xa7, 0x66, 0x72, 0xbb, 0x81, - 0x04, 0x0d, 0x2d, 0x41, 0x96, 0x5e, 0x36, 0x6d, 0xb2, 0x3b, 0xcd, 0x39, 0x28, 0xe9, 0xb7, 0x7d, - 0xc5, 0x6f, 0x3e, 0x97, 0xe8, 0x05, 0xd5, 0xee, 0x35, 0xe8, 0x57, 0x61, 0x52, 0xb1, 0x8f, 0x0c, - 0x95, 0x6a, 0x18, 0x1b, 0x76, 0xdb, 0xa6, 0xa8, 0x24, 0x25, 0xe5, 0x29, 0xb9, 0xe4, 0x52, 0xd1, - 0xab, 0x70, 0x5e, 0xc3, 0xc4, 0xcd, 0x62, 0xbe, 0x8c, 0x63, 0x9a, 0xb2, 0xd9, 0xd0, 0x64, 0x7a, - 0xa3, 0x02, 0x45, 0x24, 0x29, 0xe9, 0x0c, 0xcd, 0x40, 0xbd, 0x98, 0xba, 0x69, 0x6e, 0x34, 0xb4, - 0x32, 0x49, 0xe4, 0xb7, 0x67, 0xfe, 0x96, 0x00, 0xd9, 0x8e, 0x03, 0x0e, 0xaf, 0x77, 0xed, 0xef, - 0x9e, 0x0f, 0xc7, 0x52, 0xfd, 0x02, 0xc4, 0x52, 0xbc, 0xed, 0xdc, 0xf0, 0xb8, 0xf9, 0xfe, 0xbe, - 0x38, 0x5d, 0x59, 0x70, 0x63, 0x0b, 0x5c, 0xb6, 0xd7, 0x12, 0xbf, 0xf3, 0xfe, 0xfc, 0x58, 0xf1, - 0xe7, 0x71, 0xc8, 0x75, 0x1e, 0x64, 0xa8, 0x76, 0x95, 0x2b, 0xcc, 0xd6, 0x75, 0x70, 0x2c, 0x0e, - 0xb8, 0x4c, 0x2c, 0xed, 0x5f, 0x6e, 0xcd, 0x8a, 0xb9, 0x30, 0x60, 0x17, 0x3b, 0x58, 0x4e, 0x9f, - 0x71, 0xf6, 0x07, 0x31, 0xcf, 0x66, 0x2c, 0xc2, 0x38, 0x53, 0xb8, 0xd0, 0xf7, 0x60, 0x29, 0xd5, - 0xb9, 0xc4, 0xb2, 0x11, 0x1b, 0x53, 0x3f, 0xd5, 0x8d, 0x51, 0x1e, 0xe1, 0x14, 0x5f, 0x80, 0xe2, - 0xf7, 0x86, 0x8d, 0x9f, 0xec, 0xde, 0x30, 0xb6, 0x4b, 0xdd, 0x68, 0x30, 0xfb, 0xcd, 0x46, 0x59, - 0xb2, 0xe7, 0xf4, 0x26, 0x15, 0xc1, 0x3f, 0x10, 0xb6, 0x28, 0xf1, 0x0f, 0x84, 0x05, 0x22, 0x16, - 0xf3, 0x9e, 0x08, 0x3a, 0x24, 0x59, 0x5c, 0x2b, 0x6f, 0xea, 0xef, 0x08, 0x20, 0xd2, 0x01, 0x78, - 0x07, 0x63, 0x2d, 0x92, 0x5e, 0xe8, 0x06, 0x53, 0xc6, 0x46, 0x8f, 0x31, 0xef, 0xb8, 0x6c, 0x3c, - 0xde, 0x79, 0xd9, 0x78, 0xf1, 0x7d, 0x01, 0xf2, 0x5e, 0x09, 0xd9, 0xe7, 0x70, 0x06, 0x5c, 0x07, - 0x76, 0xba, 0x2f, 0xc4, 0xb8, 0x27, 0xb3, 0x47, 0xfa, 0x2e, 0x4f, 0xf0, 0x64, 0x36, 0xfb, 0x9a, - 0xc9, 0xb7, 0x05, 0x98, 0xf6, 0x8a, 0x58, 0xf2, 0x4f, 0xdd, 0x9e, 0x22, 0xdc, 0x5e, 0xa2, 0x5f, - 0x0a, 0x23, 0x88, 0x9f, 0x1e, 0x89, 0x1f, 0xa9, 0x7b, 0x22, 0x1e, 0x8d, 0x01, 0x7c, 0x25, 0x41, - 0xab, 0xd7, 0xe8, 0x37, 0xc4, 0xd8, 0x7f, 0xbb, 0x78, 0x27, 0xa0, 0x40, 0x3a, 0x12, 0x88, 0x96, - 0x46, 0x1a, 0x32, 0xae, 0x96, 0x68, 0xe6, 0xe2, 0x8f, 0x82, 0x2d, 0x51, 0xde, 0x27, 0x1e, 0xe4, - 0x6d, 0x88, 0xef, 0x2b, 0x8d, 0x41, 0xc1, 0x28, 0x1d, 0x2d, 0x27, 0x91, 0xdc, 0xe8, 0x4e, 0xc7, - 0x61, 0xe5, 0x58, 0x7f, 0x6f, 0xa7, 0x57, 0xa5, 0x1d, 0x87, 0x9a, 0x5f, 0x71, 0x6b, 0x11, 0x1f, - 0xfe, 0xfa, 0xa0, 0x05, 0x78, 0x2d, 0xf1, 0xc1, 0xfb, 0xf3, 0xc2, 0xf5, 0x1a, 0x4c, 0x87, 0xcc, - 0x8d, 0x28, 0x0f, 0x10, 0xb8, 0x82, 0x9c, 0x7f, 0xa8, 0x6c, 0x69, 0x45, 0xde, 0x5a, 0x2f, 0x6d, - 0xac, 0xad, 0x55, 0xeb, 0xf5, 0xf2, 0x8a, 0x28, 0x20, 0x11, 0xb2, 0x1d, 0x17, 0x98, 0xf3, 0xef, - 0x93, 0x5d, 0xff, 0x5f, 0x00, 0xfe, 0x47, 0x0c, 0x88, 0xac, 0xd5, 0xf2, 0x43, 0xf9, 0xc1, 0xd2, - 0xfd, 0xad, 0x72, 0x4d, 0x1c, 0x43, 0x08, 0xf2, 0xcb, 0x4b, 0xf5, 0x52, 0x45, 0x96, 0xca, 0xb5, - 0xcd, 0x8d, 0xf5, 0x5a, 0x59, 0x14, 0x38, 0xdf, 0x0a, 0x64, 0x83, 0xc7, 0xba, 0xd1, 0x34, 0x4c, - 0x96, 0x2a, 0xe5, 0xd2, 0xaa, 0xfc, 0xa0, 0xba, 0x24, 0xbf, 0xb5, 0x55, 0xde, 0x2a, 0x8b, 0x63, - 0xb4, 0x68, 0x94, 0x78, 0x67, 0xeb, 0xfe, 0x7d, 0x51, 0x40, 0x93, 0x90, 0x61, 0xcf, 0xf4, 0xb2, - 0x73, 0x31, 0x76, 0x7d, 0x0d, 0x32, 0x81, 0x5b, 0xd1, 0xc8, 0xeb, 0x36, 0xb7, 0x6a, 0x15, 0xb9, - 0x5e, 0x5d, 0x2b, 0xd7, 0xea, 0x4b, 0x6b, 0x9b, 0x4c, 0x06, 0xa5, 0x2d, 0x2d, 0x6f, 0x48, 0x75, - 0x51, 0xf0, 0x9e, 0xeb, 0x1b, 0x5b, 0xa5, 0x8a, 0xf7, 0x99, 0xb5, 0x44, 0x2a, 0x2e, 0xc6, 0xaf, - 0x3f, 0x86, 0x73, 0x7d, 0xce, 0x36, 0xa3, 0x0c, 0x4c, 0x6c, 0x19, 0xf4, 0x1e, 0x28, 0x71, 0x0c, - 0xe5, 0x02, 0xc7, 0x9b, 0x45, 0x01, 0xa5, 0xd8, 0xc1, 0x55, 0x31, 0x86, 0x92, 0x10, 0xab, 0xdd, - 0x16, 0xe3, 0xa4, 0xa0, 0x81, 0xd3, 0xc1, 0x62, 0x02, 0xa5, 0xf9, 0xd1, 0x49, 0x71, 0x1c, 0x65, - 0xfd, 0xb3, 0x8b, 0x62, 0xf2, 0xfa, 0x05, 0x08, 0x1c, 0xec, 0x42, 0x00, 0xc9, 0xfb, 0x8a, 0x83, - 0x6d, 0x47, 0x1c, 0x43, 0x13, 0x10, 0x5f, 0x6a, 0x34, 0x44, 0xe1, 0xd6, 0x9f, 0x08, 0x90, 0x72, - 0xef, 0xed, 0x46, 0xf7, 0x61, 0x9c, 0x2d, 0x03, 0xcc, 0xf7, 0x9f, 0x91, 0xa8, 0x51, 0x9b, 0x5d, - 0x18, 0x36, 0x65, 0x15, 0xc7, 0xd0, 0xdb, 0xfc, 0x9b, 0x89, 0xa4, 0xc7, 0xa0, 0x8b, 0x83, 0xfa, - 0x93, 0x2b, 0x75, 0x70, 0xa7, 0x23, 0x63, 0xa4, 0x38, 0xf6, 0x92, 0xb0, 0xfc, 0xfc, 0x07, 0x3f, - 0x9d, 0x1b, 0xfb, 0xe0, 0xe9, 0x9c, 0xf0, 0xe1, 0xd3, 0x39, 0xe1, 0x27, 0x4f, 0xe7, 0x84, 0x7f, - 0x79, 0x3a, 0x27, 0xfc, 0xc6, 0xcf, 0xe6, 0xc6, 0x3e, 0xfc, 0xd9, 0xdc, 0xd8, 0x4f, 0x7e, 0x36, - 0x37, 0xf6, 0xce, 0x04, 0xe7, 0xde, 0x4e, 0xd2, 0xcf, 0x37, 0xde, 0xfe, 0xcf, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xdc, 0x8b, 0x9c, 0xfe, 0xc3, 0x72, 0x00, 0x00, +func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_b15d24b83d75a88d) } + +var fileDescriptor_api_b15d24b83d75a88d = []byte{ + // 7234 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5d, 0x8c, 0x23, 0xc7, + 0x75, 0xee, 0x34, 0xc9, 0xe1, 0x90, 0x87, 0x1c, 0x4e, 0x4f, 0xcd, 0xfe, 0x70, 0x47, 0xd2, 0xce, + 0x2c, 0xf7, 0x57, 0x6b, 0x69, 0x56, 0xbb, 0x6b, 0x5d, 0xc9, 0x92, 0x2c, 0x7b, 0x86, 0xc3, 0x5d, + 0x72, 0x67, 0xe7, 0x47, 0x4d, 0xce, 0xca, 0x2b, 0x5f, 0xdd, 0x76, 0x6f, 0x77, 0x0d, 0xa7, 0xbd, + 0x64, 0x37, 0xb7, 0xbb, 0x39, 0x3f, 0x0b, 0x5c, 0x5c, 0xdc, 0x7b, 0x1f, 0x7c, 0xe1, 0x6b, 0x08, + 0x01, 0x12, 0x04, 0x81, 0xed, 0xc0, 0x02, 0x1c, 0x24, 0x41, 0x02, 0x1b, 0x08, 0x10, 0x24, 0x48, + 0x90, 0xc0, 0x0f, 0x79, 0x51, 0x0c, 0x23, 0x10, 0x82, 0x04, 0x36, 0x02, 0x64, 0x10, 0x8f, 0x81, + 0xc4, 0xf0, 0x43, 0x5e, 0x0d, 0xe8, 0x21, 0x09, 0xea, 0xa7, 0xff, 0xc8, 0x26, 0x87, 0x33, 0x6a, + 0x25, 0x0a, 0xf2, 0x44, 0xf6, 0xa9, 0x3a, 0xa7, 0xab, 0x4e, 0x55, 0x9d, 0x3a, 0x5f, 0xd5, 0xa9, + 0x6a, 0x98, 0xb6, 0x4c, 0x45, 0xdd, 0xee, 0x3c, 0xba, 0xa1, 0x74, 0xf4, 0x85, 0x8e, 0x65, 0x3a, + 0x26, 0x9a, 0x56, 0x4d, 0xf5, 0x31, 0x25, 0x2f, 0xf0, 0xc4, 0x59, 0xe4, 0xe6, 0xd2, 0x14, 0x47, + 0x61, 0xd9, 0x66, 0x4f, 0xb9, 0x34, 0x6c, 0x59, 0xa6, 0x65, 0x73, 0xea, 0x19, 0x97, 0xda, 0xc6, + 0x8e, 0x12, 0xc8, 0x5d, 0xb2, 0x1d, 0xd3, 0x52, 0x9a, 0xf8, 0x06, 0x36, 0x9a, 0xba, 0xe1, 0xfe, + 0x90, 0x7c, 0x3b, 0xaa, 0xca, 0xf3, 0x5c, 0x1c, 0x96, 0xe7, 0x36, 0xcf, 0x54, 0xec, 0x3a, 0x7a, + 0xeb, 0xc6, 0x76, 0x4b, 0xbd, 0xe1, 0xe8, 0x6d, 0x6c, 0x3b, 0x4a, 0xbb, 0xc3, 0x53, 0xe6, 0x69, + 0x8a, 0x63, 0x29, 0xaa, 0x6e, 0x34, 0x6f, 0x58, 0x58, 0x35, 0x2d, 0x0d, 0x6b, 0xb2, 0xdd, 0x51, + 0x0c, 0xb7, 0xc8, 0x4d, 0xb3, 0x69, 0xd2, 0xbf, 0x37, 0xc8, 0x3f, 0x46, 0x2d, 0xfd, 0x2f, 0xc8, + 0x4a, 0x8a, 0xd1, 0xc4, 0x35, 0x63, 0xcb, 0x44, 0x6f, 0x40, 0x4a, 0xc3, 0xb6, 0x5a, 0x14, 0xe6, + 0x85, 0x6b, 0xb9, 0x5b, 0xa5, 0x85, 0x3e, 0x5d, 0x2c, 0xd0, 0xbc, 0xcb, 0xd8, 0x56, 0x2d, 0xbd, + 0xe3, 0x98, 0xd6, 0x52, 0xea, 0x83, 0x83, 0xb9, 0x31, 0x89, 0x72, 0xa1, 0xcf, 0xc2, 0x78, 0x0b, + 0x2b, 0x36, 0x2e, 0x26, 0x28, 0x7b, 0x31, 0x82, 0xfd, 0x3e, 0x49, 0xe7, 0x4c, 0x2c, 0x73, 0xe9, + 0x2f, 0x04, 0x98, 0x94, 0xf0, 0x93, 0x2e, 0xb6, 0x9d, 0x2a, 0x56, 0x34, 0x6c, 0xa1, 0x73, 0x90, + 0x7c, 0x8c, 0xf7, 0x8b, 0xc9, 0x79, 0xe1, 0x5a, 0x7e, 0x69, 0xe2, 0xa3, 0x83, 0xb9, 0xe4, 0x0a, + 0xde, 0x97, 0x08, 0x0d, 0xcd, 0xc3, 0x04, 0x36, 0x34, 0x99, 0x24, 0xa7, 0xc2, 0xc9, 0x69, 0x6c, + 0x68, 0x2b, 0x78, 0x1f, 0xa9, 0x90, 0xb1, 0x89, 0x34, 0x43, 0xc5, 0xc5, 0xf1, 0x79, 0xe1, 0xda, + 0xf8, 0xd2, 0xdd, 0x8f, 0x0e, 0xe6, 0xca, 0x4d, 0xdd, 0xd9, 0xee, 0x3e, 0x5a, 0x50, 0xcd, 0xf6, + 0x0d, 0xaf, 0x54, 0xda, 0x23, 0xff, 0xff, 0x8d, 0xce, 0xe3, 0xe6, 0x8d, 0x01, 0x2d, 0xb0, 0xd0, + 0xd8, 0x33, 0xea, 0xf8, 0x89, 0xe4, 0x09, 0x7e, 0x2d, 0xf5, 0xf3, 0xf7, 0xe7, 0x84, 0x7b, 0xa9, + 0x8c, 0x20, 0x26, 0xee, 0xa5, 0x32, 0x09, 0x31, 0x59, 0xfa, 0x46, 0x12, 0x0a, 0x12, 0xb6, 0x3b, + 0xa6, 0x61, 0x63, 0x5e, 0x8d, 0x97, 0x20, 0xe9, 0xec, 0x19, 0xb4, 0x1a, 0xb9, 0x5b, 0xe7, 0x23, + 0x94, 0xd1, 0xb0, 0x14, 0xc3, 0x56, 0x54, 0x47, 0x37, 0x0d, 0x89, 0x64, 0x45, 0xaf, 0x42, 0xce, + 0xc2, 0x76, 0xb7, 0x8d, 0x69, 0xb3, 0xd1, 0x1a, 0xe6, 0x6e, 0x9d, 0x8d, 0xe0, 0xac, 0x77, 0x14, + 0x43, 0x02, 0x96, 0x97, 0xfc, 0x47, 0xe7, 0x20, 0x63, 0x74, 0xdb, 0x44, 0x2f, 0x36, 0xad, 0x75, + 0x52, 0x9a, 0x30, 0xba, 0xed, 0x15, 0xbc, 0x6f, 0xa3, 0x32, 0xe4, 0x2c, 0xd2, 0x68, 0xb2, 0x6e, + 0x6c, 0x99, 0x76, 0x31, 0x3d, 0x9f, 0xbc, 0x96, 0xbb, 0xf5, 0xec, 0xa0, 0xa6, 0x25, 0xdd, 0x80, + 0xb7, 0x0f, 0x58, 0x2e, 0xc1, 0x46, 0x75, 0x98, 0xe4, 0x25, 0xb3, 0xb0, 0x62, 0x9b, 0x46, 0x71, + 0x62, 0x5e, 0xb8, 0x56, 0xb8, 0xb5, 0x10, 0x25, 0x26, 0xa4, 0x05, 0xf2, 0xd8, 0x6d, 0x63, 0x89, + 0x72, 0x49, 0x79, 0x2b, 0xf0, 0x54, 0x7a, 0x08, 0xf9, 0x60, 0x2a, 0x42, 0x50, 0x90, 0x2a, 0xf5, + 0xcd, 0xd5, 0x8a, 0xbc, 0xb9, 0xb6, 0xb2, 0xb6, 0xfe, 0xf6, 0x9a, 0x38, 0x86, 0x4e, 0x81, 0xc8, + 0x69, 0x2b, 0x95, 0x87, 0xf2, 0xfd, 0xda, 0x6a, 0xad, 0x21, 0x0a, 0xe8, 0x1c, 0x9c, 0xe6, 0x54, + 0x69, 0x71, 0xed, 0x6e, 0x45, 0x5e, 0x5a, 0xdf, 0x5c, 0x5b, 0x5e, 0x94, 0x1e, 0x8a, 0x89, 0xd9, + 0xd4, 0xff, 0xfb, 0xee, 0xf9, 0xb1, 0xd2, 0x03, 0x80, 0xbb, 0xd8, 0xe1, 0xdd, 0x0a, 0x2d, 0x41, + 0x7a, 0x9b, 0x96, 0x86, 0x77, 0xec, 0xf9, 0xc8, 0x62, 0x07, 0xba, 0xe0, 0x52, 0x86, 0x68, 0xe0, + 0xc3, 0x83, 0x39, 0x41, 0xe2, 0x9c, 0xac, 0xc9, 0x4b, 0x3f, 0x10, 0x20, 0x47, 0x05, 0xb3, 0x3a, + 0xa2, 0x72, 0x8f, 0xe4, 0x0b, 0x47, 0x2a, 0xa4, 0x5f, 0x34, 0x5a, 0x80, 0xf1, 0x1d, 0xa5, 0xd5, + 0x1d, 0x36, 0x6e, 0x1e, 0x90, 0x74, 0x89, 0x65, 0x43, 0xaf, 0x43, 0x5e, 0x37, 0x1c, 0x6c, 0x38, + 0x32, 0x63, 0x4b, 0x1e, 0xc1, 0x96, 0x63, 0xb9, 0xe9, 0x43, 0xe9, 0x4f, 0x05, 0x80, 0x8d, 0x6e, + 0x9c, 0xaa, 0x21, 0xe3, 0x7e, 0xa4, 0xf2, 0xbb, 0xe3, 0x9e, 0xd5, 0xe2, 0x0c, 0xa4, 0x75, 0xa3, + 0xa5, 0x1b, 0xac, 0xfc, 0x19, 0x89, 0x3f, 0xa1, 0x53, 0x30, 0xfe, 0xa8, 0xa5, 0x1b, 0x1a, 0xed, + 0xfe, 0x19, 0x89, 0x3d, 0x70, 0xf5, 0x4b, 0x90, 0xa3, 0x65, 0x8f, 0x51, 0xfb, 0xa5, 0x6f, 0x26, + 0xe0, 0x74, 0xd9, 0x34, 0x34, 0x9d, 0x8c, 0x43, 0xa5, 0xf5, 0xa9, 0xd0, 0xcd, 0xcb, 0x90, 0xc5, + 0x7b, 0x9d, 0x11, 0x9b, 0x37, 0x83, 0xf7, 0x3a, 0xf4, 0x5f, 0xb4, 0xea, 0xd0, 0x67, 0xe1, 0xac, + 0xd2, 0x6a, 0x99, 0xbb, 0xb2, 0xbe, 0x25, 0x6b, 0x26, 0xb6, 0x65, 0xc3, 0x74, 0x64, 0xbc, 0xa7, + 0xdb, 0x0e, 0x35, 0x15, 0x19, 0x69, 0x86, 0x26, 0xd7, 0xb6, 0x96, 0x4d, 0x6c, 0xaf, 0x99, 0x4e, + 0x85, 0x24, 0x71, 0x85, 0xbf, 0x0b, 0x67, 0x7a, 0x75, 0x13, 0xa7, 0xee, 0xff, 0x5a, 0x80, 0x42, + 0xcd, 0xd0, 0x9d, 0x4f, 0x85, 0xd2, 0x3d, 0xed, 0x25, 0x83, 0xda, 0xbb, 0x0e, 0xe2, 0x96, 0xa2, + 0xb7, 0xd6, 0x8d, 0x86, 0xd9, 0x7e, 0x64, 0x3b, 0xa6, 0x81, 0x6d, 0xae, 0xde, 0x3e, 0x3a, 0xd7, + 0xd9, 0x03, 0x98, 0xf2, 0xea, 0x14, 0xa7, 0xb2, 0x9e, 0x82, 0x58, 0x33, 0x54, 0x0b, 0xb7, 0xb1, + 0x11, 0xab, 0xb6, 0x9e, 0x85, 0xac, 0xee, 0xca, 0xa5, 0x1a, 0x4b, 0x4a, 0x3e, 0x81, 0xd7, 0xa9, + 0x0b, 0xd3, 0x81, 0x77, 0xc7, 0x69, 0xfc, 0x9e, 0x81, 0xac, 0x81, 0x77, 0x65, 0xbf, 0xbd, 0x92, + 0x52, 0xc6, 0xc0, 0xbb, 0xcc, 0x58, 0x3d, 0x84, 0xc9, 0x65, 0xdc, 0xc2, 0x0e, 0x8e, 0xdf, 0x92, + 0x6f, 0x42, 0xc1, 0x15, 0x1d, 0x67, 0x23, 0xfd, 0xa6, 0x00, 0x88, 0xcb, 0x25, 0xb3, 0x67, 0x9c, + 0xed, 0x34, 0x47, 0xbc, 0x03, 0xa7, 0x6b, 0x19, 0x6c, 0x9a, 0x67, 0xbd, 0x14, 0x18, 0x89, 0xce, + 0xf4, 0xbe, 0x45, 0x4d, 0x05, 0x2d, 0xaa, 0xe7, 0xad, 0x10, 0x3f, 0x65, 0x17, 0x66, 0x42, 0xc5, + 0x8b, 0xb7, 0x29, 0x53, 0xb4, 0x64, 0x89, 0xf9, 0x64, 0xd0, 0x33, 0xa3, 0xc4, 0xd2, 0xbb, 0x30, + 0x5d, 0x6e, 0x61, 0xc5, 0x8a, 0x5b, 0x2d, 0xbc, 0x39, 0x1f, 0x02, 0x0a, 0x8a, 0x8f, 0xb3, 0x49, + 0x7f, 0x4b, 0x00, 0x24, 0xe1, 0x1d, 0x6c, 0x39, 0xb1, 0x37, 0xe9, 0x32, 0xe4, 0x1c, 0xc5, 0x6a, + 0x62, 0x47, 0x26, 0xee, 0x3c, 0x37, 0x57, 0xcf, 0x05, 0x04, 0x11, 0xa7, 0x7e, 0x61, 0xbb, 0xa5, + 0x2e, 0x34, 0x5c, 0x77, 0xdf, 0x75, 0xce, 0x18, 0x1f, 0x21, 0x73, 0x0d, 0xbc, 0x03, 0x33, 0xa1, + 0x52, 0xc6, 0xa9, 0x02, 0x1d, 0x72, 0x75, 0x55, 0x31, 0xd6, 0x3b, 0x64, 0x1e, 0xb0, 0xd1, 0x6d, + 0x38, 0x63, 0x3b, 0x66, 0x47, 0x56, 0x1c, 0x99, 0xb9, 0x96, 0x8f, 0xcc, 0xae, 0xa1, 0x29, 0xd6, + 0x3e, 0x7d, 0x47, 0x46, 0x9a, 0x21, 0xa9, 0x8b, 0xac, 0x20, 0x4b, 0x3c, 0x89, 0x74, 0xdf, 0xb6, + 0x6e, 0xc8, 0xc4, 0x03, 0x6c, 0x39, 0x36, 0x1f, 0xea, 0xd0, 0xd6, 0x0d, 0x89, 0x51, 0x78, 0x35, + 0xbe, 0x2b, 0xb0, 0x77, 0xc5, 0xa9, 0xe6, 0x37, 0x21, 0x67, 0xab, 0x8a, 0x21, 0x6f, 0x99, 0x56, + 0x5b, 0x71, 0xe8, 0xe8, 0x28, 0x84, 0xd4, 0xec, 0xf9, 0xd5, 0xaa, 0x62, 0xdc, 0xa1, 0x99, 0x24, + 0xb0, 0xbd, 0xff, 0xc1, 0x01, 0x74, 0x2f, 0x95, 0x49, 0x8a, 0xa9, 0xd2, 0x2f, 0x05, 0xc8, 0xb3, + 0x52, 0xc6, 0x39, 0x80, 0x5e, 0x86, 0x94, 0x65, 0xee, 0xb2, 0x01, 0x94, 0xbb, 0xf5, 0x4c, 0x84, + 0x88, 0x15, 0xbc, 0x1f, 0x9c, 0xb9, 0x68, 0x76, 0xb4, 0x04, 0xdc, 0xc3, 0x93, 0x29, 0x77, 0x72, + 0x54, 0x6e, 0x60, 0x5c, 0x12, 0x91, 0x71, 0x15, 0xa6, 0x1e, 0x29, 0x8e, 0xba, 0x4d, 0xda, 0x87, + 0x16, 0x92, 0xcc, 0x72, 0xc9, 0x6b, 0x79, 0xa9, 0x40, 0xc9, 0x6e, 0xd1, 0xed, 0xd2, 0xef, 0xb9, + 0xa3, 0xc1, 0xc6, 0x9f, 0xfe, 0x66, 0xfa, 0x17, 0x81, 0x0f, 0x0a, 0xb7, 0xb0, 0xff, 0xd5, 0x5a, + 0xeb, 0x3b, 0x09, 0x38, 0x5b, 0xde, 0xc6, 0xea, 0xe3, 0xb2, 0x69, 0xd8, 0xba, 0xed, 0x60, 0x43, + 0xdd, 0x8f, 0xb3, 0xc9, 0x9e, 0x81, 0xec, 0xae, 0xee, 0x6c, 0xcb, 0x9a, 0xbe, 0xb5, 0x45, 0x87, + 0x74, 0x46, 0xca, 0x10, 0xc2, 0xb2, 0xbe, 0xb5, 0x85, 0x6e, 0x43, 0xaa, 0x6d, 0x6a, 0xcc, 0x81, + 0x2d, 0xdc, 0x9a, 0x8b, 0x10, 0x4f, 0x8b, 0x66, 0x77, 0xdb, 0xab, 0xa6, 0x86, 0x25, 0x9a, 0x19, + 0x9d, 0x07, 0x50, 0x09, 0xb5, 0x63, 0xea, 0x86, 0xc3, 0x27, 0xb2, 0x00, 0x05, 0x55, 0x21, 0xeb, + 0x60, 0xab, 0xad, 0x1b, 0x8a, 0x43, 0x00, 0x3e, 0x51, 0xde, 0xa5, 0xc8, 0x82, 0x77, 0x5a, 0xba, + 0xaa, 0xf4, 0xad, 0x54, 0xf8, 0xcc, 0xdc, 0xde, 0xbc, 0x97, 0x82, 0x62, 0xbf, 0x86, 0xe2, 0xec, + 0x27, 0x1b, 0x90, 0x66, 0x46, 0x8f, 0xf7, 0x94, 0x5b, 0x83, 0x14, 0x11, 0x51, 0x82, 0x05, 0x66, + 0x1c, 0x79, 0xe1, 0xb9, 0x9c, 0xd9, 0x3f, 0x13, 0x20, 0xcd, 0x12, 0xd0, 0x4d, 0xc8, 0x70, 0x74, + 0xaf, 0xd1, 0x32, 0x26, 0x97, 0xce, 0x1c, 0x1e, 0xcc, 0x4d, 0x30, 0x2c, 0xbf, 0xfc, 0x91, 0xff, + 0x57, 0x9a, 0x60, 0x70, 0x5e, 0x23, 0x6d, 0x66, 0x3b, 0x8a, 0xe5, 0xd0, 0x55, 0x14, 0xd2, 0x66, + 0x79, 0x29, 0x43, 0x09, 0x2b, 0x78, 0x1f, 0xdd, 0x83, 0xb4, 0xed, 0x28, 0x4e, 0xd7, 0xe6, 0xad, + 0x76, 0xac, 0xc2, 0xd6, 0x29, 0xa7, 0xc4, 0x25, 0x10, 0x7f, 0x44, 0xc3, 0x8e, 0xa2, 0xb7, 0x68, + 0x33, 0x66, 0x25, 0xfe, 0x54, 0xfa, 0x96, 0x00, 0x69, 0x96, 0x15, 0x9d, 0x85, 0x19, 0x86, 0xe0, + 0x6b, 0x6b, 0xcb, 0x95, 0x46, 0x45, 0x5a, 0xad, 0xad, 0x2d, 0x36, 0x2a, 0xe2, 0x18, 0x3a, 0x03, + 0xc8, 0x4d, 0x28, 0xaf, 0xaf, 0xd5, 0x6b, 0xf5, 0x46, 0x65, 0x8d, 0x20, 0xff, 0x53, 0x20, 0x32, + 0x7a, 0x80, 0x9a, 0x40, 0x97, 0x60, 0xbe, 0x97, 0x2a, 0xd7, 0x1b, 0x8b, 0x8d, 0xba, 0x5c, 0xa9, + 0x37, 0x6a, 0xab, 0x8b, 0x8d, 0xca, 0xb2, 0x98, 0x1c, 0x92, 0x8b, 0xbc, 0x44, 0x92, 0x2a, 0xe5, + 0x86, 0x98, 0x2a, 0x3d, 0x85, 0xd3, 0x12, 0x56, 0xcd, 0x76, 0xa7, 0xeb, 0x60, 0x52, 0x4a, 0x3b, + 0xce, 0xf1, 0x72, 0x16, 0x26, 0x34, 0x6b, 0x5f, 0xb6, 0xba, 0x06, 0x1f, 0x2d, 0x69, 0xcd, 0xda, + 0x97, 0xba, 0x06, 0xef, 0x8c, 0x7f, 0x2c, 0xc0, 0x99, 0xde, 0x97, 0xc7, 0xd9, 0x15, 0xbf, 0x04, + 0x39, 0x45, 0xd3, 0xb0, 0x26, 0x6b, 0xb8, 0xe5, 0x28, 0xdc, 0xdf, 0xb8, 0x19, 0x90, 0xc4, 0x57, + 0xc0, 0x16, 0xd8, 0xd2, 0xd7, 0x82, 0xb7, 0x02, 0xb6, 0xfa, 0xa0, 0x5c, 0xa6, 0xe5, 0x59, 0x26, + 0x8c, 0xae, 0x45, 0xa2, 0xb2, 0x28, 0xa5, 0xf4, 0xed, 0x14, 0x4c, 0x56, 0x0c, 0xad, 0xb1, 0x17, + 0xeb, 0x8c, 0x70, 0x06, 0xd2, 0xaa, 0xd9, 0x6e, 0xeb, 0x8e, 0xab, 0x2d, 0xf6, 0x84, 0x3e, 0x07, + 0x19, 0x0d, 0x2b, 0x9a, 0xb7, 0x7a, 0x70, 0x94, 0xd3, 0x24, 0x79, 0xd9, 0xd1, 0x57, 0xe0, 0x2c, + 0x31, 0xa4, 0x96, 0xa1, 0xb4, 0x64, 0x26, 0x4d, 0x76, 0x2c, 0xbd, 0xd9, 0xc4, 0x16, 0x5f, 0x6f, + 0xbb, 0x16, 0x51, 0xce, 0x1a, 0xe7, 0x28, 0x53, 0x86, 0x06, 0xcb, 0x2f, 0x9d, 0xd6, 0xa3, 0xc8, + 0xe8, 0x8b, 0xde, 0xf2, 0x8c, 0xdd, 0x51, 0x0c, 0x9b, 0x1b, 0xa9, 0x41, 0xcb, 0x78, 0x5c, 0x97, + 0x7c, 0x4e, 0x20, 0x14, 0x1b, 0xdd, 0x20, 0x9e, 0xfe, 0x93, 0xae, 0x6e, 0x61, 0xf9, 0x66, 0x47, + 0x2d, 0xa6, 0x49, 0xdd, 0x97, 0x0a, 0x87, 0x07, 0x73, 0x20, 0x31, 0xf2, 0xcd, 0x8d, 0x32, 0xf1, + 0xfc, 0xd9, 0xff, 0x8e, 0x8a, 0xae, 0x81, 0x68, 0x98, 0xb2, 0x85, 0xb7, 0x2c, 0x6c, 0x6f, 0xf3, + 0xd7, 0x66, 0xa8, 0xc6, 0x0a, 0x86, 0x29, 0x31, 0x32, 0x13, 0x7d, 0x06, 0xd2, 0x1d, 0x53, 0xb7, + 0x4d, 0xa3, 0x98, 0x65, 0x1a, 0x65, 0x4f, 0xe8, 0x2d, 0x10, 0x75, 0x43, 0xde, 0x6a, 0xe9, 0xcd, + 0x6d, 0x47, 0xde, 0xb5, 0x74, 0x07, 0xdb, 0xc5, 0x69, 0x5a, 0xf0, 0xa8, 0x8e, 0x56, 0xe7, 0x0b, + 0xa1, 0xda, 0xdb, 0x24, 0x27, 0xaf, 0x42, 0x41, 0x37, 0xee, 0x50, 0x7e, 0x4a, 0xb4, 0xbd, 0xe9, + 0x78, 0x42, 0xcc, 0x94, 0xfe, 0x5e, 0x80, 0x82, 0xdb, 0x3d, 0xe2, 0xec, 0xd0, 0xd7, 0x40, 0x34, + 0x0d, 0x2c, 0x77, 0xb6, 0x15, 0x1b, 0xf3, 0xe6, 0xe4, 0x73, 0x46, 0xc1, 0x34, 0xf0, 0x06, 0x21, + 0xb3, 0xc6, 0x41, 0x1b, 0x30, 0x6d, 0x3b, 0x4a, 0x53, 0x37, 0x9a, 0xb2, 0xb7, 0x74, 0x4e, 0xd7, + 0x3f, 0x46, 0x74, 0xb8, 0x45, 0xce, 0xed, 0xd1, 0x43, 0x8e, 0xc6, 0x8f, 0x05, 0x98, 0x5e, 0xd4, + 0xda, 0xba, 0x51, 0xef, 0xb4, 0xf4, 0x58, 0xd1, 0xf9, 0x25, 0xc8, 0xda, 0x44, 0xa6, 0x6f, 0xad, + 0x7d, 0x64, 0x95, 0xa1, 0x29, 0xc4, 0x6c, 0xdf, 0x87, 0x29, 0xbc, 0xd7, 0xd1, 0x2d, 0x85, 0x38, + 0xe8, 0x0c, 0x4c, 0xa4, 0x46, 0xaf, 0x5b, 0xc1, 0xe7, 0xf5, 0x01, 0x05, 0xaf, 0xd9, 0x43, 0x40, + 0xc1, 0x8a, 0xc5, 0x89, 0x2a, 0x64, 0x98, 0xa1, 0xa2, 0x37, 0x0d, 0x3b, 0x66, 0xad, 0x71, 0x73, + 0xfa, 0x65, 0x38, 0x15, 0x7e, 0x41, 0x9c, 0xa5, 0x7f, 0x97, 0xb7, 0xf8, 0x2a, 0xb6, 0x3e, 0x21, + 0x40, 0x1b, 0x14, 0x1f, 0x67, 0xc9, 0xbf, 0x2e, 0xc0, 0x39, 0x2a, 0x9b, 0x6e, 0x40, 0x6c, 0x61, + 0x8b, 0xee, 0xca, 0xc4, 0xd9, 0x69, 0x2f, 0x42, 0x9a, 0xe1, 0x53, 0xda, 0x63, 0xc7, 0x97, 0x72, + 0xc4, 0x11, 0xa9, 0x3b, 0xa6, 0x45, 0x1c, 0x11, 0x9e, 0xc4, 0xeb, 0xa9, 0xc0, 0x6c, 0x54, 0x59, + 0x62, 0x06, 0xf0, 0xd3, 0xdc, 0x1f, 0x24, 0x5d, 0xbc, 0xbc, 0x4d, 0x1c, 0x21, 0x54, 0x81, 0x9c, + 0x4a, 0xff, 0xc9, 0xce, 0x7e, 0x07, 0x53, 0xf9, 0x85, 0x61, 0xae, 0x24, 0x63, 0x6b, 0xec, 0x77, + 0x30, 0xf1, 0x47, 0xdd, 0xff, 0x44, 0x5d, 0x81, 0xaa, 0x0e, 0x75, 0x46, 0xe9, 0xf8, 0xa2, 0x79, + 0x5d, 0x7f, 0x2e, 0xa4, 0x89, 0x3f, 0x49, 0x72, 0x55, 0xb0, 0x37, 0x71, 0xa6, 0x58, 0xdd, 0x8f, + 0x77, 0xe0, 0x8c, 0x86, 0x3b, 0x16, 0x56, 0x15, 0x07, 0x6b, 0x72, 0xb0, 0xfa, 0x89, 0x63, 0x54, + 0xff, 0x94, 0x2f, 0xc3, 0xa7, 0xa2, 0x87, 0x80, 0x02, 0xb2, 0x59, 0xcd, 0x5c, 0x78, 0x73, 0x1c, + 0xa5, 0x4c, 0xfb, 0x52, 0x18, 0xdd, 0x46, 0x65, 0xc8, 0xe0, 0xbd, 0x8e, 0x4c, 0xb7, 0x26, 0x53, + 0xc7, 0xdc, 0x9a, 0x9c, 0xc0, 0x7b, 0x1d, 0x42, 0x44, 0x9b, 0x64, 0x86, 0x73, 0x27, 0x7e, 0x5a, + 0x6c, 0xfb, 0x68, 0xfc, 0xe0, 0xf7, 0x17, 0x2e, 0x6e, 0xca, 0x9b, 0xf3, 0x99, 0x08, 0xde, 0x76, + 0xef, 0x0b, 0xf0, 0x4c, 0x64, 0xdb, 0xc5, 0x39, 0xd9, 0xb9, 0xbb, 0xb3, 0x89, 0x93, 0xec, 0xce, + 0x96, 0x7e, 0xdf, 0x1d, 0xf5, 0x12, 0x6e, 0x99, 0x44, 0xbd, 0x9f, 0xc0, 0x6a, 0xd6, 0x84, 0xdb, + 0xec, 0x89, 0x63, 0x37, 0xbb, 0xcb, 0xda, 0x63, 0x16, 0x7a, 0x0a, 0x1b, 0xa7, 0x59, 0xf8, 0x75, + 0x01, 0x66, 0xaa, 0x58, 0xb1, 0x9c, 0x47, 0x58, 0x71, 0x62, 0x76, 0x5c, 0x5f, 0x86, 0xa4, 0x61, + 0xee, 0x1e, 0x67, 0x41, 0x8f, 0xe4, 0xf7, 0xa7, 0xad, 0x70, 0xb9, 0xe2, 0xac, 0xf5, 0x5f, 0x26, + 0x20, 0x7b, 0xb7, 0x1c, 0x67, 0x5d, 0xdf, 0xe0, 0xcb, 0xbe, 0x6c, 0xa8, 0x47, 0x75, 0x4b, 0xef, + 0x7d, 0x0b, 0x77, 0xcb, 0x2b, 0x78, 0xdf, 0xed, 0x96, 0x84, 0x0b, 0x2d, 0x42, 0xd6, 0xd9, 0x26, + 0xfe, 0xa9, 0xd9, 0xd2, 0x8e, 0xe3, 0xb3, 0xf8, 0x5c, 0xb3, 0x8f, 0x61, 0x9c, 0xca, 0x75, 0x03, + 0x07, 0x84, 0x88, 0xc0, 0x01, 0xf2, 0x1a, 0xcf, 0xed, 0x4b, 0x1c, 0xe7, 0x35, 0x2e, 0x81, 0x35, + 0x8e, 0xe7, 0x1b, 0x8d, 0x8b, 0xe9, 0xd2, 0x5b, 0x00, 0xa4, 0x6a, 0x71, 0x36, 0xcf, 0xaf, 0x26, + 0xa1, 0xb0, 0xd1, 0xb5, 0xb7, 0x63, 0xee, 0x8f, 0x65, 0x80, 0x4e, 0xd7, 0xde, 0xc6, 0x96, 0xec, + 0xec, 0x19, 0xbc, 0xfe, 0x47, 0x84, 0x24, 0xb8, 0x0a, 0x60, 0x7c, 0x8d, 0x3d, 0x03, 0xad, 0x73, + 0x21, 0x58, 0xf6, 0xe3, 0x1a, 0xae, 0x8f, 0x00, 0x1e, 0x1b, 0x7b, 0xc6, 0x2a, 0xf6, 0x50, 0x23, + 0x13, 0x88, 0x89, 0xc0, 0x37, 0x60, 0x82, 0x3c, 0xc8, 0x8e, 0x79, 0x9c, 0x96, 0x4f, 0x13, 0x9e, + 0x86, 0x89, 0x5e, 0x87, 0x2c, 0xe3, 0x26, 0xf3, 0x57, 0x9a, 0xce, 0x5f, 0x51, 0x55, 0xe2, 0xda, + 0xa4, 0x33, 0x57, 0x86, 0xb2, 0x92, 0xd9, 0xea, 0x14, 0x8c, 0x6f, 0x99, 0x96, 0x8a, 0x69, 0x20, + 0x43, 0x46, 0x62, 0x0f, 0xc1, 0xc6, 0xbd, 0x97, 0xca, 0x64, 0xc4, 0xec, 0xbd, 0x54, 0x26, 0x2b, + 0x42, 0xe9, 0x5b, 0x02, 0x4c, 0x79, 0xad, 0x12, 0xa7, 0x49, 0x2f, 0x87, 0x54, 0x7a, 0xfc, 0x76, + 0x21, 0x6a, 0x2c, 0xfd, 0x0d, 0xf5, 0x6f, 0x54, 0x73, 0x87, 0x36, 0x53, 0x9c, 0xdd, 0x66, 0x89, + 0x85, 0xb0, 0x24, 0x4e, 0xd8, 0xd4, 0x34, 0xa8, 0xe5, 0x26, 0x9c, 0xd2, 0xdb, 0xc4, 0xe6, 0xeb, + 0x4e, 0x6b, 0x9f, 0x63, 0x34, 0x07, 0xbb, 0xbb, 0xac, 0x33, 0x7e, 0x5a, 0xd9, 0x4d, 0xe2, 0x66, + 0x90, 0xed, 0xbb, 0xf8, 0xd5, 0x8a, 0x53, 0xef, 0x35, 0x98, 0xb4, 0x98, 0x68, 0xe2, 0xab, 0x1c, + 0x53, 0xf5, 0x79, 0x8f, 0x95, 0x68, 0xff, 0xfb, 0x09, 0x98, 0x7a, 0xab, 0x8b, 0xad, 0xfd, 0x4f, + 0xa1, 0xee, 0xaf, 0xc0, 0xd4, 0xae, 0xa2, 0x3b, 0xf2, 0x96, 0x69, 0xc9, 0xdd, 0x8e, 0xa6, 0x38, + 0x6e, 0xb0, 0xc5, 0x24, 0x21, 0xdf, 0x31, 0xad, 0x4d, 0x4a, 0x44, 0x18, 0xd0, 0x63, 0xc3, 0xdc, + 0x35, 0x64, 0x42, 0xa6, 0x10, 0x79, 0xcf, 0xe0, 0x4b, 0xca, 0x4b, 0xaf, 0xfc, 0xdd, 0xc1, 0xdc, + 0xed, 0x91, 0xc2, 0xa7, 0x68, 0x04, 0x5a, 0xb7, 0xab, 0x6b, 0x0b, 0x9b, 0x9b, 0xb5, 0x65, 0x49, + 0xa4, 0x22, 0xdf, 0x66, 0x12, 0x1b, 0x7b, 0x86, 0x3b, 0xb5, 0x7f, 0x24, 0x80, 0xe8, 0x2b, 0x2c, + 0xce, 0x56, 0xad, 0x40, 0xee, 0x49, 0x17, 0x5b, 0xfa, 0x09, 0xda, 0x14, 0x38, 0x23, 0x31, 0x4b, + 0xef, 0x40, 0x3e, 0xa4, 0x87, 0xe4, 0xc7, 0xd3, 0x43, 0x6e, 0xd7, 0x57, 0x41, 0xe9, 0x47, 0x02, + 0x20, 0x5a, 0xf9, 0x1a, 0x5b, 0xcd, 0xff, 0x94, 0x75, 0x98, 0x6b, 0x20, 0xd2, 0x80, 0x46, 0x59, + 0xdf, 0x92, 0xdb, 0xba, 0x6d, 0xeb, 0x46, 0x93, 0xf7, 0x98, 0x02, 0xa5, 0xd7, 0xb6, 0x56, 0x19, + 0x95, 0xb7, 0xe5, 0xff, 0x84, 0x99, 0x50, 0x6d, 0xe2, 0x6c, 0xcd, 0x0b, 0x90, 0xdf, 0x32, 0xbb, + 0x86, 0x26, 0xb3, 0xa5, 0x31, 0xbe, 0x04, 0x98, 0xa3, 0x34, 0xf6, 0xbe, 0xd2, 0xbf, 0x26, 0xe0, + 0x94, 0x84, 0x6d, 0xb3, 0xb5, 0x83, 0xe3, 0xd7, 0xe7, 0x3a, 0xf0, 0x2d, 0x17, 0xf9, 0xe3, 0xa8, + 0x35, 0xcb, 0x64, 0xb0, 0xe9, 0x2e, 0xbc, 0xb6, 0x7e, 0x69, 0x78, 0xcf, 0xec, 0x5f, 0x4d, 0xe7, + 0x2b, 0x77, 0xa9, 0xd0, 0xca, 0xdd, 0x0e, 0x4c, 0xe9, 0x4d, 0xc3, 0x24, 0x86, 0xcc, 0xc6, 0x4f, + 0x8c, 0x6e, 0xdb, 0x85, 0x35, 0x2f, 0x8f, 0x50, 0xd6, 0x1a, 0xe3, 0xac, 0xe3, 0x27, 0x6b, 0xdd, + 0x36, 0xdb, 0xaf, 0x3d, 0x43, 0x8a, 0x7d, 0x78, 0x30, 0x57, 0x08, 0xa5, 0xd9, 0x52, 0x41, 0xf7, + 0x9e, 0xc9, 0x4b, 0x78, 0x07, 0xf8, 0xef, 0x70, 0xba, 0xa7, 0x01, 0xe2, 0xf4, 0x86, 0xfe, 0x2a, + 0x09, 0xe7, 0xc2, 0xe2, 0xe3, 0xc6, 0x2c, 0xff, 0x49, 0x1a, 0xb9, 0x0a, 0x93, 0x6d, 0xdd, 0x38, + 0xd9, 0xca, 0x65, 0xbe, 0xad, 0x1b, 0x1e, 0x2d, 0xaa, 0xbb, 0xa4, 0xff, 0xfd, 0xba, 0x8b, 0x02, + 0xb3, 0x51, 0xed, 0x19, 0x67, 0x9f, 0x79, 0x4f, 0x80, 0x7c, 0xdc, 0x6b, 0x72, 0x27, 0x8b, 0x28, + 0xe3, 0x75, 0x6e, 0xc0, 0xe4, 0x27, 0xb0, 0x88, 0xf7, 0x3b, 0x02, 0xa0, 0x86, 0xd5, 0x35, 0x08, + 0x38, 0xbe, 0x6f, 0x36, 0xe3, 0xac, 0xec, 0x29, 0x18, 0xd7, 0x0d, 0x0d, 0xef, 0xd1, 0xca, 0xa6, + 0x24, 0xf6, 0x10, 0xda, 0x69, 0x4c, 0x8e, 0xb4, 0xd3, 0xe8, 0x07, 0xa6, 0x84, 0x0a, 0x1a, 0xa7, + 0x16, 0xbe, 0x9f, 0x80, 0x19, 0x5e, 0x9d, 0xd8, 0x17, 0x31, 0x4f, 0x14, 0xce, 0x8e, 0x3e, 0x0f, + 0xd0, 0xb1, 0xf0, 0x8e, 0xcc, 0x58, 0x93, 0x23, 0xb1, 0x66, 0x09, 0x07, 0x25, 0xa0, 0x2f, 0xc1, + 0x14, 0x19, 0xe8, 0x1d, 0xcb, 0xec, 0x98, 0x36, 0xf1, 0x63, 0xec, 0xd1, 0xa0, 0xd1, 0xf4, 0xe1, + 0xc1, 0xdc, 0xe4, 0xaa, 0x6e, 0x6c, 0x70, 0xc6, 0x46, 0x5d, 0x22, 0x16, 0xc3, 0x7b, 0x74, 0x07, + 0xe0, 0xdf, 0x0a, 0x70, 0xea, 0x13, 0x5b, 0xf6, 0xfd, 0x8f, 0xd0, 0x98, 0x37, 0x0f, 0x89, 0xf4, + 0xb1, 0x66, 0x6c, 0x99, 0xf1, 0x2f, 0xc6, 0xbf, 0x27, 0xc0, 0x74, 0x40, 0x7c, 0x9c, 0x5e, 0xce, + 0xc9, 0x0e, 0x4d, 0x7c, 0x99, 0xf8, 0x3d, 0xc1, 0x6e, 0x1f, 0xe7, 0xa0, 0xfa, 0xf3, 0x04, 0x9c, + 0x29, 0xb3, 0x3d, 0x68, 0x37, 0x40, 0x23, 0xce, 0x5e, 0x52, 0x84, 0x89, 0x1d, 0x6c, 0xd9, 0xba, + 0xc9, 0xe6, 0xdb, 0x49, 0xc9, 0x7d, 0x44, 0xb3, 0x90, 0xb1, 0x0d, 0xa5, 0x63, 0x6f, 0x9b, 0xee, + 0x2e, 0x9e, 0xf7, 0xec, 0x05, 0x93, 0x8c, 0x9f, 0x3c, 0x98, 0x24, 0x3d, 0x3c, 0x98, 0x64, 0xe2, + 0x63, 0x07, 0x93, 0xf0, 0x2d, 0xb3, 0x1f, 0x0a, 0x70, 0xb6, 0x4f, 0x7f, 0x71, 0xf6, 0x99, 0xaf, + 0x42, 0x4e, 0xe5, 0x82, 0x89, 0x35, 0x66, 0xbb, 0x82, 0x35, 0x92, 0xed, 0x84, 0x18, 0xe5, 0xf0, + 0x60, 0x0e, 0xdc, 0xa2, 0xd6, 0x96, 0xb9, 0x8a, 0xc8, 0x7f, 0xad, 0xf4, 0xff, 0x73, 0x30, 0x55, + 0xd9, 0x63, 0x6b, 0xde, 0x75, 0xe6, 0x16, 0xa0, 0x3b, 0x90, 0xe9, 0x58, 0xe6, 0x8e, 0xee, 0x56, + 0xa3, 0x10, 0x72, 0x99, 0xdc, 0x6a, 0xf4, 0x70, 0x6d, 0x70, 0x0e, 0xc9, 0xe3, 0x45, 0x0d, 0xc8, + 0xde, 0x37, 0x55, 0xa5, 0x75, 0x47, 0x6f, 0xb9, 0xfd, 0xff, 0xa5, 0xa3, 0x05, 0x2d, 0x78, 0x3c, + 0x1b, 0x8a, 0xb3, 0xed, 0x36, 0x85, 0x47, 0x44, 0x35, 0xc8, 0x54, 0x1d, 0xa7, 0x43, 0x12, 0xb9, + 0x35, 0xb9, 0x3a, 0x82, 0x50, 0xc2, 0xc2, 0x65, 0x79, 0xec, 0xa8, 0x01, 0xd3, 0x77, 0x4d, 0xb3, + 0xd9, 0xc2, 0xe5, 0x96, 0xd9, 0xd5, 0xca, 0xa6, 0xb1, 0xa5, 0x37, 0xb9, 0x3d, 0xbe, 0x32, 0x82, + 0xcc, 0xbb, 0xe5, 0xba, 0xd4, 0x2f, 0x00, 0x2d, 0x42, 0xa6, 0x7e, 0x9b, 0x0b, 0x63, 0x7e, 0xdc, + 0xe5, 0x11, 0x84, 0xd5, 0x6f, 0x4b, 0x1e, 0x1b, 0xba, 0x07, 0xb9, 0xc5, 0xa7, 0x5d, 0x0b, 0x73, + 0x29, 0xe9, 0x81, 0x91, 0x0b, 0xbd, 0x52, 0x28, 0x97, 0x14, 0x64, 0x46, 0x75, 0x28, 0xbc, 0x6d, + 0x5a, 0x8f, 0x5b, 0xa6, 0xe2, 0xd6, 0x70, 0x82, 0x8a, 0xfb, 0xcc, 0x08, 0xe2, 0x5c, 0x46, 0xa9, + 0x47, 0xc4, 0xec, 0x97, 0x60, 0x32, 0xd4, 0x4c, 0x08, 0x41, 0xaa, 0x43, 0x5a, 0x44, 0xa0, 0xa1, + 0x40, 0xf4, 0x3f, 0x7a, 0x11, 0x26, 0x0c, 0x53, 0xc3, 0x6e, 0x1f, 0x9e, 0x5c, 0x3a, 0x75, 0x78, + 0x30, 0x97, 0x5e, 0x33, 0x35, 0xe6, 0x50, 0xf0, 0x7f, 0x52, 0x9a, 0x64, 0x72, 0xdd, 0x89, 0xd9, + 0x2b, 0x90, 0x22, 0xed, 0x43, 0xcc, 0xc8, 0x23, 0xc5, 0xc6, 0x9b, 0x96, 0xce, 0x65, 0xba, 0x8f, + 0x3c, 0xdf, 0x4f, 0x04, 0x48, 0xd4, 0x6f, 0x13, 0x8f, 0xfa, 0x51, 0x57, 0x7d, 0x8c, 0x1d, 0x9e, + 0x8b, 0x3f, 0x51, 0x4f, 0xdb, 0xc2, 0x5b, 0x3a, 0xf3, 0x72, 0xb2, 0x12, 0x7f, 0x42, 0xcf, 0x01, + 0x28, 0xaa, 0x8a, 0x6d, 0x5b, 0x76, 0xcf, 0xa0, 0x65, 0xa5, 0x2c, 0xa3, 0xac, 0xe0, 0x7d, 0xc2, + 0x66, 0x63, 0xd5, 0xc2, 0x8e, 0x1b, 0xd3, 0xc4, 0x9e, 0x08, 0x9b, 0x83, 0xdb, 0x1d, 0xd9, 0x31, + 0x1f, 0x63, 0x83, 0xb6, 0x6a, 0x96, 0x98, 0x87, 0x76, 0xa7, 0x41, 0x08, 0xc4, 0xb2, 0x61, 0x43, + 0xf3, 0xcd, 0x50, 0x56, 0xf2, 0x9e, 0x89, 0x48, 0x0b, 0x37, 0x75, 0x7e, 0xa8, 0x2a, 0x2b, 0xf1, + 0x27, 0xa2, 0x31, 0xa5, 0xeb, 0x6c, 0xd3, 0x40, 0x8e, 0xac, 0x44, 0xff, 0xf3, 0xaa, 0x7d, 0x53, + 0x80, 0xe4, 0xdd, 0x72, 0xfd, 0xd8, 0x75, 0x73, 0x25, 0x26, 0x7d, 0x89, 0x34, 0x94, 0x50, 0x6f, + 0xb5, 0x74, 0xa3, 0x49, 0x9c, 0x8e, 0xaf, 0x62, 0xd5, 0xad, 0x59, 0x81, 0x93, 0x37, 0x18, 0x15, + 0xcd, 0x43, 0x4e, 0xb5, 0xb0, 0x86, 0x0d, 0x47, 0x57, 0x5a, 0x36, 0xaf, 0x62, 0x90, 0xc4, 0x0b, + 0xf7, 0x35, 0x01, 0xc6, 0x69, 0xf7, 0x42, 0xcf, 0x42, 0x56, 0x35, 0x0d, 0x47, 0xd1, 0x0d, 0x6e, + 0x27, 0xb2, 0x92, 0x4f, 0x18, 0x58, 0xc8, 0x0b, 0x90, 0x57, 0x54, 0xd5, 0xec, 0x1a, 0x8e, 0x6c, + 0x28, 0x6d, 0xcc, 0x0b, 0x9b, 0xe3, 0xb4, 0x35, 0xa5, 0x8d, 0xd1, 0x1c, 0xb8, 0x8f, 0xde, 0x49, + 0xc0, 0xac, 0x04, 0x9c, 0xb4, 0x82, 0xf7, 0x79, 0x49, 0x7e, 0x28, 0x40, 0xc6, 0xed, 0x96, 0xa4, + 0x30, 0x4d, 0x6c, 0x60, 0x4b, 0x71, 0x4c, 0xaf, 0x30, 0x1e, 0xa1, 0x77, 0x4e, 0xca, 0xfa, 0x73, + 0xd2, 0x29, 0x18, 0x77, 0x94, 0x47, 0x2d, 0xb7, 0x1c, 0xec, 0x81, 0x2e, 0x1f, 0xb7, 0x94, 0x26, + 0x5b, 0x23, 0xcb, 0x4a, 0xec, 0x81, 0x54, 0x89, 0xc7, 0xae, 0x32, 0xed, 0xf0, 0x27, 0x52, 0x5e, + 0x16, 0xae, 0xf9, 0x08, 0x37, 0x75, 0x83, 0x76, 0x80, 0xa4, 0x04, 0x94, 0xb4, 0x44, 0x28, 0xe8, + 0x19, 0xc8, 0xb2, 0x0c, 0xd8, 0xd0, 0x68, 0x2f, 0x48, 0x4a, 0x19, 0x4a, 0xa8, 0xb8, 0x47, 0x9f, + 0xb8, 0x23, 0xf2, 0x3d, 0x01, 0xa6, 0x59, 0xcc, 0x0d, 0x8b, 0xf3, 0x8c, 0x6f, 0x56, 0x7e, 0x0d, + 0xb2, 0x9a, 0xe2, 0x28, 0xec, 0xe4, 0x61, 0x62, 0xe8, 0xc9, 0x43, 0xd7, 0x4c, 0x92, 0xfc, 0xf4, + 0xf4, 0x21, 0x82, 0x14, 0xf9, 0xcf, 0x4e, 0x6c, 0x4a, 0xf4, 0xbf, 0x1f, 0xc5, 0x10, 0x2c, 0x6e, + 0x9c, 0x5e, 0xca, 0x87, 0xe3, 0x30, 0x59, 0xd9, 0xeb, 0x98, 0x56, 0xcc, 0x8b, 0x68, 0x13, 0x1c, + 0xfc, 0x0e, 0xd9, 0x66, 0xed, 0xb1, 0x82, 0xee, 0x0e, 0x26, 0x67, 0x44, 0x4b, 0x00, 0x2c, 0xc0, + 0x92, 0xc6, 0xe1, 0x24, 0x8f, 0xb1, 0xd9, 0x44, 0xd9, 0x08, 0x15, 0xad, 0x41, 0xae, 0xbd, 0xa3, + 0xaa, 0xf2, 0x96, 0xde, 0x72, 0x78, 0x68, 0x5a, 0x74, 0x2c, 0xf4, 0xea, 0x83, 0x72, 0xf9, 0x0e, + 0xcd, 0xc4, 0x22, 0xc4, 0xfc, 0x67, 0x09, 0x88, 0x04, 0xf6, 0x1f, 0xbd, 0x00, 0xfc, 0xa4, 0x88, + 0x6c, 0xbb, 0xe7, 0xbe, 0x96, 0x26, 0x0f, 0x0f, 0xe6, 0xb2, 0x12, 0xa5, 0xd6, 0xeb, 0x0d, 0x29, + 0xcb, 0x32, 0xd4, 0x6d, 0x07, 0x5d, 0x84, 0x49, 0xb3, 0xad, 0x3b, 0xb2, 0xeb, 0x07, 0x70, 0xd7, + 0x29, 0x4f, 0x88, 0xae, 0x9f, 0x80, 0x1a, 0x70, 0x15, 0x1b, 0x64, 0x34, 0xd0, 0x7a, 0xb2, 0x33, + 0x00, 0xb2, 0xee, 0xb0, 0x11, 0x25, 0x9b, 0x1d, 0x47, 0x6f, 0xeb, 0x4f, 0xe9, 0x46, 0x2f, 0xdf, + 0x64, 0xb9, 0xc8, 0xb2, 0x93, 0xfa, 0xd1, 0x53, 0x01, 0x35, 0x9e, 0x77, 0x3d, 0x90, 0x15, 0x7d, + 0x4d, 0xa0, 0x87, 0x0b, 0x88, 0x22, 0xe5, 0x47, 0xfb, 0x72, 0x8b, 0x4c, 0x22, 0xba, 0xb3, 0x2f, + 0x3f, 0xde, 0x29, 0x66, 0xa8, 0x83, 0xf6, 0xb9, 0xc8, 0x06, 0x09, 0xf4, 0x83, 0x05, 0xb7, 0x59, + 0xf6, 0xef, 0x73, 0xe6, 0x95, 0x9d, 0x8a, 0xe1, 0x58, 0xfb, 0x4b, 0x67, 0x0f, 0x0f, 0xe6, 0x66, + 0xfa, 0x53, 0x1f, 0xd0, 0x03, 0x0b, 0xbd, 0x2c, 0xb3, 0x5f, 0x85, 0xe2, 0x20, 0x49, 0x48, 0xf4, + 0x77, 0x1a, 0xb3, 0x6c, 0x83, 0xf1, 0xd5, 0xf0, 0x0a, 0xc1, 0x08, 0xdd, 0xc6, 0x5d, 0x25, 0x48, + 0xbc, 0xea, 0x8e, 0xee, 0x6f, 0x08, 0x30, 0xb9, 0xd4, 0x6d, 0x3d, 0x5e, 0xef, 0xd4, 0xbb, 0xed, + 0xb6, 0x62, 0xed, 0x13, 0xc3, 0xc0, 0x46, 0xa5, 0xfe, 0x94, 0x85, 0xa8, 0x24, 0xf9, 0xb0, 0xd3, + 0x9f, 0x62, 0x32, 0xec, 0x78, 0x00, 0x3a, 0xa1, 0xb3, 0xe8, 0xf2, 0x8b, 0x30, 0x49, 0xe1, 0xba, + 0x8c, 0x0d, 0xc7, 0xd2, 0x31, 0x5b, 0x85, 0x4a, 0x4a, 0x79, 0x4a, 0xac, 0x30, 0x1a, 0xba, 0x0c, + 0x05, 0x7b, 0xdf, 0x76, 0x70, 0x5b, 0x66, 0xe7, 0xc4, 0x19, 0xc6, 0x4c, 0x4a, 0x93, 0x8c, 0x2a, + 0x31, 0x62, 0xe9, 0xa7, 0x49, 0x28, 0xb8, 0x9a, 0x8d, 0xd3, 0x7d, 0x5d, 0x82, 0xf1, 0x2d, 0xbd, + 0x85, 0xdd, 0x28, 0x81, 0x2b, 0x43, 0x1a, 0x94, 0x07, 0x16, 0x13, 0x2f, 0xc2, 0x05, 0x40, 0x94, + 0x35, 0x8e, 0x31, 0x36, 0xfb, 0xbf, 0x13, 0x90, 0xa2, 0x1e, 0xe3, 0x4d, 0x48, 0x51, 0xb3, 0x27, + 0x8c, 0x62, 0xf6, 0x68, 0x56, 0xcf, 0x9d, 0x49, 0x04, 0xdc, 0x19, 0xe2, 0x1b, 0x6c, 0x2b, 0x2f, + 0xdf, 0xbc, 0x45, 0xc7, 0x57, 0x5e, 0xe2, 0x4f, 0x68, 0x89, 0x86, 0xaf, 0x98, 0x96, 0x83, 0x35, + 0xee, 0xa9, 0x45, 0x59, 0xa6, 0x50, 0xc3, 0xbb, 0x26, 0xd6, 0xe5, 0x43, 0xe7, 0x20, 0x49, 0x06, + 0xee, 0x04, 0xdb, 0xda, 0x3e, 0x3c, 0x98, 0x4b, 0x92, 0x21, 0x4b, 0x68, 0xe8, 0x06, 0xe4, 0xc2, + 0xa3, 0x44, 0xb8, 0x96, 0x65, 0xb6, 0x20, 0xd0, 0xc3, 0xa1, 0xe5, 0xf5, 0x60, 0x86, 0x52, 0xee, + 0xa5, 0x32, 0x29, 0x71, 0xbc, 0xf4, 0x47, 0x29, 0x98, 0xac, 0xb5, 0xe3, 0xb6, 0xa2, 0x8b, 0xe1, + 0x16, 0x8e, 0x72, 0x6f, 0x43, 0x2f, 0x8d, 0x68, 0xe0, 0xd0, 0x7c, 0x94, 0x3c, 0xde, 0x7c, 0x54, + 0x23, 0x1e, 0x15, 0x3f, 0x0b, 0x9f, 0x1c, 0xe0, 0xc9, 0x86, 0xdf, 0xdf, 0x20, 0x86, 0x49, 0x22, + 0x3c, 0x7e, 0xa8, 0x3d, 0x0d, 0x4f, 0x78, 0x93, 0x3a, 0x6e, 0xac, 0x97, 0xa5, 0x47, 0xef, 0x65, + 0x13, 0xd8, 0xd0, 0x68, 0x1f, 0x7b, 0xca, 0xbb, 0xd8, 0x6b, 0x90, 0xd4, 0x74, 0x6b, 0xc8, 0xc5, + 0x0a, 0xd1, 0x73, 0x0a, 0x61, 0x3a, 0xa2, 0xaf, 0xa5, 0x82, 0x7d, 0x2d, 0x88, 0x43, 0x67, 0xd7, + 0x01, 0xfc, 0x7a, 0xa1, 0x79, 0x48, 0x9b, 0x2d, 0xcd, 0x3d, 0x27, 0x30, 0xb9, 0x94, 0x3d, 0x3c, + 0x98, 0x1b, 0x5f, 0x6f, 0x69, 0xb5, 0x65, 0x69, 0xdc, 0x6c, 0x69, 0x35, 0x8d, 0x5e, 0x22, 0x80, + 0x77, 0x65, 0x2f, 0xc6, 0x28, 0x2f, 0x4d, 0x18, 0x78, 0x97, 0xa0, 0xde, 0x9e, 0xd8, 0x07, 0xd2, + 0x71, 0xbe, 0x23, 0x40, 0xc1, 0xd5, 0x61, 0xbc, 0xc6, 0x21, 0xa3, 0xb7, 0xf9, 0x60, 0x49, 0x1e, + 0x6f, 0xb0, 0xb8, 0x7c, 0xfc, 0xa8, 0xe3, 0xd7, 0x05, 0x1e, 0x5f, 0x5a, 0x57, 0x15, 0x87, 0xcc, + 0x87, 0x31, 0x76, 0xf0, 0xe7, 0x41, 0xb4, 0x14, 0x43, 0x33, 0xdb, 0xfa, 0x53, 0xcc, 0x16, 0xae, + 0x6c, 0xbe, 0x3f, 0x35, 0xe5, 0xd1, 0xe9, 0xca, 0x8c, 0xbb, 0xee, 0xf6, 0x0b, 0x81, 0xc7, 0xa2, + 0x7a, 0x85, 0x89, 0x53, 0x69, 0x2b, 0x90, 0xb6, 0x58, 0x44, 0x1b, 0x1b, 0x70, 0x2f, 0x46, 0x08, + 0x89, 0x7a, 0x3b, 0x0b, 0x18, 0xf3, 0xba, 0x3c, 0x15, 0x31, 0xfb, 0x45, 0x18, 0xa7, 0xe4, 0x13, + 0x98, 0x45, 0xae, 0xf9, 0x7f, 0x4c, 0xc0, 0x25, 0xfa, 0xba, 0x07, 0xd8, 0xd2, 0xb7, 0xf6, 0x37, + 0x2c, 0xd3, 0xc1, 0xaa, 0x83, 0x35, 0x3f, 0x1e, 0x3f, 0x56, 0x5b, 0x93, 0xed, 0xb8, 0x2f, 0x38, + 0x56, 0x64, 0x8f, 0xc7, 0x85, 0x56, 0x60, 0x8a, 0x4d, 0x84, 0xb2, 0xd2, 0xd2, 0x77, 0xb0, 0xac, + 0x38, 0xc7, 0x99, 0x51, 0x26, 0x19, 0xef, 0x22, 0x61, 0x5d, 0x74, 0x90, 0x06, 0x59, 0x2e, 0x4c, + 0xd7, 0xf8, 0x25, 0x25, 0x77, 0x3f, 0xde, 0xd2, 0x4c, 0x86, 0x4d, 0xc8, 0xb5, 0x65, 0x29, 0xc3, + 0x24, 0x7b, 0x4b, 0xeb, 0x3f, 0x16, 0xe0, 0xf2, 0x11, 0x8a, 0x8e, 0xb3, 0x9b, 0xcd, 0x42, 0x66, + 0x87, 0xbc, 0x48, 0xe7, 0x9a, 0xce, 0x48, 0xde, 0x33, 0x5a, 0x85, 0xc9, 0x2d, 0x45, 0x6f, 0x61, + 0x4d, 0xe6, 0x3d, 0x71, 0x70, 0x38, 0x58, 0x74, 0x94, 0x62, 0x9e, 0xb1, 0xd3, 0x44, 0xbb, 0xf4, + 0xdb, 0x09, 0x98, 0x5e, 0xd4, 0xb4, 0x7a, 0x9d, 0x5b, 0xb0, 0xf8, 0xfa, 0x8b, 0x0b, 0x56, 0x12, + 0x3e, 0x58, 0x41, 0x2f, 0x02, 0xd2, 0x74, 0x9b, 0xdd, 0x92, 0x60, 0x6f, 0x2b, 0x9a, 0xb9, 0xeb, + 0x6f, 0x7c, 0x4f, 0xbb, 0x29, 0x75, 0x37, 0x01, 0xbd, 0x03, 0xd4, 0xb5, 0x96, 0x6d, 0x47, 0xf1, + 0xd6, 0xe7, 0x5f, 0x38, 0xce, 0x29, 0x1a, 0xe6, 0x7a, 0x7b, 0x8f, 0x52, 0x96, 0x88, 0xa3, 0x7f, + 0xd1, 0x35, 0x10, 0x75, 0xa2, 0x01, 0x47, 0x56, 0x6c, 0xf7, 0x20, 0x06, 0xbb, 0xa6, 0xa1, 0xc0, + 0xe8, 0x8b, 0x76, 0xf0, 0x7c, 0x05, 0x8b, 0x13, 0xf7, 0xf5, 0x14, 0x27, 0xc2, 0xfa, 0x5d, 0x01, + 0x0a, 0xfc, 0xf0, 0x48, 0x9c, 0x0d, 0x70, 0x07, 0xf2, 0xee, 0x49, 0x95, 0x2d, 0xcb, 0x6c, 0x1f, + 0x67, 0xa8, 0xe5, 0x38, 0xe3, 0x1d, 0xcb, 0x6c, 0x87, 0x8e, 0xb5, 0x3f, 0x80, 0x29, 0xaf, 0xa4, + 0x71, 0xaa, 0xe0, 0x7b, 0xf4, 0x00, 0x29, 0x13, 0x1c, 0xf7, 0xd6, 0xf3, 0x27, 0xa1, 0x07, 0xba, + 0x2f, 0x10, 0x2c, 0x6e, 0x9c, 0xca, 0xf8, 0x85, 0x00, 0x85, 0x7a, 0xf7, 0x11, 0xbb, 0xb1, 0x27, + 0x3e, 0x3d, 0x54, 0x20, 0xdb, 0xc2, 0x5b, 0x8e, 0x7c, 0xa2, 0xd8, 0xe6, 0x0c, 0x61, 0xa5, 0xf1, + 0xdd, 0x77, 0x01, 0x2c, 0x7a, 0x7a, 0x89, 0xca, 0x49, 0x1e, 0x53, 0x4e, 0x96, 0xf2, 0xfa, 0xbe, + 0x4e, 0xe9, 0x0f, 0x13, 0x30, 0xe5, 0x55, 0x36, 0x4e, 0x23, 0xfa, 0x3f, 0x42, 0xc6, 0x23, 0x79, + 0x02, 0xe3, 0x31, 0xcd, 0xb7, 0xdc, 0xa3, 0x0d, 0xc8, 0x02, 0xcc, 0x50, 0x87, 0x44, 0x56, 0x3a, + 0x9d, 0x96, 0x8e, 0x35, 0x99, 0xed, 0xe5, 0xa6, 0xe8, 0x5e, 0xee, 0x34, 0x4d, 0x5a, 0x64, 0x29, + 0x35, 0xba, 0xaf, 0x7b, 0x07, 0xf2, 0x5b, 0x16, 0xc6, 0x4f, 0xb1, 0x4c, 0x91, 0xd1, 0x71, 0x22, + 0x0b, 0x72, 0x8c, 0xb1, 0x4e, 0xf8, 0x78, 0x07, 0x7c, 0x17, 0xa6, 0xa9, 0x82, 0xe3, 0x3e, 0x39, + 0xc9, 0x5b, 0xe5, 0x9f, 0x04, 0x40, 0x41, 0xf9, 0x9f, 0x5c, 0xc3, 0x24, 0x62, 0x6f, 0x98, 0x17, + 0x00, 0xb1, 0x20, 0x33, 0x5b, 0xee, 0x60, 0x4b, 0xb6, 0xb1, 0x6a, 0xf2, 0xcb, 0x66, 0x04, 0x49, + 0xe4, 0x29, 0x1b, 0xd8, 0xaa, 0x53, 0x7a, 0xe9, 0xbd, 0x59, 0xc8, 0x73, 0x9d, 0x6c, 0x1a, 0xba, + 0x69, 0xa0, 0x9b, 0x90, 0x6c, 0xf2, 0x95, 0xde, 0x5c, 0xe4, 0x4a, 0x90, 0x7f, 0xe1, 0x55, 0x75, + 0x4c, 0x22, 0x79, 0x09, 0x4b, 0xa7, 0xeb, 0x44, 0x38, 0x45, 0x7e, 0x6c, 0x6c, 0x90, 0xa5, 0xd3, + 0x75, 0x50, 0x1d, 0xa6, 0x54, 0xff, 0xc2, 0x1f, 0x99, 0xb0, 0x27, 0x07, 0x6e, 0x2e, 0x44, 0x5e, + 0x9b, 0x54, 0x1d, 0x93, 0x0a, 0x6a, 0x28, 0x01, 0x95, 0x83, 0x37, 0xcc, 0xb0, 0xe9, 0xf2, 0x62, + 0xe4, 0x29, 0xcb, 0xf0, 0xed, 0x36, 0xd5, 0xb1, 0xc0, 0x45, 0x34, 0xe8, 0x35, 0x48, 0x6b, 0xf4, + 0xe6, 0x12, 0xde, 0x43, 0xa3, 0x3a, 0x51, 0xe8, 0xb2, 0x98, 0xea, 0x98, 0xc4, 0x39, 0xd0, 0x3d, + 0xc8, 0xb3, 0x7f, 0xcc, 0x39, 0xe1, 0x48, 0xee, 0xf2, 0x60, 0x09, 0x01, 0x5b, 0x5f, 0x1d, 0x93, + 0x72, 0x9a, 0x4f, 0x45, 0x9f, 0x85, 0x94, 0xad, 0x2a, 0x06, 0xdf, 0x24, 0x39, 0x3f, 0xe0, 0x7a, + 0x02, 0x9f, 0x99, 0xe6, 0x46, 0xaf, 0xb3, 0x8b, 0xeb, 0x9c, 0x3d, 0x76, 0xf0, 0x32, 0xba, 0xf8, + 0xa1, 0x03, 0xb4, 0xa4, 0xf8, 0x98, 0x12, 0xd0, 0x5d, 0xc8, 0x29, 0xc4, 0xcb, 0x93, 0xe9, 0x31, + 0xb6, 0x22, 0x0c, 0x3c, 0x68, 0xd4, 0x77, 0x04, 0xb1, 0x4a, 0x4f, 0xe9, 0xba, 0x44, 0x5f, 0x50, + 0x1b, 0x5b, 0x4d, 0x5c, 0xcc, 0x0d, 0x17, 0x14, 0x8c, 0xa2, 0xf1, 0x04, 0x51, 0x22, 0xf1, 0xf6, + 0xb6, 0xdd, 0x23, 0x0a, 0xb4, 0x52, 0xf9, 0x81, 0x9b, 0x62, 0x11, 0x47, 0x2c, 0xaa, 0x63, 0x52, + 0x7e, 0x3b, 0x40, 0x46, 0x0b, 0x90, 0x68, 0xaa, 0xc5, 0x49, 0x2a, 0xe3, 0xd9, 0x61, 0x07, 0x08, + 0xaa, 0x63, 0x52, 0xa2, 0xa9, 0x12, 0x54, 0xce, 0x42, 0xbf, 0xf7, 0x8c, 0x62, 0x61, 0xe0, 0x88, + 0x0f, 0xc7, 0xd1, 0x57, 0xc7, 0x24, 0x1a, 0x6d, 0x4e, 0xde, 0xb7, 0x01, 0x05, 0x8b, 0x85, 0x21, + 0xb9, 0xc1, 0x85, 0xe2, 0xc0, 0x8d, 0xc2, 0xa8, 0xf8, 0xc2, 0x2a, 0xf5, 0xfa, 0x03, 0x74, 0xf4, + 0x15, 0x38, 0x15, 0x96, 0xc8, 0x7b, 0xda, 0x74, 0x9f, 0x19, 0x89, 0x96, 0x1b, 0xee, 0x70, 0xc8, + 0xea, 0x4b, 0x44, 0xaf, 0xc0, 0x38, 0x6b, 0x35, 0x44, 0x45, 0x46, 0xed, 0x80, 0xf7, 0x34, 0x18, + 0xcb, 0x4f, 0x3a, 0xbf, 0xc3, 0xe3, 0x6f, 0xe4, 0x96, 0xd9, 0x2c, 0xce, 0x0c, 0xec, 0xfc, 0xfd, + 0xf1, 0x44, 0xa4, 0xf3, 0x3b, 0x3e, 0x95, 0xb4, 0xbb, 0xc5, 0x52, 0x78, 0xb8, 0xc6, 0xa9, 0x81, + 0xed, 0x1e, 0x11, 0x96, 0x53, 0xa5, 0xb1, 0xd3, 0x3e, 0x99, 0x14, 0xcd, 0x62, 0xd7, 0x73, 0xc8, + 0x74, 0x4c, 0x9d, 0x1e, 0x58, 0xb4, 0xfe, 0x2b, 0x47, 0xaa, 0xd4, 0x0d, 0xf2, 0xa8, 0xe8, 0x01, + 0x88, 0xfc, 0xe0, 0xbc, 0xbf, 0x6c, 0x7d, 0x86, 0xca, 0x7b, 0x3e, 0xd2, 0x74, 0x45, 0xc5, 0x37, + 0x54, 0xc7, 0xa4, 0x29, 0x35, 0x9c, 0x82, 0x1e, 0xc2, 0x34, 0x95, 0x27, 0xab, 0xfe, 0x8d, 0x07, + 0xc5, 0x62, 0x5f, 0xa0, 0xe0, 0xe0, 0xcb, 0x11, 0x5c, 0xc9, 0xa2, 0xda, 0x93, 0x44, 0xba, 0xb1, + 0x6e, 0xe8, 0x0e, 0xb5, 0xb2, 0xb3, 0x03, 0xbb, 0x71, 0xf8, 0x82, 0x34, 0xd2, 0x8d, 0x75, 0x46, + 0x21, 0xdd, 0xd8, 0xe1, 0xb1, 0x3c, 0xbc, 0x39, 0x9e, 0x1d, 0xd8, 0x8d, 0xa3, 0x82, 0x7e, 0x48, + 0x37, 0x76, 0x82, 0x74, 0xd2, 0x8d, 0x99, 0x81, 0xe8, 0x91, 0xfb, 0xdc, 0xc0, 0x6e, 0x3c, 0xf0, + 0x20, 0x29, 0xe9, 0xc6, 0x4a, 0x5f, 0x22, 0x5a, 0x06, 0x60, 0xee, 0x89, 0x6e, 0x6c, 0x99, 0xc5, + 0xf3, 0x03, 0x27, 0x83, 0xde, 0x68, 0x1e, 0x32, 0x19, 0xb4, 0x5c, 0x1a, 0x31, 0x64, 0x14, 0x1b, + 0xc9, 0x74, 0x97, 0xac, 0x38, 0x37, 0xd0, 0x90, 0xf5, 0x6d, 0x96, 0x11, 0x43, 0xb6, 0xeb, 0x11, + 0xc9, 0xac, 0xc2, 0xd6, 0x58, 0x8b, 0xf3, 0x83, 0xcd, 0x72, 0x70, 0x77, 0x81, 0x9a, 0x65, 0x4a, + 0x40, 0x8b, 0x90, 0x25, 0xd3, 0xf6, 0x3e, 0x35, 0x43, 0x17, 0x06, 0x3a, 0x9c, 0x3d, 0x87, 0x03, + 0xaa, 0x63, 0x52, 0xe6, 0x09, 0x27, 0x91, 0xd7, 0xb3, 0x55, 0xab, 0x62, 0x69, 0xe0, 0xeb, 0x43, + 0x2b, 0x95, 0xe4, 0xf5, 0x8c, 0x03, 0xa9, 0x70, 0x9a, 0xb5, 0x15, 0x3f, 0xc7, 0x69, 0xf1, 0x43, + 0x87, 0xc5, 0x8b, 0x54, 0xd4, 0xc0, 0x35, 0xa0, 0xc8, 0xe3, 0xa5, 0xd5, 0x31, 0x69, 0x46, 0xe9, + 0x4f, 0x25, 0x03, 0x9e, 0x4f, 0x3d, 0x6c, 0xe5, 0xa8, 0x78, 0x69, 0xe0, 0x80, 0x8f, 0x58, 0x6b, + 0x23, 0x03, 0x5e, 0x09, 0x90, 0xd9, 0x04, 0xa4, 0xc9, 0xb6, 0xcd, 0xf6, 0x54, 0x2f, 0x0f, 0x99, + 0x80, 0x7a, 0xb0, 0x3f, 0x9b, 0x80, 0xb4, 0x3a, 0xe3, 0x24, 0x82, 0xd4, 0x16, 0x56, 0x2c, 0x6e, + 0x66, 0xaf, 0x0c, 0x14, 0xd4, 0x77, 0xe9, 0x18, 0x11, 0xa4, 0x7a, 0x44, 0xe2, 0xf0, 0x58, 0xee, + 0x8d, 0x1b, 0xdc, 0xf5, 0xbb, 0x3a, 0xd0, 0xe1, 0x89, 0xbc, 0x18, 0x84, 0x38, 0x3c, 0x56, 0x28, + 0x01, 0x7d, 0x1e, 0x26, 0x38, 0x42, 0x2b, 0x5e, 0x1b, 0xe2, 0x90, 0x06, 0xa1, 0x35, 0x19, 0xd7, + 0x9c, 0x87, 0x59, 0x59, 0x86, 0x0c, 0x59, 0xf5, 0x9e, 0x1f, 0x62, 0x65, 0xfb, 0xc0, 0x29, 0xb3, + 0xb2, 0x3e, 0x99, 0x58, 0x59, 0xd6, 0x4f, 0xf9, 0x5c, 0x77, 0x7d, 0xa0, 0x95, 0xed, 0x3f, 0x99, + 0x40, 0xac, 0xec, 0x13, 0x9f, 0x4a, 0x6a, 0x66, 0x33, 0x54, 0x54, 0xfc, 0xcc, 0xc0, 0x9a, 0x85, + 0x41, 0x22, 0xa9, 0x19, 0xe7, 0x21, 0xcd, 0xc6, 0x82, 0x48, 0x99, 0xa6, 0x5f, 0x18, 0x7c, 0x64, + 0xba, 0x17, 0x44, 0x54, 0xdd, 0x0b, 0x69, 0x99, 0x86, 0x3d, 0x43, 0x65, 0xf1, 0x03, 0xa2, 0x5c, + 0x53, 0x2f, 0x0e, 0x37, 0x54, 0x51, 0x67, 0x5f, 0x3d, 0x43, 0x15, 0x4a, 0xa4, 0x45, 0x65, 0xe7, + 0x7c, 0xe8, 0xf8, 0x5e, 0x18, 0x72, 0xba, 0xbb, 0xe7, 0xe8, 0x15, 0x2d, 0xaa, 0x47, 0xf4, 0x87, + 0x50, 0x97, 0x5d, 0x43, 0x50, 0xbc, 0x31, 0x7c, 0x08, 0x85, 0xaf, 0x43, 0xf0, 0x86, 0x10, 0x27, + 0x7b, 0x73, 0xa6, 0xeb, 0x61, 0xbc, 0x34, 0x7c, 0xce, 0xec, 0x75, 0x2d, 0xd8, 0x9c, 0xc9, 0x7d, + 0x8a, 0xff, 0x23, 0xc0, 0x3c, 0x2b, 0x1b, 0x5d, 0xc7, 0xdb, 0x97, 0xbd, 0x35, 0xd1, 0x40, 0xa8, + 0xf9, 0x4d, 0xfa, 0x82, 0x57, 0x06, 0x15, 0xf7, 0x88, 0x35, 0xde, 0xea, 0x98, 0xf4, 0x9c, 0x32, + 0x2c, 0xdf, 0xd2, 0x04, 0xdf, 0x39, 0xf5, 0x4e, 0xdc, 0x4d, 0x89, 0xe2, 0xbd, 0x54, 0xe6, 0xac, + 0x58, 0xbc, 0x97, 0xca, 0x9c, 0x13, 0x67, 0xef, 0xa5, 0x32, 0xcf, 0x88, 0xcf, 0x96, 0xfe, 0xf9, + 0x1c, 0x4c, 0xba, 0x18, 0x8e, 0x21, 0xa2, 0x5b, 0x41, 0x44, 0x74, 0x7e, 0x10, 0x22, 0xe2, 0xa8, + 0x8f, 0x43, 0xa2, 0x5b, 0x41, 0x48, 0x74, 0x7e, 0x10, 0x24, 0xf2, 0x79, 0x08, 0x26, 0x6a, 0x0c, + 0xc2, 0x44, 0xcf, 0x8f, 0x80, 0x89, 0x3c, 0x51, 0xbd, 0xa0, 0x68, 0xb9, 0x1f, 0x14, 0x5d, 0x1a, + 0x0e, 0x8a, 0x3c, 0x51, 0x01, 0x54, 0xf4, 0x7a, 0x0f, 0x2a, 0xba, 0x30, 0x04, 0x15, 0x79, 0xfc, + 0x2e, 0x2c, 0x5a, 0x89, 0x84, 0x45, 0x57, 0x8e, 0x82, 0x45, 0x9e, 0x9c, 0x10, 0x2e, 0x7a, 0x39, + 0x84, 0x8b, 0xe6, 0x06, 0xe2, 0x22, 0x8f, 0x9b, 0x01, 0xa3, 0x37, 0x7a, 0x81, 0xd1, 0x85, 0x21, + 0xc0, 0xc8, 0xaf, 0x01, 0x47, 0x46, 0xd5, 0x28, 0x64, 0x74, 0xf9, 0x08, 0x64, 0xe4, 0x49, 0x09, + 0x42, 0xa3, 0x6a, 0x14, 0x34, 0xba, 0x7c, 0x04, 0x34, 0xea, 0x91, 0xc4, 0xb0, 0xd1, 0x5a, 0x34, + 0x36, 0xba, 0x7a, 0x24, 0x36, 0xf2, 0xa4, 0x85, 0xc1, 0xd1, 0x8d, 0x00, 0x38, 0x7a, 0x6e, 0x00, + 0x38, 0xf2, 0x58, 0x09, 0x3a, 0xfa, 0x42, 0x1f, 0x3a, 0x2a, 0x0d, 0x43, 0x47, 0x1e, 0xaf, 0x07, + 0x8f, 0xde, 0x1a, 0x00, 0x8f, 0xae, 0x1d, 0x0d, 0x8f, 0x3c, 0x61, 0x3d, 0xf8, 0x48, 0x19, 0x8a, + 0x8f, 0x5e, 0x1c, 0x11, 0x1f, 0x79, 0xd2, 0xa3, 0x00, 0xd2, 0xab, 0x61, 0x80, 0x34, 0x3f, 0x18, + 0x20, 0x79, 0x62, 0x38, 0x42, 0x5a, 0x89, 0x44, 0x48, 0x57, 0x8e, 0x42, 0x48, 0xfe, 0x38, 0x08, + 0x42, 0xa4, 0xb5, 0x68, 0x88, 0x74, 0xf5, 0x48, 0x88, 0xe4, 0x37, 0x7f, 0x08, 0x23, 0xad, 0x44, + 0x62, 0xa4, 0x2b, 0x47, 0x61, 0x24, 0xbf, 0x70, 0x41, 0x90, 0xf4, 0xf6, 0x40, 0x90, 0x74, 0x7d, + 0x14, 0x90, 0xe4, 0x09, 0xed, 0x43, 0x49, 0xef, 0x0c, 0x46, 0x49, 0x9f, 0x39, 0xc6, 0x15, 0x72, + 0x91, 0x30, 0xe9, 0x0b, 0x7d, 0x30, 0xa9, 0x34, 0x0c, 0x26, 0xf9, 0xfd, 0xd9, 0xc5, 0x49, 0xca, + 0x50, 0x54, 0xf3, 0xe2, 0x88, 0xa8, 0xc6, 0xef, 0x7c, 0x11, 0xb0, 0xa6, 0x12, 0x01, 0x6b, 0x2e, + 0x0d, 0x87, 0x35, 0xbe, 0x39, 0xf7, 0x71, 0x4d, 0x35, 0x0a, 0xd7, 0x5c, 0x3e, 0x02, 0xd7, 0xf8, + 0x56, 0x28, 0x00, 0x6c, 0x5e, 0xef, 0x01, 0x36, 0x17, 0x8e, 0x8c, 0xb2, 0x09, 0x20, 0x9b, 0xa5, + 0x7e, 0x64, 0x73, 0x71, 0x28, 0xb2, 0xf1, 0x24, 0xf8, 0xd0, 0xe6, 0xf5, 0x1e, 0x68, 0x73, 0x61, + 0x08, 0xb4, 0xf1, 0x0b, 0xc0, 0xb1, 0x8d, 0x36, 0x1c, 0xdb, 0x2c, 0x8c, 0x8a, 0x6d, 0x3c, 0xc1, + 0x91, 0xe0, 0x66, 0x2d, 0x1a, 0xdc, 0x5c, 0x1d, 0x71, 0xf7, 0xbc, 0x0f, 0xdd, 0x54, 0xa3, 0xd0, + 0xcd, 0xe5, 0x23, 0xd0, 0x4d, 0x70, 0x0e, 0xf1, 0xe0, 0x4d, 0x35, 0x0a, 0xde, 0x5c, 0x3e, 0x02, + 0xde, 0xf8, 0x92, 0x02, 0xf8, 0xa6, 0x31, 0x08, 0xdf, 0x3c, 0x3f, 0x02, 0xbe, 0xf1, 0x9d, 0x97, + 0x1e, 0x80, 0xf3, 0x66, 0x2f, 0xc0, 0x29, 0x0d, 0x03, 0x38, 0xfe, 0x88, 0x74, 0x11, 0xce, 0x5a, + 0x34, 0xc2, 0xb9, 0x7a, 0x24, 0xc2, 0x09, 0x1a, 0xc9, 0x00, 0xc4, 0x59, 0x89, 0x84, 0x38, 0x57, + 0x8e, 0x82, 0x38, 0xbe, 0x91, 0x0c, 0x62, 0x9c, 0x37, 0x7b, 0x31, 0x4e, 0x69, 0x18, 0xc6, 0xf1, + 0x2b, 0xe7, 0x82, 0x9c, 0x6a, 0x14, 0xc8, 0xb9, 0x7c, 0x04, 0xc8, 0xf1, 0x1b, 0x2f, 0x80, 0x72, + 0x94, 0xa1, 0x28, 0xe7, 0xc5, 0x11, 0x51, 0x4e, 0x8f, 0xe1, 0x0a, 0xc3, 0x9c, 0x6a, 0x14, 0xcc, + 0xb9, 0x7c, 0x04, 0xcc, 0x09, 0x14, 0xd6, 0xc7, 0x39, 0x6b, 0xd1, 0x38, 0xe7, 0xea, 0x91, 0x38, + 0xa7, 0x67, 0x34, 0xb9, 0x40, 0x67, 0x25, 0x12, 0xe8, 0x5c, 0x39, 0x0a, 0xe8, 0xf4, 0x4c, 0x7c, + 0xdc, 0x39, 0xf8, 0xbf, 0xa3, 0x23, 0x9d, 0x57, 0x8f, 0x8f, 0x74, 0xbc, 0x77, 0xc6, 0x02, 0x75, + 0xee, 0xa5, 0x32, 0xcf, 0x8a, 0xcf, 0x95, 0x7e, 0x39, 0x0e, 0xe9, 0xaa, 0x17, 0xe3, 0xe2, 0x97, + 0x52, 0x38, 0xc9, 0xed, 0x35, 0x68, 0x99, 0x8c, 0x58, 0x6a, 0xf7, 0x8e, 0xbe, 0xa8, 0xac, 0xff, + 0x12, 0x2d, 0xce, 0x7a, 0x82, 0x43, 0xa0, 0xe8, 0x65, 0x98, 0xec, 0xda, 0xd8, 0x92, 0x3b, 0x96, + 0x6e, 0x5a, 0xba, 0xc3, 0xc2, 0xf5, 0x85, 0x25, 0xf1, 0xa3, 0x83, 0xb9, 0xfc, 0xa6, 0x8d, 0xad, + 0x0d, 0x4e, 0x97, 0xf2, 0xdd, 0xc0, 0x93, 0xfb, 0xf5, 0x9c, 0xf1, 0xd1, 0xbf, 0x9e, 0xf3, 0x16, + 0x88, 0x16, 0x56, 0xb4, 0x90, 0x07, 0xc2, 0xae, 0x85, 0x89, 0xee, 0x33, 0xf4, 0xac, 0x8a, 0x9b, + 0x93, 0x5e, 0x0f, 0x33, 0x65, 0x85, 0x89, 0xe8, 0x26, 0x9c, 0x6e, 0x2b, 0x7b, 0x34, 0x06, 0x51, + 0x76, 0x9d, 0x3a, 0x1a, 0x57, 0x98, 0xa1, 0xf1, 0xb2, 0xa8, 0xad, 0xec, 0xd1, 0x4f, 0xf1, 0xb0, + 0x24, 0x7a, 0x09, 0xff, 0x65, 0x28, 0x68, 0xba, 0xed, 0xe8, 0x86, 0xea, 0xde, 0xff, 0xc9, 0x2e, + 0xda, 0x9c, 0x74, 0xa9, 0xec, 0x1e, 0xce, 0xeb, 0x30, 0xcd, 0xe3, 0xb1, 0xfd, 0x8f, 0xf3, 0x50, + 0xf8, 0x92, 0x21, 0xa5, 0x20, 0x09, 0xfe, 0x57, 0x99, 0xca, 0x30, 0xd5, 0x54, 0x1c, 0xbc, 0xab, + 0xec, 0xcb, 0xee, 0x71, 0x99, 0x1c, 0xbd, 0x56, 0xef, 0x99, 0xc3, 0x83, 0xb9, 0xc9, 0xbb, 0x2c, + 0xa9, 0xef, 0xd4, 0xcc, 0x64, 0x33, 0x90, 0xa0, 0xa1, 0x45, 0xc8, 0xd3, 0xcb, 0xb5, 0x4d, 0x76, + 0x87, 0x3b, 0x07, 0x25, 0x83, 0xb6, 0xaf, 0xf8, 0x4d, 0xef, 0x12, 0xbd, 0x90, 0xdb, 0xbd, 0xf6, + 0xfd, 0x2a, 0x4c, 0x29, 0xf6, 0xbe, 0xa1, 0x52, 0x0d, 0x63, 0xc3, 0xee, 0xda, 0x14, 0x95, 0x64, + 0xa4, 0x02, 0x25, 0x97, 0x5d, 0x2a, 0x7a, 0x15, 0xce, 0x69, 0x98, 0xb8, 0x59, 0xcc, 0x97, 0x71, + 0x4c, 0x53, 0x36, 0x5b, 0x9a, 0x4c, 0x6f, 0x90, 0xa0, 0x88, 0x24, 0x23, 0x9d, 0xa6, 0x19, 0xa8, + 0x17, 0xd3, 0x30, 0xcd, 0xf5, 0x96, 0x56, 0x21, 0x89, 0xfc, 0xb6, 0xd0, 0x5f, 0x13, 0x20, 0x1f, + 0x3a, 0xe0, 0xf0, 0x7a, 0xcf, 0xfe, 0xee, 0xb9, 0x68, 0x2c, 0x35, 0x28, 0x40, 0x2c, 0xc3, 0xdb, + 0xce, 0x0d, 0x8f, 0x9b, 0x1b, 0xec, 0x8b, 0xd3, 0x95, 0x05, 0x37, 0xb6, 0xc0, 0x65, 0x7b, 0x2d, + 0xf5, 0x1b, 0xef, 0xcf, 0x8d, 0x95, 0x7e, 0x9e, 0x84, 0xc9, 0xf0, 0x41, 0x86, 0x5a, 0x4f, 0xb9, + 0xa2, 0x6c, 0x5d, 0x88, 0x63, 0x61, 0xc8, 0xe5, 0x69, 0x59, 0xff, 0x32, 0x6f, 0x56, 0xcc, 0xf9, + 0x21, 0xbb, 0xd8, 0xc1, 0x72, 0xfa, 0x8c, 0xb3, 0x3f, 0x48, 0x78, 0x36, 0x63, 0x01, 0xc6, 0x99, + 0xc2, 0x85, 0x81, 0x07, 0x4b, 0xa9, 0xce, 0x25, 0x96, 0x8d, 0xd8, 0x98, 0xc6, 0x89, 0x6e, 0xc8, + 0xf2, 0xef, 0x16, 0x38, 0xfe, 0x17, 0xaf, 0xf8, 0x3d, 0x69, 0xe3, 0xc7, 0xbb, 0x27, 0x8d, 0xed, + 0x52, 0xb7, 0x5a, 0xcc, 0x7e, 0xb3, 0x51, 0x96, 0xee, 0x3b, 0xbd, 0x49, 0x45, 0xf0, 0x0f, 0xa2, + 0x2d, 0x48, 0xfc, 0x83, 0x68, 0x81, 0x88, 0xc5, 0x82, 0x27, 0x82, 0x0e, 0x49, 0x16, 0xd7, 0xca, + 0x9b, 0xfa, 0x3b, 0x02, 0x88, 0x74, 0x00, 0xde, 0xc1, 0x58, 0x8b, 0xa5, 0x17, 0xba, 0xc1, 0x94, + 0x89, 0xd1, 0x63, 0xcc, 0x43, 0x97, 0xab, 0x27, 0xc3, 0x97, 0xab, 0x97, 0xde, 0x17, 0xa0, 0xe0, + 0x95, 0x90, 0x7d, 0xfe, 0x67, 0xc8, 0xf5, 0x67, 0x27, 0xfb, 0x22, 0x8e, 0x7b, 0x32, 0x7b, 0xa4, + 0xef, 0x10, 0x05, 0x4f, 0x66, 0xb3, 0xaf, 0xb7, 0x7c, 0x5b, 0x80, 0x19, 0xaf, 0x88, 0x65, 0xff, + 0xd4, 0xed, 0x09, 0xc2, 0xed, 0x25, 0xfa, 0x65, 0x34, 0x82, 0xf8, 0xe9, 0x91, 0xf8, 0x91, 0xba, + 0x27, 0xe2, 0xd1, 0x18, 0xc0, 0x57, 0x12, 0xb4, 0x46, 0x9d, 0x7e, 0x33, 0x8d, 0xfd, 0xb7, 0x4b, + 0x77, 0x02, 0x0a, 0xa4, 0x23, 0x81, 0x68, 0x69, 0xa4, 0x21, 0xe3, 0x6a, 0x89, 0x66, 0x2e, 0xfd, + 0x28, 0xd8, 0x12, 0x95, 0x1d, 0xe2, 0x41, 0xde, 0x86, 0xe4, 0x8e, 0xd2, 0x1a, 0x16, 0x8c, 0x12, + 0x6a, 0x39, 0x89, 0xe4, 0x46, 0x77, 0x42, 0x87, 0x95, 0x13, 0x83, 0xbd, 0x9d, 0x7e, 0x95, 0x86, + 0x0e, 0x35, 0xbf, 0xe2, 0xd6, 0x22, 0x79, 0xf4, 0xeb, 0x83, 0x16, 0xe0, 0xb5, 0xd4, 0x07, 0xef, + 0xcf, 0x09, 0xd7, 0xeb, 0x30, 0x13, 0x31, 0x37, 0xa2, 0x02, 0x40, 0xe0, 0xca, 0x75, 0xfe, 0x61, + 0xb6, 0xc5, 0x65, 0x79, 0x73, 0xad, 0xbc, 0xbe, 0xba, 0x5a, 0x6b, 0x34, 0x2a, 0xcb, 0xa2, 0x80, + 0x44, 0xc8, 0x87, 0x2e, 0x6c, 0xe7, 0xdf, 0x63, 0xbb, 0xfe, 0xdf, 0x00, 0xfc, 0x8f, 0x36, 0x10, + 0x59, 0x2b, 0x95, 0x87, 0xf2, 0x83, 0xc5, 0xfb, 0x9b, 0x95, 0xba, 0x38, 0x86, 0x10, 0x14, 0x96, + 0x16, 0x1b, 0xe5, 0xaa, 0x2c, 0x55, 0xea, 0x1b, 0xeb, 0x6b, 0xf5, 0x8a, 0x28, 0x70, 0xbe, 0x65, + 0xc8, 0x07, 0x8f, 0x75, 0xa3, 0x19, 0x98, 0x2a, 0x57, 0x2b, 0xe5, 0x15, 0xf9, 0x41, 0x6d, 0x51, + 0x7e, 0x6b, 0xb3, 0xb2, 0x59, 0x11, 0xc7, 0x68, 0xd1, 0x28, 0xf1, 0xce, 0xe6, 0xfd, 0xfb, 0xa2, + 0x80, 0xa6, 0x20, 0xc7, 0x9e, 0xe9, 0xe5, 0xee, 0x62, 0xe2, 0xfa, 0x2a, 0xe4, 0x02, 0xb7, 0xc0, + 0x91, 0xd7, 0x6d, 0x6c, 0xd6, 0xab, 0x72, 0xa3, 0xb6, 0x5a, 0xa9, 0x37, 0x16, 0x57, 0x37, 0x98, + 0x0c, 0x4a, 0x5b, 0x5c, 0x5a, 0x97, 0x1a, 0xa2, 0xe0, 0x3d, 0x37, 0xd6, 0x37, 0xcb, 0x55, 0xef, + 0xb3, 0x72, 0xa9, 0x4c, 0x52, 0x4c, 0x5e, 0x7f, 0x02, 0x67, 0x07, 0x9c, 0x6d, 0x46, 0x39, 0x98, + 0xd8, 0x34, 0xe8, 0xbd, 0x57, 0xe2, 0x18, 0x9a, 0x0c, 0x1c, 0x6f, 0x16, 0x05, 0x94, 0x61, 0x07, + 0x57, 0xc5, 0x04, 0x4a, 0x43, 0xa2, 0x7e, 0x5b, 0x4c, 0x92, 0x82, 0x06, 0x4e, 0x07, 0x8b, 0x29, + 0x94, 0xe5, 0x47, 0x27, 0xc5, 0x71, 0x94, 0xf7, 0xcf, 0x2e, 0x8a, 0xe9, 0xeb, 0x17, 0x20, 0x70, + 0xb0, 0x0b, 0x01, 0xa4, 0xef, 0x2b, 0x0e, 0xb6, 0x1d, 0x71, 0x0c, 0x4d, 0x40, 0x72, 0xb1, 0xd5, + 0x12, 0x85, 0x5b, 0x7f, 0x20, 0x40, 0xc6, 0xbd, 0xa7, 0x1c, 0xdd, 0x87, 0x71, 0xb6, 0x0c, 0x30, + 0x37, 0x78, 0x46, 0xa2, 0x46, 0x6d, 0x76, 0xfe, 0xa8, 0x29, 0xab, 0x34, 0x86, 0xde, 0xe6, 0xdf, + 0x88, 0x24, 0x3d, 0x06, 0x5d, 0x1c, 0xd6, 0x9f, 0x5c, 0xa9, 0xc3, 0x3b, 0x1d, 0x19, 0x23, 0xa5, + 0xb1, 0x97, 0x84, 0xa5, 0xe7, 0x3f, 0xf8, 0xe9, 0xf9, 0xb1, 0x0f, 0x0e, 0xcf, 0x0b, 0x1f, 0x1e, + 0x9e, 0x17, 0x7e, 0x72, 0x78, 0x5e, 0xf8, 0x87, 0xc3, 0xf3, 0xc2, 0xaf, 0xfc, 0xec, 0xfc, 0xd8, + 0x87, 0x3f, 0x3b, 0x3f, 0xf6, 0x93, 0x9f, 0x9d, 0x1f, 0x7b, 0x67, 0x82, 0x73, 0x3f, 0x4a, 0xd3, + 0xcf, 0x55, 0xde, 0xfe, 0xb7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x59, 0x35, 0x5f, 0xb3, 0x73, + 0x00, 0x00, } diff --git a/pkg/roachpb/api.proto b/pkg/roachpb/api.proto index 39756b8125b0..c288cab57b9c 100644 --- a/pkg/roachpb/api.proto +++ b/pkg/roachpb/api.proto @@ -1039,6 +1039,11 @@ message ResolveIntentRequest { // Optionally poison the abort span for the transaction the intent's // range. bool poison = 4; + // The list of ignored seqnum ranges as per the Transaction record. + repeated storage.engine.enginepb.IgnoredSeqNumRange ignored_seqnums = 5 [ + (gogoproto.nullable) = false, + (gogoproto.customname) = "IgnoredSeqNums" + ]; } // A ResolveIntentResponse is the return value from the @@ -1066,6 +1071,11 @@ message ResolveIntentRangeRequest { // transaction. If present, this value can be used to optimize the // iteration over the span to find intents to resolve. util.hlc.Timestamp min_timestamp = 5 [(gogoproto.nullable) = false]; + // The list of ignored seqnum ranges as per the Transaction record. + repeated storage.engine.enginepb.IgnoredSeqNumRange ignored_seqnums = 6 [ + (gogoproto.nullable) = false, + (gogoproto.customname) = "IgnoredSeqNums" + ]; } // A ResolveIntentRangeResponse is the return value from the diff --git a/pkg/roachpb/data.go b/pkg/roachpb/data.go index 786ecfbf8936..8fa33864339e 100644 --- a/pkg/roachpb/data.go +++ b/pkg/roachpb/data.go @@ -935,6 +935,7 @@ func (t *Transaction) Restart( t.CommitTimestampFixed = false t.IntentSpans = nil t.InFlightWrites = nil + t.IgnoredSeqNums = nil } // BumpEpoch increments the transaction's epoch, allowing for an in-place @@ -984,6 +985,7 @@ func (t *Transaction) Update(o *Transaction) { t.Sequence = o.Sequence t.IntentSpans = o.IntentSpans t.InFlightWrites = o.InFlightWrites + t.IgnoredSeqNums = o.IgnoredSeqNums } else if t.Epoch == o.Epoch { // Forward all epoch-scoped state. switch t.Status { @@ -1020,6 +1022,9 @@ func (t *Transaction) Update(o *Transaction) { if len(o.InFlightWrites) > 0 { t.InFlightWrites = o.InFlightWrites } + if len(o.IgnoredSeqNums) > 0 { + t.IgnoredSeqNums = o.IgnoredSeqNums + } } else /* t.Epoch > o.Epoch */ { // Ignore epoch-specific state from previous epoch. if o.Status == COMMITTED { @@ -1084,6 +1089,9 @@ func (t Transaction) String() string { if nw := len(t.InFlightWrites); t.Status != PENDING && nw > 0 { fmt.Fprintf(&buf, " ifw=%d", nw) } + if ni := len(t.IgnoredSeqNums); ni > 0 { + fmt.Fprintf(&buf, " isn=%d", ni) + } return buf.String() } @@ -1104,6 +1112,9 @@ func (t Transaction) SafeMessage() string { if nw := len(t.InFlightWrites); t.Status != PENDING && nw > 0 { fmt.Fprintf(&buf, " ifw=%d", nw) } + if ni := len(t.IgnoredSeqNums); ni > 0 { + fmt.Fprintf(&buf, " isn=%d", ni) + } return buf.String() } @@ -1150,6 +1161,7 @@ func (t *Transaction) AsRecord() TransactionRecord { tr.LastHeartbeat = t.LastHeartbeat tr.IntentSpans = t.IntentSpans tr.InFlightWrites = t.InFlightWrites + tr.IgnoredSeqNums = t.IgnoredSeqNums return tr } @@ -1163,6 +1175,7 @@ func (tr *TransactionRecord) AsTransaction() Transaction { t.LastHeartbeat = tr.LastHeartbeat t.IntentSpans = tr.IntentSpans t.InFlightWrites = tr.InFlightWrites + t.IgnoredSeqNums = tr.IgnoredSeqNums return t } @@ -1772,11 +1785,8 @@ func (l *Lease) Equal(that interface{}) bool { func AsIntents(spans []Span, txn *Transaction) []Intent { ret := make([]Intent, len(spans)) for i := range spans { - ret[i] = Intent{ - Span: spans[i], - Txn: txn.TxnMeta, - Status: txn.Status, - } + ret[i] = Intent{Span: spans[i]} + ret[i].SetTxn(txn) } return ret } @@ -2117,3 +2127,28 @@ func init() { enginepb.FormatBytesAsKey = func(k []byte) string { return Key(k).String() } enginepb.FormatBytesAsValue = func(v []byte) string { return Value{RawBytes: v}.PrettyPrint() } } + +// MakeIntent makes an intent from the given span and txn. +func MakeIntent(txn *Transaction, span Span) Intent { + intent := Intent{Span: span} + intent.SetTxn(txn) + return intent +} + +// MakePendingIntent makes an intent in the pending state with the +// given span and txn. This is suitable for use when constructing +// WriteIntentError. +func MakePendingIntent(txn *enginepb.TxnMeta, span Span) Intent { + return Intent{ + Span: span, + Txn: *txn, + Status: PENDING, + } +} + +// SetTxn updates the transaction details in the intent. +func (i *Intent) SetTxn(txn *Transaction) { + i.Txn = txn.TxnMeta + i.Status = txn.Status + i.IgnoredSeqNums = txn.IgnoredSeqNums +} diff --git a/pkg/roachpb/data.pb.go b/pkg/roachpb/data.pb.go index ef741616b676..4b061c303c86 100644 --- a/pkg/roachpb/data.pb.go +++ b/pkg/roachpb/data.pb.go @@ -90,7 +90,7 @@ func (x ValueType) String() string { return proto.EnumName(ValueType_name, int32(x)) } func (ValueType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_data_b2089b7a94e3b188, []int{0} + return fileDescriptor_data_19a513c0378cb1f2, []int{0} } // ReplicaChangeType is a parameter of ChangeReplicasTrigger. @@ -114,7 +114,7 @@ func (x ReplicaChangeType) String() string { return proto.EnumName(ReplicaChangeType_name, int32(x)) } func (ReplicaChangeType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_data_b2089b7a94e3b188, []int{1} + return fileDescriptor_data_19a513c0378cb1f2, []int{1} } // TransactionStatus specifies possible states for a transaction. @@ -166,7 +166,7 @@ func (x TransactionStatus) String() string { return proto.EnumName(TransactionStatus_name, int32(x)) } func (TransactionStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_data_b2089b7a94e3b188, []int{2} + return fileDescriptor_data_19a513c0378cb1f2, []int{2} } // Span is a key range with an inclusive start Key and an exclusive end Key. @@ -183,7 +183,7 @@ type Span struct { func (m *Span) Reset() { *m = Span{} } func (*Span) ProtoMessage() {} func (*Span) Descriptor() ([]byte, []int) { - return fileDescriptor_data_b2089b7a94e3b188, []int{0} + return fileDescriptor_data_19a513c0378cb1f2, []int{0} } func (m *Span) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -235,7 +235,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_b2089b7a94e3b188, []int{1} + return fileDescriptor_data_19a513c0378cb1f2, []int{1} } func (m *Value) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -271,7 +271,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_b2089b7a94e3b188, []int{2} + return fileDescriptor_data_19a513c0378cb1f2, []int{2} } func (m *KeyValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -309,7 +309,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_b2089b7a94e3b188, []int{3} + return fileDescriptor_data_19a513c0378cb1f2, []int{3} } func (m *StoreIdent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -349,7 +349,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_b2089b7a94e3b188, []int{4} + return fileDescriptor_data_19a513c0378cb1f2, []int{4} } func (m *SplitTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -397,7 +397,7 @@ 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_b2089b7a94e3b188, []int{5} + return fileDescriptor_data_19a513c0378cb1f2, []int{5} } func (m *MergeTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -467,7 +467,7 @@ type ChangeReplicasTrigger struct { func (m *ChangeReplicasTrigger) Reset() { *m = ChangeReplicasTrigger{} } func (*ChangeReplicasTrigger) ProtoMessage() {} func (*ChangeReplicasTrigger) Descriptor() ([]byte, []int) { - return fileDescriptor_data_b2089b7a94e3b188, []int{6} + return fileDescriptor_data_19a513c0378cb1f2, []int{6} } func (m *ChangeReplicasTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -509,7 +509,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_b2089b7a94e3b188, []int{7} + return fileDescriptor_data_19a513c0378cb1f2, []int{7} } func (m *ModifiedSpanTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -555,7 +555,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_b2089b7a94e3b188, []int{8} + return fileDescriptor_data_19a513c0378cb1f2, []int{8} } func (m *StickyBitTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -594,7 +594,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_b2089b7a94e3b188, []int{9} + return fileDescriptor_data_19a513c0378cb1f2, []int{9} } func (m *InternalCommitTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -663,7 +663,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_b2089b7a94e3b188, []int{10} + return fileDescriptor_data_19a513c0378cb1f2, []int{10} } func (m *ObservedTimestamp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -882,12 +882,19 @@ type Transaction struct { // treated as immutable and all updates should be performed on a copy of the // slice. InFlightWrites []SequencedWrite `protobuf:"bytes,17,rep,name=in_flight_writes,json=inFlightWrites,proto3" json:"in_flight_writes"` + // A list of ignored seqnum ranges. + // + // The user code must guarantee this list to be non-overlapping, + // non-contiguous (i.e. it must coalesce ranges to avoid situations + // where a range's end seqnum is equal to the next range's start + // seqnum), and sorted in seqnum order. + IgnoredSeqNums []enginepb.IgnoredSeqNumRange `protobuf:"bytes,18,rep,name=ignored_seqnums,json=ignoredSeqnums,proto3" json:"ignored_seqnums"` } func (m *Transaction) Reset() { *m = Transaction{} } func (*Transaction) ProtoMessage() {} func (*Transaction) Descriptor() ([]byte, []int) { - return fileDescriptor_data_b2089b7a94e3b188, []int{11} + return fileDescriptor_data_19a513c0378cb1f2, []int{11} } func (m *Transaction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -927,17 +934,18 @@ var xxx_messageInfo_Transaction proto.InternalMessageInfo type TransactionRecord struct { // See comments on Transaction proto. enginepb.TxnMeta `protobuf:"bytes,1,opt,name=meta,proto3,embedded=meta" json:"meta"` - Status TransactionStatus `protobuf:"varint,4,opt,name=status,proto3,enum=cockroach.roachpb.TransactionStatus" json:"status,omitempty"` - LastHeartbeat hlc.Timestamp `protobuf:"bytes,5,opt,name=last_heartbeat,json=lastHeartbeat,proto3" json:"last_heartbeat"` - IntentSpans []Span `protobuf:"bytes,11,rep,name=intent_spans,json=intentSpans,proto3" json:"intent_spans"` - InFlightWrites []SequencedWrite `protobuf:"bytes,17,rep,name=in_flight_writes,json=inFlightWrites,proto3" json:"in_flight_writes"` + Status TransactionStatus `protobuf:"varint,4,opt,name=status,proto3,enum=cockroach.roachpb.TransactionStatus" json:"status,omitempty"` + LastHeartbeat hlc.Timestamp `protobuf:"bytes,5,opt,name=last_heartbeat,json=lastHeartbeat,proto3" json:"last_heartbeat"` + IntentSpans []Span `protobuf:"bytes,11,rep,name=intent_spans,json=intentSpans,proto3" json:"intent_spans"` + InFlightWrites []SequencedWrite `protobuf:"bytes,17,rep,name=in_flight_writes,json=inFlightWrites,proto3" json:"in_flight_writes"` + IgnoredSeqNums []enginepb.IgnoredSeqNumRange `protobuf:"bytes,18,rep,name=ignored_seqnums,json=ignoredSeqnums,proto3" json:"ignored_seqnums"` } 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_b2089b7a94e3b188, []int{12} + return fileDescriptor_data_19a513c0378cb1f2, []int{12} } func (m *TransactionRecord) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -963,17 +971,29 @@ func (m *TransactionRecord) XXX_DiscardUnknown() { var xxx_messageInfo_TransactionRecord proto.InternalMessageInfo // A Intent is a Span together with a Transaction metadata and its status. +// +// Intents are used for two separate purposes: +// - on the return path of e.g. scans, to report the existence of a +// write intent on a key; +// - as input argument to intent resolution, to pass the current txn status, +// timestamps and ignored seqnum ranges to the resolution algorithm. +// Only in the latter case are the TxnMeta, status and ignored seqnum +// ranges guaranteed to be consistent with the latest txn's state. +// +// Note: avoid constructing Intent directly; consider using +// MakeIntent() or MakeErrorIntent() instead. type Intent struct { - Span `protobuf:"bytes,1,opt,name=span,proto3,embedded=span" json:"span"` - Txn enginepb.TxnMeta `protobuf:"bytes,2,opt,name=txn,proto3" json:"txn"` - Status TransactionStatus `protobuf:"varint,3,opt,name=status,proto3,enum=cockroach.roachpb.TransactionStatus" json:"status,omitempty"` + Span `protobuf:"bytes,1,opt,name=span,proto3,embedded=span" json:"span"` + Txn enginepb.TxnMeta `protobuf:"bytes,2,opt,name=txn,proto3" json:"txn"` + Status TransactionStatus `protobuf:"varint,3,opt,name=status,proto3,enum=cockroach.roachpb.TransactionStatus" json:"status,omitempty"` + IgnoredSeqNums []enginepb.IgnoredSeqNumRange `protobuf:"bytes,4,rep,name=ignored_seqnums,json=ignoredSeqnums,proto3" json:"ignored_seqnums"` } 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_b2089b7a94e3b188, []int{13} + return fileDescriptor_data_19a513c0378cb1f2, []int{13} } func (m *Intent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1010,7 +1030,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_b2089b7a94e3b188, []int{14} + return fileDescriptor_data_19a513c0378cb1f2, []int{14} } func (m *SequencedWrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1074,7 +1094,7 @@ type Lease struct { func (m *Lease) Reset() { *m = Lease{} } func (*Lease) ProtoMessage() {} func (*Lease) Descriptor() ([]byte, []int) { - return fileDescriptor_data_b2089b7a94e3b188, []int{15} + return fileDescriptor_data_19a513c0378cb1f2, []int{15} } func (m *Lease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1119,7 +1139,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_b2089b7a94e3b188, []int{16} + return fileDescriptor_data_19a513c0378cb1f2, []int{16} } func (m *AbortSpanEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1176,7 +1196,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_b2089b7a94e3b188, []int{17} + return fileDescriptor_data_19a513c0378cb1f2, []int{17} } func (m *LeafTxnInputState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1229,7 +1249,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_b2089b7a94e3b188, []int{18} + return fileDescriptor_data_19a513c0378cb1f2, []int{18} } func (m *LeafTxnFinalState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1633,6 +1653,14 @@ func (this *Transaction) Equal(that interface{}) bool { return false } } + if len(this.IgnoredSeqNums) != len(that1.IgnoredSeqNums) { + return false + } + for i := range this.IgnoredSeqNums { + if !this.IgnoredSeqNums[i].Equal(&that1.IgnoredSeqNums[i]) { + return false + } + } return true } func (this *TransactionRecord) Equal(that interface{}) bool { @@ -1679,6 +1707,14 @@ func (this *TransactionRecord) Equal(that interface{}) bool { return false } } + if len(this.IgnoredSeqNums) != len(that1.IgnoredSeqNums) { + return false + } + for i := range this.IgnoredSeqNums { + if !this.IgnoredSeqNums[i].Equal(&that1.IgnoredSeqNums[i]) { + return false + } + } return true } func (this *Intent) Equal(that interface{}) bool { @@ -1709,6 +1745,14 @@ func (this *Intent) Equal(that interface{}) bool { if this.Status != that1.Status { return false } + if len(this.IgnoredSeqNums) != len(that1.IgnoredSeqNums) { + return false + } + for i := range this.IgnoredSeqNums { + if !this.IgnoredSeqNums[i].Equal(&that1.IgnoredSeqNums[i]) { + return false + } + } return true } func (this *SequencedWrite) Equal(that interface{}) bool { @@ -2353,6 +2397,20 @@ func (m *Transaction) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.IgnoredSeqNums) > 0 { + for _, msg := range m.IgnoredSeqNums { + dAtA[i] = 0x92 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintData(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -2418,6 +2476,20 @@ func (m *TransactionRecord) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.IgnoredSeqNums) > 0 { + for _, msg := range m.IgnoredSeqNums { + dAtA[i] = 0x92 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintData(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -2457,6 +2529,18 @@ func (m *Intent) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintData(dAtA, i, uint64(m.Status)) } + if len(m.IgnoredSeqNums) > 0 { + for _, msg := range m.IgnoredSeqNums { + dAtA[i] = 0x22 + i++ + i = encodeVarintData(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -2795,6 +2879,14 @@ func NewPopulatedTransaction(r randyData, easy bool) *Transaction { this.InFlightWrites[i] = *v14 } } + if r.Intn(10) != 0 { + v15 := r.Intn(5) + this.IgnoredSeqNums = make([]enginepb.IgnoredSeqNumRange, v15) + for i := 0; i < v15; i++ { + v16 := enginepb.NewPopulatedIgnoredSeqNumRange(r, easy) + this.IgnoredSeqNums[i] = *v16 + } + } if !easy && r.Intn(10) != 0 { } return this @@ -2802,25 +2894,33 @@ func NewPopulatedTransaction(r randyData, easy bool) *Transaction { func NewPopulatedTransactionRecord(r randyData, easy bool) *TransactionRecord { this := &TransactionRecord{} - v15 := enginepb.NewPopulatedTxnMeta(r, easy) - this.TxnMeta = *v15 + v17 := enginepb.NewPopulatedTxnMeta(r, easy) + this.TxnMeta = *v17 this.Status = TransactionStatus([]int32{0, 3, 1, 2}[r.Intn(4)]) - v16 := hlc.NewPopulatedTimestamp(r, easy) - this.LastHeartbeat = *v16 + v18 := hlc.NewPopulatedTimestamp(r, easy) + this.LastHeartbeat = *v18 if r.Intn(10) != 0 { - v17 := r.Intn(5) - this.IntentSpans = make([]Span, v17) - for i := 0; i < v17; i++ { - v18 := NewPopulatedSpan(r, easy) - this.IntentSpans[i] = *v18 + v19 := r.Intn(5) + this.IntentSpans = make([]Span, v19) + for i := 0; i < v19; i++ { + v20 := NewPopulatedSpan(r, easy) + this.IntentSpans[i] = *v20 } } if r.Intn(10) != 0 { - v19 := r.Intn(5) - this.InFlightWrites = make([]SequencedWrite, v19) - for i := 0; i < v19; i++ { - v20 := NewPopulatedSequencedWrite(r, easy) - this.InFlightWrites[i] = *v20 + v21 := r.Intn(5) + this.InFlightWrites = make([]SequencedWrite, v21) + for i := 0; i < v21; i++ { + v22 := NewPopulatedSequencedWrite(r, easy) + this.InFlightWrites[i] = *v22 + } + } + if r.Intn(10) != 0 { + v23 := r.Intn(5) + this.IgnoredSeqNums = make([]enginepb.IgnoredSeqNumRange, v23) + for i := 0; i < v23; i++ { + v24 := enginepb.NewPopulatedIgnoredSeqNumRange(r, easy) + this.IgnoredSeqNums[i] = *v24 } } if !easy && r.Intn(10) != 0 { @@ -2830,9 +2930,9 @@ func NewPopulatedTransactionRecord(r randyData, easy bool) *TransactionRecord { func NewPopulatedSequencedWrite(r randyData, easy bool) *SequencedWrite { this := &SequencedWrite{} - v21 := r.Intn(100) - this.Key = make(Key, v21) - for i := 0; i < v21; i++ { + v25 := r.Intn(100) + this.Key = make(Key, v25) + for i := 0; i < v25; i++ { this.Key[i] = byte(r.Intn(256)) } this.Sequence = github_com_cockroachdb_cockroach_pkg_storage_engine_enginepb.TxnSeq(r.Int31()) @@ -2846,13 +2946,13 @@ func NewPopulatedSequencedWrite(r randyData, easy bool) *SequencedWrite { func NewPopulatedLease(r randyData, easy bool) *Lease { this := &Lease{} - v22 := hlc.NewPopulatedTimestamp(r, easy) - this.Start = *v22 + v26 := hlc.NewPopulatedTimestamp(r, easy) + this.Start = *v26 if r.Intn(10) != 0 { this.Expiration = hlc.NewPopulatedTimestamp(r, easy) } - v23 := NewPopulatedReplicaDescriptor(r, easy) - this.Replica = *v23 + v27 := NewPopulatedReplicaDescriptor(r, easy) + this.Replica = *v27 if r.Intn(10) != 0 { this.DeprecatedStartStasis = hlc.NewPopulatedTimestamp(r, easy) } @@ -2874,13 +2974,13 @@ func NewPopulatedLease(r randyData, easy bool) *Lease { func NewPopulatedAbortSpanEntry(r randyData, easy bool) *AbortSpanEntry { this := &AbortSpanEntry{} - v24 := r.Intn(100) - this.Key = make(Key, v24) - for i := 0; i < v24; i++ { + v28 := r.Intn(100) + this.Key = make(Key, v28) + for i := 0; i < v28; i++ { this.Key[i] = byte(r.Intn(256)) } - v25 := hlc.NewPopulatedTimestamp(r, easy) - this.Timestamp = *v25 + v29 := hlc.NewPopulatedTimestamp(r, easy) + this.Timestamp = *v29 this.Priority = github_com_cockroachdb_cockroach_pkg_storage_engine_enginepb.TxnPriority(r.Int31()) if r.Intn(2) == 0 { this.Priority *= -1 @@ -2909,9 +3009,9 @@ func randUTF8RuneData(r randyData) rune { return rune(ru + 61) } func randStringData(r randyData) string { - v26 := r.Intn(100) - tmps := make([]rune, v26) - for i := 0; i < v26; i++ { + v30 := r.Intn(100) + tmps := make([]rune, v30) + for i := 0; i < v30; i++ { tmps[i] = randUTF8RuneData(r) } return string(tmps) @@ -2933,11 +3033,11 @@ func randFieldData(dAtA []byte, r randyData, fieldNumber int, wire int) []byte { switch wire { case 0: dAtA = encodeVarintPopulateData(dAtA, uint64(key)) - v27 := r.Int63() + v31 := r.Int63() if r.Intn(2) == 0 { - v27 *= -1 + v31 *= -1 } - dAtA = encodeVarintPopulateData(dAtA, uint64(v27)) + dAtA = encodeVarintPopulateData(dAtA, uint64(v31)) case 1: dAtA = encodeVarintPopulateData(dAtA, uint64(key)) dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) @@ -3212,6 +3312,12 @@ func (m *Transaction) Size() (n int) { n += 2 + l + sovData(uint64(l)) } } + if len(m.IgnoredSeqNums) > 0 { + for _, e := range m.IgnoredSeqNums { + l = e.Size() + n += 2 + l + sovData(uint64(l)) + } + } return n } @@ -3240,6 +3346,12 @@ func (m *TransactionRecord) Size() (n int) { n += 2 + l + sovData(uint64(l)) } } + if len(m.IgnoredSeqNums) > 0 { + for _, e := range m.IgnoredSeqNums { + l = e.Size() + n += 2 + l + sovData(uint64(l)) + } + } return n } @@ -3256,6 +3368,12 @@ func (m *Intent) Size() (n int) { if m.Status != 0 { n += 1 + sovData(uint64(m.Status)) } + if len(m.IgnoredSeqNums) > 0 { + for _, e := range m.IgnoredSeqNums { + l = e.Size() + n += 1 + l + sovData(uint64(l)) + } + } return n } @@ -5219,6 +5337,37 @@ func (m *Transaction) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoredSeqNums", 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 + } + m.IgnoredSeqNums = append(m.IgnoredSeqNums, enginepb.IgnoredSeqNumRange{}) + if err := m.IgnoredSeqNums[len(m.IgnoredSeqNums)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipData(dAtA[iNdEx:]) @@ -5410,6 +5559,37 @@ func (m *TransactionRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoredSeqNums", 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 + } + m.IgnoredSeqNums = append(m.IgnoredSeqNums, enginepb.IgnoredSeqNumRange{}) + if err := m.IgnoredSeqNums[len(m.IgnoredSeqNums)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipData(dAtA[iNdEx:]) @@ -5539,6 +5719,37 @@ func (m *Intent) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoredSeqNums", 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 + } + m.IgnoredSeqNums = append(m.IgnoredSeqNums, enginepb.IgnoredSeqNumRange{}) + if err := m.IgnoredSeqNums[len(m.IgnoredSeqNums)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipData(dAtA[iNdEx:]) @@ -6462,145 +6673,148 @@ var ( ErrIntOverflowData = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/data.proto", fileDescriptor_data_b2089b7a94e3b188) } - -var fileDescriptor_data_b2089b7a94e3b188 = []byte{ - // 2184 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x3d, 0x8c, 0xdb, 0xc8, - 0xf5, 0x5f, 0x2e, 0x29, 0x89, 0x7a, 0xd2, 0x6a, 0xb9, 0x63, 0xaf, 0xad, 0xf3, 0xe1, 0x2f, 0xf9, - 0xaf, 0x0b, 0x12, 0xc7, 0xb8, 0xd3, 0x22, 0xf6, 0xe5, 0x90, 0x18, 0x41, 0x10, 0x7d, 0xd9, 0xa6, - 0xbc, 0xd2, 0xfa, 0x28, 0xae, 0x0f, 0xf6, 0xe5, 0xc0, 0x50, 0xe4, 0xac, 0x96, 0xb1, 0xf8, 0x61, - 0x92, 0x5a, 0xaf, 0x52, 0xa7, 0x38, 0xa4, 0xc9, 0x95, 0x41, 0x2a, 0x03, 0xe9, 0xd2, 0xa4, 0x4d, - 0x95, 0x26, 0x45, 0x5c, 0x05, 0xee, 0x72, 0x48, 0x21, 0x24, 0x72, 0x93, 0x3a, 0xa5, 0x81, 0x00, - 0xc1, 0xcc, 0x90, 0x14, 0xed, 0x95, 0x17, 0x5a, 0xac, 0x03, 0x5c, 0x23, 0x91, 0x6f, 0xde, 0xfb, - 0xbd, 0x99, 0xf7, 0x7b, 0xf3, 0xde, 0x0c, 0x01, 0xf9, 0xae, 0x6e, 0x1c, 0x7a, 0xc3, 0x1d, 0x53, - 0x0f, 0xf5, 0xba, 0xe7, 0xbb, 0xa1, 0x8b, 0xb6, 0x0c, 0xd7, 0x78, 0x4c, 0xe5, 0xf5, 0x68, 0xf4, - 0xca, 0xa5, 0x58, 0xcd, 0xc6, 0xa1, 0xbe, 0x50, 0xbd, 0x52, 0x0b, 0x42, 0xd7, 0xd7, 0x47, 0x78, - 0x07, 0x3b, 0x23, 0xcb, 0x89, 0xff, 0x88, 0xde, 0x91, 0x61, 0x44, 0x3a, 0x1f, 0x9c, 0xa6, 0x73, - 0x33, 0x52, 0x2a, 0x4f, 0x42, 0x6b, 0xbc, 0x73, 0x38, 0x36, 0x76, 0x42, 0xcb, 0xc6, 0x41, 0xa8, - 0xdb, 0x5e, 0x34, 0x72, 0x71, 0xe4, 0x8e, 0x5c, 0xfa, 0xb8, 0x43, 0x9e, 0x98, 0xb4, 0xf6, 0x05, - 0x08, 0x03, 0x4f, 0x77, 0xd0, 0x7b, 0xc0, 0x3f, 0xc6, 0xd3, 0x32, 0x7f, 0x95, 0xbb, 0x56, 0x6c, - 0xe6, 0x5e, 0xcd, 0xaa, 0xfc, 0x3d, 0x3c, 0x55, 0x88, 0x0c, 0x5d, 0x85, 0x1c, 0x76, 0x4c, 0x8d, - 0x0c, 0x0b, 0xaf, 0x0f, 0x67, 0xb1, 0x63, 0xde, 0xc3, 0xd3, 0x5b, 0xc5, 0xdf, 0x3c, 0xab, 0xae, - 0xfd, 0xf1, 0x59, 0x95, 0xfb, 0xd7, 0xb3, 0x2a, 0xd7, 0x15, 0x44, 0x4e, 0x5a, 0xef, 0x0a, 0xe2, - 0xba, 0xc4, 0xd7, 0x6c, 0xc8, 0x3c, 0xd0, 0xc7, 0x13, 0x8c, 0xde, 0x87, 0xbc, 0xaf, 0x3f, 0xd5, - 0x86, 0xd3, 0x10, 0x07, 0x65, 0x8e, 0xc0, 0x28, 0xa2, 0xaf, 0x3f, 0x6d, 0x92, 0x77, 0xd4, 0x80, - 0x7c, 0x32, 0xdb, 0xf2, 0xfa, 0x55, 0xee, 0x5a, 0xe1, 0xc6, 0xff, 0xd5, 0x17, 0xc1, 0x23, 0x4b, - 0xaa, 0x1f, 0x8e, 0x8d, 0xba, 0x1a, 0x2b, 0x35, 0x85, 0xe7, 0xb3, 0xea, 0x9a, 0xb2, 0xb0, 0xba, - 0x25, 0x10, 0xd7, 0xb5, 0xcf, 0x41, 0xbc, 0x87, 0xa7, 0xcc, 0x63, 0xb4, 0x22, 0x6e, 0xc9, 0x8a, - 0x3e, 0x86, 0xcc, 0x11, 0xd1, 0x89, 0x7c, 0x95, 0xeb, 0x27, 0x88, 0xaa, 0x53, 0x8c, 0xc8, 0x0d, - 0x53, 0xae, 0xfd, 0x8d, 0x03, 0x18, 0x84, 0xae, 0x8f, 0x65, 0x13, 0x3b, 0x21, 0x1a, 0x01, 0x18, - 0xe3, 0x49, 0x10, 0x62, 0x5f, 0xb3, 0xcc, 0xc8, 0xcd, 0x5d, 0xa2, 0xff, 0xf7, 0x59, 0xf5, 0xe6, - 0xc8, 0x0a, 0x0f, 0x27, 0xc3, 0xba, 0xe1, 0xda, 0x3b, 0x09, 0xb6, 0x39, 0x5c, 0x3c, 0xef, 0x78, - 0x8f, 0x47, 0x3b, 0x94, 0xaa, 0xc9, 0xc4, 0x32, 0xeb, 0xfb, 0xfb, 0x72, 0x7b, 0x3e, 0xab, 0xe6, - 0x5b, 0x0c, 0x50, 0x6e, 0x2b, 0xf9, 0x08, 0x5b, 0x36, 0xd1, 0x47, 0x90, 0x73, 0x5c, 0x13, 0x13, - 0x2f, 0x64, 0xbe, 0x99, 0xe6, 0xc5, 0xf9, 0xac, 0x9a, 0xed, 0xbb, 0x26, 0x96, 0xdb, 0xaf, 0x92, - 0x27, 0x25, 0x4b, 0x94, 0x64, 0x13, 0x7d, 0x0f, 0x44, 0x92, 0x28, 0x54, 0x9f, 0xa7, 0xfa, 0x97, - 0xe6, 0xb3, 0x6a, 0x8e, 0xcd, 0x9c, 0x18, 0xc4, 0x8f, 0x4a, 0x2e, 0x60, 0xab, 0xa9, 0xfd, 0x9e, - 0x83, 0xe2, 0xc0, 0x1b, 0x5b, 0xa1, 0xea, 0x5b, 0xa3, 0x11, 0xf6, 0x51, 0x07, 0xf2, 0x63, 0x7c, - 0x10, 0x6a, 0x26, 0x0e, 0x0c, 0xba, 0xb4, 0xc2, 0x8d, 0xda, 0x92, 0x20, 0x29, 0xba, 0x33, 0xc2, - 0x6d, 0x1c, 0x18, 0xbe, 0xe5, 0x85, 0xae, 0x1f, 0x85, 0x4b, 0x24, 0xa6, 0x44, 0x8a, 0xee, 0x00, - 0xf8, 0xd6, 0xe8, 0x30, 0xc2, 0x59, 0x3f, 0x23, 0x4e, 0x9e, 0xda, 0x12, 0x31, 0x63, 0xb7, 0x2b, - 0x88, 0xbc, 0x24, 0xd4, 0xe6, 0xeb, 0x50, 0xec, 0x61, 0x7f, 0x84, 0xbf, 0xa1, 0x93, 0x45, 0x0e, - 0x48, 0x0c, 0x88, 0xec, 0x4b, 0x2d, 0x08, 0xf5, 0x30, 0xa0, 0x1b, 0xa7, 0x70, 0xe3, 0xc3, 0x14, - 0x5c, 0xb4, 0x99, 0xeb, 0x6c, 0x17, 0xd7, 0xe3, 0xcd, 0x5c, 0xef, 0x3d, 0x68, 0xb5, 0x06, 0xc4, - 0xa6, 0x79, 0x89, 0x00, 0xcf, 0x67, 0xd5, 0x92, 0x42, 0xd0, 0x12, 0xb9, 0x52, 0xa2, 0xe8, 0xbd, - 0x23, 0xc3, 0xa0, 0xef, 0xe8, 0x36, 0x14, 0x0f, 0x7c, 0x8c, 0x7f, 0x81, 0x89, 0x2f, 0x3f, 0x2c, - 0x67, 0x56, 0xdf, 0x40, 0x05, 0x66, 0x38, 0x20, 0x76, 0xaf, 0x05, 0xf9, 0x0f, 0x19, 0xd8, 0x6e, - 0x1d, 0x92, 0x95, 0x2a, 0xd8, 0x1b, 0x5b, 0x86, 0x1e, 0xc4, 0xd1, 0x7e, 0x04, 0x97, 0x4c, 0xec, - 0xf9, 0xd8, 0xd0, 0x43, 0x6c, 0x6a, 0x06, 0xd5, 0xd1, 0xc2, 0xa9, 0x87, 0x69, 0xe8, 0x4b, 0x37, - 0xbe, 0xb5, 0x2c, 0x64, 0x0c, 0x83, 0x01, 0xaa, 0x53, 0x0f, 0x2b, 0x17, 0x17, 0x18, 0x0b, 0x29, - 0x7a, 0x08, 0x28, 0x85, 0xed, 0x33, 0xab, 0x88, 0x8a, 0x53, 0x70, 0x4f, 0x90, 0xb1, 0xb5, 0x40, - 0x89, 0x54, 0xd0, 0xcf, 0xe1, 0xfd, 0x14, 0xf4, 0xc4, 0x33, 0xd3, 0x2e, 0x82, 0x32, 0x7f, 0x95, - 0x3f, 0xa3, 0x8f, 0xf7, 0x16, 0x70, 0xfb, 0x0c, 0x2d, 0x8e, 0x14, 0xc2, 0x70, 0x25, 0xe5, 0xcb, - 0xc1, 0xc7, 0x61, 0xec, 0x88, 0xec, 0x49, 0x81, 0xee, 0xc9, 0x6b, 0xf3, 0x59, 0xf5, 0x72, 0x3b, - 0xd1, 0xea, 0xe3, 0xe3, 0x30, 0xb2, 0xa7, 0x7b, 0x34, 0x9f, 0xbc, 0x28, 0x97, 0xcd, 0xa5, 0x5a, - 0x26, 0xfa, 0x04, 0x04, 0x9a, 0xaa, 0x99, 0x55, 0x53, 0x55, 0xa1, 0xfa, 0x68, 0x08, 0x97, 0x2d, - 0x27, 0xc4, 0xbe, 0xa3, 0x8f, 0x35, 0xdd, 0x34, 0xd3, 0x61, 0xc8, 0x9e, 0x39, 0x0c, 0xdb, 0x31, - 0x54, 0x83, 0x20, 0x25, 0x21, 0x38, 0x80, 0xf7, 0x12, 0x1f, 0x3e, 0xb6, 0xdd, 0xa3, 0xb4, 0x97, - 0xdc, 0x99, 0xbd, 0x24, 0x13, 0x56, 0x18, 0x56, 0xec, 0xe7, 0x96, 0x48, 0x3a, 0x0f, 0x2d, 0xfd, - 0x5f, 0x71, 0x70, 0xa1, 0xe7, 0x9a, 0xd6, 0x81, 0x85, 0x4d, 0xd2, 0xd1, 0xe2, 0x7c, 0xfd, 0x10, - 0x50, 0x30, 0x0d, 0x42, 0x6c, 0x6b, 0x86, 0xeb, 0x1c, 0x58, 0x23, 0x2d, 0xf0, 0x74, 0x87, 0xe6, - 0xaa, 0xa8, 0x48, 0x6c, 0xa4, 0x45, 0x07, 0x68, 0x1b, 0xec, 0x00, 0xa2, 0xb5, 0x76, 0x6c, 0x1d, - 0x61, 0x07, 0x07, 0x01, 0xd3, 0x66, 0x19, 0x78, 0x79, 0xc9, 0x84, 0x89, 0x91, 0x22, 0x11, 0x93, - 0xdd, 0xc8, 0x82, 0x48, 0xa2, 0x6e, 0xf4, 0x53, 0x90, 0x06, 0xa1, 0x65, 0x3c, 0x9e, 0x36, 0x17, - 0x95, 0xb5, 0x09, 0x10, 0x50, 0x99, 0x36, 0xb4, 0xc2, 0xa8, 0x5a, 0xad, 0xd6, 0xeb, 0x82, 0x18, - 0x2a, 0x42, 0xff, 0x13, 0x0f, 0xdb, 0x72, 0x14, 0x96, 0x96, 0x6b, 0xdb, 0x0b, 0x1f, 0x6d, 0xd8, - 0x08, 0x48, 0x35, 0xd7, 0x42, 0x26, 0x88, 0xdc, 0x54, 0x97, 0xce, 0x7f, 0x51, 0xf5, 0x95, 0x62, - 0x90, 0xee, 0x01, 0x6d, 0xd8, 0xb0, 0x49, 0x99, 0x4d, 0x50, 0xd6, 0xdf, 0x8a, 0x92, 0x2e, 0xc7, - 0x4a, 0xd1, 0x4e, 0x17, 0xe7, 0x9f, 0xc1, 0xe5, 0xa8, 0x46, 0xc4, 0xf4, 0x27, 0x78, 0x3c, 0xc5, - 0xbb, 0xb6, 0x04, 0x6f, 0x69, 0xe5, 0x51, 0xb6, 0x8d, 0xb7, 0x14, 0xa4, 0x6d, 0x3b, 0xe2, 0x9d, - 0xb2, 0x95, 0xe0, 0xb3, 0x9a, 0xfb, 0xed, 0x65, 0xf3, 0x3d, 0x99, 0x27, 0xca, 0x05, 0x7b, 0x49, - 0xf2, 0x7c, 0x0a, 0x68, 0xc1, 0x56, 0x02, 0xcc, 0x36, 0xdc, 0x07, 0xcb, 0xc2, 0xf9, 0x06, 0xdd, - 0x8a, 0x14, 0xbc, 0x21, 0xb9, 0x25, 0x7e, 0x19, 0x9d, 0x93, 0x6a, 0xbf, 0xe6, 0x60, 0x6b, 0x6f, - 0x18, 0x60, 0xff, 0x08, 0x9b, 0x09, 0xdb, 0xe9, 0x6e, 0xcf, 0xad, 0xd0, 0xed, 0xdf, 0xc1, 0xd1, - 0x49, 0x8c, 0x4f, 0x6e, 0xb5, 0x59, 0x16, 0x0a, 0xaa, 0xaf, 0x3b, 0x81, 0x6e, 0x84, 0x96, 0xeb, - 0xa0, 0xbb, 0x20, 0x90, 0x73, 0x6a, 0x94, 0x3f, 0xd7, 0x57, 0xe8, 0x5e, 0xea, 0xb1, 0xd3, 0xc3, - 0xa1, 0xde, 0x14, 0x89, 0x93, 0x17, 0xb3, 0x2a, 0xa7, 0x50, 0x04, 0x84, 0x40, 0x70, 0x74, 0x9b, - 0x1d, 0xb8, 0xf2, 0x0a, 0x7d, 0x46, 0x3f, 0x82, 0x2c, 0x69, 0x8e, 0x13, 0xd6, 0x1d, 0x97, 0x77, - 0x8e, 0xd4, 0x6c, 0x06, 0x54, 0x57, 0x89, 0x6c, 0x50, 0x17, 0x4a, 0x63, 0x3d, 0x08, 0xb5, 0x43, - 0xac, 0xfb, 0xe1, 0x10, 0xeb, 0x67, 0xea, 0x7b, 0x1b, 0xc4, 0xf4, 0x6e, 0x6c, 0x89, 0x34, 0x48, - 0x55, 0x73, 0xcd, 0xf5, 0xad, 0x91, 0xb6, 0x08, 0x6a, 0x76, 0x75, 0xd8, 0x54, 0xa9, 0xde, 0xf3, - 0xad, 0xd1, 0x82, 0xd4, 0xbb, 0xb0, 0x61, 0xeb, 0xc7, 0x29, 0xd0, 0xdc, 0xea, 0xa0, 0x45, 0x5b, - 0x3f, 0x5e, 0x20, 0x7d, 0x0e, 0x17, 0xdc, 0x28, 0x67, 0x16, 0x70, 0x41, 0x59, 0x7c, 0x6b, 0x49, - 0x3d, 0x91, 0x61, 0x11, 0x2c, 0x72, 0xdf, 0x1c, 0x08, 0xd0, 0x4f, 0xa0, 0x48, 0x0a, 0xad, 0x13, - 0xd2, 0x8d, 0x14, 0x94, 0x0b, 0x14, 0xf5, 0x6d, 0x75, 0x2f, 0x3e, 0x43, 0x30, 0x13, 0x22, 0x09, - 0x50, 0x0d, 0x36, 0x9e, 0xfa, 0x56, 0x88, 0xb5, 0xd0, 0x75, 0x35, 0x77, 0x6c, 0x96, 0x8b, 0xb4, - 0xd0, 0x16, 0xa8, 0x50, 0x75, 0xdd, 0xbd, 0xb1, 0x49, 0x98, 0xf3, 0xb1, 0x9e, 0x9a, 0x7e, 0x79, - 0xf3, 0x0c, 0xcc, 0x11, 0xd3, 0x45, 0x38, 0x3e, 0x86, 0x4b, 0x06, 0xad, 0x7d, 0x0b, 0x34, 0xed, - 0xc0, 0x3a, 0xc6, 0x66, 0x59, 0xa2, 0x8e, 0x2f, 0xb2, 0xd1, 0xc4, 0xe0, 0x36, 0x19, 0x43, 0x9f, - 0x82, 0x64, 0x39, 0xda, 0xc1, 0x98, 0x9e, 0xd2, 0xe8, 0xd4, 0x82, 0xf2, 0x16, 0x5d, 0xeb, 0xff, - 0x2f, 0x5b, 0x2b, 0x7e, 0x32, 0xc1, 0x8e, 0x81, 0xcd, 0xcf, 0x88, 0x66, 0x34, 0x8f, 0x92, 0xe5, - 0xdc, 0xa6, 0xf6, 0x54, 0x18, 0x9c, 0xb8, 0x02, 0xf1, 0x92, 0xd0, 0x15, 0xc4, 0xbc, 0x04, 0x5d, - 0x41, 0xdc, 0x90, 0x4a, 0x5d, 0x41, 0x2c, 0x49, 0x9b, 0xb5, 0xbf, 0xf2, 0xb0, 0x95, 0x4a, 0x69, - 0x05, 0x1b, 0xae, 0x6f, 0xbe, 0xc3, 0x6d, 0xf6, 0xcd, 0xd9, 0x52, 0xe7, 0x4f, 0xa5, 0xff, 0x01, - 0x49, 0x62, 0x8a, 0xa0, 0x75, 0x89, 0x4f, 0x68, 0xca, 0x4a, 0xb9, 0xae, 0x20, 0xe6, 0x24, 0xb1, - 0x2b, 0x88, 0xa2, 0x94, 0x4f, 0x88, 0x03, 0xa9, 0xd0, 0x15, 0xc4, 0xa2, 0xb4, 0x91, 0x26, 0xb1, - 0x2b, 0x88, 0x9b, 0x92, 0xd4, 0x15, 0x44, 0x49, 0xda, 0xaa, 0xfd, 0x85, 0x83, 0xac, 0x4c, 0x27, - 0x8d, 0xbe, 0x0f, 0x42, 0x72, 0xb4, 0x38, 0x65, 0xa5, 0x29, 0xca, 0x88, 0x3a, 0x6a, 0x02, 0x1f, - 0x1e, 0xc7, 0x47, 0x8c, 0xb3, 0x70, 0xcf, 0x96, 0x48, 0x8c, 0x53, 0xb4, 0xf3, 0x67, 0xa7, 0x3d, - 0x3a, 0x4e, 0xfc, 0x96, 0x83, 0xd2, 0xeb, 0x41, 0x3c, 0xed, 0x06, 0x6d, 0x80, 0x18, 0x44, 0xca, - 0xd1, 0xa5, 0xf4, 0xce, 0xab, 0x59, 0xb5, 0xb5, 0xd2, 0xb5, 0xf7, 0x2d, 0x9f, 0x31, 0xc8, 0xc2, - 0x06, 0xf8, 0x89, 0x92, 0x00, 0xa7, 0x1a, 0xd3, 0x7f, 0x78, 0xc8, 0xec, 0x62, 0x3d, 0xc0, 0xe8, - 0x87, 0x90, 0x61, 0xb7, 0x9c, 0x33, 0x1c, 0x9d, 0x98, 0x05, 0xfa, 0x02, 0x00, 0x1f, 0x7b, 0x96, - 0xaf, 0x93, 0x18, 0xac, 0xd6, 0x2b, 0x2b, 0xff, 0x9e, 0x55, 0xaf, 0xa4, 0x56, 0x72, 0xab, 0xe6, - 0xeb, 0x8e, 0xe9, 0x4c, 0xc6, 0x63, 0x7d, 0x38, 0xc6, 0x35, 0x25, 0x05, 0x88, 0xda, 0x90, 0x8b, - 0x6f, 0x2c, 0xfc, 0x99, 0x6f, 0x2c, 0xb1, 0x29, 0x9a, 0x40, 0xaa, 0x89, 0xb0, 0x0b, 0x1d, 0xf9, - 0x0d, 0xac, 0xf8, 0x0e, 0x79, 0xce, 0x19, 0x6f, 0x2f, 0xd0, 0xe9, 0xad, 0x6f, 0x40, 0xb1, 0x51, - 0x1f, 0x0a, 0x9e, 0xef, 0x7a, 0x6e, 0x40, 0xda, 0x4a, 0xb0, 0xda, 0xbe, 0x2f, 0xcd, 0x67, 0x55, - 0xb8, 0x1f, 0x59, 0xa9, 0x03, 0x05, 0x62, 0x04, 0x35, 0x40, 0x17, 0x21, 0x83, 0x3d, 0xd7, 0x38, - 0xa4, 0xdd, 0x93, 0x57, 0xd8, 0x0b, 0xfa, 0x28, 0x95, 0x35, 0xa4, 0x03, 0xf2, 0xcd, 0xad, 0x57, - 0xb3, 0xea, 0x06, 0x65, 0x36, 0xce, 0xbd, 0x34, 0xff, 0x71, 0x4d, 0xad, 0xcd, 0x39, 0x28, 0x35, - 0x86, 0xae, 0x4f, 0x4b, 0x43, 0xc7, 0x09, 0xfd, 0xe9, 0x69, 0xc9, 0x79, 0xfe, 0x33, 0x11, 0x3a, - 0x04, 0xd1, 0xf3, 0x2d, 0xd7, 0xb7, 0xc2, 0x69, 0xf4, 0x11, 0x65, 0xf7, 0xd5, 0xac, 0x7a, 0xf7, - 0xbc, 0xf9, 0x7d, 0x3f, 0xc2, 0x54, 0x12, 0xf4, 0x54, 0x92, 0xff, 0x92, 0x87, 0xad, 0x5d, 0xac, - 0x1f, 0xa8, 0xc7, 0x8e, 0xec, 0x78, 0x13, 0x42, 0x4d, 0x88, 0xd1, 0x27, 0xac, 0x3e, 0xb0, 0x74, - 0xaf, 0x9c, 0xbe, 0xb1, 0xd3, 0x35, 0xe1, 0x3b, 0xb0, 0xe9, 0xe3, 0x03, 0x1f, 0x07, 0x87, 0x9a, - 0xe5, 0x1c, 0xe9, 0x63, 0xcb, 0xa4, 0x21, 0x17, 0x95, 0x52, 0x24, 0x96, 0x99, 0x74, 0x69, 0x9d, - 0x15, 0xcf, 0x55, 0x67, 0xd1, 0x0d, 0xd8, 0x0e, 0x42, 0xec, 0x79, 0x96, 0x33, 0xd2, 0x6c, 0x72, - 0x98, 0xc5, 0x0e, 0xc9, 0x3e, 0xb3, 0x9c, 0xa7, 0x33, 0xb8, 0x10, 0x0f, 0xf6, 0x5c, 0x13, 0x77, - 0xd8, 0x10, 0xb2, 0xa0, 0x48, 0x4f, 0x05, 0x01, 0x7e, 0xa2, 0x39, 0x13, 0xbb, 0x0c, 0xef, 0xb6, - 0xaa, 0x00, 0x01, 0x1f, 0xe0, 0x27, 0xfd, 0x89, 0xfd, 0x46, 0xf1, 0x17, 0xa4, 0x4c, 0x57, 0x10, - 0x33, 0x52, 0x96, 0x35, 0x82, 0xda, 0xaf, 0xd6, 0x13, 0x1a, 0x6e, 0x5b, 0x8e, 0x3e, 0x3e, 0x1f, - 0x0d, 0x3f, 0x80, 0x72, 0xfa, 0x73, 0x89, 0x6b, 0xdb, 0xba, 0x43, 0xfe, 0x27, 0x4e, 0xc8, 0x12, - 0x4b, 0x49, 0x7d, 0x4e, 0x69, 0xb1, 0xe1, 0x16, 0x19, 0x45, 0x4d, 0xd8, 0x88, 0x09, 0x64, 0x2d, - 0x54, 0x58, 0xa5, 0x85, 0x16, 0x23, 0x1b, 0xd6, 0x43, 0x57, 0x4d, 0x82, 0x24, 0x24, 0x49, 0x18, - 0x58, 0x27, 0xbc, 0xfe, 0x67, 0x0e, 0xf2, 0xf4, 0x53, 0x28, 0xfd, 0x3e, 0x53, 0x80, 0xdc, 0x7e, - 0xff, 0x5e, 0x7f, 0xef, 0xb3, 0xbe, 0xb4, 0x86, 0x72, 0xc0, 0xcb, 0x7d, 0x55, 0xe2, 0x50, 0x1e, - 0x32, 0xb7, 0x77, 0xf7, 0x1a, 0xaa, 0xb4, 0x4e, 0x1e, 0x9b, 0x0f, 0xd5, 0xce, 0x40, 0xe2, 0xd1, - 0x05, 0xd8, 0x6c, 0x77, 0x76, 0xe5, 0x9e, 0xac, 0x76, 0xda, 0x1a, 0x13, 0x8a, 0x48, 0x04, 0x41, - 0x95, 0x7b, 0x1d, 0x49, 0x20, 0x50, 0xed, 0x4e, 0x4b, 0xee, 0x35, 0x76, 0xa5, 0x0c, 0xda, 0x86, - 0xad, 0x85, 0x6e, 0x2c, 0xce, 0xa3, 0x22, 0x88, 0xed, 0x7d, 0xa5, 0xa1, 0xca, 0x7b, 0x7d, 0x29, - 0x8b, 0x00, 0xb2, 0xc4, 0x56, 0x7d, 0x24, 0x15, 0x89, 0x1f, 0x75, 0xff, 0xfe, 0x6e, 0x47, 0x02, - 0xa2, 0xd4, 0x94, 0xd5, 0x86, 0xa2, 0x34, 0x1e, 0x4a, 0x05, 0x54, 0x02, 0x20, 0x4a, 0x83, 0x8e, - 0x22, 0x77, 0x06, 0x92, 0x59, 0x23, 0x5d, 0x3d, 0x77, 0xfd, 0xc7, 0xb0, 0x75, 0xe2, 0x13, 0x14, - 0xda, 0x84, 0x42, 0xa3, 0xdd, 0xd6, 0x94, 0xce, 0xfd, 0x5d, 0xb9, 0xd5, 0x90, 0xd6, 0x10, 0x82, - 0x92, 0xd2, 0xe9, 0xed, 0x3d, 0xe8, 0x24, 0x32, 0xee, 0x8a, 0xf0, 0xe5, 0xef, 0x2a, 0x6b, 0xd7, - 0xf7, 0x5e, 0x3b, 0xb5, 0xb1, 0xf6, 0x49, 0x56, 0x70, 0xbf, 0xd3, 0x6f, 0xcb, 0xfd, 0x3b, 0xd2, - 0x1a, 0x79, 0x19, 0xa8, 0x8d, 0x3b, 0xe4, 0x85, 0x47, 0x1b, 0x90, 0x6f, 0xed, 0xf5, 0x7a, 0xb2, - 0xaa, 0x76, 0xda, 0x12, 0x47, 0xc6, 0x1a, 0xcd, 0x3d, 0x85, 0xbc, 0xac, 0x33, 0xc0, 0xe6, 0x77, - 0x9f, 0xff, 0xb3, 0xb2, 0xf6, 0x7c, 0x5e, 0xe1, 0x5e, 0xcc, 0x2b, 0xdc, 0xd7, 0xf3, 0x0a, 0xf7, - 0x8f, 0x79, 0x85, 0xfb, 0xea, 0x65, 0x65, 0xed, 0xc5, 0xcb, 0xca, 0xda, 0xd7, 0x2f, 0x2b, 0x6b, - 0x8f, 0x72, 0x11, 0xb7, 0xc3, 0x2c, 0xfd, 0x4e, 0x7f, 0xf3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x12, 0xee, 0x95, 0xbb, 0x61, 0x18, 0x00, 0x00, +func init() { proto.RegisterFile("roachpb/data.proto", fileDescriptor_data_19a513c0378cb1f2) } + +var fileDescriptor_data_19a513c0378cb1f2 = []byte{ + // 2234 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0x4d, 0x8c, 0x1b, 0x49, + 0x15, 0x9e, 0x76, 0xb7, 0xed, 0xf6, 0xb3, 0xc7, 0xd3, 0x53, 0xc9, 0x24, 0x4e, 0x56, 0xd8, 0xc1, + 0x8b, 0x20, 0x44, 0xbb, 0x1e, 0x91, 0xec, 0xae, 0x20, 0x42, 0x08, 0xff, 0x25, 0x69, 0x67, 0xec, + 0xc9, 0xb6, 0x3d, 0x59, 0x25, 0xcb, 0xaa, 0x69, 0x77, 0xd7, 0x78, 0x9a, 0xb8, 0xbb, 0x9d, 0xee, + 0xf6, 0x64, 0xcc, 0x99, 0xc3, 0x8a, 0x0b, 0x7b, 0x44, 0x9c, 0x22, 0x71, 0xe3, 0xc2, 0x95, 0x13, + 0x1c, 0x90, 0x50, 0x8e, 0x39, 0xc1, 0x8a, 0x83, 0x05, 0xce, 0x85, 0x33, 0xc7, 0x48, 0x48, 0xa8, + 0xaa, 0xfa, 0x2f, 0x19, 0x67, 0xe4, 0x61, 0x22, 0xb4, 0xda, 0xcb, 0xb8, 0xeb, 0xd5, 0x7b, 0xdf, + 0xab, 0x7a, 0xef, 0xd5, 0x7b, 0xaf, 0x6a, 0x00, 0xb9, 0x8e, 0xa6, 0x1f, 0x4c, 0x86, 0xdb, 0x86, + 0xe6, 0x6b, 0xb5, 0x89, 0xeb, 0xf8, 0x0e, 0xda, 0xd4, 0x1d, 0xfd, 0x11, 0xa5, 0xd7, 0x82, 0xd9, + 0xcb, 0x17, 0x42, 0x36, 0x0b, 0xfb, 0x5a, 0xcc, 0x7a, 0xb9, 0xea, 0xf9, 0x8e, 0xab, 0x8d, 0xf0, + 0x36, 0xb6, 0x47, 0xa6, 0x1d, 0xfe, 0x10, 0xbe, 0x43, 0x5d, 0x0f, 0x78, 0xde, 0x3d, 0x89, 0xe7, + 0x46, 0xc0, 0x54, 0x9a, 0xfa, 0xe6, 0x78, 0xfb, 0x60, 0xac, 0x6f, 0xfb, 0xa6, 0x85, 0x3d, 0x5f, + 0xb3, 0x26, 0xc1, 0xcc, 0xf9, 0x91, 0x33, 0x72, 0xe8, 0xe7, 0x36, 0xf9, 0x62, 0xd4, 0xea, 0x67, + 0x20, 0xf4, 0x27, 0x9a, 0x8d, 0x2e, 0x01, 0xff, 0x08, 0xcf, 0x4a, 0xfc, 0x15, 0xee, 0x6a, 0xa1, + 0x91, 0x7d, 0x39, 0xaf, 0xf0, 0x77, 0xf1, 0x4c, 0x21, 0x34, 0x74, 0x05, 0xb2, 0xd8, 0x36, 0x54, + 0x32, 0x2d, 0xbc, 0x3a, 0x9d, 0xc1, 0xb6, 0x71, 0x17, 0xcf, 0x6e, 0x16, 0x7e, 0xfd, 0xb4, 0xb2, + 0xf6, 0x87, 0xa7, 0x15, 0xee, 0x5f, 0x4f, 0x2b, 0x5c, 0x47, 0x10, 0x39, 0x29, 0xd5, 0x11, 0xc4, + 0x94, 0xc4, 0x57, 0x2d, 0x48, 0xdf, 0xd7, 0xc6, 0x53, 0x8c, 0xde, 0x81, 0x9c, 0xab, 0x3d, 0x51, + 0x87, 0x33, 0x1f, 0x7b, 0x25, 0x8e, 0xc0, 0x28, 0xa2, 0xab, 0x3d, 0x69, 0x90, 0x31, 0xaa, 0x43, + 0x2e, 0x5a, 0x6d, 0x29, 0x75, 0x85, 0xbb, 0x9a, 0xbf, 0xfe, 0x8d, 0x5a, 0x6c, 0x3c, 0xb2, 0xa5, + 0xda, 0xc1, 0x58, 0xaf, 0x0d, 0x42, 0xa6, 0x86, 0xf0, 0x6c, 0x5e, 0x59, 0x53, 0x62, 0xa9, 0x9b, + 0x02, 0x51, 0x5d, 0xfd, 0x14, 0xc4, 0xbb, 0x78, 0xc6, 0x34, 0x06, 0x3b, 0xe2, 0x96, 0xec, 0xe8, + 0x03, 0x48, 0x1f, 0x12, 0x9e, 0x40, 0x57, 0xa9, 0x76, 0xcc, 0x51, 0x35, 0x8a, 0x11, 0xa8, 0x61, + 0xcc, 0xd5, 0xbf, 0x71, 0x00, 0x7d, 0xdf, 0x71, 0xb1, 0x6c, 0x60, 0xdb, 0x47, 0x23, 0x00, 0x7d, + 0x3c, 0xf5, 0x7c, 0xec, 0xaa, 0xa6, 0x11, 0xa8, 0xb9, 0x43, 0xf8, 0xff, 0x3e, 0xaf, 0xdc, 0x18, + 0x99, 0xfe, 0xc1, 0x74, 0x58, 0xd3, 0x1d, 0x6b, 0x3b, 0xc2, 0x36, 0x86, 0xf1, 0xf7, 0xf6, 0xe4, + 0xd1, 0x68, 0x9b, 0xba, 0x6a, 0x3a, 0x35, 0x8d, 0xda, 0xde, 0x9e, 0xdc, 0x5a, 0xcc, 0x2b, 0xb9, + 0x26, 0x03, 0x94, 0x5b, 0x4a, 0x2e, 0xc0, 0x96, 0x0d, 0xf4, 0x3e, 0x64, 0x6d, 0xc7, 0xc0, 0x44, + 0x0b, 0x59, 0x6f, 0xba, 0x71, 0x7e, 0x31, 0xaf, 0x64, 0x7a, 0x8e, 0x81, 0xe5, 0xd6, 0xcb, 0xe8, + 0x4b, 0xc9, 0x10, 0x26, 0xd9, 0x40, 0xdf, 0x03, 0x91, 0x04, 0x0a, 0xe5, 0xe7, 0x29, 0xff, 0x85, + 0xc5, 0xbc, 0x92, 0x65, 0x2b, 0x27, 0x02, 0xe1, 0xa7, 0x92, 0xf5, 0xd8, 0x6e, 0xaa, 0xbf, 0xe3, + 0xa0, 0xd0, 0x9f, 0x8c, 0x4d, 0x7f, 0xe0, 0x9a, 0xa3, 0x11, 0x76, 0x51, 0x1b, 0x72, 0x63, 0xbc, + 0xef, 0xab, 0x06, 0xf6, 0x74, 0xba, 0xb5, 0xfc, 0xf5, 0xea, 0x12, 0x23, 0x29, 0x9a, 0x3d, 0xc2, + 0x2d, 0xec, 0xe9, 0xae, 0x39, 0xf1, 0x1d, 0x37, 0x30, 0x97, 0x48, 0x44, 0x09, 0x15, 0xdd, 0x06, + 0x70, 0xcd, 0xd1, 0x41, 0x80, 0x93, 0x3a, 0x25, 0x4e, 0x8e, 0xca, 0x12, 0x32, 0xf3, 0x6e, 0x47, + 0x10, 0x79, 0x49, 0xa8, 0x2e, 0x52, 0x50, 0xe8, 0x62, 0x77, 0x84, 0xbf, 0xa2, 0x8b, 0x45, 0x36, + 0x48, 0x0c, 0x88, 0x9c, 0x4b, 0xd5, 0xf3, 0x35, 0xdf, 0xa3, 0x07, 0x27, 0x7f, 0xfd, 0xbd, 0x04, + 0x5c, 0x70, 0x98, 0x6b, 0xec, 0x14, 0xd7, 0xc2, 0xc3, 0x5c, 0xeb, 0xde, 0x6f, 0x36, 0xfb, 0x44, + 0xa6, 0x71, 0x81, 0x00, 0x2f, 0xe6, 0x95, 0xa2, 0x42, 0xd0, 0x22, 0xba, 0x52, 0xa4, 0xe8, 0xdd, + 0x43, 0x5d, 0xa7, 0x63, 0x74, 0x0b, 0x0a, 0xfb, 0x2e, 0xc6, 0x3f, 0xc7, 0x44, 0x97, 0xeb, 0x97, + 0xd2, 0xab, 0x1f, 0xa0, 0x3c, 0x13, 0xec, 0x13, 0xb9, 0x57, 0x8c, 0xfc, 0xfb, 0x34, 0x6c, 0x35, + 0x0f, 0xc8, 0x4e, 0x15, 0x3c, 0x19, 0x9b, 0xba, 0xe6, 0x85, 0xd6, 0x7e, 0x08, 0x17, 0x0c, 0x3c, + 0x71, 0xb1, 0xae, 0xf9, 0xd8, 0x50, 0x75, 0xca, 0xa3, 0xfa, 0xb3, 0x09, 0xa6, 0xa6, 0x2f, 0x5e, + 0xff, 0xd6, 0x32, 0x93, 0x31, 0x0c, 0x06, 0x38, 0x98, 0x4d, 0xb0, 0x72, 0x3e, 0xc6, 0x88, 0xa9, + 0xe8, 0x01, 0xa0, 0x04, 0xb6, 0xcb, 0xa4, 0x02, 0x57, 0x9c, 0x80, 0x7b, 0xcc, 0x19, 0x9b, 0x31, + 0x4a, 0xc0, 0x82, 0x7e, 0x06, 0xef, 0x24, 0xa0, 0xa7, 0x13, 0x23, 0xa9, 0xc2, 0x2b, 0xf1, 0x57, + 0xf8, 0x53, 0xea, 0xb8, 0x14, 0xc3, 0xed, 0x31, 0xb4, 0xd0, 0x52, 0x08, 0xc3, 0xe5, 0x84, 0x2e, + 0x1b, 0x1f, 0xf9, 0xa1, 0x22, 0x72, 0x26, 0x05, 0x7a, 0x26, 0xaf, 0x2e, 0xe6, 0x95, 0x8b, 0xad, + 0x88, 0xab, 0x87, 0x8f, 0xfc, 0x40, 0x9e, 0x9e, 0xd1, 0x5c, 0x34, 0x50, 0x2e, 0x1a, 0x4b, 0xb9, + 0x0c, 0xf4, 0x11, 0x08, 0x34, 0x54, 0xd3, 0xab, 0x86, 0xaa, 0x42, 0xf9, 0xd1, 0x10, 0x2e, 0x9a, + 0xb6, 0x8f, 0x5d, 0x5b, 0x1b, 0xab, 0x9a, 0x61, 0x24, 0xcd, 0x90, 0x39, 0xb5, 0x19, 0xb6, 0x42, + 0xa8, 0x3a, 0x41, 0x8a, 0x4c, 0xb0, 0x0f, 0x97, 0x22, 0x1d, 0x2e, 0xb6, 0x9c, 0xc3, 0xa4, 0x96, + 0xec, 0xa9, 0xb5, 0x44, 0x0b, 0x56, 0x18, 0x56, 0xa8, 0xe7, 0xa6, 0x48, 0x2a, 0x0f, 0x4d, 0xfd, + 0x5f, 0x70, 0x70, 0xae, 0xeb, 0x18, 0xe6, 0xbe, 0x89, 0x0d, 0x52, 0xd1, 0xc2, 0x78, 0x7d, 0x0f, + 0x90, 0x37, 0xf3, 0x7c, 0x6c, 0xa9, 0xba, 0x63, 0xef, 0x9b, 0x23, 0xd5, 0x9b, 0x68, 0x36, 0x8d, + 0x55, 0x51, 0x91, 0xd8, 0x4c, 0x93, 0x4e, 0xd0, 0x32, 0xd8, 0x06, 0x44, 0x73, 0xed, 0xd8, 0x3c, + 0xc4, 0x36, 0xf6, 0x3c, 0xc6, 0xcd, 0x22, 0xf0, 0xe2, 0x92, 0x05, 0x13, 0x21, 0x45, 0x22, 0x22, + 0x3b, 0x81, 0x04, 0xa1, 0x04, 0xd5, 0xe8, 0x27, 0x20, 0xf5, 0x7d, 0x53, 0x7f, 0x34, 0x6b, 0xc4, + 0x99, 0xb5, 0x01, 0xe0, 0x51, 0x9a, 0x3a, 0x34, 0xfd, 0x20, 0x5b, 0xad, 0x56, 0xeb, 0xbc, 0x10, + 0x2a, 0x40, 0xff, 0x23, 0x0f, 0x5b, 0x72, 0x60, 0x96, 0xa6, 0x63, 0x59, 0xb1, 0x8e, 0x16, 0xac, + 0x7b, 0x24, 0x9b, 0xab, 0x3e, 0x23, 0x04, 0x6a, 0x2a, 0x4b, 0xd7, 0x1f, 0x67, 0x7d, 0xa5, 0xe0, + 0x25, 0x6b, 0x40, 0x0b, 0xd6, 0x2d, 0x92, 0x66, 0x23, 0x94, 0xd4, 0x1b, 0x51, 0x92, 0xe9, 0x58, + 0x29, 0x58, 0xc9, 0xe4, 0xfc, 0x53, 0xb8, 0x18, 0xe4, 0x88, 0xd0, 0xfd, 0x11, 0x1e, 0x4f, 0xf1, + 0xae, 0x2e, 0xc1, 0x5b, 0x9a, 0x79, 0x94, 0x2d, 0xfd, 0x0d, 0x09, 0x69, 0xcb, 0x0a, 0xfc, 0x4e, + 0xbd, 0x15, 0xe1, 0xb3, 0x9c, 0xfb, 0xed, 0x65, 0xeb, 0x3d, 0x1e, 0x27, 0xca, 0x39, 0x6b, 0x49, + 0xf0, 0x7c, 0x0c, 0x28, 0xf6, 0x56, 0x04, 0xcc, 0x0e, 0xdc, 0xbb, 0xcb, 0xcc, 0xf9, 0x9a, 0xbb, + 0x15, 0xc9, 0x7b, 0x8d, 0x72, 0x53, 0xfc, 0x3c, 0xe8, 0x93, 0xaa, 0xbf, 0xe2, 0x60, 0x73, 0x77, + 0xe8, 0x61, 0xf7, 0x10, 0x1b, 0x91, 0xb7, 0x93, 0xd5, 0x9e, 0x5b, 0xa1, 0xda, 0xbf, 0x85, 0xd6, + 0x49, 0x0c, 0x3b, 0xb7, 0xea, 0x5f, 0xb3, 0x90, 0x1f, 0xb8, 0x9a, 0xed, 0x69, 0xba, 0x6f, 0x3a, + 0x36, 0xba, 0x03, 0x02, 0xe9, 0x53, 0x83, 0xf8, 0xb9, 0xb6, 0x42, 0xf5, 0x1a, 0x1c, 0xd9, 0x5d, + 0xec, 0x6b, 0x0d, 0x91, 0x28, 0x79, 0x3e, 0xaf, 0x70, 0x0a, 0x45, 0x40, 0x08, 0x04, 0x5b, 0xb3, + 0x58, 0xc3, 0x95, 0x53, 0xe8, 0x37, 0xfa, 0x21, 0x64, 0x48, 0x71, 0x9c, 0xb2, 0xea, 0xb8, 0xbc, + 0x72, 0x24, 0x56, 0xd3, 0xa7, 0xbc, 0x4a, 0x20, 0x83, 0x3a, 0x50, 0x1c, 0x6b, 0x9e, 0xaf, 0x1e, + 0x60, 0xcd, 0xf5, 0x87, 0x58, 0x3b, 0x55, 0xdd, 0x5b, 0x27, 0xa2, 0x77, 0x42, 0x49, 0xa4, 0x42, + 0x22, 0x9b, 0xab, 0x8e, 0x6b, 0x8e, 0xd4, 0xd8, 0xa8, 0x99, 0xd5, 0x61, 0x13, 0xa9, 0x7a, 0xd7, + 0x35, 0x47, 0xb1, 0x53, 0xef, 0xc0, 0xba, 0xa5, 0x1d, 0x25, 0x40, 0xb3, 0xab, 0x83, 0x16, 0x2c, + 0xed, 0x28, 0x46, 0xfa, 0x14, 0xce, 0x39, 0x41, 0xcc, 0xc4, 0x70, 0x5e, 0x49, 0x7c, 0x63, 0x4a, + 0x3d, 0x16, 0x61, 0x01, 0x2c, 0x72, 0x5e, 0x9f, 0xf0, 0xd0, 0x8f, 0xa1, 0x40, 0x12, 0xad, 0xed, + 0xd3, 0x83, 0xe4, 0x95, 0xf2, 0x14, 0xf5, 0x4d, 0x79, 0x2f, 0xec, 0x21, 0x98, 0x08, 0xa1, 0x78, + 0xa8, 0x0a, 0xeb, 0x4f, 0x5c, 0xd3, 0xc7, 0xaa, 0xef, 0x38, 0xaa, 0x33, 0x36, 0x4a, 0x05, 0x9a, + 0x68, 0xf3, 0x94, 0x38, 0x70, 0x9c, 0xdd, 0xb1, 0x41, 0x3c, 0xe7, 0x62, 0x2d, 0xb1, 0xfc, 0xd2, + 0xc6, 0x29, 0x3c, 0x47, 0x44, 0x63, 0x73, 0x7c, 0x00, 0x17, 0x74, 0x9a, 0xfb, 0x62, 0x34, 0x75, + 0xdf, 0x3c, 0xc2, 0x46, 0x49, 0xa2, 0x8a, 0xcf, 0xb3, 0xd9, 0x48, 0xe0, 0x16, 0x99, 0x43, 0x1f, + 0x83, 0x64, 0xda, 0xea, 0xfe, 0x98, 0x76, 0x69, 0x74, 0x69, 0x5e, 0x69, 0x93, 0xee, 0xf5, 0x9b, + 0xcb, 0xf6, 0x8a, 0x1f, 0x4f, 0xb1, 0xad, 0x63, 0xe3, 0x13, 0xc2, 0x19, 0xac, 0xa3, 0x68, 0xda, + 0xb7, 0xa8, 0x3c, 0x25, 0x7a, 0xe8, 0x10, 0x36, 0xcc, 0x91, 0xed, 0xb8, 0x24, 0x09, 0xe1, 0xc7, + 0xf6, 0xd4, 0xf2, 0x4a, 0x88, 0x22, 0x7e, 0xb8, 0xc2, 0xa9, 0x91, 0x99, 0x64, 0x1f, 0x3f, 0xee, + 0x4d, 0x2d, 0x5a, 0xb4, 0xe3, 0xe6, 0xef, 0x95, 0x39, 0x4f, 0x29, 0x9a, 0xd1, 0x98, 0x28, 0x39, + 0x76, 0xf5, 0xe2, 0x25, 0xa1, 0x23, 0x88, 0x39, 0x09, 0x3a, 0x82, 0xb8, 0x2e, 0x15, 0x3b, 0x82, + 0x58, 0x94, 0x36, 0xaa, 0x7f, 0x11, 0x60, 0x33, 0x71, 0x94, 0x14, 0xac, 0x3b, 0xae, 0xf1, 0x16, + 0x8f, 0xf7, 0x57, 0xe7, 0x28, 0x9f, 0x3d, 0x84, 0xbf, 0x46, 0xc1, 0x21, 0x26, 0x02, 0x23, 0x25, + 0xf1, 0x51, 0x78, 0x64, 0xa4, 0x6c, 0x47, 0x10, 0xb3, 0x92, 0xd8, 0x11, 0x44, 0x51, 0xca, 0x45, + 0x01, 0x03, 0x52, 0xbe, 0x23, 0x88, 0x05, 0x69, 0x3d, 0x19, 0x3c, 0x1d, 0x41, 0xdc, 0x90, 0xa4, + 0x8e, 0x20, 0x4a, 0xd2, 0x66, 0xf5, 0x4f, 0x29, 0xc8, 0xc8, 0xd4, 0x58, 0xe8, 0x43, 0x10, 0xa2, + 0x56, 0xea, 0x04, 0x0b, 0x27, 0x42, 0x85, 0xb0, 0xa3, 0x06, 0xf0, 0xfe, 0x51, 0xd8, 0x52, 0x9d, + 0x26, 0xe6, 0x98, 0x69, 0x89, 0x70, 0x22, 0xdc, 0xf8, 0xff, 0x21, 0xdc, 0x96, 0x78, 0x43, 0xf8, + 0x7f, 0x78, 0x83, 0xb5, 0x6d, 0xbf, 0xe1, 0xa0, 0xf8, 0x6a, 0xd0, 0x9c, 0xf4, 0x52, 0xa1, 0x83, + 0xe8, 0x05, 0xcc, 0xc1, 0xe5, 0xff, 0xf6, 0xcb, 0x79, 0xa5, 0xb9, 0xd2, 0xf3, 0xc2, 0x1b, 0x9e, + 0x8b, 0x88, 0x41, 0xfb, 0xf8, 0xb1, 0x12, 0x01, 0x27, 0x1a, 0x80, 0xff, 0xf0, 0x90, 0xde, 0xc1, + 0x9a, 0x87, 0xd1, 0x0f, 0x20, 0xcd, 0x6e, 0x93, 0xa7, 0x68, 0x51, 0x99, 0x04, 0xfa, 0x0c, 0x00, + 0x1f, 0x4d, 0x4c, 0x57, 0x23, 0xb6, 0x5f, 0xad, 0x27, 0x29, 0xff, 0x7b, 0x5e, 0xb9, 0x9c, 0xd8, + 0xc9, 0xcd, 0xaa, 0xab, 0xd9, 0x86, 0x3d, 0x1d, 0x8f, 0xb5, 0xe1, 0x18, 0x57, 0x95, 0x04, 0x20, + 0x6a, 0x41, 0x36, 0xbc, 0x19, 0xf2, 0xa7, 0xbe, 0x19, 0x86, 0xa2, 0x68, 0x0a, 0x89, 0x62, 0xcd, + 0x2e, 0xce, 0xe4, 0xaf, 0x67, 0x86, 0x77, 0xf5, 0x33, 0xae, 0x78, 0x2b, 0x46, 0xa7, 0xb7, 0xeb, + 0x3e, 0xc5, 0x46, 0x3d, 0xc8, 0x4f, 0x5c, 0x67, 0xe2, 0x78, 0xa4, 0x7c, 0x7b, 0xab, 0xe5, 0xb9, + 0xe2, 0x62, 0x5e, 0x81, 0x7b, 0x81, 0xd4, 0xa0, 0xaf, 0x40, 0x88, 0x30, 0xf0, 0xd0, 0x79, 0x48, + 0xe3, 0x89, 0xa3, 0x1f, 0xd0, 0x2e, 0x85, 0x57, 0xd8, 0x00, 0xbd, 0x9f, 0x88, 0x1a, 0xd2, 0x69, + 0xf0, 0x8d, 0xcd, 0x97, 0xf3, 0xca, 0x3a, 0xf5, 0x6c, 0x18, 0x7b, 0x49, 0xff, 0x87, 0x35, 0xa4, + 0xba, 0xe0, 0xa0, 0x58, 0x1f, 0x3a, 0x2e, 0x4d, 0x85, 0x6d, 0xdb, 0x77, 0x67, 0x27, 0x05, 0xe7, + 0xd9, 0x7b, 0x4f, 0x74, 0x00, 0xe2, 0xc4, 0x35, 0x1d, 0xd7, 0xf4, 0x67, 0xc1, 0x63, 0xd5, 0xce, + 0xcb, 0x79, 0xe5, 0xce, 0x59, 0xe3, 0xfb, 0x5e, 0x80, 0xa9, 0x44, 0xe8, 0x89, 0x20, 0xff, 0x05, + 0x0f, 0x9b, 0x3b, 0x58, 0xdb, 0x1f, 0x1c, 0xd9, 0xb2, 0x3d, 0x99, 0x12, 0xd7, 0xf8, 0x18, 0x7d, + 0xc4, 0xf2, 0x12, 0x0b, 0xf7, 0xf2, 0xc9, 0x09, 0x25, 0x99, 0x8b, 0xbe, 0x03, 0x1b, 0x2e, 0xde, + 0x77, 0xb1, 0x77, 0xa0, 0x9a, 0xf6, 0xa1, 0x36, 0x36, 0x0d, 0x6a, 0x72, 0x51, 0x29, 0x06, 0x64, + 0x99, 0x51, 0x97, 0xd6, 0x15, 0xf1, 0x6c, 0x75, 0xe5, 0x3a, 0x6c, 0x79, 0x3e, 0x9e, 0x4c, 0x4c, + 0x7b, 0xa4, 0x5a, 0xe4, 0xd2, 0x80, 0x6d, 0x12, 0x7d, 0x46, 0x29, 0x47, 0x57, 0x70, 0x2e, 0x9c, + 0xec, 0x3a, 0x06, 0x6e, 0xb3, 0x29, 0x64, 0x42, 0x81, 0x76, 0x5f, 0x1e, 0x7e, 0xac, 0xda, 0x53, + 0xab, 0x04, 0x6f, 0x37, 0xab, 0x00, 0x01, 0x67, 0x19, 0xf0, 0xb5, 0xa2, 0x23, 0x48, 0xe9, 0x8e, + 0x20, 0xa6, 0xa5, 0x0c, 0x2b, 0x40, 0xd5, 0x5f, 0xa6, 0x22, 0x37, 0xdc, 0x32, 0x6d, 0x6d, 0x7c, + 0x36, 0x37, 0x7c, 0x1f, 0x4a, 0xc9, 0x67, 0x29, 0xc7, 0xb2, 0x34, 0x9b, 0xfc, 0x4e, 0x6d, 0x9f, + 0x05, 0x96, 0x92, 0x78, 0xb6, 0x6a, 0xb2, 0xe9, 0x26, 0x99, 0x45, 0x0d, 0x58, 0x0f, 0x1d, 0xc8, + 0x5a, 0x06, 0x61, 0x95, 0x96, 0xa1, 0x10, 0xc8, 0xb0, 0x9e, 0x61, 0xd5, 0x20, 0x88, 0x4c, 0x12, + 0x99, 0x81, 0x55, 0xe0, 0x6b, 0x7f, 0xe6, 0x20, 0x47, 0x9f, 0x9c, 0xe9, 0x3b, 0x58, 0x1e, 0xb2, + 0x7b, 0xbd, 0xbb, 0xbd, 0xdd, 0x4f, 0x7a, 0xd2, 0x1a, 0xca, 0x02, 0x2f, 0xf7, 0x06, 0x12, 0x87, + 0x72, 0x90, 0xbe, 0xb5, 0xb3, 0x5b, 0x1f, 0x48, 0x29, 0xf2, 0xd9, 0x78, 0x30, 0x68, 0xf7, 0x25, + 0x1e, 0x9d, 0x83, 0x8d, 0x56, 0x7b, 0x47, 0xee, 0xca, 0x83, 0x76, 0x4b, 0x65, 0x44, 0x11, 0x89, + 0x20, 0x0c, 0xe4, 0x6e, 0x5b, 0x12, 0x08, 0x54, 0xab, 0xdd, 0x94, 0xbb, 0xf5, 0x1d, 0x29, 0x8d, + 0xb6, 0x60, 0x33, 0xe6, 0x0d, 0xc9, 0x39, 0x54, 0x00, 0xb1, 0xb5, 0xa7, 0xd4, 0x07, 0xf2, 0x6e, + 0x4f, 0xca, 0x20, 0x80, 0x0c, 0x91, 0x1d, 0x3c, 0x94, 0x0a, 0x44, 0xcf, 0x60, 0xef, 0xde, 0x4e, + 0x5b, 0x02, 0xc2, 0xd4, 0x90, 0x07, 0x75, 0x45, 0xa9, 0x3f, 0x90, 0xf2, 0xa8, 0x08, 0x40, 0x98, + 0xfa, 0x6d, 0x45, 0x6e, 0xf7, 0x25, 0xa3, 0x4a, 0xba, 0x89, 0xec, 0xb5, 0x1f, 0xc1, 0xe6, 0xb1, + 0xa7, 0x3e, 0xb4, 0x01, 0xf9, 0x7a, 0xab, 0xa5, 0x2a, 0xed, 0x7b, 0x3b, 0x72, 0xb3, 0x2e, 0xad, + 0x21, 0x04, 0x45, 0xa5, 0xdd, 0xdd, 0xbd, 0xdf, 0x8e, 0x68, 0xdc, 0x65, 0xe1, 0xf3, 0xdf, 0x96, + 0xd7, 0xae, 0xed, 0xbe, 0xd2, 0xa5, 0xb2, 0xb2, 0x4d, 0x76, 0x70, 0xaf, 0xdd, 0x6b, 0xc9, 0xbd, + 0xdb, 0xd2, 0x1a, 0x19, 0xf4, 0x07, 0xf5, 0xdb, 0x64, 0xc0, 0xa3, 0x75, 0xc8, 0x35, 0x77, 0xbb, + 0x5d, 0x79, 0x30, 0x68, 0xb7, 0x24, 0x8e, 0xcc, 0xd5, 0x1b, 0xbb, 0x0a, 0x19, 0xa4, 0x18, 0x60, + 0xe3, 0xbb, 0xcf, 0xfe, 0x59, 0x5e, 0x7b, 0xb6, 0x28, 0x73, 0xcf, 0x17, 0x65, 0xee, 0xcb, 0x45, + 0x99, 0xfb, 0xc7, 0xa2, 0xcc, 0x7d, 0xf1, 0xa2, 0xbc, 0xf6, 0xfc, 0x45, 0x79, 0xed, 0xcb, 0x17, + 0xe5, 0xb5, 0x87, 0xd9, 0xc0, 0xb7, 0xc3, 0x0c, 0xfd, 0x7f, 0xc8, 0x8d, 0xff, 0x06, 0x00, 0x00, + 0xff, 0xff, 0x7a, 0x18, 0xe7, 0x5a, 0xc9, 0x19, 0x00, 0x00, } diff --git a/pkg/roachpb/data.proto b/pkg/roachpb/data.proto index 0c097967a1c7..6ffd1f2edb88 100644 --- a/pkg/roachpb/data.proto +++ b/pkg/roachpb/data.proto @@ -494,6 +494,14 @@ message Transaction { // treated as immutable and all updates should be performed on a copy of the // slice. repeated SequencedWrite in_flight_writes = 17 [(gogoproto.nullable) = false]; + // A list of ignored seqnum ranges. + // + // The user code must guarantee this list to be non-overlapping, + // non-contiguous (i.e. it must coalesce ranges to avoid situations + // where a range's end seqnum is equal to the next range's start + // seqnum), and sorted in seqnum order. + repeated storage.engine.enginepb.IgnoredSeqNumRange ignored_seqnums = 18 + [(gogoproto.nullable) = false, (gogoproto.customname) = "IgnoredSeqNums"]; reserved 3, 9, 13, 14; } @@ -520,18 +528,32 @@ message TransactionRecord { util.hlc.Timestamp last_heartbeat = 5 [(gogoproto.nullable) = false]; repeated Span intent_spans = 11 [(gogoproto.nullable) = false]; repeated SequencedWrite in_flight_writes = 17 [(gogoproto.nullable) = false]; + repeated storage.engine.enginepb.IgnoredSeqNumRange ignored_seqnums = 18 + [(gogoproto.nullable) = false, (gogoproto.customname) = "IgnoredSeqNums"]; // Fields on Transaction that are not present in a transaction record. reserved 2, 3, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16; } // A Intent is a Span together with a Transaction metadata and its status. +// +// Intents are used for two separate purposes: +// - on the return path of e.g. scans, to report the existence of a +// write intent on a key; +// - as input argument to intent resolution, to pass the current txn status, +// timestamps and ignored seqnum ranges to the resolution algorithm. +// Only in the latter case are the TxnMeta, status and ignored seqnum +// ranges guaranteed to be consistent with the latest txn's state. +// +// Note: avoid constructing Intent directly; consider using +// MakeIntent() or MakeErrorIntent() instead. message Intent { option (gogoproto.equal) = true; Span span = 1 [(gogoproto.nullable) = false, (gogoproto.embed) = true]; storage.engine.enginepb.TxnMeta txn = 2 [(gogoproto.nullable) = false]; TransactionStatus status = 3; + repeated storage.engine.enginepb.IgnoredSeqNumRange ignored_seqnums = 4 [(gogoproto.nullable) = false, (gogoproto.customname) = "IgnoredSeqNums"]; } // A SequencedWrite is a point write to a key with a certain sequence number. diff --git a/pkg/roachpb/data_test.go b/pkg/roachpb/data_test.go index 1ed286494491..3268234c93b3 100644 --- a/pkg/roachpb/data_test.go +++ b/pkg/roachpb/data_test.go @@ -490,6 +490,7 @@ var nonZeroTxn = Transaction{ IntentSpans: []Span{{Key: []byte("a"), EndKey: []byte("b")}}, InFlightWrites: []SequencedWrite{{Key: []byte("c"), Sequence: 1}}, CommitTimestampFixed: true, + IgnoredSeqNums: []enginepb.IgnoredSeqNumRange{{Start: 888, End: 999}}, } func TestTransactionUpdate(t *testing.T) { @@ -550,6 +551,7 @@ func TestTransactionUpdate(t *testing.T) { expTxn5.Sequence = txn.Sequence - 10 expTxn5.IntentSpans = nil expTxn5.InFlightWrites = nil + expTxn5.IgnoredSeqNums = nil expTxn5.WriteTooOld = false expTxn5.CommitTimestampFixed = false require.Equal(t, expTxn5, txn5) @@ -636,6 +638,7 @@ func TestTransactionClone(t *testing.T) { // listed below. If this test fails, please update the list below and/or // Transaction.Clone(). expFields := []string{ + "IgnoredSeqNums", "InFlightWrites", "InFlightWrites.Key", "IntentSpans", @@ -666,6 +669,7 @@ func TestTransactionRestart(t *testing.T) { expTxn.CommitTimestampFixed = false expTxn.IntentSpans = nil expTxn.InFlightWrites = nil + expTxn.IgnoredSeqNums = nil require.Equal(t, expTxn, txn) } @@ -688,19 +692,25 @@ func TestTransactionRecordRoundtrips(t *testing.T) { txn := nonZeroTxn txnRecord := txn.AsRecord() if err := zerofields.NoZeroField(txnRecord); err != nil { - t.Fatal(err) + t.Error(err) } if !reflect.DeepEqual(txnRecord.TxnMeta, txn.TxnMeta) { - t.Fatalf("txnRecord.TxnMeta = %v, txn.TxnMeta = %v", txnRecord.TxnMeta, txn.TxnMeta) + t.Errorf("txnRecord.TxnMeta = %v, txn.TxnMeta = %v", txnRecord.TxnMeta, txn.TxnMeta) } if !reflect.DeepEqual(txnRecord.Status, txn.Status) { - t.Fatalf("txnRecord.Status = %v, txn.Status = %v", txnRecord.Status, txn.Status) + t.Errorf("txnRecord.Status = %v, txn.Status = %v", txnRecord.Status, txn.Status) } if !reflect.DeepEqual(txnRecord.LastHeartbeat, txn.LastHeartbeat) { - t.Fatalf("txnRecord.LastHeartbeat = %v, txn.LastHeartbeat = %v", txnRecord.LastHeartbeat, txn.LastHeartbeat) + t.Errorf("txnRecord.LastHeartbeat = %v, txn.LastHeartbeat = %v", txnRecord.LastHeartbeat, txn.LastHeartbeat) } if !reflect.DeepEqual(txnRecord.IntentSpans, txn.IntentSpans) { - t.Fatalf("txnRecord.IntentSpans = %v, txn.IntentSpans = %v", txnRecord.IntentSpans, txn.IntentSpans) + t.Errorf("txnRecord.IntentSpans = %v, txn.IntentSpans = %v", txnRecord.IntentSpans, txn.IntentSpans) + } + if !reflect.DeepEqual(txnRecord.InFlightWrites, txn.InFlightWrites) { + t.Errorf("txnRecord.InFlightWrites = %v, txn.InFlightWrites = %v", txnRecord.InFlightWrites, txn.InFlightWrites) + } + if !reflect.DeepEqual(txnRecord.IgnoredSeqNums, txn.IgnoredSeqNums) { + t.Errorf("txnRecord.IgnoredSeqNums = %v, txn.IgnoredSeqNums = %v", txnRecord.IgnoredSeqNums, txn.IgnoredSeqNums) } // Verify that converting through a Transaction message and back @@ -708,7 +718,7 @@ func TestTransactionRecordRoundtrips(t *testing.T) { txn2 := txnRecord.AsTransaction() txnRecord2 := txn2.AsRecord() if !reflect.DeepEqual(txnRecord, txnRecord2) { - t.Fatalf("txnRecord = %v, txnRecord2 = %v", txnRecord, txnRecord2) + t.Errorf("txnRecord = %v, txnRecord2 = %v", txnRecord, txnRecord2) } // Verify that encoded Transaction messages can be decoded as @@ -722,7 +732,7 @@ func TestTransactionRecordRoundtrips(t *testing.T) { t.Fatal(err) } if !reflect.DeepEqual(txnRecord, txnRecord3) { - t.Fatalf("txnRecord = %v, txnRecord3 = %v", txnRecord, txnRecord3) + t.Errorf("txnRecord = %v, txnRecord3 = %v", txnRecord, txnRecord3) } // Verify that encoded TransactionRecord messages can be decoded @@ -736,7 +746,7 @@ func TestTransactionRecordRoundtrips(t *testing.T) { t.Fatal(err) } if !reflect.DeepEqual(txn2, txn3) { - t.Fatalf("txn2 = %v, txn3 = %v", txn2, txn3) + t.Errorf("txn2 = %v, txn3 = %v", txn2, txn3) } } @@ -1877,3 +1887,22 @@ func TestChangeReplicasTrigger_ConfChange(t *testing.T) { }) } } + +// TestAsIntents verifies that AsIntents propagates all the important +// fields from a txn to each intent. +func TestAsIntents(t *testing.T) { + defer leaktest.AfterTest(t)() + + ts := hlc.Timestamp{WallTime: 1} + txn := MakeTransaction("hello", Key("k"), 0, ts, 0) + + txn.Status = COMMITTED + txn.IgnoredSeqNums = []enginepb.IgnoredSeqNumRange{{Start: 0, End: 0}} + + spans := []Span{{Key: Key("a"), EndKey: Key("b")}} + for _, intent := range AsIntents(spans, &txn) { + require.Equal(t, intent.Status, txn.Status) + require.Equal(t, intent.IgnoredSeqNums, txn.IgnoredSeqNums) + require.Equal(t, intent.Txn, txn.TxnMeta) + } +} diff --git a/pkg/storage/batcheval/cmd_end_transaction.go b/pkg/storage/batcheval/cmd_end_transaction.go index 560da53adbdc..dc8b54b9bdc6 100644 --- a/pkg/storage/batcheval/cmd_end_transaction.go +++ b/pkg/storage/batcheval/cmd_end_transaction.go @@ -36,11 +36,6 @@ import ( "github.com/cockroachdb/logtags" ) -// TxnAutoGC controls whether Transaction entries are automatically gc'ed upon -// EndTxn if they only have local intents (which can be resolved synchronously -// with EndTxn). Certain tests become simpler with this being turned off. -var TxnAutoGC = true - func init() { RegisterReadWriteCommand(roachpb.EndTxn, declareKeysEndTxn, EndTxn) } @@ -483,7 +478,7 @@ func resolveLocalIntents( externalIntents = append(externalIntents, span) return nil } - intent := roachpb.Intent{Span: span, Txn: txn.TxnMeta, Status: txn.Status} + intent := roachpb.MakeIntent(txn, span) if len(span.EndKey) == 0 { // For single-key intents, do a KeyAddress-aware check of // whether it's contained in our Range. @@ -567,7 +562,7 @@ func updateFinalizedTxn( txn *roachpb.Transaction, externalIntents []roachpb.Span, ) error { - if TxnAutoGC && len(externalIntents) == 0 { + if txnAutoGC && len(externalIntents) == 0 { if log.V(2) { log.Infof(ctx, "auto-gc'ed %s (%d intents)", txn.Short(), len(args.IntentSpans)) } @@ -1132,3 +1127,16 @@ func changeReplicasTrigger( return pd } + +// txnAutoGC controls whether Transaction entries are automatically gc'ed upon +// EndTxn if they only have local intents (which can be resolved synchronously +// with EndTxn). Certain tests become simpler with this being turned off. +var txnAutoGC = true + +// TestingSetTxnAutoGC is used in tests to temporarily enable/disable +// txnAutoGC. +func TestingSetTxnAutoGC(to bool) func() { + prev := txnAutoGC + txnAutoGC = to + return func() { txnAutoGC = prev } +} diff --git a/pkg/storage/batcheval/cmd_end_transaction_test.go b/pkg/storage/batcheval/cmd_end_transaction_test.go index 3f8b5d462a28..52259bd09358 100644 --- a/pkg/storage/batcheval/cmd_end_transaction_test.go +++ b/pkg/storage/batcheval/cmd_end_transaction_test.go @@ -19,6 +19,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/storage/abortspan" "github.com/cockroachdb/cockroach/pkg/storage/engine" + "github.com/cockroachdb/cockroach/pkg/storage/engine/enginepb" "github.com/cockroachdb/cockroach/pkg/testutils" "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/leaktest" @@ -1056,3 +1057,119 @@ func TestEndTxnUpdatesTransactionRecord(t *testing.T) { }) } } + +// TestPartialRollbackOnEndTransaction verifies that the intent +// resolution performed synchronously as a side effect of +// EndTransaction request properly takes into account the ignored +// seqnum list. +func TestPartialRollbackOnEndTransaction(t *testing.T) { + defer leaktest.AfterTest(t)() + + ctx := context.Background() + k := roachpb.Key("a") + ts := hlc.Timestamp{WallTime: 1} + ts2 := hlc.Timestamp{WallTime: 2} + txn := roachpb.MakeTransaction("test", k, 0, ts, 0) + endKey := roachpb.Key("z") + desc := roachpb.RangeDescriptor{ + RangeID: 99, + StartKey: roachpb.RKey(k), + EndKey: roachpb.RKey(endKey), + } + intents := []roachpb.Span{{Key: k}} + + // We want to inspect the final txn record after EndTxn, to + // ascertain that it persists the ignore list. + defer TestingSetTxnAutoGC(false)() + + testutils.RunTrueAndFalse(t, "withStoredTxnRecord", func(t *testing.T, storeTxnBeforeEndTxn bool) { + db := engine.NewDefaultInMem() + defer db.Close() + batch := db.NewBatch() + defer batch.Close() + + var v roachpb.Value + + // Write a first value at key. + v.SetString("a") + txn.Sequence = 1 + if err := engine.MVCCPut(ctx, batch, nil, k, ts, v, &txn); err != nil { + t.Fatal(err) + } + // Write another value. + v.SetString("b") + txn.Sequence = 2 + if err := engine.MVCCPut(ctx, batch, nil, k, ts, v, &txn); err != nil { + t.Fatal(err) + } + + // Partially revert the store above. + txn.IgnoredSeqNums = []enginepb.IgnoredSeqNumRange{{Start: 2, End: 2}} + + // We test with and without a stored txn record, so as to exercise + // the two branches of EndTxn() and verify that the ignored seqnum + // list is properly persisted in the stored transaction record. + txnKey := keys.TransactionKey(txn.Key, txn.ID) + if storeTxnBeforeEndTxn { + txnRec := txn.AsRecord() + if err := engine.MVCCPutProto(ctx, batch, nil, txnKey, hlc.Timestamp{}, nil, &txnRec); err != nil { + t.Fatal(err) + } + } + + // Issue the end txn command. + req := roachpb.EndTxnRequest{ + RequestHeader: roachpb.RequestHeader{Key: txn.Key}, + Commit: true, + NoRefreshSpans: true, + IntentSpans: intents, + } + var resp roachpb.EndTxnResponse + if _, err := EndTxn(ctx, batch, CommandArgs{ + EvalCtx: &mockEvalCtx{ + desc: &desc, + canCreateTxnFn: func() (bool, hlc.Timestamp, roachpb.TransactionAbortedReason) { + return true, ts, 0 + }, + }, + Args: &req, + Header: roachpb.Header{ + Timestamp: ts, + Txn: &txn, + }, + }, &resp); err != nil { + t.Fatal(err) + } + + // The second write has been rolled back; verify that the remaining + // value is from the first write. + res, i, err := engine.MVCCGet(ctx, batch, k, ts2, engine.MVCCGetOptions{}) + if err != nil { + t.Fatal(err) + } + if i != nil { + t.Errorf("found intent, expected none: %+v", i) + } + if res == nil { + t.Errorf("no value found, expected one") + } else { + s, err := res.GetBytes() + if err != nil { + t.Fatal(err) + } + require.Equal(t, "a", string(s)) + } + + // Also verify that the txn record contains the ignore list. + var txnRec roachpb.TransactionRecord + hasRec, err := engine.MVCCGetProto(ctx, batch, txnKey, hlc.Timestamp{}, &txnRec, engine.MVCCGetOptions{}) + if err != nil { + t.Fatal(err) + } + if !hasRec { + t.Error("expected txn record remaining after test, found none") + } else { + require.Equal(t, txn.IgnoredSeqNums, txnRec.IgnoredSeqNums) + } + }) +} diff --git a/pkg/storage/batcheval/cmd_refresh_range_test.go b/pkg/storage/batcheval/cmd_refresh_range_test.go index 33294ca6bc32..f1957275264e 100644 --- a/pkg/storage/batcheval/cmd_refresh_range_test.go +++ b/pkg/storage/batcheval/cmd_refresh_range_test.go @@ -83,11 +83,9 @@ func TestRefreshRangeTimeBoundIterator(t *testing.T) { // (committed). The sstable also has a second write at a different (older) // timestamp, because if it were empty other than the deletion tombstone, it // would not have any timestamp bounds and would be selected for every read. - if _, err := engine.MVCCResolveWriteIntent(ctx, db, nil, roachpb.Intent{ - Span: roachpb.Span{Key: k}, - Txn: txn.TxnMeta, - Status: roachpb.COMMITTED, - }); err != nil { + intent := roachpb.MakeIntent(txn, roachpb.Span{Key: k}) + intent.Status = roachpb.COMMITTED + if _, err := engine.MVCCResolveWriteIntent(ctx, db, nil, intent); err != nil { t.Fatal(err) } if err := engine.MVCCPut(ctx, db, nil, roachpb.Key("unused2"), ts1, v, nil); err != nil { diff --git a/pkg/storage/batcheval/cmd_resolve_intent.go b/pkg/storage/batcheval/cmd_resolve_intent.go index d650364e44f1..5b0836545361 100644 --- a/pkg/storage/batcheval/cmd_resolve_intent.go +++ b/pkg/storage/batcheval/cmd_resolve_intent.go @@ -79,11 +79,7 @@ func ResolveIntent( return result.Result{}, ErrTransactionUnsupported } - intent := roachpb.Intent{ - Span: args.Span(), - Txn: args.IntentTxn, - Status: args.Status, - } + intent := args.AsIntent() ok, err := engine.MVCCResolveWriteIntent(ctx, readWriter, ms, intent) if err != nil { return result.Result{}, err diff --git a/pkg/storage/batcheval/cmd_resolve_intent_range.go b/pkg/storage/batcheval/cmd_resolve_intent_range.go index fc8065cf4a3c..e4175053c7aa 100644 --- a/pkg/storage/batcheval/cmd_resolve_intent_range.go +++ b/pkg/storage/batcheval/cmd_resolve_intent_range.go @@ -42,11 +42,7 @@ func ResolveIntentRange( return result.Result{}, ErrTransactionUnsupported } - intent := roachpb.Intent{ - Span: args.Span(), - Txn: args.IntentTxn, - Status: args.Status, - } + intent := args.AsIntent() iterAndBuf := engine.GetIterAndBuf(readWriter, engine.IterOptions{UpperBound: args.EndKey}) defer iterAndBuf.Cleanup() diff --git a/pkg/storage/batcheval/cmd_resolve_intent_test.go b/pkg/storage/batcheval/cmd_resolve_intent_test.go index 78ae99f19916..c3af46381c40 100644 --- a/pkg/storage/batcheval/cmd_resolve_intent_test.go +++ b/pkg/storage/batcheval/cmd_resolve_intent_test.go @@ -30,6 +30,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/leaktest" "github.com/cockroachdb/cockroach/pkg/util/uuid" + "github.com/stretchr/testify/require" ) type mockEvalCtx struct { @@ -234,3 +235,132 @@ func TestDeclareKeysResolveIntent(t *testing.T) { } }) } + +// TestResolveIntentAfterPartialRollback checks that the ResolveIntent +// and ResolveIntentRange properly propagate their IgnoredSeqNums +// parameter to the MVCC layer and only commit writes at non-ignored +// seqnums. +func TestResolveIntentAfterPartialRollback(t *testing.T) { + defer leaktest.AfterTest(t)() + + ctx := context.Background() + k := roachpb.Key("a") + ts := hlc.Timestamp{WallTime: 1} + ts2 := hlc.Timestamp{WallTime: 2} + endKey := roachpb.Key("z") + txn := roachpb.MakeTransaction("test", k, 0, ts, 0) + desc := roachpb.RangeDescriptor{ + RangeID: 99, + StartKey: roachpb.RKey(k), + EndKey: roachpb.RKey(endKey), + } + + testutils.RunTrueAndFalse(t, "ranged", func(t *testing.T, ranged bool) { + db := engine.NewDefaultInMem() + defer db.Close() + batch := db.NewBatch() + defer batch.Close() + + var v roachpb.Value + // Write a first value at key. + v.SetString("a") + txn.Sequence = 0 + if err := engine.MVCCPut(ctx, batch, nil, k, ts, v, &txn); err != nil { + t.Fatal(err) + } + // Write another value. + v.SetString("b") + txn.Sequence = 1 + if err := engine.MVCCPut(ctx, batch, nil, k, ts, v, &txn); err != nil { + t.Fatal(err) + } + if err := batch.Commit(true); err != nil { + t.Fatal(err) + } + + // Partially revert the 2nd store above. + ignoredSeqNums := []enginepb.IgnoredSeqNumRange{{Start: 1, End: 1}} + + h := roachpb.Header{ + RangeID: desc.RangeID, + Timestamp: ts, + } + + var spans spanset.SpanSet + rbatch := db.NewBatch() + rbatch = spanset.NewBatch(rbatch, &spans) + defer rbatch.Close() + + if !ranged { + // Resolve a point intent. + ri := roachpb.ResolveIntentRequest{ + IntentTxn: txn.TxnMeta, + Status: roachpb.COMMITTED, + IgnoredSeqNums: ignoredSeqNums, + } + ri.Key = k + + declareKeysResolveIntent(&desc, h, &ri, &spans) + + if _, err := ResolveIntent(ctx, rbatch, + CommandArgs{ + Header: h, + EvalCtx: &mockEvalCtx{}, + Args: &ri, + }, + &roachpb.ResolveIntentResponse{}, + ); err != nil { + t.Fatal(err) + } + } else { + // Resolve an intent range. + rir := roachpb.ResolveIntentRangeRequest{ + IntentTxn: txn.TxnMeta, + Status: roachpb.COMMITTED, + IgnoredSeqNums: ignoredSeqNums, + } + rir.Key = k + rir.EndKey = endKey + + declareKeysResolveIntentRange(&desc, h, &rir, &spans) + + if _, err := ResolveIntentRange(ctx, rbatch, + CommandArgs{ + Header: h, + EvalCtx: &mockEvalCtx{}, + Args: &rir, + MaxKeys: 10, + }, + &roachpb.ResolveIntentRangeResponse{}, + ); err != nil { + t.Fatal(err) + } + } + + if err := rbatch.Commit(true); err != nil { + t.Fatal(err) + } + + batch = db.NewBatch() + defer batch.Close() + + // The second write has been rolled back; verify that the remaining + // value is from the first write. + res, i, err := engine.MVCCGet(ctx, batch, k, ts2, engine.MVCCGetOptions{}) + if err != nil { + t.Fatal(err) + } + if i != nil { + t.Errorf("%s: found intent, expected none: %+v", k, i) + } + if res == nil { + t.Errorf("%s: no value found, expected one", k) + } else { + s, err := res.GetBytes() + if err != nil { + t.Fatal(err) + } + require.Equal(t, "a", string(s), "at key %s", k) + } + }) +} diff --git a/pkg/storage/batcheval/transaction.go b/pkg/storage/batcheval/transaction.go index 8a14055b0280..4286ecc6b4d0 100644 --- a/pkg/storage/batcheval/transaction.go +++ b/pkg/storage/batcheval/transaction.go @@ -151,13 +151,24 @@ func CanCreateTxnRecord(rec EvalContext, txn *roachpb.Transaction) error { return nil } -// SynthesizeTxnFromMeta creates a synthetic transaction object from the -// provided transaction metadata. The synthetic transaction is not meant to be -// persisted, but can serve as a representation of the transaction for outside -// observation. The function also checks whether it is possible for the -// transaction to ever create a transaction record in the future. If not, the -// returned transaction will be marked as ABORTED and it is safe to assume that -// the transaction record will never be written in the future. +// SynthesizeTxnFromMeta creates a synthetic transaction object from +// the provided transaction metadata. The synthetic transaction is not +// meant to be persisted, but can serve as a representation of the +// transaction for outside observation. The function also checks +// whether it is possible for the transaction to ever create a +// transaction record in the future. If not, the returned transaction +// will be marked as ABORTED and it is safe to assume that the +// transaction record will never be written in the future. +// +// Note that the Transaction object returned by this function is +// inadequate to perform further KV reads or to perform intent +// resolution on its behalf, even if its state is PENDING. This is +// because the original Transaction object may have been partially +// rolled back and marked some of its intents as "ignored" +// (txn.IgnoredSeqNums != nil), but this state is not stored in +// TxnMeta. Proceeding to KV reads or intent resolution without this +// information would cause a partial rollback, if any, to be reverted +// and yield inconsistent data. func SynthesizeTxnFromMeta(rec EvalContext, txn enginepb.TxnMeta) roachpb.Transaction { // Construct the transaction object. synthTxnRecord := roachpb.TransactionRecord{ diff --git a/pkg/storage/client_metrics_test.go b/pkg/storage/client_metrics_test.go index c91d386c9e81..684a3fa5801f 100644 --- a/pkg/storage/client_metrics_test.go +++ b/pkg/storage/client_metrics_test.go @@ -196,14 +196,18 @@ func TestStoreResolveMetrics(t *testing.T) { endKey := span.EndKey if i > n/2 { req := &roachpb.ResolveIntentRangeRequest{ - IntentTxn: txn.TxnMeta, Status: status, Poison: poison, + IntentTxn: txn.TxnMeta, + Status: status, + Poison: poison, } req.Key, req.EndKey = key, endKey ba.Add(req) continue } req := &roachpb.ResolveIntentRequest{ - IntentTxn: txn.TxnMeta, Status: status, Poison: poison, + IntentTxn: txn.TxnMeta, + Status: status, + Poison: poison, } req.Key = key ba.Add(req) diff --git a/pkg/storage/engine/enginepb/mvcc.go b/pkg/storage/engine/enginepb/mvcc.go index 243f161770da..f92b2f196cc5 100644 --- a/pkg/storage/engine/enginepb/mvcc.go +++ b/pkg/storage/engine/enginepb/mvcc.go @@ -48,6 +48,39 @@ const ( MaxTxnPriority TxnPriority = math.MaxInt32 ) +// TxnSeqIsIgnored returns true iff the sequence number overlaps with +// any range in the ignored array. +func TxnSeqIsIgnored(seq TxnSeq, ignored []IgnoredSeqNumRange) bool { + // The ignored seqnum ranges are guaranteed to be + // non-overlapping, non-contiguous, and guaranteed to be + // sorted in seqnum order. We're going to look from the end to + // see if the current intent seqnum is ignored. + for i := len(ignored) - 1; i >= 0; i-- { + if seq < ignored[i].Start { + // The history entry's sequence number is lower/older than + // the current ignored range. Go to the previous range + // and try again. + continue + } + + // Here we have a range where the start seqnum is lower than the current + // intent seqnum. Does it include it? + if seq > ignored[i].End { + // Here we have a range where the current history entry's seqnum + // is higher than the range's end seqnum. Given that the + // ranges are sorted, we're guaranteed that there won't + // be any further overlapping range at a lower value of i. + return false + } + // Yes, it's included. We're going to skip over this + // intent seqnum and retry the search above. + return true + } + + // Exhausted the ignore list. Not ignored. + return false +} + // Short returns a prefix of the transaction's ID. func (t TxnMeta) Short() string { return t.ID.Short() @@ -174,14 +207,34 @@ func (meta *MVCCMetadata) AddToIntentHistory(seq TxnSeq, val []byte) { // GetPrevIntentSeq goes through the intent history and finds the previous // intent's sequence number given the current sequence. -func (meta *MVCCMetadata) GetPrevIntentSeq(seq TxnSeq) (TxnSeq, bool) { - index := sort.Search(len(meta.IntentHistory), func(i int) bool { - return meta.IntentHistory[i].Sequence >= seq - }) - if index > 0 && index < len(meta.IntentHistory) { - return meta.IntentHistory[index-1].Sequence, true +func (meta *MVCCMetadata) GetPrevIntentSeq( + seq TxnSeq, ignored []IgnoredSeqNumRange, +) (MVCCMetadata_SequencedIntent, bool) { + end := len(meta.IntentHistory) + found := 0 + for { + index := sort.Search(end, func(i int) bool { + return meta.IntentHistory[i].Sequence >= seq + }) + if index == 0 { + // It is possible that no intent exists such that the sequence is less + // than the read sequence. In this case, we cannot read a value from the + // intent history. + return MVCCMetadata_SequencedIntent{}, false + } + candidate := index - 1 + if TxnSeqIsIgnored(meta.IntentHistory[candidate].Sequence, ignored) { + // This entry was part of an ignored range. Skip it and + // try the search again, using the current position as new + // upper bound. + end = candidate + continue + } + // This history entry has not been ignored, so we're going to keep it. + found = candidate + break } - return 0, false + return meta.IntentHistory[found], true } // GetIntentValue goes through the intent history and finds the value diff --git a/pkg/storage/engine/enginepb/mvcc3.pb.go b/pkg/storage/engine/enginepb/mvcc3.pb.go index b9dfbb04a381..f854a9fd6a44 100644 --- a/pkg/storage/engine/enginepb/mvcc3.pb.go +++ b/pkg/storage/engine/enginepb/mvcc3.pb.go @@ -123,7 +123,7 @@ type TxnMeta struct { func (m *TxnMeta) Reset() { *m = TxnMeta{} } func (*TxnMeta) ProtoMessage() {} func (*TxnMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_mvcc3_bde9941189a794a0, []int{0} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{0} } func (m *TxnMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -148,6 +148,42 @@ func (m *TxnMeta) XXX_DiscardUnknown() { var xxx_messageInfo_TxnMeta proto.InternalMessageInfo +// IgnoredSeqNumRange describes a range of ignored seqnums. +// The range is inclusive on both ends. +type IgnoredSeqNumRange struct { + Start TxnSeq `protobuf:"varint,1,opt,name=start,proto3,casttype=TxnSeq" json:"start,omitempty"` + End TxnSeq `protobuf:"varint,2,opt,name=end,proto3,casttype=TxnSeq" json:"end,omitempty"` +} + +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_0c66a9929b41cdeb, []int{1} +} +func (m *IgnoredSeqNumRange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IgnoredSeqNumRange) 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 *IgnoredSeqNumRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_IgnoredSeqNumRange.Merge(dst, src) +} +func (m *IgnoredSeqNumRange) XXX_Size() int { + return m.Size() +} +func (m *IgnoredSeqNumRange) XXX_DiscardUnknown() { + xxx_messageInfo_IgnoredSeqNumRange.DiscardUnknown(m) +} + +var xxx_messageInfo_IgnoredSeqNumRange proto.InternalMessageInfo + // MVCCStatsDelta is convertible to MVCCStats, but uses signed variable width // encodings for most fields that make it more efficient to store negative // values. This makes the encodings incompatible. @@ -172,7 +208,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_bde9941189a794a0, []int{1} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{2} } func (m *MVCCStatsDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -222,7 +258,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_bde9941189a794a0, []int{2} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{3} } func (m *MVCCPersistentStats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -267,7 +303,7 @@ 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_bde9941189a794a0, []int{3} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{4} } func (m *RangeAppliedState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -305,7 +341,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_bde9941189a794a0, []int{4} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{5} } func (m *MVCCWriteValueOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -343,7 +379,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_bde9941189a794a0, []int{5} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{6} } func (m *MVCCWriteIntentOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -379,7 +415,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_bde9941189a794a0, []int{6} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{7} } func (m *MVCCUpdateIntentOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -418,7 +454,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_bde9941189a794a0, []int{7} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{8} } func (m *MVCCCommitIntentOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -458,7 +494,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_bde9941189a794a0, []int{8} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{9} } func (m *MVCCAbortIntentOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +530,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_bde9941189a794a0, []int{9} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{10} } func (m *MVCCAbortTxnOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -533,7 +569,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_bde9941189a794a0, []int{10} + return fileDescriptor_mvcc3_0c66a9929b41cdeb, []int{11} } func (m *MVCCLogicalOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -560,6 +596,7 @@ var xxx_messageInfo_MVCCLogicalOp proto.InternalMessageInfo func init() { proto.RegisterType((*TxnMeta)(nil), "cockroach.storage.engine.enginepb.TxnMeta") + proto.RegisterType((*IgnoredSeqNumRange)(nil), "cockroach.storage.engine.enginepb.IgnoredSeqNumRange") proto.RegisterType((*MVCCStatsDelta)(nil), "cockroach.storage.engine.enginepb.MVCCStatsDelta") proto.RegisterType((*MVCCPersistentStats)(nil), "cockroach.storage.engine.enginepb.MVCCPersistentStats") proto.RegisterType((*RangeAppliedState)(nil), "cockroach.storage.engine.enginepb.RangeAppliedState") @@ -613,6 +650,33 @@ func (this *TxnMeta) Equal(that interface{}) bool { } return true } +func (this *IgnoredSeqNumRange) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*IgnoredSeqNumRange) + if !ok { + that2, ok := that.(IgnoredSeqNumRange) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Start != that1.Start { + return false + } + if this.End != that1.End { + return false + } + return true +} func (this *MVCCStatsDelta) Equal(that interface{}) bool { if that == nil { return this == nil @@ -832,6 +896,34 @@ func (m *TxnMeta) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *IgnoredSeqNumRange) 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 *IgnoredSeqNumRange) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Start != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintMvcc3(dAtA, i, uint64(m.Start)) + } + if m.End != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintMvcc3(dAtA, i, uint64(m.End)) + } + return i, nil +} + func (m *MVCCStatsDelta) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1397,6 +1489,21 @@ func NewPopulatedTxnMeta(r randyMvcc3, easy bool) *TxnMeta { return this } +func NewPopulatedIgnoredSeqNumRange(r randyMvcc3, easy bool) *IgnoredSeqNumRange { + this := &IgnoredSeqNumRange{} + this.Start = TxnSeq(r.Int31()) + if r.Intn(2) == 0 { + this.Start *= -1 + } + this.End = TxnSeq(r.Int31()) + if r.Intn(2) == 0 { + this.End *= -1 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + func NewPopulatedMVCCPersistentStats(r randyMvcc3, easy bool) *MVCCPersistentStats { this := &MVCCPersistentStats{} this.LastUpdateNanos = int64(r.Int63()) @@ -1571,6 +1678,21 @@ func (m *TxnMeta) Size() (n int) { return n } +func (m *IgnoredSeqNumRange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Start != 0 { + n += 1 + sovMvcc3(uint64(m.Start)) + } + if m.End != 0 { + n += 1 + sovMvcc3(uint64(m.End)) + } + return n +} + func (m *MVCCStatsDelta) Size() (n int) { if m == nil { return 0 @@ -2107,6 +2229,94 @@ func (m *TxnMeta) Unmarshal(dAtA []byte) error { } return nil } +func (m *IgnoredSeqNumRange) 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 ErrIntOverflowMvcc3 + } + 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: IgnoredSeqNumRange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IgnoredSeqNumRange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + } + m.Start = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMvcc3 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Start |= (TxnSeq(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field End", wireType) + } + m.End = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMvcc3 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.End |= (TxnSeq(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMvcc3(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMvcc3 + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *MVCCStatsDelta) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3994,80 +4204,83 @@ var ( ) func init() { - proto.RegisterFile("storage/engine/enginepb/mvcc3.proto", fileDescriptor_mvcc3_bde9941189a794a0) + proto.RegisterFile("storage/engine/enginepb/mvcc3.proto", fileDescriptor_mvcc3_0c66a9929b41cdeb) } -var fileDescriptor_mvcc3_bde9941189a794a0 = []byte{ - // 1135 bytes of a gzipped FileDescriptorProto +var fileDescriptor_mvcc3_0c66a9929b41cdeb = []byte{ + // 1175 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0x7a, 0xd7, 0x89, 0x3d, 0x76, 0x12, 0x7b, 0x5a, 0x09, 0xab, 0xa8, 0xde, 0xd4, 0x48, - 0x28, 0xe2, 0xcf, 0x1a, 0x12, 0xe0, 0x90, 0x9b, 0x9d, 0x54, 0xe0, 0xd2, 0x34, 0x65, 0xeb, 0xb4, - 0x12, 0x08, 0xad, 0xc6, 0xeb, 0x61, 0x33, 0xca, 0x7a, 0x76, 0xbb, 0x3b, 0x76, 0xd7, 0xdf, 0x82, - 0x23, 0x48, 0x20, 0xe5, 0xc2, 0x37, 0xe0, 0xc0, 0x47, 0xc8, 0xb1, 0xc7, 0xaa, 0x07, 0x0b, 0x9c, - 0x0b, 0x1f, 0x80, 0x53, 0x10, 0x12, 0x9a, 0x99, 0xdd, 0xb5, 0x13, 0x51, 0x27, 0x69, 0x44, 0xd4, - 0x53, 0x66, 0xde, 0xef, 0xbd, 0xdf, 0x7b, 0x7e, 0xef, 0xe7, 0x79, 0x0e, 0x78, 0x27, 0x64, 0x5e, - 0x80, 0x1c, 0xdc, 0xc0, 0xd4, 0x21, 0x34, 0xf9, 0xe3, 0x77, 0x1b, 0xfd, 0xa1, 0x6d, 0x6f, 0x18, - 0x7e, 0xe0, 0x31, 0x0f, 0xde, 0xb1, 0x3d, 0xfb, 0x20, 0xf0, 0x90, 0xbd, 0x6f, 0xc4, 0xee, 0x86, - 0xf4, 0x33, 0x12, 0xf7, 0x5b, 0xd5, 0x01, 0x23, 0x6e, 0x63, 0xdf, 0xb5, 0x1b, 0x8c, 0xf4, 0x71, - 0xc8, 0x50, 0xdf, 0x97, 0xc1, 0xb7, 0x6e, 0x3a, 0x9e, 0xe3, 0x89, 0x63, 0x83, 0x9f, 0xa4, 0xb5, - 0xfe, 0xa3, 0x0a, 0x16, 0x3b, 0x11, 0xdd, 0xc1, 0x0c, 0xc1, 0xaf, 0x40, 0x96, 0xf4, 0xaa, 0xca, - 0xaa, 0xb2, 0x56, 0x6a, 0x35, 0x8f, 0xc6, 0x7a, 0xe6, 0xe5, 0x58, 0xdf, 0x70, 0x08, 0xdb, 0x1f, - 0x74, 0x0d, 0xdb, 0xeb, 0x37, 0xd2, 0xec, 0xbd, 0xee, 0xf4, 0xdc, 0xf0, 0x0f, 0x9c, 0x86, 0x48, - 0x3a, 0x18, 0x90, 0x9e, 0xb1, 0xb7, 0xd7, 0xde, 0x9e, 0x8c, 0xf5, 0x6c, 0x7b, 0xdb, 0xcc, 0x92, - 0x1e, 0x2c, 0x03, 0xf5, 0x00, 0x8f, 0xaa, 0x2a, 0xe7, 0x34, 0xf9, 0x11, 0xd6, 0x41, 0x0e, 0xfb, - 0x9e, 0xbd, 0x5f, 0xd5, 0x56, 0x95, 0xb5, 0x5c, 0xab, 0x74, 0x32, 0xd6, 0xf3, 0x9d, 0x88, 0xde, - 0xe5, 0x36, 0x53, 0x42, 0xf0, 0x3e, 0x58, 0x79, 0x16, 0x10, 0x86, 0xad, 0xf4, 0x33, 0x54, 0x73, - 0xab, 0xca, 0x5a, 0x71, 0xfd, 0xb6, 0x31, 0xed, 0x00, 0xcf, 0x69, 0xec, 0xbb, 0xb6, 0xd1, 0x49, - 0x9c, 0x5a, 0x1a, 0x2f, 0xda, 0x5c, 0x16, 0xb1, 0xa9, 0x15, 0xbe, 0x0f, 0xf2, 0x7e, 0x40, 0xbc, - 0x80, 0xb0, 0x51, 0x75, 0x41, 0x24, 0x5d, 0x39, 0x19, 0xeb, 0xc5, 0x4e, 0x44, 0x1f, 0xc6, 0x66, - 0x33, 0x75, 0x80, 0xef, 0x82, 0x7c, 0x88, 0x9f, 0x0e, 0x30, 0xb5, 0x71, 0x75, 0x51, 0x38, 0x83, - 0x93, 0xb1, 0xbe, 0xd0, 0x89, 0xe8, 0x23, 0xfc, 0xd4, 0x4c, 0x31, 0xf8, 0x05, 0x58, 0xea, 0x13, - 0x3a, 0x53, 0x60, 0xe1, 0xe2, 0x05, 0x96, 0xfa, 0x84, 0xa6, 0xb6, 0xcd, 0xd2, 0x0f, 0x87, 0x7a, - 0xe6, 0xb7, 0x43, 0x5d, 0xf9, 0xf3, 0x50, 0x57, 0xee, 0x69, 0xf9, 0x6c, 0x59, 0xbd, 0xa7, 0xe5, - 0xf3, 0xe5, 0x42, 0xfd, 0x2f, 0x15, 0x2c, 0xef, 0x3c, 0xde, 0xda, 0x7a, 0xc4, 0x10, 0x0b, 0xb7, - 0xb1, 0xcb, 0x10, 0x7c, 0x0f, 0x54, 0x5c, 0x14, 0x32, 0x6b, 0xe0, 0xf7, 0x10, 0xc3, 0x16, 0x45, - 0xd4, 0x0b, 0xc5, 0xc4, 0xca, 0xe6, 0x0a, 0x07, 0xf6, 0x84, 0xfd, 0x01, 0x37, 0xc3, 0xdb, 0x00, - 0x10, 0xca, 0x30, 0x65, 0x16, 0x72, 0x70, 0x35, 0x2b, 0x9c, 0x0a, 0xd2, 0xd2, 0x74, 0x30, 0xfc, - 0x08, 0x94, 0x1c, 0xdb, 0xea, 0x8e, 0x18, 0x0e, 0x85, 0x03, 0x9f, 0x51, 0xb9, 0xb5, 0x3c, 0x19, - 0xeb, 0xe0, 0xf3, 0xad, 0x16, 0x37, 0x37, 0x1d, 0x6c, 0x02, 0xc7, 0x4e, 0xce, 0x9c, 0xd0, 0x25, - 0x43, 0x2c, 0x63, 0xc4, 0xfc, 0xa0, 0x59, 0xe0, 0x16, 0xe1, 0x91, 0xc2, 0xb6, 0x37, 0xa0, 0x4c, - 0x0c, 0x2c, 0x86, 0xb7, 0xb8, 0x01, 0xbe, 0x0d, 0x0a, 0x07, 0x78, 0x14, 0x07, 0x2f, 0x08, 0x34, - 0x7f, 0x80, 0x47, 0x32, 0x36, 0x06, 0x65, 0xe8, 0x62, 0x0a, 0xa6, 0x91, 0x43, 0xe4, 0xc6, 0x91, - 0x79, 0x09, 0x0e, 0x91, 0x9b, 0x46, 0x72, 0x50, 0x46, 0x16, 0x52, 0x50, 0x46, 0xde, 0x01, 0xa5, - 0xb8, 0x05, 0x32, 0x18, 0x08, 0xbc, 0x28, 0x6d, 0x32, 0x7e, 0xea, 0x22, 0x29, 0x8a, 0xb3, 0x2e, - 0x69, 0xfe, 0x70, 0x14, 0xc6, 0x14, 0x25, 0x99, 0x22, 0x1c, 0x85, 0x69, 0x7e, 0x0e, 0xca, 0xe0, - 0xa5, 0x14, 0x94, 0x91, 0x1f, 0x02, 0x68, 0x7b, 0x94, 0x21, 0x42, 0x43, 0x0b, 0x87, 0x8c, 0xf4, - 0x11, 0xa7, 0x58, 0x5e, 0x55, 0xd6, 0x54, 0xb3, 0x92, 0x20, 0x77, 0x13, 0x60, 0x53, 0xe3, 0x12, - 0xa8, 0xff, 0xa3, 0x82, 0x1b, 0x7c, 0xec, 0x0f, 0x71, 0x10, 0x92, 0x90, 0x97, 0x21, 0x04, 0xf0, - 0xa6, 0xcd, 0x5e, 0x9d, 0x3f, 0x7b, 0x75, 0xee, 0xec, 0xd5, 0x79, 0xb3, 0x57, 0xe7, 0xcd, 0x5e, - 0x9d, 0x37, 0x7b, 0xf5, 0x9c, 0xd9, 0xab, 0xe7, 0xcf, 0x5e, 0x3d, 0x67, 0xf6, 0xea, 0xbc, 0xd9, - 0xab, 0xaf, 0x3f, 0xfb, 0x7c, 0xf2, 0x04, 0xd4, 0x5f, 0x2a, 0xa0, 0x62, 0x22, 0xea, 0xe0, 0xa6, - 0xef, 0xbb, 0x04, 0xf7, 0xf8, 0xf4, 0x31, 0xfc, 0x00, 0xc0, 0x00, 0x7d, 0xc7, 0x2c, 0x24, 0x8d, - 0x16, 0xa1, 0x3d, 0x1c, 0x89, 0xf1, 0x6b, 0x66, 0x99, 0x23, 0xb1, 0x77, 0x9b, 0xdb, 0xa1, 0x01, - 0x6e, 0xb8, 0x18, 0x85, 0xf8, 0x8c, 0x7b, 0x56, 0xb8, 0x57, 0x04, 0x74, 0xca, 0xff, 0x5b, 0x50, - 0x0c, 0x78, 0x4a, 0x2b, 0xe4, 0x52, 0x13, 0x7a, 0x28, 0xae, 0x7f, 0x66, 0x9c, 0xbb, 0x6f, 0x8c, - 0xff, 0x10, 0x6a, 0xfc, 0xca, 0x01, 0x41, 0x28, 0x2c, 0x33, 0x1f, 0xee, 0x27, 0x05, 0x94, 0x79, - 0xcc, 0x13, 0xfe, 0x46, 0x3f, 0x46, 0xee, 0x00, 0xef, 0xfa, 0xc9, 0x96, 0x50, 0xa6, 0x5b, 0xa2, - 0x09, 0x0a, 0xd3, 0xa7, 0x35, 0x7b, 0xf1, 0xa7, 0x75, 0x1a, 0x05, 0x6f, 0x82, 0xdc, 0x90, 0xf3, - 0xc7, 0xcb, 0x47, 0x5e, 0xb8, 0x50, 0xfd, 0x00, 0x0f, 0x2d, 0x09, 0x69, 0x02, 0x2a, 0x70, 0x8b, - 0xa8, 0xa5, 0xfe, 0x73, 0x16, 0x54, 0xd2, 0xf2, 0xda, 0x42, 0x07, 0xbb, 0x3e, 0xfc, 0x06, 0x2c, - 0xb0, 0x88, 0x5a, 0xe9, 0x72, 0xdc, 0xbe, 0xda, 0x72, 0xcc, 0x75, 0x22, 0xda, 0xde, 0x36, 0x73, - 0x2c, 0xa2, 0xed, 0x1e, 0x7c, 0x0b, 0x2c, 0x72, 0x72, 0xde, 0x80, 0xac, 0x28, 0x87, 0xe7, 0xfa, - 0xf2, 0x6c, 0x0f, 0xd4, 0xd7, 0xea, 0xc1, 0x2e, 0xa8, 0x70, 0xee, 0xd3, 0x9b, 0x4a, 0xbb, 0x38, - 0xd5, 0x0a, 0x8b, 0xe8, 0xce, 0xcc, 0xb2, 0xaa, 0xff, 0xaa, 0x00, 0xc8, 0xfb, 0x23, 0xdf, 0x9a, - 0xeb, 0x69, 0xd0, 0xd5, 0xb5, 0x50, 0xff, 0x3b, 0x2e, 0x7b, 0xcb, 0xeb, 0xf7, 0x09, 0xbb, 0x9e, - 0xb2, 0x63, 0x51, 0x67, 0x5f, 0x21, 0x6a, 0xf5, 0x6a, 0xa2, 0xd6, 0x5e, 0x2d, 0xea, 0xdc, 0x59, - 0x51, 0xfb, 0x52, 0xd3, 0xcd, 0xae, 0x17, 0x5c, 0xcf, 0x67, 0xaf, 0xf7, 0xe5, 0x0f, 0x17, 0x91, - 0xb1, 0x13, 0xd1, 0xff, 0x3b, 0xdd, 0x2f, 0x1a, 0x58, 0xe2, 0xf9, 0xee, 0x7b, 0x0e, 0xb1, 0x91, - 0xbb, 0xeb, 0xc3, 0x0e, 0x28, 0xca, 0x5f, 0x90, 0xb2, 0x25, 0x8a, 0x68, 0xf6, 0xc6, 0x05, 0xdf, - 0xb3, 0xd9, 0xb7, 0xc9, 0x04, 0xcf, 0xd2, 0x1b, 0x7c, 0x02, 0x4a, 0x92, 0x55, 0x6e, 0x88, 0x58, - 0x8c, 0x9f, 0x5c, 0x86, 0x36, 0xe9, 0xbf, 0x29, 0xeb, 0x93, 0x57, 0xf8, 0x35, 0x58, 0x8a, 0xb7, - 0x7a, 0xcc, 0x2c, 0xd5, 0xf1, 0xe9, 0x05, 0x99, 0x4f, 0x7f, 0x1b, 0xcd, 0xd2, 0x60, 0xe6, 0xce, - 0xb9, 0x6d, 0x21, 0xfb, 0x84, 0x5b, 0xbb, 0x14, 0xf7, 0xe9, 0xaf, 0x8c, 0x59, 0xb2, 0x67, 0xee, - 0xbc, 0x21, 0x88, 0xcf, 0x38, 0xa1, 0xce, 0x5d, 0xaa, 0x21, 0xa7, 0x04, 0x69, 0x16, 0xd1, 0xf4, - 0x0a, 0x1f, 0x80, 0x82, 0x24, 0x66, 0x11, 0x15, 0x3f, 0x18, 0x8a, 0xeb, 0x1f, 0x5f, 0x86, 0x55, - 0x88, 0xce, 0xcc, 0xa3, 0xf8, 0xbc, 0xa9, 0x1d, 0x1d, 0xea, 0x4a, 0x6b, 0xf5, 0xe8, 0x8f, 0x5a, - 0xe6, 0x68, 0x52, 0x53, 0x9e, 0x4f, 0x6a, 0xca, 0x8b, 0x49, 0x4d, 0xf9, 0x7d, 0x52, 0x53, 0xbe, - 0x3f, 0xae, 0x65, 0x9e, 0x1f, 0xd7, 0x32, 0x2f, 0x8e, 0x6b, 0x99, 0xee, 0x82, 0xf8, 0xaf, 0x68, - 0xe3, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x52, 0x3f, 0xe8, 0x2e, 0x8f, 0x0d, 0x00, 0x00, + 0x14, 0xf7, 0x7a, 0xd7, 0x89, 0xfd, 0xec, 0x24, 0xf6, 0xb4, 0x12, 0x56, 0xa1, 0xb6, 0x6b, 0x24, + 0x14, 0xf1, 0x67, 0x0d, 0x09, 0x70, 0xc8, 0xcd, 0x4e, 0x2a, 0x70, 0x69, 0x92, 0xb2, 0x71, 0x5a, + 0x09, 0x04, 0xd6, 0x78, 0x3d, 0x6c, 0x56, 0x59, 0xcf, 0x6e, 0x76, 0xc7, 0xae, 0xfd, 0x2d, 0x38, + 0x82, 0x04, 0x52, 0x2e, 0x7c, 0x03, 0x0e, 0x7c, 0x84, 0x1c, 0x7b, 0xac, 0x7a, 0xb0, 0xc0, 0xb9, + 0xf0, 0x01, 0x38, 0x05, 0x21, 0xa1, 0x99, 0x59, 0xaf, 0xed, 0x40, 0x9d, 0xa4, 0x11, 0x11, 0xa7, + 0xcc, 0xbc, 0xdf, 0x7b, 0xbf, 0xf7, 0xfc, 0xde, 0xcf, 0xf3, 0x1c, 0x78, 0x33, 0x60, 0xae, 0x8f, + 0x2d, 0x52, 0x21, 0xd4, 0xb2, 0xe9, 0xf8, 0x8f, 0xd7, 0xaa, 0x74, 0x7a, 0xa6, 0xb9, 0xae, 0x7b, + 0xbe, 0xcb, 0x5c, 0x74, 0xcf, 0x74, 0xcd, 0x43, 0xdf, 0xc5, 0xe6, 0x81, 0x1e, 0xba, 0xeb, 0xd2, + 0x4f, 0x1f, 0xbb, 0xdf, 0xc9, 0x77, 0x99, 0xed, 0x54, 0x0e, 0x1c, 0xb3, 0xc2, 0xec, 0x0e, 0x09, + 0x18, 0xee, 0x78, 0x32, 0xf8, 0xce, 0x6d, 0xcb, 0xb5, 0x5c, 0x71, 0xac, 0xf0, 0x93, 0xb4, 0x96, + 0xbf, 0x57, 0x61, 0xb1, 0xd1, 0xa7, 0xdb, 0x84, 0x61, 0xf4, 0x39, 0xc4, 0xed, 0x76, 0x5e, 0x29, + 0x29, 0xab, 0x99, 0x5a, 0xf5, 0x64, 0x58, 0x8c, 0xbd, 0x18, 0x16, 0xd7, 0x2d, 0x9b, 0x1d, 0x74, + 0x5b, 0xba, 0xe9, 0x76, 0x2a, 0x51, 0xf6, 0x76, 0x6b, 0x72, 0xae, 0x78, 0x87, 0x56, 0x45, 0x24, + 0xed, 0x76, 0xed, 0xb6, 0xbe, 0xbf, 0x5f, 0xdf, 0x1a, 0x0d, 0x8b, 0xf1, 0xfa, 0x96, 0x11, 0xb7, + 0xdb, 0x28, 0x0b, 0xea, 0x21, 0x19, 0xe4, 0x55, 0xce, 0x69, 0xf0, 0x23, 0x2a, 0x43, 0x82, 0x78, + 0xae, 0x79, 0x90, 0xd7, 0x4a, 0xca, 0x6a, 0xa2, 0x96, 0x39, 0x1b, 0x16, 0x93, 0x8d, 0x3e, 0xbd, + 0xcf, 0x6d, 0x86, 0x84, 0xd0, 0x43, 0x58, 0x79, 0xea, 0xdb, 0x8c, 0x34, 0xa3, 0xcf, 0x90, 0x4f, + 0x94, 0x94, 0xd5, 0xf4, 0xda, 0x5d, 0x7d, 0xd2, 0x01, 0x9e, 0x53, 0x3f, 0x70, 0x4c, 0xbd, 0x31, + 0x76, 0xaa, 0x69, 0xbc, 0x68, 0x63, 0x59, 0xc4, 0x46, 0x56, 0xf4, 0x0e, 0x24, 0x3d, 0xdf, 0x76, + 0x7d, 0x9b, 0x0d, 0xf2, 0x0b, 0x22, 0xe9, 0xca, 0xd9, 0xb0, 0x98, 0x6e, 0xf4, 0xe9, 0xa3, 0xd0, + 0x6c, 0x44, 0x0e, 0xe8, 0x2d, 0x48, 0x06, 0xe4, 0xa8, 0x4b, 0xa8, 0x49, 0xf2, 0x8b, 0xc2, 0x19, + 0xce, 0x86, 0xc5, 0x85, 0x46, 0x9f, 0xee, 0x91, 0x23, 0x23, 0xc2, 0xd0, 0xa7, 0xb0, 0xd4, 0xb1, + 0xe9, 0x54, 0x81, 0xa9, 0xcb, 0x17, 0x98, 0xe9, 0xd8, 0x34, 0xb2, 0x6d, 0x64, 0xbe, 0x3b, 0x2e, + 0xc6, 0x7e, 0x39, 0x2e, 0x2a, 0xbf, 0x1f, 0x17, 0x95, 0x07, 0x5a, 0x32, 0x9e, 0x55, 0x1f, 0x68, + 0xc9, 0x64, 0x36, 0x55, 0xfe, 0x1a, 0x50, 0xdd, 0xa2, 0xae, 0x4f, 0xda, 0x7b, 0xe4, 0x68, 0xa7, + 0xdb, 0x31, 0x30, 0xb5, 0x08, 0x2a, 0x41, 0x22, 0x60, 0xd8, 0x67, 0x62, 0x50, 0xb3, 0xe5, 0x49, + 0x00, 0xbd, 0x01, 0x2a, 0xa1, 0xed, 0x7c, 0xfc, 0x1f, 0x38, 0x37, 0x6f, 0x24, 0xc7, 0xb9, 0xca, + 0x7f, 0xa8, 0xb0, 0xbc, 0xfd, 0x78, 0x73, 0x73, 0x8f, 0x61, 0x16, 0x6c, 0x11, 0x87, 0x61, 0xf4, + 0x36, 0xe4, 0x1c, 0x1c, 0xb0, 0x66, 0xd7, 0x6b, 0x63, 0x46, 0x9a, 0x14, 0x53, 0x37, 0x10, 0x89, + 0xb2, 0xc6, 0x0a, 0x07, 0xf6, 0x85, 0x7d, 0x87, 0x9b, 0xd1, 0x5d, 0x00, 0x9b, 0x32, 0x42, 0x59, + 0x13, 0x5b, 0x44, 0x64, 0xcb, 0x1a, 0x29, 0x69, 0xa9, 0x5a, 0x04, 0xbd, 0x0f, 0x19, 0xcb, 0x6c, + 0xb6, 0x06, 0x8c, 0x04, 0xc2, 0x81, 0x6b, 0x20, 0x5b, 0x5b, 0x1e, 0x0d, 0x8b, 0xf0, 0xc9, 0x66, + 0x8d, 0x9b, 0xab, 0x16, 0x31, 0xc0, 0x32, 0xc7, 0x67, 0x4e, 0xe8, 0xd8, 0x3d, 0x22, 0x63, 0x84, + 0x3e, 0x90, 0x91, 0xe2, 0x16, 0xe1, 0x11, 0xc1, 0xa6, 0xdb, 0xa5, 0x4c, 0x08, 0x22, 0x84, 0x37, + 0xb9, 0x01, 0xbd, 0x0e, 0xa9, 0x43, 0x32, 0x08, 0x83, 0x17, 0x04, 0x9a, 0x3c, 0x24, 0x03, 0x19, + 0x1b, 0x82, 0x32, 0x74, 0x31, 0x02, 0xa3, 0xc8, 0x1e, 0x76, 0xc2, 0xc8, 0xa4, 0x04, 0x7b, 0xd8, + 0x89, 0x22, 0x39, 0x28, 0x23, 0x53, 0x11, 0x28, 0x23, 0xef, 0x41, 0x26, 0x6c, 0x81, 0x0c, 0x06, + 0x81, 0xa7, 0xa5, 0x4d, 0xc6, 0x4f, 0x5c, 0x24, 0x45, 0x7a, 0xda, 0x25, 0xca, 0x1f, 0x0c, 0x82, + 0x90, 0x22, 0x23, 0x53, 0x04, 0x83, 0x20, 0xca, 0xcf, 0x41, 0x19, 0xbc, 0x14, 0x81, 0x32, 0xf2, + 0x3d, 0x40, 0xa6, 0x4b, 0x19, 0xb6, 0x69, 0xd0, 0x24, 0x01, 0xb3, 0x3b, 0x98, 0x53, 0x2c, 0x97, + 0x94, 0x55, 0xd5, 0xc8, 0x8d, 0x91, 0xfb, 0x63, 0x60, 0x43, 0x13, 0x63, 0xff, 0x4b, 0x85, 0x5b, + 0x7c, 0xec, 0x8f, 0x88, 0x1f, 0xd8, 0x01, 0x2f, 0x43, 0x08, 0xe0, 0xff, 0x36, 0x7b, 0x75, 0xfe, + 0xec, 0xd5, 0xb9, 0xb3, 0x57, 0xe7, 0xcd, 0x5e, 0x9d, 0x37, 0x7b, 0x75, 0xde, 0xec, 0xd5, 0x0b, + 0x66, 0xaf, 0x5e, 0x3c, 0x7b, 0xf5, 0x82, 0xd9, 0xab, 0xf3, 0x66, 0xaf, 0xbe, 0xfa, 0xec, 0x27, + 0x5f, 0xfb, 0x17, 0x0a, 0xe4, 0xc4, 0x53, 0x52, 0xf5, 0x3c, 0xc7, 0x26, 0x6d, 0x3e, 0x7d, 0x82, + 0xde, 0x05, 0xe4, 0xe3, 0x6f, 0x58, 0x13, 0x4b, 0x63, 0xd3, 0xa6, 0x6d, 0xd2, 0x17, 0xe3, 0xd7, + 0x8c, 0x2c, 0x47, 0x42, 0xef, 0x3a, 0xb7, 0x23, 0x1d, 0x6e, 0x39, 0x04, 0x07, 0xe4, 0x9c, 0x7b, + 0x5c, 0xb8, 0xe7, 0x04, 0x34, 0xe3, 0xff, 0x15, 0xa4, 0x7d, 0x9e, 0xb2, 0x19, 0x70, 0xa9, 0x09, + 0x3d, 0xa4, 0xd7, 0x3e, 0xd6, 0x2f, 0xdc, 0x67, 0xfa, 0xbf, 0x08, 0x35, 0x7c, 0x45, 0x41, 0x10, + 0x0a, 0xcb, 0xd4, 0x87, 0xfb, 0x41, 0x81, 0x2c, 0x8f, 0x79, 0xc2, 0x77, 0xc0, 0x63, 0xec, 0x74, + 0xc9, 0xae, 0x37, 0xde, 0x42, 0xca, 0x64, 0x0b, 0x55, 0x21, 0x35, 0x79, 0xba, 0xe3, 0x97, 0x7f, + 0xba, 0x27, 0x51, 0xe8, 0x36, 0x24, 0x7a, 0x9c, 0x3f, 0x5c, 0x6e, 0xf2, 0xc2, 0x85, 0xea, 0xf9, + 0xa4, 0xd7, 0x94, 0x90, 0x26, 0xa0, 0x14, 0xb7, 0x88, 0x5a, 0xca, 0x3f, 0xc6, 0x21, 0x17, 0x95, + 0x57, 0x17, 0x3a, 0xd8, 0xf5, 0xd0, 0x97, 0xb0, 0xc0, 0xfa, 0xb4, 0x19, 0x2d, 0xdf, 0xad, 0xeb, + 0x2d, 0xdf, 0x44, 0xa3, 0x4f, 0xeb, 0x5b, 0x46, 0x82, 0xf5, 0x69, 0xbd, 0x8d, 0x5e, 0x83, 0x45, + 0x4e, 0xce, 0x1b, 0x10, 0x17, 0xe5, 0xf0, 0x5c, 0x9f, 0x9d, 0xef, 0x81, 0xfa, 0x4a, 0x3d, 0xd8, + 0x85, 0x1c, 0xe7, 0x9e, 0xdd, 0x84, 0xda, 0xe5, 0xa9, 0x56, 0x58, 0x9f, 0x6e, 0x4f, 0x2d, 0xc3, + 0xf2, 0xcf, 0x0a, 0x20, 0xde, 0x1f, 0xf9, 0xd6, 0xdc, 0x4c, 0x83, 0xae, 0xaf, 0x85, 0xf2, 0x9f, + 0x61, 0xd9, 0x9b, 0x6e, 0xa7, 0x63, 0xb3, 0x9b, 0x29, 0x3b, 0x14, 0x75, 0xfc, 0x25, 0xa2, 0x56, + 0xaf, 0x27, 0x6a, 0xed, 0xe5, 0xa2, 0x4e, 0x9c, 0x17, 0xb5, 0x27, 0x35, 0x5d, 0x6d, 0xb9, 0xfe, + 0xcd, 0x7c, 0xf6, 0x72, 0x47, 0xfe, 0x70, 0x11, 0x19, 0x1b, 0x7d, 0xfa, 0x5f, 0xa7, 0xfb, 0x49, + 0x83, 0x25, 0x9e, 0xef, 0xa1, 0x6b, 0xd9, 0x26, 0x76, 0x76, 0x3d, 0xd4, 0x80, 0xb4, 0xfc, 0x85, + 0x2a, 0x5b, 0xa2, 0x88, 0x66, 0xaf, 0x5f, 0xf2, 0x3d, 0x9b, 0x7e, 0x9b, 0x0c, 0x78, 0x1a, 0xdd, + 0xd0, 0x13, 0xc8, 0x48, 0x56, 0xb9, 0x21, 0x42, 0x31, 0x7e, 0x78, 0x15, 0xda, 0x71, 0xff, 0x0d, + 0x59, 0x9f, 0xbc, 0xa2, 0x2f, 0x60, 0x29, 0xdc, 0xea, 0x21, 0xb3, 0x54, 0xc7, 0x47, 0x97, 0x64, + 0x9e, 0xfd, 0x36, 0x1a, 0x99, 0xee, 0xd4, 0x9d, 0x73, 0x9b, 0x42, 0xf6, 0x63, 0x6e, 0xed, 0x4a, + 0xdc, 0xb3, 0x5f, 0x19, 0x23, 0x63, 0x4e, 0xdd, 0x79, 0x43, 0x30, 0x9f, 0xf1, 0x98, 0x3a, 0x71, + 0xa5, 0x86, 0xcc, 0x08, 0xd2, 0x48, 0xe3, 0xc9, 0x15, 0xed, 0x40, 0x4a, 0x12, 0xb3, 0x3e, 0x15, + 0x3f, 0x18, 0xd2, 0x6b, 0x1f, 0x5c, 0x85, 0x55, 0x88, 0xce, 0x48, 0xe2, 0xf0, 0xbc, 0xa1, 0x9d, + 0x1c, 0x17, 0x95, 0x5a, 0xe9, 0xe4, 0xb7, 0x42, 0xec, 0x64, 0x54, 0x50, 0x9e, 0x8d, 0x0a, 0xca, + 0xf3, 0x51, 0x41, 0xf9, 0x75, 0x54, 0x50, 0xbe, 0x3d, 0x2d, 0xc4, 0x9e, 0x9d, 0x16, 0x62, 0xcf, + 0x4f, 0x0b, 0xb1, 0xd6, 0x82, 0xf8, 0xaf, 0x6b, 0xfd, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4d, + 0x60, 0x0d, 0x7f, 0xef, 0x0d, 0x00, 0x00, } diff --git a/pkg/storage/engine/enginepb/mvcc3.proto b/pkg/storage/engine/enginepb/mvcc3.proto index 55f9854609bf..c288eff6dc7d 100644 --- a/pkg/storage/engine/enginepb/mvcc3.proto +++ b/pkg/storage/engine/enginepb/mvcc3.proto @@ -116,6 +116,15 @@ message TxnMeta { reserved 8; } +// IgnoredSeqNumRange describes a range of ignored seqnums. +// The range is inclusive on both ends. +message IgnoredSeqNumRange { + option (gogoproto.equal) = true; + option (gogoproto.populate) = true; + int32 start = 1 [(gogoproto.casttype) = "TxnSeq"]; + int32 end = 2 [(gogoproto.casttype) = "TxnSeq"]; +} + // MVCCStatsDelta is convertible to MVCCStats, but uses signed variable width // encodings for most fields that make it more efficient to store negative // values. This makes the encodings incompatible. diff --git a/pkg/storage/engine/enginepb/mvcc_test.go b/pkg/storage/engine/enginepb/mvcc_test.go index b66862349897..91016f8cb55d 100644 --- a/pkg/storage/engine/enginepb/mvcc_test.go +++ b/pkg/storage/engine/enginepb/mvcc_test.go @@ -18,6 +18,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/storage/engine/enginepb" "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/uuid" + "github.com/stretchr/testify/assert" ) func TestFormatMVCCMetadata(t *testing.T) { @@ -71,3 +72,32 @@ func TestFormatMVCCMetadata(t *testing.T) { expV, str) } } + +func TestTxnSeqIsIgnored(t *testing.T) { + type s = enginepb.TxnSeq + type r = enginepb.IgnoredSeqNumRange + mr := func(a, b s) r { + return r{Start: a, End: b} + } + + testData := []struct { + list []r + ignored []s + notIgnored []s + }{ + {[]r{}, nil, []s{0, 1, 10}}, + {[]r{mr(1, 1)}, []s{1}, []s{0, 2, 10}}, + {[]r{mr(1, 1), mr(2, 3)}, []s{1, 2, 3}, []s{0, 4, 10}}, + {[]r{mr(1, 2), mr(4, 8), mr(9, 10)}, []s{1, 2, 5, 10}, []s{0, 3, 11}}, + {[]r{mr(0, 10)}, []s{0, 1, 2, 3, 10}, []s{11, 100}}, + } + + for _, tc := range testData { + for _, ign := range tc.ignored { + assert.True(t, enginepb.TxnSeqIsIgnored(ign, tc.list)) + } + for _, notIgn := range tc.notIgnored { + assert.False(t, enginepb.TxnSeqIsIgnored(notIgn, tc.list)) + } + } +} diff --git a/pkg/storage/engine/mvcc.go b/pkg/storage/engine/mvcc.go index 1028773d857f..0db81e6963c1 100644 --- a/pkg/storage/engine/mvcc.go +++ b/pkg/storage/engine/mvcc.go @@ -935,11 +935,8 @@ func mvccGetInternal( // ignore the intent by insisting that the timestamp we're reading // at is a historical timestamp < the intent timestamp. However, we // return the intent separately; the caller may want to resolve it. - ignoredIntent = &roachpb.Intent{ - Span: roachpb.Span{Key: metaKey.Key}, - Status: roachpb.PENDING, - Txn: *meta.Txn, - } + intent := roachpb.MakePendingIntent(meta.Txn, roachpb.Span{Key: metaKey.Key}) + ignoredIntent = &intent timestamp = metaTimestamp.Prev() } @@ -957,9 +954,9 @@ func mvccGetInternal( } if metaTimestamp.LessEq(maxVisibleTimestamp) { return nil, nil, safeValue, &roachpb.WriteIntentError{ - Intents: []roachpb.Intent{{ - Span: roachpb.Span{Key: metaKey.Key}, Status: roachpb.PENDING, Txn: *meta.Txn, - }}, + Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(meta.Txn, roachpb.Span{Key: metaKey.Key}), + }, } } } @@ -1323,36 +1320,39 @@ func replayTransactionalWrite( // If the valueFn is specified, we must apply it to the would-be value at the key. if valueFn != nil { - prevSeq, prevValueWritten := meta.GetPrevIntentSeq(txn.Sequence) + var exVal *roachpb.Value + + // If there's an intent history, use that. + prevIntent, prevValueWritten := meta.GetPrevIntentSeq(txn.Sequence, txn.IgnoredSeqNums) if prevValueWritten { // If the previous value was found in the IntentHistory, // simply apply the value function to the historic value // to get the would-be value. - prevVal, _ := meta.GetIntentValue(prevSeq) - value, err = valueFn(&roachpb.Value{RawBytes: prevVal}) - if err != nil { - return err - } - } else { - // If the previous value at the key wasn't written by this transaction, - // we must apply the value function to the last committed value on the key. + prevVal := prevIntent.Value + + exVal = &roachpb.Value{RawBytes: prevVal} + } + if exVal == nil { + // If the previous value at the key wasn't written by this + // transaction, or it was hidden by a rolled back seqnum, we + // look at last committed value on the key. getBuf := newGetBuffer() defer getBuf.release() getBuf.meta = buf.meta - var exVal *roachpb.Value - var err error // Since we want the last committed value on the key, we must make // an inconsistent read so we ignore our previous intents here. - if exVal, _, _, err = mvccGetInternal( - ctx, iter, metaKey, timestamp, false /* consistent */, unsafeValue, nil /* txn */, getBuf); err != nil { - return err - } - value, err = valueFn(exVal) + exVal, _, _, err = mvccGetInternal( + ctx, iter, metaKey, timestamp, false /* consistent */, unsafeValue, nil /* txn */, getBuf) if err != nil { return err } } + + value, err = valueFn(exVal) + if err != nil { + return err + } } // To ensure the transaction is idempotent, we must assert that the @@ -1496,7 +1496,9 @@ func mvccPutInternal( if txn == nil || meta.Txn.ID != txn.ID { // The current Put operation does not come from the same // transaction. - return &roachpb.WriteIntentError{Intents: []roachpb.Intent{{Span: roachpb.Span{Key: key}, Status: roachpb.PENDING, Txn: *meta.Txn}}} + return &roachpb.WriteIntentError{Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(meta.Txn, roachpb.Span{Key: key}), + }} } else if txn.Epoch < meta.Txn.Epoch { return errors.Errorf("put with epoch %d came after put with epoch %d in txn %s", txn.Epoch, meta.Txn.Epoch, txn.ID) @@ -1508,29 +1510,63 @@ func mvccPutInternal( } // We're overwriting the intent that was present at this key, before we do - // that though - we must record the older intent in the IntentHistory. - var prevIntentValBytes []byte - getBuf := newGetBuffer() - // Release the buffer after using the existing value. - defer getBuf.release() - getBuf.meta = buf.meta // initialize get metadata from what we've already read + // that though - we must record the older value in the IntentHistory. + + // But where to find the older value? There are 4 cases: + // - last write inside txn, same epoch, seqnum of last write is not ignored: value at key. + // => read the value associated with the intent with consistent mvccGetInternal(). + // (This is the common case.) + // - last write inside txn, same epoch, seqnum of last write is ignored: cannot use value at key. + // => try reading from intent history. + // => if all intent history entries are rolled back, fall back to last case below. + // - last write outside txn or at different epoch: use inconsistent mvccGetInternal, + // which will find it outside. + // + // (Note that _some_ value is guaranteed to be found, as indicated by ok == true above.) + var existingVal *roachpb.Value + if txn.Epoch == meta.Txn.Epoch /* last write inside txn */ { + if !enginepb.TxnSeqIsIgnored(meta.Txn.Sequence, txn.IgnoredSeqNums) { + // Seqnum of last write is not ignored. Retrieve the value + // using a consistent read. + getBuf := newGetBuffer() + // Release the buffer after using the existing value. + defer getBuf.release() + getBuf.meta = buf.meta // initialize get metadata from what we've already read + + existingVal, _, _, err = mvccGetInternal( + ctx, iter, metaKey, readTimestamp, true /* consistent */, safeValue, txn, getBuf) + if err != nil { + return err + } + } else { + // Seqnum of last write was ignored. Try retrieving the value from the history. + prevIntent, prevValueWritten := meta.GetPrevIntentSeq(txn.Sequence, txn.IgnoredSeqNums) + if prevValueWritten { + existingVal = &roachpb.Value{RawBytes: prevIntent.Value} + } + } - existingVal, _, _, err := mvccGetInternal( - ctx, iter, metaKey, readTimestamp, true /* consistent */, safeValue, txn, getBuf) - if err != nil { - return err } - // It's possible that the existing value is nil if the intent on the key - // has a lower epoch. We don't have to deal with this as a special case - // because in this case, the value isn't written to the intent history. - // Instead, the intent history is blown away completely. - if existingVal != nil { - prevIntentValBytes = existingVal.RawBytes + if existingVal == nil { + // "last write inside txn && seqnum of last write is not ignored" + // OR + // "last write outside txn" + // => use inconsistent mvccGetInternal to retrieve the last committed value at key. + getBuf := newGetBuffer() + defer getBuf.release() + getBuf.meta = buf.meta + + // Since we want the last committed value on the key, we must make + // an inconsistent read so we ignore our previous intents here. + existingVal, _, _, err = mvccGetInternal( + ctx, iter, metaKey, readTimestamp, false /* consistent */, unsafeValue, nil /* txn */, getBuf) + if err != nil { + return err + } } - prevIntentSequence := meta.Txn.Sequence // Make sure we process valueFn before clearing any earlier - // version. For example, a conditional put within same + // version. For example, a conditional put within same // transaction should read previous write. if valueFn != nil { value, err = valueFn(existingVal) @@ -1539,6 +1575,16 @@ func mvccPutInternal( } } + // It's possible that the existing value is nil if the intent on the key + // has a lower epoch. We don't have to deal with this as a special case + // because in this case, the value isn't written to the intent history. + // Instead, the intent history is blown away completely. + var prevIntentValBytes []byte + if existingVal != nil { + prevIntentValBytes = existingVal.RawBytes + } + prevIntentSequence := meta.Txn.Sequence + // We are replacing our own write intent. If we are writing at // the same timestamp (see comments in else block) we can // overwrite the existing intent; otherwise we must manually @@ -1581,10 +1627,10 @@ func mvccPutInternal( // If the epoch of the transaction doesn't match the epoch of the // intent, blow away the intent history. if txn.Epoch == meta.Txn.Epoch { - // This case shouldn't pop up, but it is worth asserting - // that it doesn't. We shouldn't write invalid intents - // to the history if existingVal == nil { + // This case shouldn't pop up, but it is worth asserting + // that it doesn't. We shouldn't write invalid intents + // to the history. return errors.Errorf( "previous intent of the transaction with the same epoch not found for %s (%+v)", metaKey, txn) @@ -1654,6 +1700,7 @@ func mvccPutInternal( } } } + { var txnMeta *enginepb.TxnMeta if txn != nil { @@ -2139,9 +2186,9 @@ func MVCCClearTimeRange( ts := hlc.Timestamp(meta.Timestamp) if meta.Txn != nil && startTime.Less(ts) && ts.LessEq(endTime) { err := &roachpb.WriteIntentError{ - Intents: []roachpb.Intent{{Span: roachpb.Span{Key: append([]byte{}, k.Key...)}, - Status: roachpb.PENDING, Txn: *meta.Txn, - }}} + Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(meta.Txn, roachpb.Span{Key: append([]byte{}, k.Key...)}), + }} return nil, err } } @@ -2347,11 +2394,7 @@ func buildScanIntents(data []byte) ([]roachpb.Intent, error) { if err := protoutil.Unmarshal(reader.Value(), &meta); err != nil { return nil, err } - intents = append(intents, roachpb.Intent{ - Span: roachpb.Span{Key: key.Key}, - Status: roachpb.PENDING, - Txn: *meta.Txn, - }) + intents = append(intents, roachpb.MakePendingIntent(meta.Txn, roachpb.Span{Key: key.Key})) } if err := reader.Error(); err != nil { @@ -2705,11 +2748,29 @@ func mvccResolveWriteIntent( // testing. inProgress := !intent.Status.IsFinalized() && meta.Txn.Epoch >= intent.Txn.Epoch pushed := inProgress && hlc.Timestamp(meta.Timestamp).Less(intent.Txn.WriteTimestamp) + collapsedIntent := false + var rolledBackVal []byte + latestKey := MVCCKey{Key: intent.Key, Timestamp: hlc.Timestamp(meta.Timestamp)} + + // Handle partial txn rollbacks. If the current txn sequence + // is part of a rolled back (ignored) seqnum range, we're going + // to erase that MVCC write and reveal the previous value. + // If _all_ the writes get removed in this way, the intent + // "collapses" and should be considered empty (i.e. can be removed altogether). + // If only part of the intent history was rolled back, but the intent still + // remains, updatedIntent is set to true. + if len(intent.IgnoredSeqNums) > 0 { + collapsedIntent, rolledBackVal, err = mvccMaybeRewriteIntentHistory(ctx, rw, intent.IgnoredSeqNums, meta, latestKey) + if err != nil { + return false, err + } + } // There's nothing to do if meta's epoch is greater than or equal txn's // epoch and the state is still in progress but the intent was not pushed - // to a larger timestamp. - if inProgress && !pushed { + // to a larger timestamp, and if the rollback code did not modify or collapse + // the intent. + if inProgress && !pushed && rolledBackVal == nil && !collapsedIntent { return false, nil } @@ -2717,15 +2778,21 @@ func mvccResolveWriteIntent( // the proposed epoch matches the existing epoch: update the meta.Txn. For commit, it's set to // nil; otherwise, we update its value. We may have to update the actual version value (remove old // and create new with proper timestamp-encoded key) if timestamp changed. - if commit || pushed { + // + // We also use the commit path when the intent is being collapsed, + // to ensure the intent meta gets deleted and the stats updated. + if commit || pushed || (rolledBackVal != nil) { buf.newMeta = *meta // Set the timestamp for upcoming write (or at least the stats update). buf.newMeta.Timestamp = hlc.LegacyTimestamp(intent.Txn.WriteTimestamp) // Update or remove the metadata key. var metaKeySize, metaValSize int64 - if pushed { - // Keep existing intent if we're pushing timestamp. We keep the + // Note that commit takes precedence over {updated, collapsed}Intent; as in, + // if we're committing, we don't care whether mvccMaybeRewriteIntentHistory + // updated the intent or collapsed it. + if pushed || (rolledBackVal != nil && !commit) { + // Keep existing intent if we're updating it. We keep the // existing metadata instead of using the supplied intent meta // to avoid overwriting a newer epoch (see comments above). The // pusher's job isn't to do anything to update the intent but @@ -2739,9 +2806,12 @@ func mvccResolveWriteIntent( return false, err } - // If we're moving the intent's timestamp, adjust stats and rewrite it. + // If we're moving the intent's timestamp, adjust stats and + // rewrite it. However this work needs not be done if the intent + // was collapsed (mvccMaybeRewriteIntentHistory already rewrote + // the key at the correct timestamp and adjusted the stats). var prevValSize int64 - if buf.newMeta.Timestamp != meta.Timestamp { + if buf.newMeta.Timestamp != meta.Timestamp && !collapsedIntent { oldKey := MVCCKey{Key: intent.Key, Timestamp: hlc.Timestamp(meta.Timestamp)} newKey := MVCCKey{Key: intent.Key, Timestamp: intent.Txn.WriteTimestamp} @@ -2752,7 +2822,16 @@ func mvccResolveWriteIntent( } else if !valid || !iter.UnsafeKey().Equal(oldKey) { return false, errors.Errorf("existing intent value missing: %s", oldKey) } - if err = rw.Put(newKey, iter.UnsafeValue()); err != nil { + value := iter.UnsafeValue() + // Special case: If mvccMaybeRewriteIntentHistory rolled back to a value + // in the intent history and wrote that at oldKey, iter would not be able + // to "see" the value since it was created before that value was written + // to the engine. In this case, reuse the value returned by + // mvccMaybeRewriteIntentHistory. + if rolledBackVal != nil { + value = rolledBackVal + } + if err = rw.Put(newKey, value); err != nil { return false, err } if err = rw.Clear(oldKey); err != nil { @@ -2808,7 +2887,6 @@ func mvccResolveWriteIntent( // - ResolveIntent with epoch 0 aborts intent from epoch 1. // First clear the intent value. - latestKey := MVCCKey{Key: intent.Key, Timestamp: hlc.Timestamp(meta.Timestamp)} if err := rw.Clear(latestKey); err != nil { return false, err } @@ -2860,6 +2938,59 @@ func mvccResolveWriteIntent( return true, nil } +// mvccMaybeRewriteIntentHistory rewrites the intent to reveal the latest +// stored value, ignoring all values from the history that have an +// ignored seqnum. +// The cleared return value, when true, indicates that +// all the writes in the intent are ignored and the intent should +// not be considered to exist any more. +// The updated return value, when true, indicates that the intent was updated +// and should be overwritten in engine. +func mvccMaybeRewriteIntentHistory( + ctx context.Context, + engine ReadWriter, + ignoredSeqNums []enginepb.IgnoredSeqNumRange, + meta *enginepb.MVCCMetadata, + latestKey MVCCKey, +) (cleared bool, updatedVal []byte, err error) { + if !enginepb.TxnSeqIsIgnored(meta.Txn.Sequence, ignoredSeqNums) { + // The latest write was not ignored. Nothing to do here. We'll + // proceed with the intent as usual. + return false, nil, nil + } + // Find the latest historical write before that that was not + // ignored. + var i int + for i = len(meta.IntentHistory) - 1; i >= 0; i-- { + e := &meta.IntentHistory[i] + if !enginepb.TxnSeqIsIgnored(e.Sequence, ignoredSeqNums) { + break + } + } + + // If i < 0, we don't have an intent any more: everything + // has been rolled back. + if i < 0 { + err := engine.Clear(latestKey) + // For stats recomputation in the caller, flatten the + // value size so there's nothing left attributed to this intent. + meta.ValBytes = 0 + return true, nil, err + } + + // Otherwise, we place back the write at that history entry + // back into the intent. + restoredVal := meta.IntentHistory[i].Value + meta.Txn.Sequence = meta.IntentHistory[i].Sequence + meta.IntentHistory = meta.IntentHistory[:i] + meta.Deleted = len(restoredVal) == 0 + meta.ValBytes = int64(len(restoredVal)) + // And also overwrite whatever was there in storage. + err = engine.Put(latestKey, restoredVal) + + return false, restoredVal, err +} + // IterAndBuf used to pass iterators and buffers between MVCC* calls, allowing // reuse without the callers needing to know the particulars. type IterAndBuf struct { @@ -3513,11 +3644,11 @@ func checkForKeyCollisionsGo( // encounter many intents during IMPORT INTO as we lock the key space we // are importing into. Older write intents could however be found in the // target key space, which will require appropriate resolution logic. - var writeIntentErr roachpb.WriteIntentError - var intent roachpb.Intent - intent.Txn = *mvccMeta.Txn - intent.Key = existingIter.Key().Key - writeIntentErr.Intents = append(writeIntentErr.Intents, intent) + writeIntentErr := roachpb.WriteIntentError{ + Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(mvccMeta.Txn, roachpb.Span{Key: existingIter.Key().Key}), + }, + } return enginepb.MVCCStats{}, &writeIntentErr } else { diff --git a/pkg/storage/engine/mvcc_history_test.go b/pkg/storage/engine/mvcc_history_test.go index 20b794ba3490..fd4dee347eb0 100644 --- a/pkg/storage/engine/mvcc_history_test.go +++ b/pkg/storage/engine/mvcc_history_test.go @@ -368,13 +368,14 @@ const ( // commands is the list of all supported script commands. var commands = map[string]cmd{ - "txn_advance": {typTxnUpdate, cmdTxnAdvance}, - "txn_begin": {typTxnUpdate, cmdTxnBegin}, - "txn_remove": {typTxnUpdate, cmdTxnRemove}, - "txn_restart": {typTxnUpdate, cmdTxnRestart}, - "txn_status": {typTxnUpdate, cmdTxnSetStatus}, - "txn_step": {typTxnUpdate, cmdTxnStep}, - "txn_update": {typTxnUpdate, cmdTxnUpdate}, + "txn_advance": {typTxnUpdate, cmdTxnAdvance}, + "txn_begin": {typTxnUpdate, cmdTxnBegin}, + "txn_ignore_seqs": {typTxnUpdate, cmdTxnIgnoreSeqs}, + "txn_remove": {typTxnUpdate, cmdTxnRemove}, + "txn_restart": {typTxnUpdate, cmdTxnRestart}, + "txn_status": {typTxnUpdate, cmdTxnSetStatus}, + "txn_step": {typTxnUpdate, cmdTxnStep}, + "txn_update": {typTxnUpdate, cmdTxnUpdate}, "resolve_intent": {typDataUpdate, cmdResolveIntent}, "check_intent": {typReadOnly, cmdCheckIntent}, @@ -414,6 +415,30 @@ func cmdTxnBegin(e *evalCtx) error { return err } +func cmdTxnIgnoreSeqs(e *evalCtx) error { + txn := e.getTxn(mandatory) + seql := e.getList("seqs") + is := []enginepb.IgnoredSeqNumRange{} + for _, s := range seql { + parts := strings.Split(s, "-") + if len(parts) != 2 { + e.Fatalf("syntax error: expected 'a-b', got: '%s'", s) + } + a, err := strconv.ParseInt(parts[0], 10, 32) + if err != nil { + e.Fatalf("%v", err) + } + b, err := strconv.ParseInt(parts[1], 10, 32) + if err != nil { + e.Fatalf("%v", err) + } + is = append(is, enginepb.IgnoredSeqNumRange{Start: enginepb.TxnSeq(a), End: enginepb.TxnSeq(b)}) + } + txn.IgnoredSeqNums = is + e.results.txn = txn + return nil +} + func cmdTxnRemove(e *evalCtx) error { txn := e.getTxn(mandatory) delete(e.txns, txn.Name) @@ -478,11 +503,9 @@ func cmdResolveIntent(e *evalCtx) error { func (e *evalCtx) resolveIntent( rw ReadWriter, key roachpb.Key, txn *roachpb.Transaction, resolveStatus roachpb.TransactionStatus, ) error { - _, err := MVCCResolveWriteIntent(e.ctx, rw, nil, roachpb.Intent{ - Span: roachpb.Span{Key: key}, - Status: resolveStatus, - Txn: txn.TxnMeta, - }) + intent := roachpb.MakeIntent(txn, roachpb.Span{Key: key}) + intent.Status = resolveStatus + _, err := MVCCResolveWriteIntent(e.ctx, rw, nil, intent) return err } @@ -502,7 +525,7 @@ func cmdCheckIntent(e *evalCtx) error { return errors.Newf("meta: %v -> expected intent, found none", key) } if ok { - fmt.Fprintf(e.results.buf, "meta: %v -> %s\n", key, &meta) + fmt.Fprintf(e.results.buf, "meta: %v -> %+v\n", key, &meta) if !wantIntent { return errors.Newf("meta: %v -> expected no intent, found one", key) } @@ -793,6 +816,16 @@ const ( mandatory ) +func (e *evalCtx) getList(argName string) []string { + for _, c := range e.td.CmdArgs { + if c.Key == argName { + return c.Vals + } + } + e.Fatalf("missing argument: %s", argName) + return nil +} + func (e *evalCtx) getTxn(opt optArg) *roachpb.Transaction { e.t.Helper() if opt == optional && (e.hasArg("notxn") || !e.hasArg("t")) { diff --git a/pkg/storage/engine/mvcc_incremental_iterator.go b/pkg/storage/engine/mvcc_incremental_iterator.go index ca50d29dc716..5502840e7a1b 100644 --- a/pkg/storage/engine/mvcc_incremental_iterator.go +++ b/pkg/storage/engine/mvcc_incremental_iterator.go @@ -192,11 +192,9 @@ func (i *MVCCIncrementalIterator) advance() { if i.meta.Txn != nil { if i.startTime.Less(metaTimestamp) && metaTimestamp.LessEq(i.endTime) { i.err = &roachpb.WriteIntentError{ - Intents: []roachpb.Intent{{ - Span: roachpb.Span{Key: i.iter.Key().Key}, - Status: roachpb.PENDING, - Txn: *i.meta.Txn, - }}, + Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(i.meta.Txn, roachpb.Span{Key: i.iter.Key().Key}), + }, } i.valid = false return diff --git a/pkg/storage/engine/mvcc_incremental_iterator_test.go b/pkg/storage/engine/mvcc_incremental_iterator_test.go index af1f2dc0dfce..1d049fcf5cba 100644 --- a/pkg/storage/engine/mvcc_incremental_iterator_test.go +++ b/pkg/storage/engine/mvcc_incremental_iterator_test.go @@ -206,11 +206,13 @@ func TestMVCCIncrementalIterator(t *testing.T) { t.Run("intents", assertEqualKVs(e, fn, keyMin, keyMax, ts4, tsMax, kvs())) t.Run("intents", assertEqualKVs(e, fn, keyMin, keyMax, ts4.Next(), tsMax, kvs())) - intent1 := roachpb.Intent{Span: roachpb.Span{Key: testKey1}, Txn: txn1.TxnMeta, Status: roachpb.COMMITTED} + intent1 := roachpb.MakeIntent(&txn1, roachpb.Span{Key: testKey1}) + intent1.Status = roachpb.COMMITTED if _, err := MVCCResolveWriteIntent(ctx, e, nil, intent1); err != nil { t.Fatal(err) } - intent2 := roachpb.Intent{Span: roachpb.Span{Key: testKey2}, Txn: txn2.TxnMeta, Status: roachpb.ABORTED} + intent2 := roachpb.MakeIntent(&txn2, roachpb.Span{Key: testKey2}) + intent2.Status = roachpb.ABORTED if _, err := MVCCResolveWriteIntent(ctx, e, nil, intent2); err != nil { t.Fatal(err) } @@ -294,11 +296,13 @@ func TestMVCCIncrementalIterator(t *testing.T) { t.Run("intents", assertEqualKVs(e, fn, keyMin, keyMax, ts4, tsMax, kvs())) t.Run("intents", assertEqualKVs(e, fn, keyMin, keyMax, ts4.Next(), tsMax, kvs())) - intent1 := roachpb.Intent{Span: roachpb.Span{Key: testKey1}, Txn: txn1.TxnMeta, Status: roachpb.COMMITTED} + intent1 := roachpb.MakeIntent(&txn1, roachpb.Span{Key: testKey1}) + intent1.Status = roachpb.COMMITTED if _, err := MVCCResolveWriteIntent(ctx, e, nil, intent1); err != nil { t.Fatal(err) } - intent2 := roachpb.Intent{Span: roachpb.Span{Key: testKey2}, Txn: txn2.TxnMeta, Status: roachpb.ABORTED} + intent2 := roachpb.MakeIntent(&txn2, roachpb.Span{Key: testKey2}) + intent2.Status = roachpb.ABORTED if _, err := MVCCResolveWriteIntent(ctx, e, nil, intent2); err != nil { t.Fatal(err) } diff --git a/pkg/storage/engine/mvcc_logical_ops_test.go b/pkg/storage/engine/mvcc_logical_ops_test.go index c953f012aae8..21a27bfb4dfb 100644 --- a/pkg/storage/engine/mvcc_logical_ops_test.go +++ b/pkg/storage/engine/mvcc_logical_ops_test.go @@ -75,18 +75,18 @@ func TestMVCCOpLogWriter(t *testing.T) { // Resolve all three intent. txn1CommitTS := *txn1Commit txn1CommitTS.WriteTimestamp = hlc.Timestamp{Logical: 4} - if _, _, err := MVCCResolveWriteIntentRange(ctx, ol, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1, EndKey: testKey2.Next()}, - Txn: txn1CommitTS.TxnMeta, - Status: txn1CommitTS.Status, - }, math.MaxInt64); err != nil { + if _, _, err := MVCCResolveWriteIntentRange(ctx, ol, nil, + roachpb.MakeIntent( + &txn1CommitTS, + roachpb.Span{Key: testKey1, EndKey: testKey2.Next()}), + math.MaxInt64); err != nil { t.Fatal(err) } - if _, _, err := MVCCResolveWriteIntentRange(ctx, ol, nil, roachpb.Intent{ - Span: roachpb.Span{Key: localKey, EndKey: localKey.Next()}, - Txn: txn1CommitTS.TxnMeta, - Status: txn1CommitTS.Status, - }, math.MaxInt64); err != nil { + if _, _, err := MVCCResolveWriteIntentRange(ctx, ol, nil, + roachpb.MakeIntent( + &txn1CommitTS, + roachpb.Span{Key: localKey, EndKey: localKey.Next()}), + math.MaxInt64); err != nil { t.Fatal(err) } @@ -97,20 +97,16 @@ func TestMVCCOpLogWriter(t *testing.T) { } txn2Pushed := *txn2 txn2Pushed.WriteTimestamp = hlc.Timestamp{Logical: 6} - if _, err := MVCCResolveWriteIntent(ctx, ol, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey3}, - Txn: txn2Pushed.TxnMeta, - Status: txn2Pushed.Status, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, ol, nil, + roachpb.MakeIntent(&txn2Pushed, roachpb.Span{Key: testKey3}), + ); err != nil { t.Fatal(err) } txn2Abort := txn2Pushed txn2Abort.Status = roachpb.ABORTED - if _, err := MVCCResolveWriteIntent(ctx, ol, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey3}, - Txn: txn2Abort.TxnMeta, - Status: txn2Abort.Status, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, ol, nil, + roachpb.MakeIntent(&txn2Abort, roachpb.Span{Key: testKey3}), + ); err != nil { t.Fatal(err) } diff --git a/pkg/storage/engine/mvcc_stats_test.go b/pkg/storage/engine/mvcc_stats_test.go index 705f61bf2542..d045fcddb448 100644 --- a/pkg/storage/engine/mvcc_stats_test.go +++ b/pkg/storage/engine/mvcc_stats_test.go @@ -112,9 +112,9 @@ func TestMVCCStatsDeleteCommitMovesTimestamp(t *testing.T) { ts4 := hlc.Timestamp{WallTime: 4 * 1e9} txn.Status = roachpb.COMMITTED txn.WriteTimestamp.Forward(ts4) - if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, roachpb.Intent{ - Span: roachpb.Span{Key: key}, Status: txn.Status, Txn: txn.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, + roachpb.MakeIntent(txn, roachpb.Span{Key: key}), + ); err != nil { t.Fatal(err) } @@ -192,9 +192,9 @@ func TestMVCCStatsPutCommitMovesTimestamp(t *testing.T) { ts4 := hlc.Timestamp{WallTime: 4 * 1e9} txn.Status = roachpb.COMMITTED txn.WriteTimestamp.Forward(ts4) - if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, roachpb.Intent{ - Span: roachpb.Span{Key: key}, Status: txn.Status, Txn: txn.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, + roachpb.MakeIntent(txn, roachpb.Span{Key: key}), + ); err != nil { t.Fatal(err) } @@ -270,9 +270,9 @@ func TestMVCCStatsPutPushMovesTimestamp(t *testing.T) { // push as it would happen for a SNAPSHOT txn) ts4 := hlc.Timestamp{WallTime: 4 * 1e9} txn.WriteTimestamp.Forward(ts4) - if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, roachpb.Intent{ - Span: roachpb.Span{Key: key}, Status: txn.Status, Txn: txn.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, + roachpb.MakeIntent(txn, roachpb.Span{Key: key}), + ); err != nil { t.Fatal(err) } @@ -605,9 +605,9 @@ func TestMVCCStatsDelDelCommitMovesTimestamp(t *testing.T) { txnCommit := txn.Clone() txnCommit.Status = roachpb.COMMITTED txnCommit.WriteTimestamp.Forward(ts3) - if _, err := MVCCResolveWriteIntent(ctx, engine, &aggMS, roachpb.Intent{ - Span: roachpb.Span{Key: key}, Status: txnCommit.Status, Txn: txnCommit.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, &aggMS, + roachpb.MakeIntent(txnCommit, roachpb.Span{Key: key}), + ); err != nil { t.Fatal(err) } @@ -634,9 +634,9 @@ func TestMVCCStatsDelDelCommitMovesTimestamp(t *testing.T) { txnAbort := txn.Clone() txnAbort.Status = roachpb.ABORTED txnAbort.WriteTimestamp.Forward(ts3) - if _, err := MVCCResolveWriteIntent(ctx, engine, &aggMS, roachpb.Intent{ - Span: roachpb.Span{Key: key}, Status: txnAbort.Status, Txn: txnAbort.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, &aggMS, + roachpb.MakeIntent(txnAbort, roachpb.Span{Key: key}), + ); err != nil { t.Fatal(err) } @@ -764,9 +764,9 @@ func TestMVCCStatsPutDelPutMovesTimestamp(t *testing.T) { txnAbort := txn.Clone() txnAbort.Status = roachpb.ABORTED // doesn't change m2ValSize, fortunately - if _, err := MVCCResolveWriteIntent(ctx, engine, &aggMS, roachpb.Intent{ - Span: roachpb.Span{Key: key}, Status: txnAbort.Status, Txn: txnAbort.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, &aggMS, + roachpb.MakeIntent(txnAbort, roachpb.Span{Key: key}), + ); err != nil { t.Fatal(err) } @@ -1235,9 +1235,9 @@ func TestMVCCStatsTxnSysPutAbort(t *testing.T) { // Now abort the intent. txn.Status = roachpb.ABORTED - if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, roachpb.Intent{ - Span: roachpb.Span{Key: key}, Status: txn.Status, Txn: txn.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, aggMS, + roachpb.MakeIntent(txn, roachpb.Span{Key: key}), + ); err != nil { t.Fatal(err) } @@ -1340,19 +1340,15 @@ type state struct { } func (s *state) intent(status roachpb.TransactionStatus) roachpb.Intent { - return roachpb.Intent{ - Span: roachpb.Span{Key: s.key}, - Txn: s.Txn.TxnMeta, - Status: status, - } + intent := roachpb.MakeIntent(s.Txn, roachpb.Span{Key: s.key}) + intent.Status = status + return intent } func (s *state) intentRange(status roachpb.TransactionStatus) roachpb.Intent { - return roachpb.Intent{ - Span: roachpb.Span{Key: roachpb.KeyMin, EndKey: roachpb.KeyMax}, - Txn: s.Txn.TxnMeta, - Status: status, - } + intent := roachpb.MakeIntent(s.Txn, roachpb.Span{Key: roachpb.KeyMin, EndKey: roachpb.KeyMax}) + intent.Status = status + return intent } func (s *state) rngVal() roachpb.Value { diff --git a/pkg/storage/engine/mvcc_test.go b/pkg/storage/engine/mvcc_test.go index d803215b5243..fb66fb6d3be8 100644 --- a/pkg/storage/engine/mvcc_test.go +++ b/pkg/storage/engine/mvcc_test.go @@ -2721,11 +2721,8 @@ func TestMVCCInitPutWithTxn(t *testing.T) { txnCommit := txn txnCommit.Status = roachpb.COMMITTED txnCommit.WriteTimestamp = clock.Now().Add(1, 0) - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txnCommit.Status, - Txn: txnCommit.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(&txnCommit, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -3039,11 +3036,8 @@ func TestMVCCResolveTxn(t *testing.T) { } // Resolve will write with txn1's timestamp which is 0,1. - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Txn: txn1Commit.TxnMeta, - Status: txn1Commit.Status, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn1Commit, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -3084,11 +3078,8 @@ func TestMVCCResolveNewerIntent(t *testing.T) { } // Resolve will succeed but should remove the intent. - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Txn: txn1Commit.TxnMeta, - Status: txn1Commit.Status, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn1Commit, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -3121,15 +3112,12 @@ func TestMVCCResolveIntentTxnTimestampMismatch(t *testing.T) { t.Fatal(err) } - intent := roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: roachpb.PENDING, - // The Timestamp within is equal to that of txn.Meta even though - // the intent sits at tsEarly. The bug was looking at the former - // instead of the latter (and so we could also tickle it with - // smaller timestamps in Txn). - Txn: txn.TxnMeta, - } + // The Timestamp within is equal to that of txn.Meta even though + // the intent sits at tsEarly. The bug was looking at the former + // instead of the latter (and so we could also tickle it with + // smaller timestamps in Txn). + intent := roachpb.MakeIntent(txn, roachpb.Span{Key: testKey1}) + intent.Status = roachpb.PENDING // A bug (see #7654) caused intents to just stay where they were instead // of being moved forward in the situation set up above. @@ -3350,11 +3338,9 @@ func TestMVCCAbortTxn(t *testing.T) { txn1AbortWithTS := txn1Abort.Clone() txn1AbortWithTS.WriteTimestamp = hlc.Timestamp{Logical: 1} - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Txn: txn1AbortWithTS.TxnMeta, - Status: txn1AbortWithTS.Status, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn1AbortWithTS, roachpb.Span{Key: testKey1}), + ); err != nil { t.Fatal(err) } @@ -3397,11 +3383,9 @@ func TestMVCCAbortTxnWithPreviousVersion(t *testing.T) { txn1AbortWithTS := txn1Abort.Clone() txn1AbortWithTS.WriteTimestamp = hlc.Timestamp{WallTime: 2} - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txn1AbortWithTS.Status, - Txn: txn1AbortWithTS.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn1AbortWithTS, roachpb.Span{Key: testKey1}), + ); err != nil { t.Fatal(err) } @@ -3467,11 +3451,8 @@ func TestMVCCWriteWithDiffTimestampsAndEpochs(t *testing.T) { txne2Commit := txne2 txne2Commit.Status = roachpb.COMMITTED txne2Commit.WriteTimestamp = hlc.Timestamp{WallTime: 1} - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txne2Commit.Status, - Txn: txne2Commit.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(&txne2Commit, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -3800,11 +3781,8 @@ func TestMVCCGetWithPushedTimestamp(t *testing.T) { } // Resolve the intent, pushing its timestamp forward. txn := makeTxn(*txn1, hlc.Timestamp{WallTime: 1}) - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txn.Status, - Txn: txn.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } // Attempt to read using naive txn's previous timestamp. @@ -3835,11 +3813,8 @@ func TestMVCCResolveWithDiffEpochs(t *testing.T) { if err := MVCCPut(ctx, engine, nil, testKey2, txn1e2.ReadTimestamp, value2, txn1e2); err != nil { t.Fatal(err) } - num, _, err := MVCCResolveWriteIntentRange(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1, EndKey: testKey2.Next()}, - Txn: txn1e2Commit.TxnMeta, - Status: txn1e2Commit.Status, - }, 2) + num, _, err := MVCCResolveWriteIntentRange(ctx, engine, nil, + roachpb.MakeIntent(txn1e2Commit, roachpb.Span{Key: testKey1, EndKey: testKey2.Next()}), 2) if err != nil { t.Fatal(err) } @@ -3894,11 +3869,8 @@ func TestMVCCResolveWithUpdatedTimestamp(t *testing.T) { // Resolve with a higher commit timestamp -- this should rewrite the // intent when making it permanent. txn := makeTxn(*txn1Commit, hlc.Timestamp{WallTime: 1}) - if _, err = MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txn.Status, - Txn: txn.TxnMeta, - }); err != nil { + if _, err = MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -3948,11 +3920,8 @@ func TestMVCCResolveWithPushedTimestamp(t *testing.T) { // Resolve with a higher commit timestamp, but with still-pending transaction. // This represents a straightforward push (i.e. from a read/write conflict). txn := makeTxn(*txn1, hlc.Timestamp{WallTime: 1}) - if _, err = MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txn.Status, - Txn: txn.TxnMeta, - }); err != nil { + if _, err = MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -3989,11 +3958,8 @@ func TestMVCCResolveTxnNoOps(t *testing.T) { defer engine.Close() // Resolve a non existent key; noop. - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txn1Commit.Status, - Txn: txn1Commit.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn1Commit, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -4001,11 +3967,8 @@ func TestMVCCResolveTxnNoOps(t *testing.T) { if err := MVCCPut(ctx, engine, nil, testKey1, hlc.Timestamp{Logical: 1}, value1, nil); err != nil { t.Fatal(err) } - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txn2Commit.Status, - Txn: txn2Commit.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn2Commit, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } @@ -4016,11 +3979,8 @@ func TestMVCCResolveTxnNoOps(t *testing.T) { txn1CommitWithTS := txn2Commit.Clone() txn1CommitWithTS.WriteTimestamp = hlc.Timestamp{WallTime: 1} - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey2}, - Status: txn1CommitWithTS.Status, - Txn: txn1CommitWithTS.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn1CommitWithTS, roachpb.Span{Key: testKey2})); err != nil { t.Fatal(err) } }) @@ -4049,11 +4009,9 @@ func TestMVCCResolveTxnRange(t *testing.T) { t.Fatal(err) } - num, resumeSpan, err := MVCCResolveWriteIntentRange(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1, EndKey: testKey4.Next()}, - Txn: txn1Commit.TxnMeta, - Status: txn1Commit.Status, - }, math.MaxInt64) + num, resumeSpan, err := MVCCResolveWriteIntentRange(ctx, engine, nil, + roachpb.MakeIntent(txn1Commit, roachpb.Span{Key: testKey1, EndKey: testKey4.Next()}), + math.MaxInt64) if err != nil { t.Fatal(err) } @@ -4135,11 +4093,9 @@ func TestMVCCResolveTxnRangeResume(t *testing.T) { } // Resolve up to 5 intents. - num, resumeSpan, err := MVCCResolveWriteIntentRange(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: roachpb.Key("00"), EndKey: roachpb.Key("30")}, - Txn: txn1Commit.TxnMeta, - Status: txn1Commit.Status, - }, 5) + num, resumeSpan, err := MVCCResolveWriteIntentRange(ctx, engine, nil, + roachpb.MakeIntent(txn1Commit, roachpb.Span{Key: roachpb.Key("00"), EndKey: roachpb.Key("30")}), + 5) if err != nil { t.Fatal(err) } @@ -4894,11 +4850,8 @@ func TestResolveIntentWithLowerEpoch(t *testing.T) { t.Fatal(err) } // Resolve the intent with a low epoch. - if _, err := MVCCResolveWriteIntent(ctx, engine, nil, roachpb.Intent{ - Span: roachpb.Span{Key: testKey1}, - Status: txn1.Status, - Txn: txn1.TxnMeta, - }); err != nil { + if _, err := MVCCResolveWriteIntent(ctx, engine, nil, + roachpb.MakeIntent(txn1, roachpb.Span{Key: testKey1})); err != nil { t.Fatal(err) } diff --git a/pkg/storage/engine/rocksdb.go b/pkg/storage/engine/rocksdb.go index 4035df594956..409a24e0ffb9 100644 --- a/pkg/storage/engine/rocksdb.go +++ b/pkg/storage/engine/rocksdb.go @@ -2620,6 +2620,16 @@ func goToCSlice(b []byte) C.DBSlice { } } +func goToCIgnoredSeqNums(b []enginepb.IgnoredSeqNumRange) C.DBIgnoredSeqNums { + if len(b) == 0 { + return C.DBIgnoredSeqNums{ranges: nil, len: 0} + } + return C.DBIgnoredSeqNums{ + ranges: (*C.DBIgnoredSeqNumRange)(unsafe.Pointer(&b[0])), + len: C.int(len(b)), + } +} + func goToCKey(key MVCCKey) C.DBKey { return C.DBKey{ key: goToCSlice(key.Key), @@ -2707,6 +2717,7 @@ func goToCTxn(txn *roachpb.Transaction) C.DBTxn { r.epoch = C.uint32_t(txn.Epoch) r.sequence = C.int32_t(txn.Sequence) r.max_timestamp = goToCTimestamp(txn.MaxTimestamp) + r.ignored_seqnums = goToCIgnoredSeqNums(txn.IgnoredSeqNums) } return r } diff --git a/pkg/storage/engine/testdata/mvcc_histories/conditional_put_with_txn b/pkg/storage/engine/testdata/mvcc_histories/conditional_put_with_txn index 65e44f9f925f..da1c1e374cd4 100644 --- a/pkg/storage/engine/testdata/mvcc_histories/conditional_put_with_txn +++ b/pkg/storage/engine/testdata/mvcc_histories/conditional_put_with_txn @@ -48,9 +48,9 @@ run ok with t=A txn_advance ts=124 resolve_intent k=k + txn_remove ---- >> at end: -txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=1 ts=0.000000124,0 min=0,0 seq=1} rw=true stat=PENDING rts=0.000000123,0 wto=false max=0,0 data: "k"/0.000000124,0 -> /BYTES/v3 # Write value4 with an old timestamp without txn...should get a write @@ -63,3 +63,47 @@ cput k=k v=v4 cond=v3 ts=123 data: "k"/0.000000124,1 -> /BYTES/v4 data: "k"/0.000000124,0 -> /BYTES/v3 error: (*roachpb.WriteTooOldError:) WriteTooOldError: write at timestamp 0.000000123,0 too old; wrote at 0.000000124,1 + +# Reset for next test + +run ok +clear_range k=k end=-k +---- +>> at end: + + +# From TxnCoordSenderRetries, +# "multi-range batch with forwarded timestamp and cput and delete range" + +# First txn attempt + +run ok +# Before txn start: +put k=c v=value ts=1 +with t=A + txn_begin ts=2 + txn_step + cput k=c v=cput cond=value +---- +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000002,0 min=0,0 seq=1} rw=true stat=PENDING rts=0.000000002,0 wto=false max=0,0 +meta: "c"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000002,0 min=0,0 seq=1} ts=0.000000002,0 del=false klen=12 vlen=9 +data: "c"/0.000000002,0 -> /BYTES/cput +data: "c"/0.000000001,0 -> /BYTES/value + +# Restart and retry cput. It should succeed. + +run trace ok +with t=A + txn_restart ts=3 + txn_step + cput k=c v=cput cond=value +---- +>> txn_restart ts=3 t=A +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=1 ts=0.000000003,0 min=0,0 seq=0} rw=true stat=PENDING rts=0.000000003,0 wto=false max=0,0 +>> txn_step t=A +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=1 ts=0.000000003,0 min=0,0 seq=1} rw=true stat=PENDING rts=0.000000003,0 wto=false max=0,0 +>> cput k=c v=cput cond=value t=A +meta: "c"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=1 ts=0.000000003,0 min=0,0 seq=1} ts=0.000000003,0 del=false klen=12 vlen=9 +data: "c"/0.000000003,0 -> /BYTES/cput +data: "c"/0.000000001,0 -> /BYTES/value diff --git a/pkg/storage/engine/testdata/mvcc_histories/idempotent_transactions b/pkg/storage/engine/testdata/mvcc_histories/idempotent_transactions index b0f4d083af52..79fb3852553a 100644 --- a/pkg/storage/engine/testdata/mvcc_histories/idempotent_transactions +++ b/pkg/storage/engine/testdata/mvcc_histories/idempotent_transactions @@ -34,7 +34,7 @@ with t=a k=a txn_step check_intent ---- -meta: "a" -> txn={id=00000000 key="a" pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=1} ts=0.000000011,0 del=false klen=12 vlen=11 nih=1 +meta: "a" -> txn={id=00000000 key="a" pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=1} ts=0.000000011,0 del=false klen=12 vlen=11 ih={{0 /BYTES/first}} >> at end: txn: "a" meta={id=00000000 key="a" pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=1} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 meta: "a"/0,0 -> txn={id=00000000 key="a" pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=1} ts=0.000000011,0 del=false klen=12 vlen=11 ih={{0 /BYTES/first}} diff --git a/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums new file mode 100644 index 000000000000..cab836b5f009 --- /dev/null +++ b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums @@ -0,0 +1,140 @@ +# Pebble does not support ignored seqnums for now. +skip pebble +---- + +# Perform some writes at various sequence numbers. + +run ok +with t=A + txn_begin ts=11 + txn_step seq=10 + put k=k v=a + put k=k/10 v=10 + txn_step seq=20 + put k=k v=b + put k=k/20 v=20 + txn_step seq=30 + put k=k v=c + put k=k/30 v=30 + txn_step seq=40 +---- +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "k"/0.000000011,0 -> /BYTES/c +meta: "k/10"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=10} ts=0.000000011,0 del=false klen=12 vlen=7 +data: "k/10"/0.000000011,0 -> /BYTES/10 +meta: "k/20"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000011,0 del=false klen=12 vlen=7 +data: "k/20"/0.000000011,0 -> /BYTES/20 +meta: "k/30"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} ts=0.000000011,0 del=false klen=12 vlen=7 +data: "k/30"/0.000000011,0 -> /BYTES/30 + +# Mask a single write. +# The third write should be hidden now. + +run ok +with t=A + txn_ignore_seqs seqs=(25-35) + scan k=k end=-k + get k=k +---- +scan: "k" -> /BYTES/b @0,0 +scan: "k/10" -> /BYTES/10 @0.000000011,0 +scan: "k/20" -> /BYTES/20 @0.000000011,0 +get: "k" -> /BYTES/b @0,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 + +# Mask a write in the middle. + +run ok +with t=A + txn_ignore_seqs seqs=(15-25) + txn_step seq=40 + scan k=k end=-k + get k=k +---- +scan: "k" -> /BYTES/c @0.000000011,0 +scan: "k/10" -> /BYTES/10 @0.000000011,0 +scan: "k/30" -> /BYTES/30 @0.000000011,0 +get: "k" -> /BYTES/c @0.000000011,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 + +# Mask all the writes. + +run ok +with t=A + txn_ignore_seqs seqs=(1-35) + txn_step seq=40 + scan k=k end=-k + get k=k +---- +scan: "k"-"l" -> +get: "k" -> +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 + +# Disjoint masks. + +run ok +with t=A + txn_ignore_seqs seqs=(1-15,25-35) + txn_step seq=40 + scan k=k end=-k + get k=k +---- +scan: "k" -> /BYTES/b @0,0 +scan: "k/20" -> /BYTES/20 @0.000000011,0 +get: "k" -> /BYTES/b @0,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=2 + +# A historical read before the ignored range should retrieve the +# historical value visible at that point. + +run ok +with t=A + txn_ignore_seqs seqs=(15-25) + txn_step seq=12 + scan k=k end=-k + get k=k +---- +scan: "k" -> /BYTES/a @0,0 +scan: "k/10" -> /BYTES/10 @0.000000011,0 +get: "k" -> /BYTES/a @0,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=12} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 + +# A historical read with an ignored range before it should hide +# the historical value hidden at that point. + +run ok +with t=A + txn_ignore_seqs seqs=(5-15) + txn_step seq=22 + scan k=k end=-k + get k=k +---- +scan: "k" -> /BYTES/b @0,0 +scan: "k/20" -> /BYTES/20 @0.000000011,0 +get: "k" -> /BYTES/b @0,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=22} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 + +# A historical read with an ignored range that overlaps should hide +# the historical value hidden at that point. + +run ok +with t=A + txn_ignore_seqs seqs=(25-35) + txn_step seq=32 + scan k=k end=-k + get k=k +---- +scan: "k" -> /BYTES/b @0,0 +scan: "k/10" -> /BYTES/10 @0.000000011,0 +scan: "k/20" -> /BYTES/20 @0.000000011,0 +get: "k" -> /BYTES/b @0,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=32} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 diff --git a/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_commit b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_commit new file mode 100644 index 000000000000..2f8500c4c6f1 --- /dev/null +++ b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_commit @@ -0,0 +1,80 @@ +# Pebble does not support ignored seqnums for now. +skip pebble +---- + +# Perform some writes at various sequence numbers. + +run ok +with t=A + txn_begin ts=11 + txn_step seq=10 + put k=k v=a + put k=k/10 v=10 + txn_step seq=20 + put k=k v=b + put k=k/20 v=20 + txn_step seq=30 + put k=k v=c + put k=k/30 v=30 + txn_step seq=40 +# Mask a single write. +# The third write should be hidden now. + txn_ignore_seqs seqs=(25-35) + resolve_intent k=k + resolve_intent k=k/10 + resolve_intent k=k/20 + resolve_intent k=k/30 +---- +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 +data: "k"/0.000000011,0 -> /BYTES/b +data: "k/10"/0.000000011,0 -> /BYTES/10 +data: "k/20"/0.000000011,0 -> /BYTES/20 + +run ok +scan k=k end=-k +get k=k +---- +scan: "k"-"l" -> +get: "k" -> + +run ok +clear_range k=k end=-k +txn_remove t=A +---- +>> at end: + + +run ok +with t=A + txn_begin ts=11 + txn_step seq=10 + put k=k v=a + put k=k/10 v=10 + txn_step seq=20 + put k=k v=b + put k=k/20 v=20 + txn_step seq=30 + put k=k v=c + put k=k/30 v=30 + txn_step seq=40 +# Mask a single write. +# The middle write should be hidden now. + txn_ignore_seqs seqs=(15-25) + resolve_intent k=k + resolve_intent k=k/10 + resolve_intent k=k/20 + resolve_intent k=k/30 +---- +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 +data: "k"/0.000000011,0 -> /BYTES/c +data: "k/10"/0.000000011,0 -> /BYTES/10 +data: "k/30"/0.000000011,0 -> /BYTES/30 + +run ok +scan k=k end=-k +get k=k +---- +scan: "k"-"l" -> +get: "k" -> diff --git a/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_cput b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_cput new file mode 100644 index 000000000000..8ce2b2d3e758 --- /dev/null +++ b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_cput @@ -0,0 +1,208 @@ +# Pebble does not support ignored seqnums for now. +skip pebble +---- + + +## We'll check the behavior of cput in the following circumstances: +## A. last write is ignored, no intent history (need to go to store) +## B. last write is ignored, intent history not ignored (need to pick last from history) +## C. last write is ignored, last entry in intent history is ignored, other entry available (need to pick next-to-last from history) +## D. last write is ignored, all intent history ignored (need to go to store) + +# Case A: just 1 put in txn before CPut (no intent history). Then ignore that put. +# Expect cput to find original value (first). + +run ok +put k=k v=first ts=1 +with t=A + txn_begin ts=11 + txn_step seq=10 + put k=k v=a + txn_ignore_seqs seqs=(5-15) + txn_step seq=20 +---- +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=10} ts=0.000000011,0 del=false klen=12 vlen=6 +data: "k"/0.000000011,0 -> /BYTES/a +data: "k"/0.000000001,0 -> /BYTES/first + +# Condition must fail to find the last write a. + +run error +cput t=A k=k cond=a v=c +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=10} ts=0.000000011,0 del=false klen=12 vlen=6 +data: "k"/0.000000011,0 -> /BYTES/a +data: "k"/0.000000001,0 -> /BYTES/first +error: (*roachpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003first" timestamp: + +# Condition succeeds to find the original value. + +run ok +cput t=A k=k cond=first v=b +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/first}} +data: "k"/0.000000011,0 -> /BYTES/b +data: "k"/0.000000001,0 -> /BYTES/first + +run ok +clear_range k=k end=-k +---- +>> at end: + + +# Case B: two writes, ignore last (check cput picks from history). + +run ok +put k=k v=first ts=1 +with t=B + txn_begin ts=11 + txn_step seq=10 + put k=k v=a + txn_step seq=20 + put k=k v=b + txn_ignore_seqs seqs=(15-25) + txn_step seq=30 +---- +>> at end: +txn: "B" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +data: "k"/0.000000011,0 -> /BYTES/b +data: "k"/0.000000001,0 -> /BYTES/first + +# Condition must fail to find the last write b. + +run error +cput t=B k=k cond=b v=c +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +data: "k"/0.000000011,0 -> /BYTES/b +data: "k"/0.000000001,0 -> /BYTES/first +error: (*roachpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003a" timestamp:<> + +# However it succeeds to find the write before that. + +run ok +cput t=B k=k cond=a v=c +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/a}} +data: "k"/0.000000011,0 -> /BYTES/c +data: "k"/0.000000001,0 -> /BYTES/first + +run ok +clear_range k=k end=-k +---- +>> at end: + + +# Case C: two or more history entries, last is ignored. + +run ok +put k=k v=first ts=1 +with t=C + txn_begin ts=11 + txn_step seq=10 + put k=k v=a + txn_step seq=20 + put k=k v=b + txn_step seq=30 + put k=k v=c + txn_ignore_seqs seqs=(15-35) + txn_step seq=40 +---- +>> at end: +txn: "C" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "k"/0.000000011,0 -> /BYTES/c +data: "k"/0.000000001,0 -> /BYTES/first + +# Condition must fail to find the last write b and c. + +run error +cput t=C k=k cond=c v=d +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "k"/0.000000011,0 -> /BYTES/c +data: "k"/0.000000001,0 -> /BYTES/first +error: (*roachpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003a" timestamp:<> + +run error +cput t=C k=k cond=b v=d +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "k"/0.000000011,0 -> /BYTES/c +data: "k"/0.000000001,0 -> /BYTES/first +error: (*roachpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003a" timestamp:<> + +# However it succeeds to find the write before that. + +run ok +cput t=C k=k cond=a v=c +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=40} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}{30 /BYTES/a}} +data: "k"/0.000000011,0 -> /BYTES/c +data: "k"/0.000000001,0 -> /BYTES/first + +run ok +clear_range k=k end=-k +---- +>> at end: + + +# Case D: last write + intent history all ignored. +# We need just two writes to have a non-empty intent history, then we can ignore that. + +run ok +put k=k v=first ts=1 +with t=D + txn_begin ts=11 + txn_step seq=10 + put k=k v=a + txn_step seq=20 + put k=k v=b + txn_ignore_seqs seqs=(5-25) + txn_step seq=30 +---- +>> at end: +txn: "D" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +data: "k"/0.000000011,0 -> /BYTES/b +data: "k"/0.000000001,0 -> /BYTES/first + +# Condition must fail to find the last writes a and b. + +run error +cput t=D k=k cond=a v=c +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +data: "k"/0.000000011,0 -> /BYTES/b +data: "k"/0.000000001,0 -> /BYTES/first +error: (*roachpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003first" timestamp: + +run error +cput t=D k=k cond=b v=c +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +data: "k"/0.000000011,0 -> /BYTES/b +data: "k"/0.000000001,0 -> /BYTES/first +error: (*roachpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003first" timestamp: + +# However it succeeds to find the write before that. + +run ok +cput t=D k=k cond=first v=c +---- +>> at end: +meta: "k"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=30} ts=0.000000011,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/first}} +data: "k"/0.000000011,0 -> /BYTES/c +data: "k"/0.000000001,0 -> /BYTES/first diff --git a/pkg/storage/intentresolver/contention_queue.go b/pkg/storage/intentresolver/contention_queue.go index ffc86b3b0edc..6a65fddb6d42 100644 --- a/pkg/storage/intentresolver/contention_queue.go +++ b/pkg/storage/intentresolver/contention_queue.go @@ -221,11 +221,7 @@ func (cq *contentionQueue) add( log.VEventf(ctx, 3, "%s exiting contention queue to push %s", txnID(curPusher.txn), txnMeta.ID.Short()) wiErrCopy := *wiErr wiErrCopy.Intents = []roachpb.Intent{ - { - Span: intent.Span, - Txn: *txnMeta, - Status: roachpb.PENDING, - }, + roachpb.MakePendingIntent(txnMeta, intent.Span), } wiErr = &wiErrCopy } else { diff --git a/pkg/storage/intentresolver/intent_resolver.go b/pkg/storage/intentresolver/intent_resolver.go index e42980237359..acd9cda729ee 100644 --- a/pkg/storage/intentresolver/intent_resolver.go +++ b/pkg/storage/intentresolver/intent_resolver.go @@ -374,8 +374,7 @@ func updateIntentTxnStatus( // It must have been skipped. continue } - intent.Txn = pushee.TxnMeta - intent.Status = pushee.Status + intent.SetTxn(&pushee) results = append(results, intent) } return results @@ -709,8 +708,7 @@ func (ir *IntentResolver) CleanupTxnIntentsOnGCAsync( // Get the pushed txn and update the intents slice. txn = &b.RawResponse().Responses[0].GetInner().(*roachpb.PushTxnResponse).PusheeTxn for i := range intents { - intents[i].Txn = txn.TxnMeta - intents[i].Status = txn.Status + intents[i].SetTxn(txn) } } var onCleanupComplete func(error) @@ -887,24 +885,27 @@ func (ir *IntentResolver) ResolveIntents( var resolveRangeReqs []roachpb.Request for i := range intents { intent := intents[i] // avoids a race in `i, intent := range ...` + if len(intent.EndKey) == 0 { resolveReqs = append(resolveReqs, resolveReq{ rangeID: ir.lookupRangeID(ctx, intent.Key), req: &roachpb.ResolveIntentRequest{ - RequestHeader: roachpb.RequestHeaderFromSpan(intent.Span), - IntentTxn: intent.Txn, - Status: intent.Status, - Poison: opts.Poison, + RequestHeader: roachpb.RequestHeaderFromSpan(intent.Span), + IntentTxn: intent.Txn, + Status: intent.Status, + Poison: opts.Poison, + IgnoredSeqNums: intent.IgnoredSeqNums, }, }) } else { resolveRangeReqs = append(resolveRangeReqs, &roachpb.ResolveIntentRangeRequest{ - RequestHeader: roachpb.RequestHeaderFromSpan(intent.Span), - IntentTxn: intent.Txn, - Status: intent.Status, - Poison: opts.Poison, - MinTimestamp: opts.MinTimestamp, + RequestHeader: roachpb.RequestHeaderFromSpan(intent.Span), + IntentTxn: intent.Txn, + Status: intent.Status, + Poison: opts.Poison, + MinTimestamp: opts.MinTimestamp, + IgnoredSeqNums: intent.IgnoredSeqNums, }) } } diff --git a/pkg/storage/intentresolver/intent_resolver_test.go b/pkg/storage/intentresolver/intent_resolver_test.go index e47b03b43cf8..2d214a81e6ee 100644 --- a/pkg/storage/intentresolver/intent_resolver_test.go +++ b/pkg/storage/intentresolver/intent_resolver_test.go @@ -13,6 +13,7 @@ package intentresolver import ( "context" "fmt" + "reflect" "sort" "sync" "sync/atomic" @@ -147,14 +148,8 @@ func TestCleanupTxnIntentsOnGCAsync(t *testing.T) { { txn: txn1, intents: []roachpb.Intent{ - { - Span: roachpb.Span{Key: key}, - Txn: txn1.TxnMeta, - }, - { - Span: roachpb.Span{Key: key, EndKey: roachpb.Key("b")}, - Txn: txn1.TxnMeta, - }, + roachpb.MakeIntent(txn1, roachpb.Span{Key: key}), + roachpb.MakeIntent(txn1, roachpb.Span{Key: key, EndKey: roachpb.Key("b")}), }, sendFuncs: newSendFuncs(t, singlePushTxnSendFunc(t), @@ -173,9 +168,9 @@ func TestCleanupTxnIntentsOnGCAsync(t *testing.T) { { txn: txn1, intents: []roachpb.Intent{ - {Span: roachpb.Span{Key: key}, Txn: txn1.TxnMeta}, - {Span: roachpb.Span{Key: roachpb.Key("aa")}, Txn: txn1.TxnMeta}, - {Span: roachpb.Span{Key: key, EndKey: roachpb.Key("b")}, Txn: txn1.TxnMeta}, + roachpb.MakeIntent(txn1, roachpb.Span{Key: key}), + roachpb.MakeIntent(txn1, roachpb.Span{Key: roachpb.Key("aa")}), + roachpb.MakeIntent(txn1, roachpb.Span{Key: key, EndKey: roachpb.Key("b")}), }, sendFuncs: func() *sendFuncs { s := newSendFuncs(t) @@ -212,14 +207,8 @@ func TestCleanupTxnIntentsOnGCAsync(t *testing.T) { { txn: txn3, intents: []roachpb.Intent{ - { - Span: roachpb.Span{Key: key}, - Txn: txn3.TxnMeta, - }, - { - Span: roachpb.Span{Key: key, EndKey: roachpb.Key("b")}, - Txn: txn3.TxnMeta, - }, + roachpb.MakeIntent(txn3, roachpb.Span{Key: key}), + roachpb.MakeIntent(txn3, roachpb.Span{Key: key, EndKey: roachpb.Key("b")}), }, sendFuncs: newSendFuncs(t, singlePushTxnSendFunc(t), @@ -238,9 +227,9 @@ func TestCleanupTxnIntentsOnGCAsync(t *testing.T) { { txn: txn3, intents: []roachpb.Intent{ - {Span: roachpb.Span{Key: key}, Txn: txn3.TxnMeta}, - {Span: roachpb.Span{Key: roachpb.Key("aa")}, Txn: txn3.TxnMeta}, - {Span: roachpb.Span{Key: key, EndKey: roachpb.Key("b")}, Txn: txn3.TxnMeta}, + roachpb.MakeIntent(txn3, roachpb.Span{Key: key}), + roachpb.MakeIntent(txn3, roachpb.Span{Key: roachpb.Key("aa")}), + roachpb.MakeIntent(txn3, roachpb.Span{Key: key, EndKey: roachpb.Key("b")}), }, sendFuncs: func() *sendFuncs { s := newSendFuncs(t) @@ -432,10 +421,8 @@ func TestContendedIntent(t *testing.T) { defer cancel() testCases[i].cancelFunc = cancel t.Run(tc.pusher.ID.String(), func(t *testing.T) { - wiErr := &roachpb.WriteIntentError{Intents: []roachpb.Intent{{ - Txn: origTxn.TxnMeta, - Span: roachpb.Span{Key: keyA}, - }}} + wiErr := &roachpb.WriteIntentError{Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(&origTxn.TxnMeta, roachpb.Span{Key: keyA})}} h := roachpb.Header{Txn: tc.pusher} wg.Add(1) go func(idx int) { @@ -510,10 +497,8 @@ func TestContendedIntent(t *testing.T) { "max priority": newTransaction("max-txn", keyA, roachpb.MaxUserPriority, clock), } { t.Run(name, func(t *testing.T) { - wiErr := &roachpb.WriteIntentError{Intents: []roachpb.Intent{{ - Txn: origTxn.TxnMeta, - Span: roachpb.Span{Key: keyA}, - }}} + wiErr := &roachpb.WriteIntentError{Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(&origTxn.TxnMeta, roachpb.Span{Key: keyA})}} h := roachpb.Header{Txn: pusher} cleanupFunc, pErr := ir.ProcessWriteIntentError(ctx, roachpb.NewError(wiErr), h, roachpb.PUSH_ABORT) if pErr != nil { @@ -541,18 +526,14 @@ func TestContendedIntent(t *testing.T) { // Call the CleanupFunc with a new WriteIntentError with a different // transaction. This should lean to a new push on the new transaction and // an intent resolution of the original intent. - f(&roachpb.WriteIntentError{Intents: []roachpb.Intent{{ - Span: roachpb.Span{Key: keyA}, - Txn: unrelatedRWTxn.TxnMeta, - }}}, nil) + f(&roachpb.WriteIntentError{Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(&unrelatedRWTxn.TxnMeta, roachpb.Span{Key: keyA})}}, nil) verifyPushTxn(<-reqChan, rwTxn2.ID, unrelatedRWTxn.ID) verifyResolveIntent(<-reqChan, rwTxn1.Key) case 5: verifyPushTxn(<-reqChan, rwTxn3.ID, unrelatedRWTxn.ID) - f(&roachpb.WriteIntentError{Intents: []roachpb.Intent{{ - Span: roachpb.Span{Key: keyB}, - Txn: rwTxn1.TxnMeta, - }}}, nil) + f(&roachpb.WriteIntentError{Intents: []roachpb.Intent{ + roachpb.MakePendingIntent(&rwTxn1.TxnMeta, roachpb.Span{Key: keyB})}}, nil) case 6: f(nil, &testCases[idx].pusher.TxnMeta) default: @@ -593,7 +574,7 @@ func TestCleanupIntentsAsyncThrottled(t *testing.T) { } wg.Wait() testIntents := []roachpb.Intent{ - {Span: roachpb.Span{Key: roachpb.Key("a")}, Txn: txn.TxnMeta}, + roachpb.MakeIntent(txn, roachpb.Span{Key: roachpb.Key("a")}), } // Running with allowSyncProcessing = false should result in an error and no // requests being sent. @@ -618,7 +599,7 @@ func TestCleanupIntentsAsync(t *testing.T) { clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) txn := newTransaction("txn", roachpb.Key("a"), 1, clock) testIntents := []roachpb.Intent{ - {Span: roachpb.Span{Key: roachpb.Key("a")}, Txn: txn.TxnMeta}, + roachpb.MakeIntent(txn, roachpb.Span{Key: roachpb.Key("a")}), } cases := []testCase{ { @@ -774,6 +755,64 @@ func (sf *sendFuncs) drain(t *testing.T) { }) } +// TestTxnCleanupIntentsAsyncWithPartialRollback verifies that +// CleanupIntentsAsync properly forwards the ignored seqnum list in +// the resolve intent requests. +func TestCleanupTxnIntentsAsyncWithPartialRollback(t *testing.T) { + clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) + txn := newTransaction("txn", roachpb.Key("a"), 1, clock) + txn.IntentSpans = []roachpb.Span{ + {Key: roachpb.Key("a")}, + {Key: roachpb.Key("b"), EndKey: roachpb.Key("c")}, + } + txn.IgnoredSeqNums = []enginepb.IgnoredSeqNumRange{{Start: 1, End: 1}} + + var gotResolveIntent, gotResolveIntentRange int32 + check := func(ba roachpb.BatchRequest) (*roachpb.BatchResponse, *roachpb.Error) { + for _, r := range ba.Requests { + if ri, ok := r.GetInner().(*roachpb.ResolveIntentRequest); ok { + atomic.StoreInt32(&gotResolveIntent, 1) + if !reflect.DeepEqual(ri.IgnoredSeqNums, txn.IgnoredSeqNums) { + t.Errorf("expected ignored list %v, got %v", txn.IgnoredSeqNums, ri.IgnoredSeqNums) + } + } else if rir, ok := r.GetInner().(*roachpb.ResolveIntentRangeRequest); ok { + atomic.StoreInt32(&gotResolveIntentRange, 1) + if !reflect.DeepEqual(rir.IgnoredSeqNums, txn.IgnoredSeqNums) { + t.Errorf("expected ignored list %v, got %v", txn.IgnoredSeqNums, rir.IgnoredSeqNums) + } + } + } + return respForResolveIntentBatch(t, ba), nil + } + sf := newSendFuncs(t, + sendFunc(check), + sendFunc(check), + gcSendFunc(t), + ) + stopper := stop.NewStopper() + defer stopper.Stop(context.Background()) + cfg := Config{ + Stopper: stopper, + Clock: clock, + } + ir := newIntentResolverWithSendFuncs(cfg, sf) + + intents := []result.EndTxnIntents{{Txn: txn}} + + if err := ir.CleanupTxnIntentsAsync(context.Background(), 1, intents, true /*allowAsyncProcessing*/); err != nil { + t.Fatal(err) + } + testutils.SucceedsSoon(t, func() error { + if atomic.LoadInt32(&gotResolveIntent) == 0 { + return errors.New("still waiting for resolve intent req") + } + if atomic.LoadInt32(&gotResolveIntentRange) == 0 { + return errors.New("still waiting for resolve intent range req") + } + return nil + }) +} + // TestCleanupTxnIntentsAsync verifies that CleanupTxnIntentsAsync sends the // expected requests. func TestCleanupTxnIntentsAsync(t *testing.T) { @@ -952,7 +991,7 @@ func TestCleanupIntents(t *testing.T) { // Set txn.ID to a very small value so it's sorted deterministically first. txn.ID = uuid.UUID{15: 0x01} testIntents := []roachpb.Intent{ - {Span: roachpb.Span{Key: roachpb.Key("a")}, Txn: txn.TxnMeta}, + roachpb.MakeIntent(txn, roachpb.Span{Key: roachpb.Key("a")}), } type testCase struct { intents []roachpb.Intent @@ -1036,7 +1075,7 @@ func makeTxnIntents(t *testing.T, clock *hlc.Clock, numIntents int) []roachpb.In for i := 0; i < numIntents; i++ { txn := newTransaction("test", roachpb.Key("a"), 1, clock) ret = append(ret, - roachpb.Intent{Span: roachpb.Span{Key: txn.Key}, Txn: txn.TxnMeta}) + roachpb.MakeIntent(txn, roachpb.Span{Key: txn.Key})) } return ret } diff --git a/pkg/storage/replica_test.go b/pkg/storage/replica_test.go index b805e78139c2..e9adf57d2259 100644 --- a/pkg/storage/replica_test.go +++ b/pkg/storage/replica_test.go @@ -4370,11 +4370,9 @@ func TestEndTxnRollbackAbortedTransaction(t *testing.T) { } if pErr := tc.store.intentResolver.ResolveIntents(context.TODO(), - []roachpb.Intent{{ - Span: roachpb.Span{Key: key}, - Txn: txnRecord.TxnMeta, - Status: txnRecord.Status, - }}, intentresolver.ResolveOptions{Wait: true, Poison: true}); pErr != nil { + []roachpb.Intent{ + roachpb.MakeIntent(&txnRecord, roachpb.Span{Key: key}), + }, intentresolver.ResolveOptions{Wait: true, Poison: true}); pErr != nil { t.Fatal(pErr) } } @@ -5038,11 +5036,11 @@ func TestReplicaResolveIntentNoWait(t *testing.T) { txn := newTransaction("name", key, 1, tc.Clock()) txn.Status = roachpb.COMMITTED if pErr := tc.store.intentResolver.ResolveIntents(context.Background(), - []roachpb.Intent{{ - Span: roachpb.Span{Key: key}, - Txn: txn.TxnMeta, - Status: txn.Status, - }}, intentresolver.ResolveOptions{Wait: false, Poison: true /* irrelevant */}); pErr != nil { + []roachpb.Intent{ + roachpb.MakeIntent(txn, roachpb.Span{Key: key}), + }, + intentresolver.ResolveOptions{Wait: false, Poison: true /* irrelevant */}, + ); pErr != nil { t.Fatal(pErr) } testutils.SucceedsSoon(t, func() error { @@ -5993,8 +5991,9 @@ func TestReplicaResolveIntentRange(t *testing.T) { Key: roachpb.Key("a"), EndKey: roachpb.Key("c"), }, - IntentTxn: txn.TxnMeta, - Status: roachpb.COMMITTED, + IntentTxn: txn.TxnMeta, + Status: roachpb.COMMITTED, + IgnoredSeqNums: txn.IgnoredSeqNums, } if _, pErr := tc.SendWrapped(rArgs); pErr != nil { t.Fatal(pErr) @@ -6107,8 +6106,9 @@ func TestRangeStatsComputation(t *testing.T) { RequestHeader: roachpb.RequestHeader{ Key: pArgs.Key, }, - IntentTxn: txn.TxnMeta, - Status: roachpb.COMMITTED, + IntentTxn: txn.TxnMeta, + Status: roachpb.COMMITTED, + IgnoredSeqNums: txn.IgnoredSeqNums, } if _, pErr := tc.SendWrapped(rArgs); pErr != nil { @@ -6508,8 +6508,9 @@ func TestReplicaLookupUseReverseScan(t *testing.T) { Key: keys.RangeMetaKey(roachpb.RKey("a")).AsRawKey(), EndKey: keys.RangeMetaKey(roachpb.RKey("z")).AsRawKey(), }, - IntentTxn: txn.TxnMeta, - Status: roachpb.COMMITTED, + IntentTxn: txn.TxnMeta, + Status: roachpb.COMMITTED, + IgnoredSeqNums: txn.IgnoredSeqNums, } if _, pErr := tc.SendWrapped(rArgs); pErr != nil { t.Fatal(pErr) diff --git a/pkg/storage/store_test.go b/pkg/storage/store_test.go index a87d3ea0e71d..fb138efc28ad 100644 --- a/pkg/storage/store_test.go +++ b/pkg/storage/store_test.go @@ -1938,14 +1938,7 @@ func TestStoreResolveWriteIntentNoTxn(t *testing.T) { } } -func setTxnAutoGC(to bool) func() { - orig := batcheval.TxnAutoGC - f := func() { - batcheval.TxnAutoGC = orig - } - batcheval.TxnAutoGC = to - return f -} +func setTxnAutoGC(to bool) func() { return batcheval.TestingSetTxnAutoGC(to) } // TestStoreReadInconsistent verifies that gets and scans with read // consistency set to INCONSISTENT or READ_UNCOMMITTED either push or