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..ba634dffbf04 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..f419cd7cda3c 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,38 @@ func mvccResolveWriteIntent( // testing. inProgress := !intent.Status.IsFinalized() && meta.Txn.Epoch >= intent.Txn.Epoch pushed := inProgress && hlc.Timestamp(meta.Timestamp).Less(intent.Txn.WriteTimestamp) + 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 + // can be considered empty and marked for removal (removeIntent = true). + // If only part of the intent history was rolled back, but the intent still + // remains, the rolledBackVal is set to a non-nil value. + var rolledBackVal []byte + if len(intent.IgnoredSeqNums) > 0 { + var removeIntent bool + removeIntent, rolledBackVal, err = mvccMaybeRewriteIntentHistory(ctx, rw, intent.IgnoredSeqNums, meta, latestKey) + if err != nil { + return false, err + } + + if removeIntent { + // This intent should be cleared. Set commit, pushed, and inProgress to + // false so that this intent isn't updated, gets cleared, and committed + // values are left untouched. + commit = false + pushed = false + inProgress = false + } + } // 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 mark + // the intent for removal. + if inProgress && !pushed && rolledBackVal == nil { return false, nil } @@ -2717,15 +2787,20 @@ 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 { + // + // If the intent has disappeared in mvccMaybeRewriteIntentHistory, we skip + // this block and fall down to the intent/value deletion code path. This + // is because removeIntent implies rolledBackVal == nil, pushed == false, and + // commit == false. + 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 + if !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,7 +2814,8 @@ 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. var prevValSize int64 if buf.newMeta.Timestamp != meta.Timestamp { oldKey := MVCCKey{Key: intent.Key, Timestamp: hlc.Timestamp(meta.Timestamp)} @@ -2752,7 +2828,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 +2893,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 +2944,55 @@ 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 remove return value, when true, indicates that +// all the writes in the intent are ignored and the intent should +// be marked for removal as it does not exist any more. +// The updatedVal, when non-nil, 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, +) (remove 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 { + return true, nil, nil + } + + // 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 +3646,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/pebble_mvcc_scanner.go b/pkg/storage/engine/pebble_mvcc_scanner.go index 6e6046ed8b8e..0c4cdb207fb4 100644 --- a/pkg/storage/engine/pebble_mvcc_scanner.go +++ b/pkg/storage/engine/pebble_mvcc_scanner.go @@ -99,9 +99,10 @@ type pebbleMVCCScanner struct { // Max number of keys to return. maxKeys int64 // Transaction epoch and sequence number. - txn *roachpb.Transaction - txnEpoch enginepb.TxnEpoch - txnSequence enginepb.TxnSeq + txn *roachpb.Transaction + txnEpoch enginepb.TxnEpoch + txnSequence enginepb.TxnSeq + txnIgnoredSeqNums []enginepb.IgnoredSeqNumRange // Metadata object for unmarshalling intents. meta enginepb.MVCCMetadata // Bools copied over from MVCC{Scan,Get}Options. See the comment on the @@ -139,6 +140,7 @@ func (p *pebbleMVCCScanner) init(txn *roachpb.Transaction) { p.txn = txn p.txnEpoch = txn.Epoch p.txnSequence = txn.Sequence + p.txnIgnoredSeqNums = txn.IgnoredSeqNums p.checkUncertainty = p.ts.Less(txn.MaxTimestamp) } } @@ -215,10 +217,19 @@ func (p *pebbleMVCCScanner) getFromIntentHistory() bool { upIdx := sort.Search(len(intentHistory), func(i int) bool { return intentHistory[i].Sequence > p.txnSequence }) + // If the candidate intent has a sequence number that is ignored by this txn, + // iterate backward along the sorted intent history until we come across an + // intent which isn't ignored. + // + // TODO(itsbilal): Explore if this iteration can be improved through binary + // search. + for upIdx > 0 && enginepb.TxnSeqIsIgnored(p.meta.IntentHistory[upIdx-1].Sequence, p.txnIgnoredSeqNums) { + upIdx-- + } if upIdx == 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. + // than the read sequence, and is not ignored by this transaction. + // In this case, we cannot read a value from the intent history. return false } intent := p.meta.IntentHistory[upIdx-1] @@ -350,7 +361,7 @@ func (p *pebbleMVCCScanner) getAndAdvance() bool { } if p.txnEpoch == p.meta.Txn.Epoch { - if p.txnSequence >= p.meta.Txn.Sequence { + if p.txnSequence >= p.meta.Txn.Sequence && !enginepb.TxnSeqIsIgnored(p.meta.Txn.Sequence, p.txnIgnoredSeqNums) { // 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 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..6e9699ad8144 --- /dev/null +++ b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums @@ -0,0 +1,574 @@ + +# 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 + txn_ignore_seqs seqs=(30-31) + get k=k + txn_ignore_seqs seqs=(29-30) + 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 +get: "k" -> /BYTES/b @0,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 + +# Do an intent push by advancing the transaction timestamp, while also having +# a range of ignored seqnums. This should permanently delete the value at seqnum +# 30. This tests the pushed && intentUpdated case in mvccResolveWriteIntents. + +run ok +with t=A + txn_ignore_seqs seqs=(25-35) + txn_step seq=32 + check_intent k=k + get k=k + txn_advance ts=14 + get k=k + resolve_intent k=k status=PENDING + check_intent k=k + get k=k +---- +meta: "k" -> 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}} +get: "k" -> /BYTES/b @0,0 +get: "k" -> /BYTES/b @0,0 +meta: "k" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000014,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +get: "k" -> /BYTES/b @0.000000014,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000014,0 min=0,0 seq=32} 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.000000014,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +data: "k"/0.000000014,0 -> /BYTES/b +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 + +# Ensure that the deleted value doens't surface. Instead, if we ignore the +# now-newest seq, we get the write before it. + +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/a @0,0 +scan: "k/10" -> /BYTES/10 @0.000000011,0 +scan: "k/30" -> /BYTES/30 @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.000000014,0 min=0,0 seq=40} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 + +run ok +with t=A + txn_ignore_seqs seqs=(26-27) + txn_step seq=35 + scan k=k end=-k + get k=k + txn_step seq=25 + scan k=k end=-k + get k=k +---- +scan: "k" -> /BYTES/b @0.000000014,0 +scan: "k/10" -> /BYTES/10 @0.000000011,0 +scan: "k/20" -> /BYTES/20 @0.000000011,0 +scan: "k/30" -> /BYTES/30 @0.000000011,0 +get: "k" -> /BYTES/b @0.000000014,0 +scan: "k" -> /BYTES/b @0.000000014,0 +scan: "k/10" -> /BYTES/10 @0.000000011,0 +scan: "k/20" -> /BYTES/20 @0.000000011,0 +get: "k" -> /BYTES/b @0.000000014,0 +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000014,0 min=0,0 seq=25} rw=true stat=PENDING rts=0.000000011,0 wto=false max=0,0 isn=1 + +# Call mvccResolveWriteIntent with status=COMMITTED. This should fold the +# intent while leaving the value unmodified. + +run ok +with t=A + txn_ignore_seqs seqs=(25-35) + check_intent k=k + resolve_intent k=k status=COMMITTED +with t=B + txn_begin ts=20 + get k=k +---- +meta: "k" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000011,0 min=0,0 seq=20} ts=0.000000014,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} +get: "k" -> /BYTES/b @0.000000014,0 +>> at end: +txn: "B" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000020,0 min=0,0 seq=0} rw=true stat=PENDING rts=0.000000020,0 wto=false max=0,0 +data: "k"/0.000000014,0 -> /BYTES/b +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 + + +# Put a couple values at different sequence numbers in this new txn. + +run ok +with t=B + txn_step seq=10 + put k=l v=a + txn_step seq=20 + put k=l v=b + txn_step seq=30 + put k=l v=c + check_intent k=l + get k=l +---- +meta: "l" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000020,0 min=0,0 seq=30} ts=0.000000020,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "l" -> /BYTES/c @0.000000020,0 +>> at end: +txn: "B" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000020,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000020,0 wto=false max=0,0 +data: "k"/0.000000014,0 -> /BYTES/b +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 +meta: "l"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000020,0 min=0,0 seq=30} ts=0.000000020,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "l"/0.000000020,0 -> /BYTES/c + + +# Blow up the entire intent history, then do a commit. No value or intent should +# remain. + +run error +with t=B + txn_step seq=35 + txn_ignore_seqs seqs=(5-35) + check_intent k=l + get k=l + resolve_intent k=l status=COMMITTED + check_intent k=l +---- +meta: "l" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000020,0 min=0,0 seq=30} ts=0.000000020,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "l" -> +>> at end: +txn: "B" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000020,0 min=0,0 seq=35} rw=true stat=PENDING rts=0.000000020,0 wto=false max=0,0 isn=1 +data: "k"/0.000000014,0 -> /BYTES/b +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 +error: (*withstack.withStack:) meta: "l" -> expected intent, found none + + +run ok +with t=C + txn_begin ts=30 + get k=l +---- +get: "l" -> +>> at end: +txn: "C" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000030,0 min=0,0 seq=0} rw=true stat=PENDING rts=0.000000030,0 wto=false max=0,0 + + +# Put some values, then ignore all except the first, then do a commit. The +# first value put should be committed. + +run ok +with t=C + txn_step seq=10 + put k=m v=a + txn_step seq=20 + put k=m v=b + txn_step seq=30 + put k=m v=c + check_intent k=m + get k=m +---- +meta: "m" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000030,0 min=0,0 seq=30} ts=0.000000030,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "m" -> /BYTES/c @0.000000030,0 +>> at end: +txn: "C" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000030,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000030,0 wto=false max=0,0 +data: "k"/0.000000014,0 -> /BYTES/b +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 +meta: "m"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000030,0 min=0,0 seq=30} ts=0.000000030,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "m"/0.000000030,0 -> /BYTES/c + + +run ok +with t=C + txn_ignore_seqs seqs=(15-35) + check_intent k=m + get k=m + resolve_intent k=m status=COMMITTED +---- +meta: "m" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000030,0 min=0,0 seq=30} ts=0.000000030,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "m" -> /BYTES/a @0,0 +>> at end: +txn: "C" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000030,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000030,0 wto=false max=0,0 isn=1 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a + + +run ok +with t=D + txn_begin ts=40 + get k=m + txn_step seq=10 + put k=n v=a + txn_step seq=20 + put k=n v=b + txn_step seq=30 + put k=n v=c + check_intent k=n + get k=n +---- +get: "m" -> /BYTES/a @0.000000030,0 +meta: "n" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000040,0 min=0,0 seq=30} ts=0.000000040,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "n" -> /BYTES/c @0.000000040,0 +>> at end: +txn: "D" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000040,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000040,0 wto=false max=0,0 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a +meta: "n"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000040,0 min=0,0 seq=30} ts=0.000000040,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "n"/0.000000040,0 -> /BYTES/c + + +# Do a push. The intent should remain, unmodified, save for the timestamp. +run ok +with t=D + check_intent k=n + get k=n + txn_advance ts=45 + resolve_intent k=n status=PENDING + check_intent k=n + get k=n +---- +meta: "n" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000040,0 min=0,0 seq=30} ts=0.000000040,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "n" -> /BYTES/c @0.000000040,0 +meta: "n" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000040,0 min=0,0 seq=30} ts=0.000000045,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "n" -> /BYTES/c @0.000000045,0 +>> at end: +txn: "D" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000045,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000040,0 wto=false max=0,0 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a +meta: "n"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000040,0 min=0,0 seq=30} ts=0.000000045,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "n"/0.000000045,0 -> /BYTES/c + +# Ignore sequence numbers other than the current one, then commit. The value +# shouldn't change. +run ok +with t=D + txn_ignore_seqs seqs=(5-25) + check_intent k=n + get k=n + resolve_intent k=n status=COMMITTED +with t=E + txn_begin ts=50 + get k=n +---- +meta: "n" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000040,0 min=0,0 seq=30} ts=0.000000045,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +get: "n" -> /BYTES/c @0.000000045,0 +get: "n" -> /BYTES/c @0.000000045,0 +>> at end: +txn: "E" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=0} rw=true stat=PENDING rts=0.000000050,0 wto=false max=0,0 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a +data: "n"/0.000000045,0 -> /BYTES/c + +# Write a couple values at different sequence numbers on this key, then ignore +# them all, then do a resolve_intent while the txn is pending. The intent should +# disappear. Also do the same on a new key. + +run ok +with t=E + get k=n + get k=o + txn_step seq=10 + put k=n v=a + put k=o v=a + txn_step seq=20 + put k=n v=b + put k=o v=b + txn_step seq=30 + put k=n v=c + put k=o v=c +---- +get: "n" -> /BYTES/c @0.000000045,0 +get: "o" -> +>> at end: +txn: "E" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000050,0 wto=false max=0,0 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a +meta: "n"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=30} ts=0.000000050,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "n"/0.000000050,0 -> /BYTES/c +data: "n"/0.000000045,0 -> /BYTES/c +meta: "o"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=30} ts=0.000000050,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "o"/0.000000050,0 -> /BYTES/c + + +run ok +with t=E + txn_ignore_seqs seqs=(5-35) + get k=n + get k=o + resolve_intent k=n status=PENDING + resolve_intent k=o status=PENDING +---- +get: "n" -> /BYTES/c @0.000000045,0 +get: "o" -> +>> at end: +txn: "E" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000050,0 wto=false max=0,0 isn=1 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a +data: "n"/0.000000045,0 -> /BYTES/c + +run ok +with t=E + get k=n + get k=o +---- +get: "n" -> /BYTES/c @0.000000045,0 +get: "o" -> + +# No intent should exist on either value + +run error +with t=E + check_intent k=n +---- +error: (*withstack.withStack:) meta: "n" -> expected intent, found none + +run error +with t=E + check_intent k=o +---- +error: (*withstack.withStack:) meta: "o" -> expected intent, found none + +# Push a transaction forward, while all writes for a key are ignored. The +# ignored value and the intent should be deleted. +run ok +with t=E + txn_ignore_seqs seqs=(5-6) + txn_step seq=10 + put k=o v=a + txn_step seq=20 + put k=o v=b + txn_step seq=30 + put k=o v=c + check_intent k=o +---- +meta: "o" -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=30} ts=0.000000050,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +>> at end: +txn: "E" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000050,0 wto=false max=0,0 isn=1 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a +data: "n"/0.000000045,0 -> /BYTES/c +meta: "o"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000050,0 min=0,0 seq=30} ts=0.000000050,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} +data: "o"/0.000000050,0 -> /BYTES/c + + +run ok +with t=E + txn_advance ts=55 + txn_ignore_seqs seqs=(5-35) + resolve_intent k=o status=PENDING + get k=o +---- +get: "o" -> +>> at end: +txn: "E" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=0.000000055,0 min=0,0 seq=30} rw=true stat=PENDING rts=0.000000050,0 wto=false max=0,0 isn=1 +data: "k"/0.000000014,0 -> /BYTES/b +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 +data: "m"/0.000000030,0 -> /BYTES/a +data: "n"/0.000000045,0 -> /BYTES/c + + +run error +with t=E + check_intent k=o +---- +error: (*withstack.withStack:) meta: "o" -> expected intent, found none 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..0578acad2861 --- /dev/null +++ b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_commit @@ -0,0 +1,77 @@ + +# 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..74b8dbe229a9 --- /dev/null +++ b/pkg/storage/engine/testdata/mvcc_histories/ignored_seq_nums_cput @@ -0,0 +1,204 @@ + +## 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