From 6b9807199b9da55f6513b0483016b789490ba20a Mon Sep 17 00:00:00 2001 From: Andrei Matei Date: Wed, 27 Feb 2019 18:26:27 -0500 Subject: [PATCH] storage,kv: make transaction deadline exceeded errors retriable Before this patch, they were opaque TransactionStatusErrors. The belief is that we should only be seeing such errors when a transaction is pushed by minutes. Shockingly, this seems to hapen enough in our tests, for example as described here: https://github.com/cockroachdb/cockroach/issues/18684#issuecomment-428433335 This patch marks the error as retriable, since it technically is. Touches #18684 Release note (sql change): "transaction deadline exceeded" errors are now returned to the client with a retriable code. --- pkg/kv/dist_sender_server_test.go | 2 +- pkg/kv/txn_coord_sender.go | 22 +- pkg/kv/txn_coord_sender_test.go | 27 +- pkg/kv/txn_interceptor_committer.go | 16 +- pkg/kv/txn_interceptor_pipeliner.go | 4 +- pkg/kv/txn_interceptor_pipeliner_test.go | 2 +- pkg/kv/txn_interceptor_span_refresher.go | 4 +- pkg/roachpb/errors.go | 23 +- pkg/roachpb/errors.pb.go | 541 +++++++++++-------- pkg/roachpb/errors.proto | 5 + pkg/sql/as_of_test.go | 3 +- pkg/sql/distsql_running_test.go | 2 +- pkg/sql/lease_test.go | 20 +- pkg/sql/txn_restart_test.go | 2 +- pkg/storage/batcheval/cmd_end_transaction.go | 34 +- pkg/storage/batcheval/cmd_query_intent.go | 4 +- pkg/storage/client_merge_test.go | 9 +- pkg/storage/replica_test.go | 11 +- pkg/storage/replica_write.go | 4 +- pkg/storage/store.go | 3 +- 20 files changed, 434 insertions(+), 304 deletions(-) diff --git a/pkg/kv/dist_sender_server_test.go b/pkg/kv/dist_sender_server_test.go index 0d51723f663e..592a7a7c643d 100644 --- a/pkg/kv/dist_sender_server_test.go +++ b/pkg/kv/dist_sender_server_test.go @@ -1919,7 +1919,7 @@ func TestTxnCoordSenderRetries(t *testing.T) { if atomic.AddInt32(&count, 1) > 1 { return nil } - err := roachpb.NewTransactionRetryError(reason) + err := roachpb.NewTransactionRetryError(reason, "filter err") return roachpb.NewErrorWithTxn(err, fArgs.Hdr.Txn) } return nil diff --git a/pkg/kv/txn_coord_sender.go b/pkg/kv/txn_coord_sender.go index 51ec162516fd..055cdf6eb391 100644 --- a/pkg/kv/txn_coord_sender.go +++ b/pkg/kv/txn_coord_sender.go @@ -610,11 +610,23 @@ func (tc *TxnCoordSender) DisablePipelining() error { // sendLockedWithElidedEndTransaction method, but we would want to confirm // that doing so doesn't cut into the speed-up we see from this fast-path. func (tc *TxnCoordSender) commitReadOnlyTxnLocked( - ctx context.Context, deadline *hlc.Timestamp, + ctx context.Context, ba roachpb.BatchRequest, ) *roachpb.Error { - if deadline != nil && deadline.Less(tc.mu.txn.Timestamp) { - return roachpb.NewError( - roachpb.NewTransactionStatusError("deadline exceeded before transaction finalization")) + deadline := ba.Requests[0].GetEndTransaction().Deadline + txn := tc.mu.txn + if deadline != nil && deadline.Less(txn.Timestamp) { + exceededBy := txn.Timestamp.GoTime().Sub(deadline.GoTime()) + fromStart := txn.Timestamp.GoTime().Sub(txn.OrigTimestamp.GoTime()) + extraMsg := fmt.Sprintf( + "txn timestamp pushed too much; deadline exceeded by %s (%s > %s), "+ + "original timestamp %s ago (%s)", + exceededBy, txn.Timestamp, deadline, fromStart, txn.OrigTimestamp) + txnCpy := txn.Clone() + pErr := roachpb.NewErrorWithTxn( + roachpb.NewTransactionRetryError(roachpb.RETRY_COMMIT_DEADLINE_EXCEEDED, extraMsg), &txnCpy) + // We need to bump the epoch and transform this retriable error. + ba.Txn = &txn + return tc.updateStateLocked(ctx, ba, nil /* br */, pErr) } tc.mu.txnState = txnFinalized // Mark the transaction as committed so that, in case this commit is done by @@ -642,7 +654,7 @@ func (tc *TxnCoordSender) Send( } if ba.IsSingleEndTransactionRequest() && !tc.interceptorAlloc.txnIntentCollector.haveIntents() { - return nil, tc.commitReadOnlyTxnLocked(ctx, ba.Requests[0].GetEndTransaction().Deadline) + return nil, tc.commitReadOnlyTxnLocked(ctx, ba) } startNs := tc.clock.PhysicalNow() diff --git a/pkg/kv/txn_coord_sender_test.go b/pkg/kv/txn_coord_sender_test.go index 7407aba9229d..fde338744025 100644 --- a/pkg/kv/txn_coord_sender_test.go +++ b/pkg/kv/txn_coord_sender_test.go @@ -505,8 +505,9 @@ func TestTxnCoordSenderEndTxn(t *testing.T) { case 1: // Past deadline. - if err := roachpb.CheckTxnDeadlineExceededErr(err); err != nil { - t.Fatal(err) + assertTransactionRetryError(t, err) + if !testutils.IsError(err, "RETRY_COMMIT_DEADLINE_EXCEEDED") { + t.Fatalf("expected deadline exceeded, got: %s", err) } case 2: @@ -1876,7 +1877,9 @@ func TestEndWriteRestartReadOnlyTransaction(t *testing.T) { sender.match(func(ba roachpb.BatchRequest) (*roachpb.BatchResponse, *roachpb.Error) { calls = append(calls, ba.Methods()...) if _, ok := ba.GetArg(roachpb.Put); ok { - return nil, roachpb.NewErrorWithTxn(roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE), ba.Txn) + return nil, roachpb.NewErrorWithTxn( + roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE, "test err"), + ba.Txn) } return nil, nil }) @@ -1955,7 +1958,9 @@ func TestTransactionKeyNotChangedInRestart(t *testing.T) { } if attempt == 0 { - return nil, roachpb.NewErrorWithTxn(roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE), ba.Txn) + return nil, roachpb.NewErrorWithTxn( + roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE, "test err"), + ba.Txn) } return nil, nil }) @@ -2199,9 +2204,10 @@ func TestReadOnlyTxnObeysDeadline(t *testing.T) { if _, err := txn.Get(ctx, "k"); err != nil { t.Fatal(err) } - if err := txn.Commit(ctx); !testutils.IsError( - err, "deadline exceeded before transaction finalization") { - t.Fatal(err) + err := txn.Commit(ctx) + assertTransactionRetryError(t, err) + if !testutils.IsError(err, "RETRY_COMMIT_DEADLINE_EXCEEDED") { + t.Fatalf("expected deadline exceeded, got: %s", err) } }) @@ -2211,9 +2217,10 @@ func TestReadOnlyTxnObeysDeadline(t *testing.T) { txn.UpdateDeadlineMaybe(ctx, clock.Now()) b := txn.NewBatch() b.Get("k") - if err := txn.CommitInBatch(ctx, b); !testutils.IsError( - err, "deadline exceeded before transaction finalization") { - t.Fatal(err) + err := txn.CommitInBatch(ctx, b) + assertTransactionRetryError(t, err) + if !testutils.IsError(err, "RETRY_COMMIT_DEADLINE_EXCEEDED") { + t.Fatalf("expected deadline exceeded, got: %s", err) } }) } diff --git a/pkg/kv/txn_interceptor_committer.go b/pkg/kv/txn_interceptor_committer.go index ad4c69caef2b..f7ba320234c2 100644 --- a/pkg/kv/txn_interceptor_committer.go +++ b/pkg/kv/txn_interceptor_committer.go @@ -16,6 +16,7 @@ package kv import ( "context" + "fmt" "github.com/cockroachdb/cockroach/pkg/roachpb" ) @@ -91,9 +92,18 @@ func (tc *txnCommitter) sendLockedWithElidedEndTransaction( } // Check if the (read-only) txn was pushed above its deadline. - if et.Deadline != nil && et.Deadline.Less(br.Txn.Timestamp) { - return nil, roachpb.NewErrorWithTxn(roachpb.NewTransactionStatusError( - "deadline exceeded before transaction finalization"), br.Txn) + deadline := et.Deadline + if deadline != nil && deadline.Less(br.Txn.Timestamp) { + txn := ba.Txn + exceededBy := txn.Timestamp.GoTime().Sub(deadline.GoTime()) + fromStart := txn.Timestamp.GoTime().Sub(txn.OrigTimestamp.GoTime()) + extraMsg := fmt.Sprintf( + "txn timestamp pushed too much; deadline exceeded by %s (%s > %s), "+ + "original timestamp %s ago (%s)", + exceededBy, txn.Timestamp, deadline, fromStart, txn.OrigTimestamp) + txnCpy := txn.Clone() + return nil, roachpb.NewErrorWithTxn( + roachpb.NewTransactionRetryError(roachpb.RETRY_COMMIT_DEADLINE_EXCEEDED, extraMsg), &txnCpy) } // Update the response's transaction proto. This normally happens on the diff --git a/pkg/kv/txn_interceptor_pipeliner.go b/pkg/kv/txn_interceptor_pipeliner.go index cc63d6989ff7..fbd04096496b 100644 --- a/pkg/kv/txn_interceptor_pipeliner.go +++ b/pkg/kv/txn_interceptor_pipeliner.go @@ -16,6 +16,7 @@ package kv import ( "context" + "fmt" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/settings" @@ -426,7 +427,8 @@ func (tp *txnPipeliner) adjustError( // Turn an IntentMissingError into a transactional retry error. if ime, ok := pErr.GetDetail().(*roachpb.IntentMissingError); ok { log.VEventf(ctx, 2, "transforming intent missing error into retry: %v", ime) - err := roachpb.NewTransactionRetryError(roachpb.RETRY_ASYNC_WRITE_FAILURE) + err := roachpb.NewTransactionRetryError( + roachpb.RETRY_ASYNC_WRITE_FAILURE, fmt.Sprintf("missing intent on: %s", ime.Key)) retryErr := roachpb.NewErrorWithTxn(err, pErr.GetTxn()) retryErr.Index = pErr.Index return retryErr diff --git a/pkg/kv/txn_interceptor_pipeliner_test.go b/pkg/kv/txn_interceptor_pipeliner_test.go index c2f183f3720a..0c98b5362bc4 100644 --- a/pkg/kv/txn_interceptor_pipeliner_test.go +++ b/pkg/kv/txn_interceptor_pipeliner_test.go @@ -718,7 +718,7 @@ func TestTxnPipelinerIntentMissingError(t *testing.T) { require.IsType(t, &roachpb.QueryIntentRequest{}, ba.Requests[5].GetInner()) require.IsType(t, &roachpb.PutRequest{}, ba.Requests[6].GetInner()) - err := roachpb.NewIntentMissingError(nil) + err := roachpb.NewIntentMissingError(nil /* key */, nil /* intent */) pErr := roachpb.NewErrorWithTxn(err, &txn) pErr.SetErrorIndex(errIdx) return nil, pErr diff --git a/pkg/kv/txn_interceptor_span_refresher.go b/pkg/kv/txn_interceptor_span_refresher.go index 42c4d7d0dc5c..9044016a7afc 100644 --- a/pkg/kv/txn_interceptor_span_refresher.go +++ b/pkg/kv/txn_interceptor_span_refresher.go @@ -117,7 +117,9 @@ func (sr *txnSpanRefresher) SendLocked( if !sr.appendRefreshSpans(ctx, ba, br) { // The refresh spans are out of date, return a generic client-side retry error. return nil, roachpb.NewErrorWithTxn( - roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE), br.Txn, + roachpb.NewTransactionRetryError( + roachpb.RETRY_SERIALIZABLE, "refresh spans are out of date", + ), br.Txn, ) } } diff --git a/pkg/roachpb/errors.go b/pkg/roachpb/errors.go index e68d22aa0d07..766df14a2630 100644 --- a/pkg/roachpb/errors.go +++ b/pkg/roachpb/errors.go @@ -22,7 +22,6 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/caller" "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/uuid" - "github.com/pkg/errors" ) func (e *UnhandledRetryableError) Error() string { @@ -391,9 +390,12 @@ func (*TransactionPushError) canRestartTransaction() TransactionRestart { } // NewTransactionRetryError initializes a new TransactionRetryError. -func NewTransactionRetryError(reason TransactionRetryReason) *TransactionRetryError { +func NewTransactionRetryError( + reason TransactionRetryReason, extraMsg string, +) *TransactionRetryError { return &TransactionRetryError{ - Reason: reason, + Reason: reason, + ExtraMsg: extraMsg, } } @@ -438,18 +440,6 @@ func (e *TransactionStatusError) message(pErr *Error) string { return fmt.Sprintf("%s: %s", e.Error(), pErr.GetTxn()) } -// CheckTxnDeadlineExceededErr returns an error if deadlineErr is not a -// transaction deadline exceeded roachpb.TransactionStatusError. -func CheckTxnDeadlineExceededErr(deadlineErr error) error { - if statusError, ok := deadlineErr.(*TransactionStatusError); !ok { - return errors.Errorf("expected TransactionStatusError but got %T: %s", - deadlineErr, deadlineErr) - } else if e := "transaction deadline exceeded"; !strings.Contains(statusError.Msg, e) { - return errors.Errorf("expected %s, got %s", e, statusError.Msg) - } - return nil -} - var _ ErrorDetailInterface = &TransactionStatusError{} func (e *WriteIntentError) Error() string { @@ -693,8 +683,9 @@ func (e *BatchTimestampBeforeGCError) message(_ *Error) string { var _ ErrorDetailInterface = &BatchTimestampBeforeGCError{} // NewIntentMissingError creates a new IntentMissingError. -func NewIntentMissingError(wrongIntent *Intent) *IntentMissingError { +func NewIntentMissingError(key Key, wrongIntent *Intent) *IntentMissingError { return &IntentMissingError{ + Key: key, WrongIntent: wrongIntent, } } diff --git a/pkg/roachpb/errors.pb.go b/pkg/roachpb/errors.pb.go index 20137309abc9..9dc082f10c90 100644 --- a/pkg/roachpb/errors.pb.go +++ b/pkg/roachpb/errors.pb.go @@ -114,7 +114,7 @@ func (x *TransactionAbortedReason) UnmarshalJSON(data []byte) error { return nil } func (TransactionAbortedReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{0} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{0} } // TransactionRetryReason specifies what caused a transaction retry. @@ -133,6 +133,8 @@ const ( RETRY_POSSIBLE_REPLAY TransactionRetryReason = 4 // An asynchronous write was observed to have failed. RETRY_ASYNC_WRITE_FAILURE TransactionRetryReason = 5 + // The transaction exceeded its deadline. + RETRY_COMMIT_DEADLINE_EXCEEDED TransactionRetryReason = 6 ) var TransactionRetryReason_name = map[int32]string{ @@ -141,13 +143,15 @@ var TransactionRetryReason_name = map[int32]string{ 3: "RETRY_SERIALIZABLE", 4: "RETRY_POSSIBLE_REPLAY", 5: "RETRY_ASYNC_WRITE_FAILURE", + 6: "RETRY_COMMIT_DEADLINE_EXCEEDED", } var TransactionRetryReason_value = map[string]int32{ - "RETRY_REASON_UNKNOWN": 0, - "RETRY_WRITE_TOO_OLD": 1, - "RETRY_SERIALIZABLE": 3, - "RETRY_POSSIBLE_REPLAY": 4, - "RETRY_ASYNC_WRITE_FAILURE": 5, + "RETRY_REASON_UNKNOWN": 0, + "RETRY_WRITE_TOO_OLD": 1, + "RETRY_SERIALIZABLE": 3, + "RETRY_POSSIBLE_REPLAY": 4, + "RETRY_ASYNC_WRITE_FAILURE": 5, + "RETRY_COMMIT_DEADLINE_EXCEEDED": 6, } func (x TransactionRetryReason) Enum() *TransactionRetryReason { @@ -167,7 +171,7 @@ func (x *TransactionRetryReason) UnmarshalJSON(data []byte) error { return nil } func (TransactionRetryReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{1} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{1} } // TransactionRestart indicates how an error should be handled in a @@ -218,7 +222,7 @@ func (x *TransactionRestart) UnmarshalJSON(data []byte) error { return nil } func (TransactionRestart) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{2} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{2} } // Reason specifies what caused the error. @@ -261,7 +265,7 @@ func (x *TransactionStatusError_Reason) UnmarshalJSON(data []byte) error { return nil } func (TransactionStatusError_Reason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{9, 0} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{9, 0} } // Reason specifies what caused the error. @@ -317,7 +321,7 @@ func (x *RangeFeedRetryError_Reason) UnmarshalJSON(data []byte) error { return nil } func (RangeFeedRetryError_Reason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{29, 0} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{29, 0} } // A NotLeaseHolderError indicates that the current range is not the lease @@ -346,7 +350,7 @@ func (m *NotLeaseHolderError) Reset() { *m = NotLeaseHolderError{} } func (m *NotLeaseHolderError) String() string { return proto.CompactTextString(m) } func (*NotLeaseHolderError) ProtoMessage() {} func (*NotLeaseHolderError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{0} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{0} } func (m *NotLeaseHolderError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -383,7 +387,7 @@ func (m *NodeUnavailableError) Reset() { *m = NodeUnavailableError{} } func (m *NodeUnavailableError) String() string { return proto.CompactTextString(m) } func (*NodeUnavailableError) ProtoMessage() {} func (*NodeUnavailableError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{1} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{1} } func (m *NodeUnavailableError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -419,7 +423,7 @@ func (m *UnsupportedRequestError) Reset() { *m = UnsupportedRequestError func (m *UnsupportedRequestError) String() string { return proto.CompactTextString(m) } func (*UnsupportedRequestError) ProtoMessage() {} func (*UnsupportedRequestError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{2} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{2} } func (m *UnsupportedRequestError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -458,7 +462,7 @@ func (m *RangeNotFoundError) Reset() { *m = RangeNotFoundError{} } func (m *RangeNotFoundError) String() string { return proto.CompactTextString(m) } func (*RangeNotFoundError) ProtoMessage() {} func (*RangeNotFoundError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{3} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{3} } func (m *RangeNotFoundError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -504,7 +508,7 @@ func (m *RangeKeyMismatchError) Reset() { *m = RangeKeyMismatchError{} } func (m *RangeKeyMismatchError) String() string { return proto.CompactTextString(m) } func (*RangeKeyMismatchError) ProtoMessage() {} func (*RangeKeyMismatchError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{4} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{4} } func (m *RangeKeyMismatchError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -552,7 +556,7 @@ func (m *ReadWithinUncertaintyIntervalError) Reset() { *m = ReadWithinUn func (m *ReadWithinUncertaintyIntervalError) String() string { return proto.CompactTextString(m) } func (*ReadWithinUncertaintyIntervalError) ProtoMessage() {} func (*ReadWithinUncertaintyIntervalError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{5} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{5} } func (m *ReadWithinUncertaintyIntervalError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -597,7 +601,7 @@ func (m *TransactionAbortedError) Reset() { *m = TransactionAbortedError func (m *TransactionAbortedError) String() string { return proto.CompactTextString(m) } func (*TransactionAbortedError) ProtoMessage() {} func (*TransactionAbortedError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{6} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{6} } func (m *TransactionAbortedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -635,7 +639,7 @@ func (m *TransactionPushError) Reset() { *m = TransactionPushError{} } func (m *TransactionPushError) String() string { return proto.CompactTextString(m) } func (*TransactionPushError) ProtoMessage() {} func (*TransactionPushError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{7} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{7} } func (m *TransactionPushError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -664,6 +668,7 @@ var xxx_messageInfo_TransactionPushError proto.InternalMessageInfo // retried, usually with an increased transaction timestamp. type TransactionRetryError struct { Reason TransactionRetryReason `protobuf:"varint,1,opt,name=reason,enum=cockroach.roachpb.TransactionRetryReason" json:"reason"` + ExtraMsg string `protobuf:"bytes,2,opt,name=extra_msg,json=extraMsg" json:"extra_msg"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` } @@ -672,7 +677,7 @@ func (m *TransactionRetryError) Reset() { *m = TransactionRetryError{} } func (m *TransactionRetryError) String() string { return proto.CompactTextString(m) } func (*TransactionRetryError) ProtoMessage() {} func (*TransactionRetryError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{8} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{8} } func (m *TransactionRetryError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -714,7 +719,7 @@ func (m *TransactionStatusError) Reset() { *m = TransactionStatusError{} func (m *TransactionStatusError) String() string { return proto.CompactTextString(m) } func (*TransactionStatusError) ProtoMessage() {} func (*TransactionStatusError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{9} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{9} } func (m *TransactionStatusError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -754,7 +759,7 @@ func (m *WriteIntentError) Reset() { *m = WriteIntentError{} } func (m *WriteIntentError) String() string { return proto.CompactTextString(m) } func (*WriteIntentError) ProtoMessage() {} func (*WriteIntentError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{10} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{10} } func (m *WriteIntentError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -794,7 +799,7 @@ func (m *WriteTooOldError) Reset() { *m = WriteTooOldError{} } func (m *WriteTooOldError) String() string { return proto.CompactTextString(m) } func (*WriteTooOldError) ProtoMessage() {} func (*WriteTooOldError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{11} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{11} } func (m *WriteTooOldError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -832,7 +837,7 @@ func (m *OpRequiresTxnError) Reset() { *m = OpRequiresTxnError{} } func (m *OpRequiresTxnError) String() string { return proto.CompactTextString(m) } func (*OpRequiresTxnError) ProtoMessage() {} func (*OpRequiresTxnError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{12} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{12} } func (m *OpRequiresTxnError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -871,7 +876,7 @@ func (m *ConditionFailedError) Reset() { *m = ConditionFailedError{} } func (m *ConditionFailedError) String() string { return proto.CompactTextString(m) } func (*ConditionFailedError) ProtoMessage() {} func (*ConditionFailedError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{13} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{13} } func (m *ConditionFailedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -910,7 +915,7 @@ func (m *LeaseRejectedError) Reset() { *m = LeaseRejectedError{} } func (m *LeaseRejectedError) String() string { return proto.CompactTextString(m) } func (*LeaseRejectedError) ProtoMessage() {} func (*LeaseRejectedError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{14} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{14} } func (m *LeaseRejectedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -947,7 +952,7 @@ func (m *SendError) Reset() { *m = SendError{} } func (m *SendError) String() string { return proto.CompactTextString(m) } func (*SendError) ProtoMessage() {} func (*SendError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{15} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{15} } func (m *SendError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -987,7 +992,7 @@ func (m *AmbiguousResultError) Reset() { *m = AmbiguousResultError{} } func (m *AmbiguousResultError) String() string { return proto.CompactTextString(m) } func (*AmbiguousResultError) ProtoMessage() {} func (*AmbiguousResultError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{16} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{16} } func (m *AmbiguousResultError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1023,7 +1028,7 @@ func (m *RaftGroupDeletedError) Reset() { *m = RaftGroupDeletedError{} } func (m *RaftGroupDeletedError) String() string { return proto.CompactTextString(m) } func (*RaftGroupDeletedError) ProtoMessage() {} func (*RaftGroupDeletedError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{17} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{17} } func (m *RaftGroupDeletedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1063,7 +1068,7 @@ func (m *ReplicaCorruptionError) Reset() { *m = ReplicaCorruptionError{} func (m *ReplicaCorruptionError) String() string { return proto.CompactTextString(m) } func (*ReplicaCorruptionError) ProtoMessage() {} func (*ReplicaCorruptionError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{18} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{18} } func (m *ReplicaCorruptionError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1102,7 +1107,7 @@ func (m *ReplicaTooOldError) Reset() { *m = ReplicaTooOldError{} } func (m *ReplicaTooOldError) String() string { return proto.CompactTextString(m) } func (*ReplicaTooOldError) ProtoMessage() {} func (*ReplicaTooOldError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{19} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{19} } func (m *ReplicaTooOldError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1139,7 +1144,7 @@ func (m *StoreNotFoundError) Reset() { *m = StoreNotFoundError{} } func (m *StoreNotFoundError) String() string { return proto.CompactTextString(m) } func (*StoreNotFoundError) ProtoMessage() {} func (*StoreNotFoundError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{20} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{20} } func (m *StoreNotFoundError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1187,7 +1192,7 @@ func (m *UnhandledRetryableError) Reset() { *m = UnhandledRetryableError func (m *UnhandledRetryableError) String() string { return proto.CompactTextString(m) } func (*UnhandledRetryableError) ProtoMessage() {} func (*UnhandledRetryableError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{21} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{21} } func (m *UnhandledRetryableError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1241,7 +1246,7 @@ func (m *TransactionRetryWithProtoRefreshError) Reset() { *m = Transacti func (m *TransactionRetryWithProtoRefreshError) String() string { return proto.CompactTextString(m) } func (*TransactionRetryWithProtoRefreshError) ProtoMessage() {} func (*TransactionRetryWithProtoRefreshError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{22} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{22} } func (m *TransactionRetryWithProtoRefreshError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1281,7 +1286,7 @@ func (m *TxnAlreadyEncounteredErrorError) Reset() { *m = TxnAlreadyEncou func (m *TxnAlreadyEncounteredErrorError) String() string { return proto.CompactTextString(m) } func (*TxnAlreadyEncounteredErrorError) ProtoMessage() {} func (*TxnAlreadyEncounteredErrorError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{23} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{23} } func (m *TxnAlreadyEncounteredErrorError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1320,7 +1325,7 @@ func (m *IntegerOverflowError) Reset() { *m = IntegerOverflowError{} } func (m *IntegerOverflowError) String() string { return proto.CompactTextString(m) } func (*IntegerOverflowError) ProtoMessage() {} func (*IntegerOverflowError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{24} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{24} } func (m *IntegerOverflowError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1358,7 +1363,7 @@ func (m *MixedSuccessError) Reset() { *m = MixedSuccessError{} } func (m *MixedSuccessError) String() string { return proto.CompactTextString(m) } func (*MixedSuccessError) ProtoMessage() {} func (*MixedSuccessError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{25} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{25} } func (m *MixedSuccessError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1396,7 +1401,7 @@ func (m *BatchTimestampBeforeGCError) Reset() { *m = BatchTimestampBefor func (m *BatchTimestampBeforeGCError) String() string { return proto.CompactTextString(m) } func (*BatchTimestampBeforeGCError) ProtoMessage() {} func (*BatchTimestampBeforeGCError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{26} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{26} } func (m *BatchTimestampBeforeGCError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1426,7 +1431,9 @@ var xxx_messageInfo_BatchTimestampBeforeGCError proto.InternalMessageInfo // not there. type IntentMissingError struct { // The non-matching intent that was found at that key, if any. - WrongIntent *Intent `protobuf:"bytes,1,opt,name=wrong_intent,json=wrongIntent" json:"wrong_intent,omitempty"` + WrongIntent *Intent `protobuf:"bytes,1,opt,name=wrong_intent,json=wrongIntent" json:"wrong_intent,omitempty"` + // The key where the intent was expected. + Key Key `protobuf:"bytes,2,opt,name=key,casttype=Key" json:"key,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` } @@ -1435,7 +1442,7 @@ func (m *IntentMissingError) Reset() { *m = IntentMissingError{} } func (m *IntentMissingError) String() string { return proto.CompactTextString(m) } func (*IntentMissingError) ProtoMessage() {} func (*IntentMissingError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{27} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{27} } func (m *IntentMissingError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1474,7 +1481,7 @@ func (m *MergeInProgressError) Reset() { *m = MergeInProgressError{} } func (m *MergeInProgressError) String() string { return proto.CompactTextString(m) } func (*MergeInProgressError) ProtoMessage() {} func (*MergeInProgressError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{28} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{28} } func (m *MergeInProgressError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1511,7 +1518,7 @@ func (m *RangeFeedRetryError) Reset() { *m = RangeFeedRetryError{} } func (m *RangeFeedRetryError) String() string { return proto.CompactTextString(m) } func (*RangeFeedRetryError) ProtoMessage() {} func (*RangeFeedRetryError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{29} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{29} } func (m *RangeFeedRetryError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1577,7 +1584,7 @@ func (m *ErrorDetail) Reset() { *m = ErrorDetail{} } func (m *ErrorDetail) String() string { return proto.CompactTextString(m) } func (*ErrorDetail) ProtoMessage() {} func (*ErrorDetail) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{30} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{30} } func (m *ErrorDetail) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2537,7 +2544,7 @@ func (m *ErrPosition) Reset() { *m = ErrPosition{} } func (m *ErrPosition) String() string { return proto.CompactTextString(m) } func (*ErrPosition) ProtoMessage() {} func (*ErrPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{31} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{31} } func (m *ErrPosition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2593,7 +2600,7 @@ type Error struct { func (m *Error) Reset() { *m = Error{} } func (*Error) ProtoMessage() {} func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_2f91914b0d06d64b, []int{32} + return fileDescriptor_errors_ee43f5f6d0e525bf, []int{32} } func (m *Error) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2904,6 +2911,9 @@ func (this *TransactionRetryError) Equal(that interface{}) bool { if this.Reason != that1.Reason { return false } + if this.ExtraMsg != that1.ExtraMsg { + return false + } return true } func (this *TransactionStatusError) Equal(that interface{}) bool { @@ -3368,6 +3378,9 @@ func (this *IntentMissingError) Equal(that interface{}) bool { if !this.WrongIntent.Equal(that1.WrongIntent) { return false } + if !bytes.Equal(this.Key, that1.Key) { + return false + } return true } func (this *MergeInProgressError) Equal(that interface{}) bool { @@ -4491,6 +4504,10 @@ func (m *TransactionRetryError) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x8 i++ i = encodeVarintErrors(dAtA, i, uint64(m.Reason)) + dAtA[i] = 0x12 + i++ + i = encodeVarintErrors(dAtA, i, uint64(len(m.ExtraMsg))) + i += copy(dAtA[i:], m.ExtraMsg) return i, nil } @@ -5014,6 +5031,12 @@ func (m *IntentMissingError) MarshalTo(dAtA []byte) (int, error) { } i += n22 } + if m.Key != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintErrors(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } return i, nil } @@ -5736,6 +5759,8 @@ func (m *TransactionRetryError) Size() (n int) { var l int _ = l n += 1 + sovErrors(uint64(m.Reason)) + l = len(m.ExtraMsg) + n += 1 + l + sovErrors(uint64(l)) return n } @@ -5971,6 +5996,10 @@ func (m *IntentMissingError) Size() (n int) { l = m.WrongIntent.Size() n += 1 + l + sovErrors(uint64(l)) } + if m.Key != nil { + l = len(m.Key) + n += 1 + l + sovErrors(uint64(l)) + } return n } @@ -7332,6 +7361,35 @@ func (m *TransactionRetryError) Unmarshal(dAtA []byte) error { break } } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraMsg", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErrors + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthErrors + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtraMsg = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipErrors(dAtA[iNdEx:]) @@ -9064,6 +9122,37 @@ func (m *IntentMissingError) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErrors + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthErrors + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipErrors(dAtA[iNdEx:]) @@ -10599,185 +10688,187 @@ var ( ErrIntOverflowErrors = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/errors.proto", fileDescriptor_errors_2f91914b0d06d64b) } - -var fileDescriptor_errors_2f91914b0d06d64b = []byte{ - // 2819 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xcb, 0x6f, 0xe3, 0xd6, - 0xd5, 0x17, 0x65, 0xd9, 0xb2, 0x8f, 0x5f, 0xf4, 0x1d, 0xc7, 0xc3, 0xf1, 0x64, 0x64, 0x8f, 0x27, - 0x93, 0x4c, 0xe6, 0x43, 0xec, 0x0f, 0x93, 0x6f, 0xf0, 0x35, 0xd3, 0x64, 0xa1, 0x07, 0x6d, 0xc9, - 0xd6, 0xc3, 0xa1, 0xe4, 0x38, 0x93, 0xb4, 0x20, 0x68, 0xf1, 0x5a, 0x66, 0x46, 0x22, 0xd5, 0x4b, - 0xd2, 0x8f, 0x5d, 0x97, 0x41, 0x57, 0x2d, 0xd0, 0x45, 0x77, 0x0d, 0xd0, 0x55, 0xd0, 0x6d, 0x91, - 0x7f, 0xa0, 0x9b, 0x2c, 0xbb, 0x0c, 0xba, 0x18, 0xb4, 0x53, 0xa0, 0x28, 0xda, 0xff, 0x20, 0xab, - 0xe2, 0x3e, 0x48, 0x91, 0x16, 0xe9, 0x51, 0xb2, 0x92, 0x78, 0x5e, 0xf7, 0xdc, 0x73, 0xcf, 0x3d, - 0xe7, 0x77, 0x2e, 0xac, 0x12, 0xc7, 0xe8, 0x9e, 0x0d, 0x4f, 0x76, 0x30, 0x21, 0x0e, 0x71, 0xb7, - 0x87, 0xc4, 0xf1, 0x1c, 0xb4, 0xd2, 0x75, 0xba, 0x2f, 0x18, 0x67, 0x5b, 0xf0, 0xd7, 0x51, 0x20, - 0x68, 0x1a, 0x9e, 0xc1, 0xc5, 0xd6, 0xd7, 0x02, 0xda, 0x00, 0x7b, 0x46, 0x84, 0xfe, 0xc0, 0xf5, - 0x1c, 0x62, 0xf4, 0xf0, 0x0e, 0xb6, 0x7b, 0x96, 0x1d, 0xfc, 0x50, 0xb9, 0xf3, 0x6e, 0xf7, 0x7d, - 0x21, 0xa4, 0xf8, 0x9e, 0xd5, 0xdf, 0x39, 0xeb, 0x77, 0x77, 0x3c, 0x6b, 0x80, 0x5d, 0xcf, 0x18, - 0x0c, 0x05, 0x67, 0xb5, 0xe7, 0xf4, 0x1c, 0xf6, 0x77, 0x87, 0xfe, 0xe3, 0xd4, 0xad, 0x6f, 0xb2, - 0x70, 0xab, 0xe9, 0x78, 0x75, 0x6c, 0xb8, 0xb8, 0xea, 0xf4, 0x4d, 0x4c, 0x54, 0xea, 0x32, 0xaa, - 0x40, 0x9e, 0xe0, 0x61, 0xdf, 0xea, 0x1a, 0x8a, 0xb4, 0x29, 0x3d, 0x9a, 0x7f, 0xf2, 0xd6, 0xf6, - 0x98, 0xf7, 0xdb, 0x1a, 0x97, 0xa8, 0x60, 0xb7, 0x4b, 0xac, 0xa1, 0xe7, 0x90, 0x52, 0xee, 0xdb, - 0x97, 0x1b, 0x19, 0x2d, 0x50, 0x45, 0x7b, 0xb0, 0xd0, 0xa7, 0x96, 0xf5, 0x33, 0x66, 0x5a, 0xc9, - 0x4e, 0x6e, 0x4a, 0x9b, 0xef, 0x8f, 0x7c, 0x42, 0x4f, 0x61, 0x96, 0x18, 0x76, 0x0f, 0xeb, 0x96, - 0xa9, 0x4c, 0x6d, 0x4a, 0x8f, 0xa6, 0x4a, 0xeb, 0x74, 0xa5, 0x57, 0x2f, 0x37, 0xf2, 0x1a, 0xa5, - 0xd7, 0x2a, 0xdf, 0x8f, 0xfe, 0x6a, 0x79, 0x26, 0x5b, 0x33, 0xd1, 0x36, 0x4c, 0x33, 0x2b, 0x4a, - 0x8e, 0x2d, 0xac, 0x24, 0x2c, 0xcc, 0x76, 0xae, 0x71, 0x31, 0xf4, 0x00, 0xa0, 0xeb, 0xbb, 0x9e, - 0x33, 0xd0, 0x07, 0x6e, 0x4f, 0x99, 0xde, 0x94, 0x1e, 0xcd, 0x89, 0x2d, 0xcd, 0x71, 0x7a, 0xc3, - 0xed, 0x3d, 0xcb, 0xfd, 0xeb, 0xab, 0x0d, 0x69, 0xeb, 0x4d, 0x58, 0x6d, 0x3a, 0x26, 0x3e, 0xb2, - 0x8d, 0x73, 0xc3, 0xea, 0x1b, 0x27, 0x7d, 0xcc, 0x02, 0x27, 0xb8, 0x1b, 0x70, 0xfb, 0xc8, 0x76, - 0xfd, 0xe1, 0xd0, 0x21, 0x1e, 0x36, 0x35, 0xfc, 0x0b, 0x1f, 0xbb, 0x5e, 0x54, 0xe0, 0x4b, 0x09, - 0x10, 0x73, 0xb7, 0xe9, 0x78, 0xbb, 0x8e, 0x6f, 0x9b, 0x3c, 0xec, 0xd1, 0x7d, 0x4a, 0x93, 0xef, - 0xf3, 0x29, 0xcc, 0xd2, 0xe4, 0x60, 0x6a, 0xd9, 0xb8, 0x5a, 0x9b, 0xd2, 0xb9, 0x9a, 0xf8, 0xab, - 0xe5, 0x99, 0x6c, 0xcd, 0x14, 0xae, 0xfc, 0x3e, 0x0b, 0x6f, 0x30, 0x8b, 0x07, 0xf8, 0xaa, 0x61, - 0xb9, 0x03, 0xc3, 0xeb, 0x9e, 0x71, 0x6f, 0xde, 0x87, 0x15, 0xc2, 0x5d, 0xd7, 0x5d, 0xcf, 0x20, - 0x9e, 0xfe, 0x02, 0x5f, 0x31, 0xb7, 0x16, 0x4a, 0xf9, 0xef, 0x5f, 0x6e, 0x4c, 0x1d, 0xe0, 0x2b, - 0x6d, 0x59, 0x48, 0xb4, 0xa9, 0xc0, 0x01, 0xbe, 0x42, 0x3b, 0x10, 0x90, 0x74, 0x6c, 0x9b, 0x4c, - 0x25, 0x1b, 0x57, 0x59, 0x14, 0x7c, 0xd5, 0x36, 0xa9, 0x42, 0x03, 0xe4, 0x81, 0x58, 0x16, 0x9b, - 0x3a, 0xdb, 0x12, 0x3b, 0xe3, 0xf9, 0x27, 0x5b, 0x49, 0x89, 0x42, 0xf9, 0x91, 0x34, 0x59, 0x1e, - 0xe9, 0x32, 0x16, 0x3a, 0x80, 0x65, 0xd7, 0xef, 0xf5, 0xb0, 0xeb, 0x85, 0xd6, 0x72, 0x13, 0x5b, - 0x5b, 0x0a, 0x55, 0x19, 0x47, 0x44, 0xe8, 0x3f, 0x59, 0xd8, 0xd2, 0xb0, 0x61, 0x1e, 0x5b, 0xde, - 0x99, 0x65, 0x1f, 0xd9, 0x5d, 0x4c, 0x3c, 0xc3, 0xb2, 0xbd, 0xab, 0x9a, 0xed, 0x61, 0x72, 0x6e, - 0xf4, 0x79, 0xb8, 0xf6, 0x61, 0x89, 0x60, 0xc3, 0xd4, 0xc3, 0x9b, 0x27, 0xae, 0xce, 0xbd, 0xc8, - 0xc2, 0xf4, 0x7a, 0x6e, 0x9f, 0xf5, 0xbb, 0xdb, 0x9d, 0x40, 0x48, 0x24, 0xd8, 0x22, 0x55, 0x0d, - 0x89, 0x48, 0x03, 0x84, 0x2f, 0x2d, 0xd7, 0xb3, 0xec, 0x5e, 0xc4, 0x5e, 0x76, 0x72, 0x7b, 0x2b, - 0x81, 0xfa, 0xc8, 0x66, 0x09, 0x16, 0x07, 0xc6, 0x65, 0xc4, 0xdc, 0xd4, 0x04, 0xe6, 0xb4, 0x85, - 0x81, 0x71, 0x39, 0xb2, 0xf1, 0x39, 0xdc, 0x72, 0x4e, 0x5c, 0x4c, 0xce, 0x71, 0x64, 0x9f, 0xae, - 0x92, 0xdb, 0x9c, 0x4a, 0xb9, 0xd8, 0x2d, 0x21, 0x7d, 0xdd, 0x3f, 0xe4, 0x5c, 0x67, 0xb8, 0x22, - 0xda, 0x5f, 0xc0, 0xed, 0x0e, 0x31, 0x6c, 0xd7, 0xe8, 0x7a, 0x96, 0x63, 0x17, 0x4f, 0xd8, 0x15, - 0xe2, 0x11, 0xae, 0xc1, 0x0c, 0xc1, 0x86, 0xeb, 0xd8, 0x2c, 0xb2, 0x4b, 0x4f, 0xfe, 0x27, 0x61, - 0xc1, 0x71, 0x5d, 0x8d, 0xa9, 0x88, 0x75, 0x85, 0x01, 0xb1, 0x96, 0x01, 0xab, 0x11, 0xf9, 0x43, - 0xdf, 0x15, 0x99, 0x5f, 0x06, 0x18, 0xfa, 0xee, 0x19, 0xc6, 0xba, 0x77, 0x69, 0x8b, 0x63, 0x2c, - 0xdc, 0xbc, 0x58, 0x50, 0x28, 0xb8, 0x5e, 0xe7, 0x32, 0x58, 0xe2, 0x14, 0xde, 0x88, 0x48, 0x69, - 0xd8, 0x23, 0x57, 0x7c, 0x8d, 0xbd, 0x6b, 0x9b, 0x79, 0xf7, 0x66, 0xfb, 0x4c, 0xf3, 0x86, 0xad, - 0x7c, 0x27, 0xc1, 0x5a, 0x44, 0xbc, 0xed, 0x19, 0x9e, 0xef, 0xf2, 0x95, 0xd6, 0x60, 0x8a, 0xd6, - 0x33, 0x29, 0x52, 0xcf, 0x28, 0x01, 0x35, 0x43, 0x0f, 0xb2, 0xcc, 0x83, 0xff, 0xbd, 0xd9, 0x83, - 0x88, 0xc9, 0xed, 0x24, 0x47, 0xb6, 0x0e, 0x61, 0x86, 0xd3, 0x11, 0x82, 0x25, 0x4d, 0x2d, 0xb6, - 0x5b, 0x4d, 0xfd, 0xa8, 0x79, 0xd0, 0x6c, 0x1d, 0x37, 0xe5, 0x0c, 0x52, 0x60, 0x55, 0xd0, 0x3a, - 0x9f, 0x36, 0xf5, 0x66, 0xab, 0xa3, 0xef, 0xb6, 0x8e, 0x9a, 0x15, 0x59, 0xba, 0xc6, 0x29, 0xb7, - 0x1a, 0x8d, 0x5a, 0xa7, 0xa3, 0x56, 0xe4, 0xac, 0xd8, 0xda, 0x73, 0x90, 0x8f, 0x89, 0xe5, 0x61, - 0x7a, 0xdd, 0x6c, 0x5e, 0x46, 0xd1, 0x07, 0x90, 0xb7, 0xd8, 0xa7, 0xab, 0x48, 0x2c, 0xf9, 0xee, - 0x24, 0x38, 0xcf, 0x15, 0x82, 0xae, 0x24, 0xe4, 0xb9, 0xd1, 0xfd, 0xdc, 0x6c, 0x56, 0x9e, 0xda, - 0xfa, 0xa3, 0x24, 0x6c, 0x77, 0x1c, 0xa7, 0xd5, 0x17, 0x69, 0x56, 0x84, 0xb9, 0x1f, 0x75, 0x87, - 0x47, 0x5a, 0xa8, 0x09, 0xb2, 0xd1, 0xf5, 0x7c, 0xa3, 0xff, 0xe3, 0x6e, 0xef, 0x32, 0x57, 0x0e, - 0xc9, 0x22, 0x10, 0xeb, 0x80, 0x5a, 0x43, 0xda, 0x4d, 0x2c, 0x82, 0xdd, 0xce, 0xa5, 0x1d, 0xed, - 0x28, 0xcf, 0x61, 0xb5, 0xec, 0xd8, 0xa6, 0x45, 0x4f, 0x6a, 0xd7, 0xb0, 0xfa, 0xc1, 0x9d, 0xf9, - 0x29, 0x2c, 0x08, 0x4f, 0xce, 0x8d, 0xbe, 0x8f, 0xc5, 0x7e, 0x92, 0x5a, 0xe1, 0x27, 0x94, 0xaf, - 0xcd, 0x73, 0x69, 0xf6, 0x21, 0x4c, 0xff, 0x49, 0x02, 0xc4, 0xfb, 0x24, 0xfe, 0x02, 0x77, 0xc3, - 0xdb, 0x58, 0x80, 0xfc, 0x00, 0xbb, 0xae, 0xd1, 0xc3, 0xb1, 0xd4, 0x0a, 0x88, 0xe8, 0x43, 0x98, - 0x13, 0x95, 0x1e, 0x9b, 0x62, 0xf3, 0xa9, 0x1d, 0x38, 0x88, 0x60, 0xa8, 0x80, 0x9e, 0xc1, 0x6c, - 0x50, 0xc2, 0x44, 0xa1, 0x7a, 0x9d, 0x72, 0x28, 0x2f, 0xdc, 0xfe, 0x7f, 0x98, 0x6b, 0x63, 0x7b, - 0x32, 0x67, 0x63, 0x49, 0x71, 0x01, 0xab, 0xc5, 0xc1, 0x89, 0xd5, 0xf3, 0x1d, 0xdf, 0xd5, 0xb0, - 0xeb, 0xf7, 0xbd, 0xc9, 0x36, 0xfc, 0x01, 0xcc, 0x5f, 0x10, 0x63, 0x38, 0xc4, 0xa6, 0x8e, 0x09, - 0xb9, 0x61, 0xcb, 0xcc, 0x9c, 0x06, 0x42, 0x58, 0x25, 0xc1, 0x19, 0xde, 0xa3, 0x9d, 0xf8, 0xd4, - 0xdb, 0x23, 0x8e, 0x3f, 0xac, 0xe0, 0x3e, 0x0e, 0x42, 0x2d, 0xd8, 0x18, 0xd6, 0x04, 0x4e, 0x2a, - 0x3b, 0x84, 0xf8, 0x43, 0x7a, 0xd4, 0xdc, 0xb3, 0xfb, 0x30, 0xc7, 0xa0, 0xa6, 0x7e, 0xfd, 0x9e, - 0xcf, 0x32, 0x72, 0xc3, 0xed, 0xa1, 0x2d, 0x98, 0x1b, 0x12, 0xa7, 0x8b, 0x5d, 0x57, 0x9c, 0xc6, - 0x6c, 0x58, 0xb1, 0x02, 0x72, 0x98, 0x49, 0x48, 0x2c, 0x13, 0xbd, 0x14, 0x1f, 0x01, 0x08, 0x58, - 0x17, 0x80, 0x93, 0xe9, 0x52, 0x41, 0xa0, 0x8c, 0x39, 0x21, 0xcf, 0x70, 0xc6, 0xe8, 0x83, 0x1e, - 0x27, 0xff, 0x1b, 0x98, 0xfe, 0x18, 0x10, 0x43, 0x21, 0x63, 0xa8, 0x27, 0x84, 0x2f, 0xd2, 0x0f, - 0x85, 0x2f, 0x0d, 0x0a, 0xb5, 0xce, 0x0c, 0xdb, 0xec, 0xd3, 0x4a, 0xef, 0x91, 0xab, 0x10, 0x8b, - 0xa1, 0x27, 0x90, 0x1b, 0xaa, 0x84, 0xdc, 0x90, 0xf2, 0x4c, 0x4e, 0xc4, 0x81, 0xc9, 0x6e, 0xfd, - 0x5b, 0x82, 0x87, 0xd7, 0xab, 0x2e, 0xed, 0xfb, 0x87, 0x14, 0x2e, 0x6b, 0xf8, 0x94, 0xe0, 0xa0, - 0x47, 0xa4, 0x55, 0xd5, 0xcf, 0x61, 0xc6, 0xbb, 0xb4, 0x03, 0x28, 0xb6, 0x50, 0xaa, 0x50, 0xd6, - 0x5f, 0x5f, 0x6e, 0xbc, 0xdf, 0xb3, 0xbc, 0x33, 0xff, 0x64, 0xbb, 0xeb, 0x0c, 0x76, 0x42, 0x4f, - 0xcc, 0x93, 0xd1, 0xff, 0x9d, 0xe1, 0x8b, 0xde, 0x0e, 0xc3, 0xef, 0xbe, 0x6f, 0x99, 0xdb, 0x47, - 0x47, 0xb5, 0xca, 0xab, 0x97, 0x1b, 0xd3, 0x9d, 0x4b, 0xbb, 0x56, 0xd1, 0xa6, 0xbd, 0x4b, 0xbb, - 0x66, 0xa2, 0x5d, 0x98, 0xf7, 0x46, 0xde, 0x89, 0x8b, 0x31, 0x59, 0x67, 0x8a, 0x2a, 0x8a, 0xd8, - 0xd5, 0x61, 0xa3, 0x73, 0x69, 0x17, 0xfb, 0x14, 0x7b, 0x5c, 0xa9, 0x76, 0xd7, 0xf1, 0x29, 0xa0, - 0x11, 0x49, 0xc7, 0x77, 0xf9, 0x00, 0x60, 0x48, 0xf0, 0xb9, 0xce, 0xf2, 0x28, 0xb6, 0xd9, 0x39, - 0x4a, 0x8f, 0xa6, 0xe7, 0x6f, 0x24, 0x58, 0xa5, 0x15, 0xb7, 0x87, 0x49, 0xeb, 0x1c, 0x93, 0xd3, - 0xbe, 0x73, 0xc1, 0x6d, 0xdc, 0x81, 0xa9, 0x04, 0xe4, 0x48, 0x69, 0xe8, 0x5d, 0x58, 0xec, 0xfa, - 0x84, 0x60, 0xdb, 0x13, 0xe5, 0x89, 0xc3, 0x57, 0xbe, 0xc2, 0x82, 0x60, 0xb1, 0x5a, 0x84, 0xde, - 0x83, 0x65, 0xcb, 0xee, 0x12, 0x3c, 0x18, 0x09, 0x4f, 0x45, 0x84, 0x97, 0x42, 0x66, 0xb4, 0x74, - 0x35, 0x60, 0xa5, 0x61, 0x5d, 0x62, 0xb3, 0xed, 0x77, 0x69, 0x8e, 0x07, 0x79, 0x91, 0x17, 0x57, - 0xef, 0x75, 0xa9, 0xa1, 0x05, 0x82, 0xc2, 0xdc, 0xd7, 0x12, 0xdc, 0x2d, 0x51, 0xb4, 0x39, 0x2a, - 0xd8, 0xf8, 0xd4, 0x21, 0x78, 0xaf, 0x1c, 0x76, 0x8e, 0xce, 0x8f, 0xea, 0x1c, 0x23, 0x84, 0x45, - 0x4d, 0x9c, 0xd1, 0x2c, 0x73, 0xfa, 0xe6, 0x0f, 0x69, 0x19, 0x23, 0x2d, 0xe1, 0xeb, 0xa7, 0x80, - 0x78, 0xff, 0x6b, 0x58, 0xae, 0x6b, 0xd9, 0x3d, 0xee, 0xe1, 0x87, 0xb0, 0x70, 0x41, 0x1c, 0xbb, - 0xa7, 0xf3, 0x6e, 0x28, 0x9c, 0x4c, 0x6f, 0x9e, 0xda, 0x3c, 0x13, 0xe7, 0x1f, 0xa3, 0xd9, 0xa7, - 0x81, 0x49, 0x0f, 0xd7, 0xec, 0x43, 0xe2, 0xf4, 0x48, 0x10, 0x57, 0xc1, 0xfd, 0x6d, 0x16, 0x6e, - 0x31, 0xf4, 0xbc, 0x8b, 0xc5, 0x8d, 0xe4, 0x2b, 0x1f, 0x5c, 0xc3, 0x3b, 0xef, 0xa5, 0xe1, 0xf1, - 0xb8, 0x5e, 0x32, 0xd4, 0xf8, 0x5a, 0x0a, 0xb1, 0xc6, 0x3a, 0xac, 0x09, 0xf4, 0xa0, 0xa9, 0x87, - 0xf5, 0x5a, 0xb9, 0xa8, 0x6b, 0x6a, 0xa3, 0xf5, 0x89, 0x5a, 0x91, 0x33, 0x68, 0x0d, 0x50, 0xc0, - 0x2b, 0x36, 0xf7, 0x54, 0xbd, 0x7d, 0x58, 0xaf, 0x75, 0x64, 0x09, 0xdd, 0x86, 0x5b, 0x31, 0x7a, - 0x43, 0xd5, 0xf6, 0x28, 0xe0, 0x88, 0x40, 0x11, 0xad, 0xb8, 0xdb, 0xd1, 0xdb, 0xcd, 0xe2, 0x61, - 0xbb, 0xda, 0xea, 0xc8, 0x53, 0xa8, 0x00, 0xeb, 0x82, 0x53, 0x6f, 0xed, 0xd5, 0xca, 0xc5, 0xba, - 0xde, 0x3a, 0x6c, 0xeb, 0x8d, 0x5a, 0xbb, 0x5d, 0x6b, 0xee, 0xc9, 0xb9, 0x88, 0x66, 0xbb, 0xde, - 0x3a, 0xd6, 0xcb, 0xad, 0x66, 0xfb, 0xa8, 0xa1, 0x6a, 0xf2, 0xb4, 0x08, 0xcb, 0x9f, 0x57, 0x61, - 0x9e, 0x6d, 0xa8, 0x82, 0x3d, 0xc3, 0xea, 0x23, 0x0d, 0x64, 0xdb, 0xf1, 0xf4, 0xd8, 0x7c, 0xcc, - 0x0f, 0xe3, 0xed, 0x84, 0xc0, 0x24, 0xcc, 0xe8, 0xd5, 0x8c, 0xb6, 0x64, 0xc7, 0xc8, 0xa8, 0x05, - 0xcb, 0x7c, 0x7c, 0xa4, 0x96, 0x4f, 0x69, 0x81, 0x15, 0x19, 0xf4, 0x30, 0x2d, 0xd6, 0xb1, 0x42, - 0x5c, 0xa5, 0x63, 0x48, 0x94, 0x8a, 0x3e, 0x05, 0xc4, 0x0d, 0xbe, 0xc0, 0x57, 0x7a, 0x30, 0x69, - 0x89, 0xaa, 0xf3, 0x28, 0xcd, 0xe6, 0xf5, 0x39, 0xb2, 0x9a, 0xd1, 0x64, 0x72, 0x8d, 0x81, 0x7e, - 0x29, 0xc1, 0x26, 0x9b, 0x96, 0x2e, 0xd8, 0x50, 0xa5, 0xfb, 0xa3, 0xa9, 0x8a, 0xa5, 0x26, 0x1d, - 0xab, 0xc4, 0xe0, 0xf6, 0x34, 0xf1, 0xbd, 0xe0, 0x75, 0xe3, 0x58, 0x35, 0xa3, 0xdd, 0x23, 0x37, - 0x49, 0xa1, 0x9f, 0xc3, 0xad, 0x48, 0x49, 0xd4, 0x0d, 0x3e, 0x2d, 0xb0, 0xb1, 0x7f, 0xfe, 0xc9, - 0xe3, 0x89, 0x46, 0x8b, 0x60, 0x25, 0xe4, 0x8d, 0xb1, 0x50, 0x07, 0xe4, 0xa8, 0x79, 0x3a, 0x17, - 0x28, 0x33, 0xcc, 0xf6, 0x3b, 0x37, 0xdb, 0x0e, 0xc7, 0x90, 0x6a, 0x46, 0x5b, 0xf6, 0xe2, 0x74, - 0x74, 0x0c, 0x2b, 0x51, 0xab, 0x84, 0xde, 0x13, 0x25, 0x9f, 0x7a, 0x20, 0x89, 0xa3, 0x07, 0x3d, - 0x10, 0xef, 0x1a, 0x03, 0x7d, 0x06, 0xd1, 0x4d, 0xd0, 0x81, 0xdf, 0xf3, 0x5d, 0x65, 0x96, 0x59, - 0x7e, 0x77, 0xe2, 0xc1, 0xa0, 0x9a, 0xd1, 0xa2, 0xfe, 0x71, 0x0e, 0xaa, 0xd2, 0xa2, 0x63, 0x79, - 0x38, 0x28, 0x3a, 0x73, 0xcc, 0xea, 0x83, 0x04, 0xab, 0xd7, 0x71, 0x7e, 0x35, 0x43, 0x0b, 0x50, - 0x48, 0x43, 0x35, 0x58, 0xe4, 0x96, 0x3c, 0xc7, 0xd1, 0x69, 0x85, 0x84, 0x9b, 0x4d, 0x45, 0x10, - 0x4c, 0x68, 0x8a, 0xd3, 0xe8, 0x65, 0x71, 0x86, 0x3a, 0x11, 0x68, 0x9a, 0x0d, 0x7a, 0xf3, 0xa9, - 0x97, 0x65, 0x1c, 0x76, 0xd3, 0xcb, 0xe2, 0x44, 0xa9, 0xf4, 0xc0, 0xbb, 0x01, 0x02, 0xd7, 0x4f, - 0x19, 0x04, 0x57, 0x16, 0x52, 0x0f, 0x3c, 0x09, 0xac, 0xd3, 0x03, 0xef, 0xc6, 0xe9, 0xa8, 0x09, - 0x4b, 0xbc, 0x46, 0x10, 0x01, 0xbe, 0x95, 0xc5, 0x54, 0x2f, 0xc7, 0x41, 0x3a, 0xf5, 0xb2, 0x1f, - 0xa5, 0x52, 0x2f, 0x6d, 0xc7, 0xc4, 0xba, 0x3f, 0x7a, 0xb9, 0x52, 0x96, 0x52, 0xbd, 0x4c, 0x7a, - 0xe3, 0xa2, 0x5e, 0xda, 0x71, 0x3a, 0x85, 0x5a, 0x2e, 0xb6, 0x4d, 0x65, 0x99, 0x59, 0x7a, 0x33, - 0xc1, 0x52, 0x08, 0xc5, 0xab, 0x19, 0x8d, 0xc9, 0xf2, 0xe2, 0x72, 0xea, 0xe9, 0x3d, 0x0a, 0x77, - 0x75, 0x93, 0xe3, 0x5d, 0x45, 0xbe, 0xa1, 0xb8, 0x24, 0x40, 0x63, 0x5e, 0x5c, 0xe2, 0x0c, 0x9a, - 0xcb, 0x01, 0x56, 0xed, 0x86, 0x48, 0x59, 0x59, 0x49, 0xcd, 0xe5, 0x64, 0x54, 0x4d, 0x73, 0x99, - 0x5c, 0xe7, 0xb0, 0x1a, 0x2b, 0x6c, 0x07, 0x39, 0x88, 0xd2, 0x6b, 0xec, 0x18, 0x8e, 0x66, 0x35, - 0x36, 0x4a, 0xa5, 0x07, 0x62, 0x04, 0xd3, 0x86, 0x4e, 0xd8, 0xb8, 0xa1, 0xac, 0xa7, 0x1e, 0x48, - 0xd2, 0x60, 0x42, 0x0f, 0xc4, 0x88, 0xd3, 0xa9, 0x9b, 0x1c, 0x53, 0x8f, 0x5a, 0xc1, 0xdd, 0x54, - 0x37, 0xc7, 0x31, 0x39, 0x75, 0xd3, 0x8d, 0x52, 0xd1, 0xaf, 0x24, 0x78, 0x6b, 0xac, 0xf2, 0xb0, - 0xea, 0xad, 0xb3, 0xa7, 0x64, 0x9d, 0x70, 0x70, 0xac, 0xbc, 0xc9, 0x96, 0xf9, 0xc9, 0x04, 0xc5, - 0x28, 0x11, 0x57, 0x57, 0x33, 0xda, 0xa6, 0xf7, 0x1a, 0x41, 0x1a, 0x33, 0x8b, 0x23, 0x4d, 0xdd, - 0x11, 0x50, 0x53, 0xd9, 0x48, 0x8d, 0x59, 0x12, 0x28, 0xa5, 0x31, 0xb3, 0xe2, 0x74, 0xda, 0x10, - 0xfc, 0xd1, 0xab, 0xad, 0x2e, 0x66, 0x51, 0x65, 0x33, 0xb5, 0x21, 0xa4, 0xbc, 0xf1, 0xd2, 0x86, - 0xe0, 0x8f, 0xb1, 0xd0, 0x01, 0x2c, 0x0e, 0x28, 0x16, 0xd5, 0x5d, 0x0e, 0x46, 0x95, 0xfb, 0xa9, - 0xcf, 0xe1, 0x63, 0x98, 0xb5, 0x9a, 0xd1, 0x16, 0x06, 0x11, 0x22, 0xfa, 0x1c, 0xe4, 0xf0, 0x65, - 0x41, 0x3f, 0x61, 0x20, 0x54, 0xd9, 0x62, 0xf6, 0xb6, 0x13, 0xec, 0xdd, 0x80, 0x59, 0x59, 0x93, - 0x89, 0x73, 0xd0, 0x05, 0xdc, 0xa3, 0x23, 0x8c, 0xc1, 0x07, 0x03, 0x1d, 0x8f, 0x26, 0x03, 0x31, - 0x07, 0x3c, 0x60, 0x2b, 0x3d, 0x49, 0x3a, 0xe3, 0x9b, 0xe7, 0x89, 0x6a, 0x46, 0x5b, 0xf7, 0x52, - 0x45, 0x68, 0xb1, 0xe3, 0x2d, 0x82, 0x82, 0x0d, 0x0a, 0x5a, 0x95, 0xb7, 0x52, 0x93, 0x76, 0x1c, - 0xdc, 0xd2, 0xa4, 0xb5, 0xa2, 0x54, 0x74, 0x04, 0x2b, 0x03, 0x8a, 0x54, 0x75, 0xcb, 0xa6, 0x59, - 0xca, 0xb0, 0xaa, 0xf2, 0x30, 0x35, 0x51, 0x92, 0x50, 0x2d, 0x8d, 0xcf, 0x20, 0x4e, 0x47, 0x1f, - 0x0b, 0x9c, 0x75, 0x8a, 0x59, 0x9a, 0xd0, 0x16, 0xfc, 0x76, 0x2a, 0x74, 0x4b, 0xc0, 0xb4, 0x14, - 0xba, 0x85, 0x06, 0x18, 0x99, 0x83, 0xc4, 0x52, 0x1e, 0xa6, 0xd9, 0x64, 0xb3, 0x9f, 0x9b, 0x5d, - 0x93, 0x6f, 0xef, 0xe7, 0x66, 0xef, 0xc8, 0xeb, 0xfb, 0xb9, 0xd9, 0x7b, 0x72, 0x61, 0x3f, 0x37, - 0x5b, 0x90, 0x37, 0xb6, 0x76, 0x18, 0x88, 0x3c, 0x74, 0x5c, 0xd6, 0x22, 0xd0, 0x3a, 0x4c, 0x5b, - 0xb6, 0x89, 0x2f, 0xc5, 0x3c, 0xce, 0x31, 0x32, 0x27, 0x09, 0xd8, 0xf9, 0xcd, 0x14, 0x4c, 0x4f, - 0xf6, 0x7a, 0xf1, 0xb3, 0x38, 0x1c, 0x22, 0x98, 0xbd, 0xf9, 0x33, 0xb0, 0xb7, 0x94, 0x78, 0x00, - 0xb1, 0xeb, 0xcc, 0x84, 0x83, 0xb7, 0x5d, 0x6f, 0x8c, 0x83, 0xca, 0xb0, 0xe8, 0xdb, 0xf8, 0x72, - 0xe8, 0xb8, 0xd8, 0x64, 0xbd, 0x36, 0x37, 0xc9, 0xe8, 0xaa, 0x2d, 0x84, 0x4a, 0xb4, 0xc3, 0xee, - 0xc0, 0xbc, 0x43, 0xac, 0x9e, 0x65, 0xeb, 0xb4, 0xff, 0x30, 0xa4, 0x36, 0x5d, 0x5a, 0xa2, 0x6b, - 0x7e, 0xff, 0x72, 0x63, 0x86, 0xf6, 0xaa, 0x5a, 0x45, 0x03, 0x2e, 0x42, 0xbf, 0xd0, 0x87, 0x30, - 0x63, 0x32, 0xb8, 0x2d, 0x90, 0x57, 0x21, 0x6d, 0xd0, 0xe3, 0xa0, 0x3c, 0x18, 0x32, 0xb8, 0x0e, - 0xfa, 0xbf, 0x20, 0xba, 0xf9, 0x9b, 0x94, 0x83, 0xc3, 0x10, 0x71, 0x47, 0x4f, 0x61, 0xca, 0x76, - 0x2e, 0x04, 0x72, 0x9a, 0x68, 0x74, 0xa3, 0xf2, 0xcf, 0x66, 0x7f, 0xf7, 0xd5, 0x46, 0x66, 0xf4, - 0x08, 0xf5, 0xf8, 0x9f, 0x59, 0x50, 0xd2, 0xde, 0xb2, 0xe9, 0xb0, 0x51, 0x2c, 0xb5, 0xb4, 0x8e, - 0x3e, 0xf6, 0xca, 0xfa, 0x10, 0xee, 0xc7, 0x38, 0xec, 0x43, 0xad, 0xe8, 0x9a, 0x5a, 0x6e, 0x69, - 0x95, 0xf0, 0xc9, 0xf5, 0x1d, 0x78, 0x10, 0x13, 0x6b, 0xaa, 0xc7, 0xec, 0xf1, 0x55, 0x88, 0x75, - 0x5a, 0x2d, 0xbd, 0x55, 0xa7, 0x03, 0x51, 0x01, 0xd6, 0x63, 0x82, 0xe5, 0x7a, 0x4d, 0x6d, 0xd2, - 0xaf, 0x7d, 0xb5, 0x4c, 0xc7, 0xa2, 0x0d, 0xb8, 0x1b, 0xe3, 0x1f, 0x1e, 0xb5, 0xab, 0xaa, 0x16, - 0x2c, 0x2b, 0xe7, 0xd0, 0x5d, 0xb8, 0x3d, 0xee, 0x90, 0xde, 0x3e, 0x2c, 0x36, 0xe5, 0x69, 0x54, - 0x84, 0x8f, 0xe2, 0xcc, 0xba, 0xa6, 0x16, 0x2b, 0xcf, 0x47, 0x6f, 0xc0, 0x7a, 0x4b, 0xd3, 0xb5, - 0x56, 0xbd, 0xae, 0x56, 0xf4, 0x52, 0xb1, 0x7c, 0xa0, 0x1f, 0xb6, 0xda, 0xed, 0x5a, 0xa9, 0xae, - 0xb2, 0x59, 0xaf, 0xf8, 0x5c, 0x9e, 0x41, 0x1f, 0xc0, 0xd3, 0x98, 0x89, 0x4e, 0xad, 0xa1, 0xb6, - 0x3b, 0xc5, 0xc6, 0xa1, 0x5e, 0x2e, 0x96, 0xab, 0xaa, 0xf0, 0x54, 0xad, 0x8c, 0xa9, 0xe6, 0xd7, - 0x73, 0x5f, 0xfe, 0xa1, 0x90, 0x79, 0xfc, 0x75, 0xfc, 0xe1, 0x3c, 0xf2, 0xce, 0xce, 0x67, 0xba, - 0x8e, 0xf6, 0x7c, 0x3c, 0xcc, 0x6c, 0x80, 0xa4, 0x9c, 0x63, 0xad, 0xd6, 0x51, 0xc3, 0x78, 0x49, - 0x7c, 0xe2, 0xa4, 0x8c, 0xb6, 0xaa, 0xd5, 0x8a, 0xf5, 0xda, 0x67, 0xc5, 0x52, 0x5d, 0x95, 0xa7, - 0xd0, 0x1d, 0x78, 0x83, 0xd3, 0xaf, 0xbb, 0x91, 0x43, 0xf7, 0xe0, 0x0e, 0x67, 0x15, 0xdb, 0xcf, - 0x9b, 0x65, 0x61, 0x71, 0xb7, 0x58, 0xab, 0x1f, 0x69, 0xaa, 0x3c, 0xcd, 0xbd, 0xdc, 0xa2, 0x49, - 0x91, 0x7d, 0xfc, 0x0c, 0xd0, 0xf8, 0xad, 0x43, 0xb3, 0x90, 0x6b, 0xb6, 0x9a, 0xaa, 0x9c, 0x41, - 0xf3, 0x90, 0xa7, 0x61, 0x6a, 0xed, 0xee, 0xca, 0x12, 0x5a, 0x84, 0xb9, 0x5a, 0xa3, 0xa1, 0x56, - 0x6a, 0xc5, 0x8e, 0x2a, 0x67, 0x4b, 0xf7, 0xbf, 0xfd, 0x7b, 0x21, 0xf3, 0xed, 0xab, 0x82, 0xf4, - 0x97, 0x57, 0x05, 0xe9, 0xbb, 0x57, 0x05, 0xe9, 0x6f, 0xaf, 0x0a, 0xd2, 0xaf, 0xff, 0x51, 0xc8, - 0x7c, 0x96, 0x17, 0xd9, 0xfc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0x02, 0x56, 0x4f, 0xb8, - 0x1e, 0x00, 0x00, +func init() { proto.RegisterFile("roachpb/errors.proto", fileDescriptor_errors_ee43f5f6d0e525bf) } + +var fileDescriptor_errors_ee43f5f6d0e525bf = []byte{ + // 2864 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x59, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xe7, 0x52, 0x94, 0x48, 0x3d, 0x7d, 0xad, 0xc7, 0x8a, 0xbc, 0x96, 0x63, 0x4a, 0x96, 0xe3, + 0xc4, 0x71, 0x11, 0xa9, 0x70, 0x6a, 0xb4, 0x71, 0x93, 0x03, 0x3f, 0x56, 0x22, 0x25, 0x7e, 0x28, + 0x4b, 0x2a, 0x8a, 0x93, 0x16, 0x83, 0x15, 0x77, 0x44, 0x6d, 0x4c, 0xee, 0xb2, 0xb3, 0x4b, 0x89, + 0xba, 0xf5, 0x98, 0xf6, 0xd4, 0x02, 0x3d, 0xf4, 0xd6, 0x00, 0x3d, 0x05, 0xbd, 0x16, 0xf9, 0x07, + 0x7a, 0xc9, 0xa5, 0x40, 0x8f, 0x41, 0x0f, 0x46, 0xeb, 0x02, 0x45, 0xd1, 0xfe, 0x07, 0x39, 0x15, + 0xf3, 0xb1, 0xe4, 0xae, 0xb8, 0x94, 0x99, 0x9c, 0xc4, 0x7d, 0x5f, 0xf3, 0xe6, 0xcd, 0x9b, 0xf7, + 0x7e, 0x6f, 0x04, 0xab, 0xd4, 0x35, 0x5b, 0x67, 0xbd, 0x93, 0x1d, 0x42, 0xa9, 0x4b, 0xbd, 0xed, + 0x1e, 0x75, 0x7d, 0x17, 0xdd, 0x68, 0xb9, 0xad, 0xe7, 0x9c, 0xb3, 0x2d, 0xf9, 0xeb, 0x28, 0x10, + 0xb4, 0x4c, 0xdf, 0x14, 0x62, 0xeb, 0x6b, 0x01, 0xad, 0x4b, 0x7c, 0x33, 0x44, 0xbf, 0xef, 0xf9, + 0x2e, 0x35, 0xdb, 0x64, 0x87, 0x38, 0x6d, 0xdb, 0x09, 0xfe, 0x30, 0xb9, 0xf3, 0x56, 0xeb, 0x5d, + 0x29, 0xa4, 0xf5, 0x7d, 0xbb, 0xb3, 0x73, 0xd6, 0x69, 0xed, 0xf8, 0x76, 0x97, 0x78, 0xbe, 0xd9, + 0xed, 0x49, 0xce, 0x6a, 0xdb, 0x6d, 0xbb, 0xfc, 0xe7, 0x0e, 0xfb, 0x25, 0xa8, 0x5b, 0x5f, 0x25, + 0xe1, 0x66, 0xcd, 0xf5, 0x2b, 0xc4, 0xf4, 0x48, 0xc9, 0xed, 0x58, 0x84, 0xea, 0xcc, 0x65, 0x54, + 0x84, 0x34, 0x25, 0xbd, 0x8e, 0xdd, 0x32, 0x35, 0x65, 0x53, 0x79, 0xb8, 0xf0, 0xf8, 0x8d, 0xed, + 0x31, 0xef, 0xb7, 0x0d, 0x21, 0x51, 0x24, 0x5e, 0x8b, 0xda, 0x3d, 0xdf, 0xa5, 0xf9, 0xd4, 0xd7, + 0x2f, 0x36, 0x12, 0x46, 0xa0, 0x8a, 0xf6, 0x60, 0xb1, 0xc3, 0x2c, 0xe3, 0x33, 0x6e, 0x5a, 0x4b, + 0x4e, 0x6f, 0xca, 0x58, 0xe8, 0x8c, 0x7c, 0x42, 0x4f, 0x20, 0x43, 0x4d, 0xa7, 0x4d, 0xb0, 0x6d, + 0x69, 0x33, 0x9b, 0xca, 0xc3, 0x99, 0xfc, 0x3a, 0x5b, 0xe9, 0xe5, 0x8b, 0x8d, 0xb4, 0xc1, 0xe8, + 0xe5, 0xe2, 0xb7, 0xa3, 0x9f, 0x46, 0x9a, 0xcb, 0x96, 0x2d, 0xb4, 0x0d, 0xb3, 0xdc, 0x8a, 0x96, + 0xe2, 0x0b, 0x6b, 0x31, 0x0b, 0xf3, 0x9d, 0x1b, 0x42, 0x0c, 0xdd, 0x07, 0x68, 0xf5, 0x3d, 0xdf, + 0xed, 0xe2, 0xae, 0xd7, 0xd6, 0x66, 0x37, 0x95, 0x87, 0xf3, 0x72, 0x4b, 0xf3, 0x82, 0x5e, 0xf5, + 0xda, 0x4f, 0x53, 0xff, 0xf9, 0x62, 0x43, 0xd9, 0x7a, 0x1d, 0x56, 0x6b, 0xae, 0x45, 0x8e, 0x1c, + 0xf3, 0xdc, 0xb4, 0x3b, 0xe6, 0x49, 0x87, 0xf0, 0xc0, 0x49, 0xee, 0x06, 0xdc, 0x3a, 0x72, 0xbc, + 0x7e, 0xaf, 0xe7, 0x52, 0x9f, 0x58, 0x06, 0xf9, 0x45, 0x9f, 0x78, 0x7e, 0x58, 0xe0, 0x73, 0x05, + 0x10, 0x77, 0xb7, 0xe6, 0xfa, 0xbb, 0x6e, 0xdf, 0xb1, 0x44, 0xd8, 0xc3, 0xfb, 0x54, 0xa6, 0xdf, + 0xe7, 0x13, 0xc8, 0xb0, 0xe4, 0xe0, 0x6a, 0xc9, 0xa8, 0x5a, 0x83, 0xd1, 0x85, 0x9a, 0xfc, 0x69, + 0xa4, 0xb9, 0x6c, 0xd9, 0x92, 0xae, 0xfc, 0x21, 0x09, 0xaf, 0x71, 0x8b, 0x07, 0xe4, 0xb2, 0x6a, + 0x7b, 0x5d, 0xd3, 0x6f, 0x9d, 0x09, 0x6f, 0xde, 0x85, 0x1b, 0x54, 0xb8, 0x8e, 0x3d, 0xdf, 0xa4, + 0x3e, 0x7e, 0x4e, 0x2e, 0xb9, 0x5b, 0x8b, 0xf9, 0xf4, 0xb7, 0x2f, 0x36, 0x66, 0x0e, 0xc8, 0xa5, + 0xb1, 0x22, 0x25, 0x1a, 0x4c, 0xe0, 0x80, 0x5c, 0xa2, 0x1d, 0x08, 0x48, 0x98, 0x38, 0x16, 0x57, + 0x49, 0x46, 0x55, 0x96, 0x24, 0x5f, 0x77, 0x2c, 0xa6, 0x50, 0x05, 0xb5, 0x2b, 0x97, 0x25, 0x16, + 0xe6, 0x5b, 0xe2, 0x67, 0xbc, 0xf0, 0x78, 0x2b, 0x2e, 0x51, 0x18, 0x3f, 0x94, 0x26, 0x2b, 0x23, + 0x5d, 0xce, 0x42, 0x07, 0xb0, 0xe2, 0xf5, 0xdb, 0x6d, 0xe2, 0xf9, 0x43, 0x6b, 0xa9, 0xa9, 0xad, + 0x2d, 0x0f, 0x55, 0x39, 0x47, 0x46, 0xe8, 0x7f, 0x49, 0xd8, 0x32, 0x88, 0x69, 0x1d, 0xdb, 0xfe, + 0x99, 0xed, 0x1c, 0x39, 0x2d, 0x42, 0x7d, 0xd3, 0x76, 0xfc, 0xcb, 0xb2, 0xe3, 0x13, 0x7a, 0x6e, + 0x76, 0x44, 0xb8, 0xf6, 0x61, 0x99, 0x12, 0xd3, 0xc2, 0xc3, 0x9b, 0x27, 0xaf, 0xce, 0xdd, 0xd0, + 0xc2, 0xec, 0x7a, 0x6e, 0x9f, 0x75, 0x5a, 0xdb, 0xcd, 0x40, 0x48, 0x26, 0xd8, 0x12, 0x53, 0x1d, + 0x12, 0x91, 0x01, 0x88, 0x0c, 0x6c, 0xcf, 0xb7, 0x9d, 0x76, 0xc8, 0x5e, 0x72, 0x7a, 0x7b, 0x37, + 0x02, 0xf5, 0x91, 0xcd, 0x3c, 0x2c, 0x75, 0xcd, 0x41, 0xc8, 0xdc, 0xcc, 0x14, 0xe6, 0x8c, 0xc5, + 0xae, 0x39, 0x18, 0xd9, 0xf8, 0x14, 0x6e, 0xba, 0x27, 0x1e, 0xa1, 0xe7, 0x24, 0xb4, 0x4f, 0x4f, + 0x4b, 0x6d, 0xce, 0x4c, 0xb8, 0xd8, 0x75, 0x29, 0x7d, 0xd5, 0x3f, 0xe4, 0x5e, 0x65, 0x78, 0x32, + 0xda, 0x9f, 0xc1, 0xad, 0x26, 0x35, 0x1d, 0xcf, 0x6c, 0xf9, 0xb6, 0xeb, 0xe4, 0x4e, 0xf8, 0x15, + 0x12, 0x11, 0x2e, 0xc3, 0x1c, 0x25, 0xa6, 0xe7, 0x3a, 0x3c, 0xb2, 0xcb, 0x8f, 0x7f, 0x10, 0xb3, + 0xe0, 0xb8, 0xae, 0xc1, 0x55, 0xe4, 0xba, 0xd2, 0x80, 0x5c, 0xcb, 0x84, 0xd5, 0x90, 0xfc, 0x61, + 0xdf, 0x93, 0x99, 0x5f, 0x00, 0xe8, 0xf5, 0xbd, 0x33, 0x42, 0xb0, 0x3f, 0x70, 0xe4, 0x31, 0x66, + 0xaf, 0x5f, 0x2c, 0x28, 0x14, 0x42, 0xaf, 0x39, 0x08, 0x96, 0xf8, 0x95, 0x02, 0xaf, 0x85, 0xc4, + 0x0c, 0xe2, 0xd3, 0x4b, 0xb1, 0xc8, 0xde, 0x95, 0xdd, 0xbc, 0x7d, 0xfd, 0x02, 0x5c, 0x33, 0x6e, + 0x2f, 0xe8, 0x1e, 0xcc, 0x93, 0x81, 0x4f, 0x4d, 0x5e, 0xb5, 0x92, 0xa1, 0xaa, 0x95, 0xe1, 0xe4, + 0x51, 0xd1, 0xfa, 0x46, 0x81, 0xb5, 0x90, 0xc5, 0x86, 0x6f, 0xfa, 0x7d, 0x4f, 0x38, 0xb3, 0x06, + 0x33, 0x4c, 0x5b, 0x09, 0x69, 0x33, 0x02, 0xaa, 0x0d, 0x9d, 0x4c, 0x72, 0x27, 0x7f, 0x78, 0xbd, + 0x93, 0x21, 0x93, 0xdb, 0x71, 0xbe, 0x6e, 0x1d, 0xc2, 0x9c, 0xa0, 0x23, 0x04, 0xcb, 0x86, 0x9e, + 0x6b, 0xd4, 0x6b, 0xf8, 0xa8, 0x76, 0x50, 0xab, 0x1f, 0xd7, 0xd4, 0x04, 0xd2, 0x60, 0x55, 0xd2, + 0x9a, 0x1f, 0xd7, 0x70, 0xad, 0xde, 0xc4, 0xbb, 0xf5, 0xa3, 0x5a, 0x51, 0x55, 0xae, 0x70, 0x0a, + 0xf5, 0x6a, 0xb5, 0xdc, 0x6c, 0xea, 0x45, 0x35, 0x29, 0xb7, 0xf6, 0x0c, 0xd4, 0x63, 0x6a, 0xfb, + 0x84, 0x5d, 0x49, 0x47, 0x94, 0x5a, 0xf4, 0x1e, 0xa4, 0x6d, 0xfe, 0xe9, 0x69, 0x0a, 0x4f, 0xd0, + 0xdb, 0x31, 0xce, 0x0b, 0x85, 0xa0, 0x73, 0x49, 0x79, 0x61, 0x74, 0x3f, 0x95, 0x49, 0xaa, 0x33, + 0x5b, 0x7f, 0x52, 0xa4, 0xed, 0xa6, 0xeb, 0xd6, 0x3b, 0x32, 0x15, 0x73, 0x30, 0xff, 0xbd, 0xee, + 0xf9, 0x48, 0x0b, 0xd5, 0x40, 0x35, 0x5b, 0x7e, 0xdf, 0xec, 0x7c, 0xbf, 0x1b, 0xbe, 0x22, 0x94, + 0x87, 0x64, 0x19, 0x88, 0x75, 0x40, 0xf5, 0x1e, 0xeb, 0x38, 0x36, 0x25, 0x5e, 0x73, 0xe0, 0x84, + 0xbb, 0xce, 0x33, 0x58, 0x2d, 0xb8, 0x8e, 0x65, 0xb3, 0x93, 0xda, 0x35, 0xed, 0x4e, 0x70, 0xaf, + 0x7e, 0x0a, 0x8b, 0xd2, 0x93, 0x73, 0xb3, 0xd3, 0x27, 0x72, 0x3f, 0x71, 0xed, 0xf2, 0x23, 0xc6, + 0x37, 0x16, 0x84, 0x34, 0xff, 0x90, 0xa6, 0xff, 0xac, 0x00, 0x12, 0xbd, 0x94, 0x7c, 0x46, 0x5a, + 0xc3, 0x1b, 0x9b, 0x85, 0x74, 0x97, 0x78, 0x9e, 0xd9, 0x26, 0x91, 0xd4, 0x0a, 0x88, 0xe8, 0x7d, + 0x98, 0x97, 0xdd, 0x80, 0x58, 0x72, 0xf3, 0x13, 0xbb, 0x74, 0x10, 0xc1, 0xa1, 0x02, 0x7a, 0x0a, + 0x99, 0xa0, 0xcc, 0xc9, 0x62, 0xf6, 0x2a, 0xe5, 0xa1, 0xbc, 0x74, 0xfb, 0xc7, 0x30, 0xdf, 0x20, + 0xce, 0x74, 0xce, 0x46, 0x92, 0xe2, 0x02, 0x56, 0x73, 0xdd, 0x13, 0xbb, 0xdd, 0x77, 0xfb, 0x9e, + 0x41, 0xbc, 0x7e, 0xc7, 0x9f, 0x6e, 0xc3, 0xef, 0xc1, 0xc2, 0x05, 0x35, 0x7b, 0x3d, 0x62, 0x61, + 0x42, 0xe9, 0x35, 0x5b, 0xe6, 0xe6, 0x0c, 0x90, 0xc2, 0x3a, 0x0d, 0xce, 0xf0, 0x2e, 0xeb, 0xd6, + 0xa7, 0xfe, 0x1e, 0x75, 0xfb, 0xbd, 0x22, 0xe9, 0x90, 0x20, 0xd4, 0x92, 0x4d, 0x60, 0x4d, 0x62, + 0xa9, 0x82, 0x4b, 0x69, 0xbf, 0xc7, 0x8e, 0x5a, 0x78, 0xc6, 0xaa, 0x04, 0xfb, 0x81, 0xaf, 0xde, + 0xf3, 0x0c, 0x27, 0x57, 0xbd, 0x36, 0xda, 0x82, 0xf9, 0x1e, 0x75, 0x5b, 0xc4, 0xf3, 0xe4, 0x69, + 0x64, 0x86, 0x55, 0x2d, 0x20, 0x0f, 0x33, 0x09, 0xc9, 0x65, 0xc2, 0x97, 0xe2, 0x03, 0x00, 0x09, + 0xfd, 0x02, 0x00, 0x33, 0x9b, 0xcf, 0x4a, 0x24, 0x32, 0x2f, 0xe5, 0x39, 0x16, 0x19, 0x7d, 0xb0, + 0xe3, 0x14, 0x3f, 0x03, 0xd3, 0x1f, 0x02, 0xe2, 0x48, 0x65, 0x0c, 0x19, 0x0d, 0x21, 0x8e, 0xf2, + 0x5d, 0x21, 0x4e, 0x95, 0xc1, 0xb1, 0x33, 0xd3, 0xb1, 0x3a, 0xac, 0x1b, 0xf8, 0xf4, 0x72, 0x88, + 0xd7, 0xd0, 0x63, 0x48, 0xf5, 0x74, 0x4a, 0xaf, 0x49, 0x79, 0x2e, 0x27, 0xe3, 0xc0, 0x65, 0xb7, + 0xfe, 0xab, 0xc0, 0x83, 0xab, 0x85, 0x99, 0x61, 0x83, 0x43, 0x06, 0xa9, 0x0d, 0x72, 0x4a, 0x49, + 0xd0, 0x47, 0x26, 0x55, 0xd5, 0x4f, 0x61, 0xce, 0x1f, 0x38, 0x01, 0x5c, 0x5b, 0xcc, 0x17, 0x19, + 0xeb, 0xef, 0x2f, 0x36, 0xde, 0x6d, 0xdb, 0xfe, 0x59, 0xff, 0x64, 0xbb, 0xe5, 0x76, 0x77, 0x86, + 0x9e, 0x58, 0x27, 0xa3, 0xdf, 0x3b, 0xbd, 0xe7, 0xed, 0x1d, 0x8e, 0xf1, 0xfb, 0x7d, 0xdb, 0xda, + 0x3e, 0x3a, 0x2a, 0x17, 0x5f, 0xbe, 0xd8, 0x98, 0x6d, 0x0e, 0x9c, 0x72, 0xd1, 0x98, 0xf5, 0x07, + 0x4e, 0xd9, 0x42, 0xbb, 0xb0, 0xe0, 0x8f, 0xbc, 0x93, 0x17, 0x63, 0xba, 0xee, 0x15, 0x56, 0x94, + 0xb1, 0xab, 0xc0, 0x46, 0x73, 0xe0, 0xe4, 0x3a, 0x0c, 0x9f, 0x5c, 0xea, 0x4e, 0xcb, 0xed, 0x33, + 0xd0, 0x23, 0x93, 0x4e, 0xec, 0xf2, 0x3e, 0x40, 0x8f, 0x92, 0x73, 0xcc, 0xf3, 0x28, 0xb2, 0xd9, + 0x79, 0x46, 0x0f, 0xa7, 0xe7, 0x6f, 0x15, 0x58, 0x65, 0x15, 0xb7, 0x4d, 0x68, 0xfd, 0x9c, 0xd0, + 0xd3, 0x8e, 0x7b, 0x21, 0x6c, 0xdc, 0x86, 0x99, 0x18, 0x74, 0xc9, 0x68, 0xe8, 0x6d, 0x58, 0x6a, + 0xf5, 0x29, 0x25, 0x8e, 0x2f, 0xcb, 0x93, 0x80, 0xb8, 0x62, 0x85, 0x45, 0xc9, 0xe2, 0xb5, 0x08, + 0xbd, 0x03, 0x2b, 0xb6, 0xd3, 0xa2, 0xa4, 0x3b, 0x12, 0x9e, 0x09, 0x09, 0x2f, 0x0f, 0x99, 0xe1, + 0xd2, 0x55, 0x85, 0x1b, 0x55, 0x7b, 0x40, 0xac, 0x46, 0xbf, 0xc5, 0x72, 0x3c, 0xc8, 0x8b, 0xb4, + 0xbc, 0x7a, 0xaf, 0x4a, 0x0d, 0x23, 0x10, 0x94, 0xe6, 0xbe, 0x54, 0xe0, 0x4e, 0x9e, 0x21, 0xd2, + 0x51, 0xc1, 0x26, 0xa7, 0x2e, 0x25, 0x7b, 0x85, 0x61, 0xe7, 0x68, 0x7e, 0xaf, 0xce, 0x31, 0x42, + 0x61, 0xcc, 0xc4, 0x19, 0xcb, 0x32, 0xb7, 0x63, 0x7d, 0x97, 0x96, 0x31, 0xd2, 0x92, 0xbe, 0x7a, + 0x80, 0x44, 0xff, 0xab, 0xda, 0x9e, 0x67, 0x3b, 0x6d, 0xe1, 0xe1, 0xfb, 0xb0, 0x78, 0x41, 0x5d, + 0xa7, 0x8d, 0x45, 0x37, 0x94, 0x4e, 0x4e, 0x6e, 0x9e, 0xc6, 0x02, 0x17, 0x17, 0x1f, 0xc1, 0x49, + 0x26, 0xc7, 0x4f, 0x72, 0x34, 0x3a, 0x55, 0x09, 0x6d, 0x93, 0xb2, 0x73, 0x48, 0xdd, 0x36, 0x0d, + 0x42, 0x2e, 0xb9, 0xbf, 0x4b, 0xc2, 0x4d, 0x0e, 0xbe, 0x77, 0x89, 0xbc, 0xac, 0xc2, 0xa9, 0x83, + 0x2b, 0x68, 0xe9, 0x9d, 0x49, 0x70, 0x3e, 0xaa, 0x17, 0x8f, 0x42, 0xbe, 0x54, 0x86, 0x30, 0x64, + 0x1d, 0xd6, 0x24, 0xb0, 0x30, 0xf4, 0xc3, 0x4a, 0xb9, 0x90, 0xc3, 0x86, 0x5e, 0xad, 0x7f, 0xa4, + 0x17, 0xd5, 0x04, 0x5a, 0x03, 0x14, 0xf0, 0x72, 0xb5, 0x3d, 0x1d, 0x37, 0x0e, 0x2b, 0xe5, 0xa6, + 0xaa, 0xa0, 0x5b, 0x70, 0x33, 0x42, 0xaf, 0xea, 0xc6, 0x1e, 0xc3, 0x22, 0x21, 0x94, 0x62, 0xe4, + 0x76, 0x9b, 0xb8, 0x51, 0xcb, 0x1d, 0x36, 0x4a, 0xf5, 0xa6, 0x3a, 0x83, 0xb2, 0xb0, 0x2e, 0x39, + 0x95, 0xfa, 0x5e, 0xb9, 0x90, 0xab, 0xe0, 0xfa, 0x61, 0x03, 0x57, 0xcb, 0x8d, 0x46, 0xb9, 0xb6, + 0xa7, 0xa6, 0x42, 0x9a, 0x8d, 0x4a, 0xfd, 0x18, 0x17, 0xea, 0xb5, 0xc6, 0x51, 0x55, 0x37, 0xd4, + 0x59, 0x19, 0x96, 0xbf, 0xac, 0xc2, 0x02, 0xdf, 0x50, 0x91, 0xf8, 0xa6, 0xdd, 0x41, 0x06, 0xa8, + 0x8e, 0xeb, 0xe3, 0xc8, 0x78, 0x2d, 0xce, 0xe9, 0xcd, 0x98, 0xc0, 0xc4, 0x8c, 0xf8, 0xa5, 0x84, + 0xb1, 0xec, 0x44, 0xc8, 0xa8, 0x0e, 0x2b, 0x62, 0xfa, 0x64, 0x96, 0x4f, 0x59, 0xed, 0x95, 0xc9, + 0xf5, 0x60, 0x52, 0xac, 0x23, 0x35, 0xba, 0xc4, 0xa6, 0x98, 0x30, 0x15, 0x7d, 0x0c, 0x48, 0x18, + 0x7c, 0x4e, 0x2e, 0x71, 0x30, 0xa8, 0xc9, 0x82, 0xf4, 0x70, 0x92, 0xcd, 0xab, 0x63, 0x68, 0x29, + 0x61, 0xa8, 0xf4, 0x0a, 0x03, 0xfd, 0x52, 0x81, 0x4d, 0x3e, 0x6c, 0x5d, 0xf0, 0x99, 0x0c, 0xf7, + 0x47, 0x43, 0x19, 0xcf, 0x5a, 0x36, 0x95, 0xc9, 0xb9, 0xef, 0x49, 0xec, 0x73, 0xc3, 0xab, 0xa6, + 0xb9, 0x52, 0xc2, 0xb8, 0x4b, 0xaf, 0x93, 0x42, 0x3f, 0x87, 0x9b, 0xa1, 0x6a, 0x89, 0x4d, 0x31, + 0x6c, 0xf0, 0x57, 0x83, 0x85, 0xc7, 0x8f, 0xa6, 0x9a, 0x4c, 0x82, 0x95, 0x90, 0x3f, 0xc6, 0x42, + 0x4d, 0x50, 0xc3, 0xe6, 0xd9, 0x58, 0xa1, 0xcd, 0x71, 0xdb, 0x6f, 0x5d, 0x6f, 0x7b, 0x38, 0xc5, + 0x94, 0x12, 0xc6, 0x8a, 0x1f, 0xa5, 0xa3, 0x63, 0xb8, 0x11, 0xb6, 0x4a, 0xd9, 0x3d, 0xd1, 0xd2, + 0x13, 0x0f, 0x24, 0x76, 0x70, 0x61, 0x07, 0xe2, 0x5f, 0x61, 0xa0, 0x4f, 0x20, 0xbc, 0x09, 0xec, + 0xf1, 0x39, 0x40, 0xcb, 0x70, 0xcb, 0x6f, 0x4f, 0x3d, 0x33, 0x94, 0x12, 0x46, 0xd8, 0x3f, 0xc1, + 0x41, 0x25, 0x56, 0x8f, 0x6c, 0x9f, 0x04, 0xf5, 0x68, 0x9e, 0x5b, 0xbd, 0x1f, 0x63, 0xf5, 0xea, + 0x08, 0x50, 0x4a, 0xb0, 0xda, 0x34, 0xa4, 0xa1, 0x32, 0x2c, 0x09, 0x4b, 0xbe, 0xeb, 0x62, 0x56, + 0x3c, 0xe1, 0x7a, 0x53, 0x21, 0x70, 0x33, 0x34, 0x25, 0x68, 0xec, 0xb2, 0xb8, 0x3d, 0x4c, 0x25, + 0xd0, 0xe6, 0x73, 0xe2, 0xc2, 0xc4, 0xcb, 0x32, 0x8e, 0xc8, 0xd9, 0x65, 0x71, 0xc3, 0x54, 0x76, + 0xe0, 0xad, 0x00, 0x9c, 0xe3, 0x53, 0x8e, 0xce, 0xb5, 0xc5, 0x89, 0x07, 0x1e, 0x87, 0xe3, 0xd9, + 0x81, 0xb7, 0xa2, 0x74, 0x54, 0x83, 0x65, 0x51, 0x23, 0xa8, 0xc4, 0xe5, 0xda, 0xd2, 0x44, 0x2f, + 0xc7, 0xf1, 0x3b, 0xf3, 0xb2, 0x13, 0xa6, 0x32, 0x2f, 0x1d, 0xd7, 0x22, 0xb8, 0x3f, 0x7a, 0xf8, + 0xd2, 0x96, 0x27, 0x7a, 0x19, 0xf7, 0x44, 0xc6, 0xbc, 0x74, 0xa2, 0x74, 0x86, 0xc2, 0x3c, 0xe2, + 0x58, 0xda, 0x0a, 0xb7, 0xf4, 0x7a, 0x8c, 0xa5, 0x21, 0x4a, 0x2f, 0x25, 0x0c, 0x2e, 0x2b, 0x8a, + 0xcb, 0xa9, 0x8f, 0xdb, 0x0c, 0x09, 0x63, 0x4b, 0x40, 0x61, 0x4d, 0xbd, 0xa6, 0xb8, 0xc4, 0xa0, + 0x66, 0x51, 0x5c, 0xa2, 0x0c, 0x96, 0xcb, 0x01, 0x8c, 0x6d, 0x0d, 0x41, 0xb4, 0x76, 0x63, 0x62, + 0x2e, 0xc7, 0x03, 0x6e, 0x96, 0xcb, 0xf4, 0x2a, 0x87, 0xd7, 0x58, 0x69, 0x3b, 0xc8, 0x41, 0x34, + 0xb9, 0xc6, 0x8e, 0x41, 0x6c, 0x5e, 0x63, 0xc3, 0x54, 0x76, 0x20, 0x66, 0x30, 0x88, 0x60, 0xca, + 0x27, 0x11, 0x6d, 0x7d, 0xe2, 0x81, 0xc4, 0xcd, 0x2c, 0xec, 0x40, 0xcc, 0x28, 0x9d, 0xb9, 0x29, + 0xe0, 0xf6, 0xa8, 0x15, 0xdc, 0x99, 0xe8, 0xe6, 0x38, 0x5c, 0x67, 0x6e, 0x7a, 0x61, 0x2a, 0xfa, + 0xb5, 0x02, 0x6f, 0x8c, 0x55, 0x1e, 0x5e, 0xbd, 0x31, 0x7f, 0x89, 0xc6, 0x54, 0xe0, 0x66, 0xed, + 0x75, 0xbe, 0xcc, 0x4f, 0xa6, 0x28, 0x46, 0xb1, 0x90, 0xbb, 0x94, 0x30, 0x36, 0xfd, 0x57, 0x08, + 0xb2, 0x98, 0xd9, 0x02, 0x84, 0x62, 0x57, 0xa2, 0x50, 0x6d, 0x63, 0x62, 0xcc, 0xe2, 0xf0, 0x2a, + 0x8b, 0x99, 0x1d, 0xa5, 0xb3, 0x86, 0xd0, 0x1f, 0x3d, 0xfa, 0x62, 0x39, 0xa6, 0x6a, 0x9b, 0x13, + 0x1b, 0xc2, 0x84, 0x27, 0x62, 0xd6, 0x10, 0xfa, 0x63, 0x2c, 0x74, 0x00, 0x4b, 0x5d, 0x06, 0x53, + 0xb1, 0x27, 0x70, 0xaa, 0x76, 0x6f, 0xe2, 0x6b, 0xfa, 0x18, 0x9c, 0x2d, 0x25, 0x8c, 0xc5, 0x6e, + 0x88, 0x88, 0x3e, 0x05, 0x75, 0xf8, 0xe8, 0x80, 0x4f, 0x38, 0x3e, 0xd5, 0xb6, 0xb8, 0xbd, 0xed, + 0x18, 0x7b, 0xd7, 0xc0, 0x59, 0xde, 0x64, 0xa2, 0x1c, 0x74, 0x01, 0x77, 0xd9, 0x74, 0x63, 0x8a, + 0x99, 0x01, 0x93, 0xd1, 0xd0, 0x20, 0x47, 0x84, 0xfb, 0x7c, 0xa5, 0xc7, 0x71, 0x67, 0x7c, 0xfd, + 0xa8, 0x51, 0x4a, 0x18, 0xeb, 0xfe, 0x44, 0x11, 0x56, 0xec, 0x44, 0x8b, 0x60, 0x60, 0x83, 0xe1, + 0x59, 0xed, 0x8d, 0x89, 0x49, 0x3b, 0x8e, 0x7b, 0x59, 0xd2, 0xda, 0x61, 0x2a, 0x3a, 0x82, 0x1b, + 0x5d, 0x86, 0x54, 0xb1, 0xed, 0xb0, 0x2c, 0xe5, 0x58, 0x55, 0x7b, 0x30, 0x31, 0x51, 0xe2, 0x50, + 0x2d, 0x8b, 0x4f, 0x37, 0x4a, 0x47, 0x1f, 0x4a, 0x9c, 0x75, 0x4a, 0x78, 0x9a, 0xb0, 0x16, 0xfc, + 0xe6, 0x44, 0xe8, 0x16, 0x83, 0x69, 0x19, 0x74, 0x1b, 0x1a, 0xe0, 0x64, 0x01, 0x12, 0xf3, 0x69, + 0x98, 0xe5, 0x43, 0xcf, 0x7e, 0x2a, 0xb3, 0xa6, 0xde, 0xda, 0x4f, 0x65, 0x6e, 0xab, 0xeb, 0xfb, + 0xa9, 0xcc, 0x5d, 0x35, 0xbb, 0x9f, 0xca, 0x64, 0xd5, 0x8d, 0xad, 0x1d, 0x0e, 0x22, 0x0f, 0x5d, + 0x8f, 0xb7, 0x08, 0xb4, 0x0e, 0xb3, 0xb6, 0x63, 0x91, 0x81, 0x1c, 0xd5, 0x05, 0x46, 0x16, 0x24, + 0x09, 0x3b, 0xbf, 0x9a, 0x81, 0xd9, 0xe9, 0x1e, 0x36, 0x7e, 0x16, 0x85, 0x43, 0x94, 0xf0, 0x7f, + 0x19, 0x70, 0xb0, 0xb7, 0x1c, 0x7b, 0x00, 0x91, 0xeb, 0xcc, 0x85, 0x83, 0xa7, 0x61, 0x7f, 0x8c, + 0x83, 0x0a, 0xb0, 0xd4, 0x77, 0xc8, 0xa0, 0xe7, 0x7a, 0xc4, 0xe2, 0xbd, 0x36, 0x35, 0xcd, 0x54, + 0x6b, 0x2c, 0x0e, 0x95, 0x58, 0x87, 0xdd, 0x81, 0x05, 0x97, 0xda, 0x6d, 0xdb, 0xc1, 0xac, 0xff, + 0x70, 0xa4, 0x36, 0x9b, 0x5f, 0x66, 0x6b, 0x7e, 0xfb, 0x62, 0x63, 0x8e, 0xf5, 0xaa, 0x72, 0xd1, + 0x00, 0x21, 0xc2, 0xbe, 0xd0, 0xfb, 0x30, 0x67, 0x71, 0xb8, 0x2d, 0x91, 0x57, 0x76, 0xd2, 0x0c, + 0x28, 0x40, 0x79, 0x30, 0x64, 0x08, 0x1d, 0xf4, 0xa3, 0x20, 0xba, 0xe9, 0xeb, 0x94, 0x83, 0xc3, + 0x90, 0x71, 0x47, 0x4f, 0x60, 0xc6, 0x71, 0x2f, 0x24, 0x72, 0x9a, 0x6a, 0xaa, 0x63, 0xf2, 0x4f, + 0x33, 0xbf, 0xff, 0x62, 0x23, 0x31, 0x7a, 0x9f, 0x7a, 0xf4, 0xef, 0x24, 0x68, 0x93, 0x9e, 0xc2, + 0xd9, 0xb0, 0x91, 0xcb, 0xd7, 0x8d, 0x26, 0x1e, 0x7b, 0x80, 0x7d, 0x00, 0xf7, 0x22, 0x1c, 0xfe, + 0xa1, 0x17, 0xb1, 0xa1, 0x17, 0xea, 0x46, 0x71, 0xf8, 0x1a, 0xfb, 0x16, 0xdc, 0x8f, 0x88, 0xd5, + 0xf4, 0x63, 0xfe, 0x2e, 0x2b, 0xc5, 0x9a, 0xf5, 0x3a, 0xae, 0x57, 0xd8, 0x40, 0x94, 0x85, 0xf5, + 0x88, 0x60, 0xa1, 0x52, 0xd6, 0x6b, 0xec, 0x6b, 0x5f, 0x2f, 0xb0, 0xb1, 0x68, 0x03, 0xee, 0x44, + 0xf8, 0x87, 0x47, 0x8d, 0x92, 0x6e, 0x04, 0xcb, 0xaa, 0x29, 0x74, 0x07, 0x6e, 0x8d, 0x3b, 0x84, + 0x1b, 0x87, 0xb9, 0x9a, 0x3a, 0x8b, 0x72, 0xf0, 0x41, 0x94, 0x59, 0x31, 0xf4, 0x5c, 0xf1, 0xd9, + 0xe8, 0x79, 0x18, 0xd7, 0x0d, 0x6c, 0xd4, 0x2b, 0x15, 0xbd, 0x88, 0xf3, 0xb9, 0xc2, 0x01, 0x3e, + 0xac, 0x37, 0x1a, 0xe5, 0x7c, 0x45, 0xe7, 0xb3, 0x5e, 0xee, 0x99, 0x3a, 0x87, 0xde, 0x83, 0x27, + 0x11, 0x13, 0xcd, 0x72, 0x55, 0x6f, 0x34, 0x73, 0xd5, 0x43, 0x5c, 0xc8, 0x15, 0x4a, 0xba, 0xf4, + 0x54, 0x2f, 0x8e, 0xa9, 0xa6, 0xd7, 0x53, 0x9f, 0xff, 0x31, 0x9b, 0x78, 0xf4, 0xd7, 0xe8, 0x9b, + 0x7a, 0xe8, 0x95, 0x5e, 0xcc, 0x74, 0x4d, 0xe3, 0xd9, 0x78, 0x98, 0xf9, 0x00, 0xc9, 0x38, 0xc7, + 0x46, 0xb9, 0xa9, 0x0f, 0xe3, 0xa5, 0x88, 0x89, 0x93, 0x31, 0x1a, 0xba, 0x51, 0xce, 0x55, 0xca, + 0x9f, 0xe4, 0xf2, 0x15, 0x5d, 0x9d, 0x41, 0xb7, 0xe1, 0x35, 0x41, 0xbf, 0xea, 0x46, 0x0a, 0xdd, + 0x85, 0xdb, 0x82, 0x95, 0x6b, 0x3c, 0xab, 0x15, 0xa4, 0xc5, 0xdd, 0x5c, 0xb9, 0x72, 0x64, 0xe8, + 0xea, 0x2c, 0xda, 0x82, 0xac, 0x60, 0x8b, 0xa0, 0xe0, 0xa2, 0x9e, 0x2b, 0x56, 0xca, 0x35, 0x1d, + 0xeb, 0x1f, 0x17, 0x74, 0xbd, 0xa8, 0x17, 0xd5, 0x39, 0xb1, 0x93, 0x2d, 0x96, 0x38, 0xc9, 0x47, + 0x4f, 0x01, 0x8d, 0xdf, 0x4c, 0x94, 0x81, 0x54, 0xad, 0x5e, 0xd3, 0xd5, 0x04, 0x5a, 0x80, 0x34, + 0x0b, 0x65, 0x7d, 0x77, 0x57, 0x55, 0xd0, 0x12, 0xcc, 0x97, 0xab, 0x55, 0xbd, 0x58, 0xce, 0x35, + 0x75, 0x35, 0x99, 0xbf, 0xf7, 0xf5, 0x3f, 0xb3, 0x89, 0xaf, 0x5f, 0x66, 0x95, 0xbf, 0xbd, 0xcc, + 0x2a, 0xdf, 0xbc, 0xcc, 0x2a, 0xff, 0x78, 0x99, 0x55, 0x7e, 0xf3, 0xaf, 0x6c, 0xe2, 0x93, 0xb4, + 0xcc, 0xf8, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x85, 0x13, 0x03, 0xac, 0x1b, 0x1f, 0x00, 0x00, } diff --git a/pkg/roachpb/errors.proto b/pkg/roachpb/errors.proto index 5f6aa6488b37..0445b4561cc2 100644 --- a/pkg/roachpb/errors.proto +++ b/pkg/roachpb/errors.proto @@ -212,6 +212,8 @@ enum TransactionRetryReason { RETRY_POSSIBLE_REPLAY = 4; // An asynchronous write was observed to have failed. RETRY_ASYNC_WRITE_FAILURE = 5; + // The transaction exceeded its deadline. + RETRY_COMMIT_DEADLINE_EXCEEDED = 6; } // A TransactionRetryError indicates that the transaction must be @@ -220,6 +222,7 @@ message TransactionRetryError { option (gogoproto.equal) = true; optional TransactionRetryReason reason = 1 [(gogoproto.nullable) = false]; + optional string extra_msg = 2 [(gogoproto.nullable) = false]; } // A TransactionStatusError indicates that the transaction status is @@ -447,6 +450,8 @@ message IntentMissingError { // The non-matching intent that was found at that key, if any. optional Intent wrong_intent = 1; + // The key where the intent was expected. + optional bytes key = 2 [(gogoproto.casttype) = "Key"]; } // A MergeInProgressError indicates that the request could not be completed diff --git a/pkg/sql/as_of_test.go b/pkg/sql/as_of_test.go index 3d2d0f5dc7ff..ab6b609cbb45 100644 --- a/pkg/sql/as_of_test.go +++ b/pkg/sql/as_of_test.go @@ -301,7 +301,8 @@ func TestAsOfRetry(t *testing.T) { } if count > 0 && bytes.Contains(req.Key, []byte(key)) { magicVals.restartCounts[key]-- - err := roachpb.NewTransactionRetryError(roachpb.RETRY_REASON_UNKNOWN) + err := roachpb.NewTransactionRetryError( + roachpb.RETRY_REASON_UNKNOWN, "filter err") magicVals.failedValues[string(req.Key)] = failureRecord{err, args.Hdr.Txn} txn := args.Hdr.Txn.Clone() diff --git a/pkg/sql/distsql_running_test.go b/pkg/sql/distsql_running_test.go index 0ca03e450fb1..68c350b6dae4 100644 --- a/pkg/sql/distsql_running_test.go +++ b/pkg/sql/distsql_running_test.go @@ -213,7 +213,7 @@ func TestDistSQLReceiverErrorRanking(t *testing.T) { retryErr := roachpb.NewErrorWithTxn( roachpb.NewTransactionRetryError( - roachpb.RETRY_SERIALIZABLE), + roachpb.RETRY_SERIALIZABLE, "test err"), txn.Serialize()).GoError() abortErr := roachpb.NewErrorWithTxn( diff --git a/pkg/sql/lease_test.go b/pkg/sql/lease_test.go index 91f8ee7400a6..18eef47558d7 100644 --- a/pkg/sql/lease_test.go +++ b/pkg/sql/lease_test.go @@ -33,6 +33,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/server" "github.com/cockroachdb/cockroach/pkg/sql" + "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" "github.com/cockroachdb/cockroach/pkg/sql/tests" "github.com/cockroachdb/cockroach/pkg/testutils" @@ -43,6 +44,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/syncutil" "github.com/cockroachdb/cockroach/pkg/util/timeutil" "github.com/cockroachdb/cockroach/pkg/util/tracing" + "github.com/lib/pq" "github.com/pkg/errors" ) @@ -1010,10 +1012,14 @@ INSERT INTO t.kv VALUES ('a', 'b'); t.Fatal(err) } - deadlineError := "TransactionStatusError: transaction deadline exceeded" - if err := txWrite.Commit(); !testutils.IsError(err, deadlineError) { - t.Fatalf("err = %v", err) + checkDeadlineErr := func(err error, t *testing.T) { + pqe, ok := err.(*pq.Error) + if !ok || pqe.Code != pgerror.CodeSerializationFailureError || + !testutils.IsError(err, "RETRY_COMMIT_DEADLINE_EXCEEDED") { + t.Fatalf("expected deadline exceeded, got: %v", err) + } } + checkDeadlineErr(txWrite.Commit(), t) // Test the deadline exceeded error with a CREATE/DROP INDEX. txWrite, err = sqlDB.Begin() @@ -1037,17 +1043,13 @@ INSERT INTO t.kv VALUES ('a', 'b'); t.Fatal(err) } - if err := txWrite.Commit(); !testutils.IsError(err, deadlineError) { - t.Fatalf("err = %v", err) - } + checkDeadlineErr(txWrite.Commit(), t) if _, err := txUpdate.Exec(`UPDATE t.kv SET v = 'c' WHERE k = 'a';`); err != nil { t.Fatal(err) } - if err := txUpdate.Commit(); !testutils.IsError(err, deadlineError) { - t.Fatalf("err = %v", err) - } + checkDeadlineErr(txUpdate.Commit(), t) txWrite, err = sqlDB.Begin() if err != nil { diff --git a/pkg/sql/txn_restart_test.go b/pkg/sql/txn_restart_test.go index 45f76fec6746..410df9dec491 100644 --- a/pkg/sql/txn_restart_test.go +++ b/pkg/sql/txn_restart_test.go @@ -130,7 +130,7 @@ func injectErrors( {counts: magicVals.restartCounts, errFn: func() error { // Note we use a retry error that cannot be automatically retried // by the transaction coord sender. - return roachpb.NewTransactionRetryError(roachpb.RETRY_POSSIBLE_REPLAY) + return roachpb.NewTransactionRetryError(roachpb.RETRY_POSSIBLE_REPLAY, "injected err") }}, {counts: magicVals.abortCounts, errFn: func() error { return roachpb.NewTransactionAbortedError(roachpb.ABORT_REASON_ABORTED_RECORD_FOUND) diff --git a/pkg/storage/batcheval/cmd_end_transaction.go b/pkg/storage/batcheval/cmd_end_transaction.go index ab50caed7bb4..6095219f1cce 100644 --- a/pkg/storage/batcheval/cmd_end_transaction.go +++ b/pkg/storage/batcheval/cmd_end_transaction.go @@ -271,22 +271,11 @@ func evalEndTransaction( // Set transaction status to COMMITTED or ABORTED as per the // args.Commit parameter. if args.Commit { - if retry, reason := IsEndTransactionTriggeringRetryError(reply.Txn, *args); retry { - return result.Result{}, roachpb.NewTransactionRetryError(reason) + if retry, reason, extraMsg := IsEndTransactionTriggeringRetryError(reply.Txn, *args); retry { + return result.Result{}, roachpb.NewTransactionRetryError(reason, extraMsg) } if IsEndTransactionExceedingDeadline(reply.Txn.Timestamp, *args) { - // If the deadline has lapsed return an error and rely on the client - // issuing a Rollback() that aborts the transaction and cleans up - // intents. Unfortunately, we're returning an error and unable to - // write on error (see #1989): we can't write ABORTED into the master - // transaction record which remains PENDING, and thus rely on the - // client to issue a Rollback() for cleanup. - // - // N.B. This deadline test is expected to be a Noop for Serializable - // transactions; unless the client misconfigured the txn, the deadline can - // only be expired if the txn has been pushed, and pushed Serializable - // transactions are detected above. exceededBy := reply.Txn.Timestamp.GoTime().Sub(args.Deadline.GoTime()) fromStart := reply.Txn.Timestamp.GoTime().Sub(reply.Txn.OrigTimestamp.GoTime()) return result.Result{}, roachpb.NewTransactionStatusError(fmt.Sprintf( @@ -380,10 +369,11 @@ func IsEndTransactionExceedingDeadline(t hlc.Timestamp, args roachpb.EndTransact // IsEndTransactionTriggeringRetryError returns true if the // EndTransactionRequest cannot be committed and needs to return a -// TransactionRetryError. +// TransactionRetryError. It also returns the reason and possibly an extra +// message to be used for the error. func IsEndTransactionTriggeringRetryError( txn *roachpb.Transaction, args roachpb.EndTransactionRequest, -) (retry bool, reason roachpb.TransactionRetryReason) { +) (retry bool, reason roachpb.TransactionRetryReason, extraMsg string) { // If we saw any WriteTooOldErrors, we must restart to avoid lost // update anomalies. if txn.WriteTooOld { @@ -405,7 +395,19 @@ func IsEndTransactionTriggeringRetryError( retry, reason = false, 0 } - return retry, reason + if !retry { + if IsEndTransactionExceedingDeadline(txn.Timestamp, args) { + exceededBy := txn.Timestamp.GoTime().Sub(args.Deadline.GoTime()) + fromStart := txn.Timestamp.GoTime().Sub(txn.OrigTimestamp.GoTime()) + extraMsg = fmt.Sprintf( + "txn timestamp pushed too much; deadline exceeded by %s (%s > %s), "+ + "original timestamp %s ago (%s)", + exceededBy, txn.Timestamp, args.Deadline, fromStart, txn.OrigTimestamp) + retry, reason = true, roachpb.RETRY_COMMIT_DEADLINE_EXCEEDED + } + } + + return retry, reason, extraMsg } // canForwardSerializableTimestamp returns whether a serializable txn can diff --git a/pkg/storage/batcheval/cmd_query_intent.go b/pkg/storage/batcheval/cmd_query_intent.go index dd487fd71317..58485b566ac9 100644 --- a/pkg/storage/batcheval/cmd_query_intent.go +++ b/pkg/storage/batcheval/cmd_query_intent.go @@ -95,9 +95,9 @@ func QueryIntent( // return a TransactionRetryError immediately with an updated // transaction proto. This is an optimization that can help // the txn use refresh spans more effectively. - return result.Result{}, roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE) + return result.Result{}, roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE, "" /* extraMsg */) } - return result.Result{}, roachpb.NewIntentMissingError(intent) + return result.Result{}, roachpb.NewIntentMissingError(args.Key, intent) case roachpb.QueryIntentRequest_PREVENT: // The intent will be prevented by bumping the timestamp cache for // the key to the txn timestamp in Replica.updateTimestampCache. diff --git a/pkg/storage/client_merge_test.go b/pkg/storage/client_merge_test.go index 52c18ef666b7..c37c5f24d208 100644 --- a/pkg/storage/client_merge_test.go +++ b/pkg/storage/client_merge_test.go @@ -236,7 +236,8 @@ func mergeWithData(t *testing.T, retries int64) { for _, req := range ba.Requests { if et := req.GetEndTransaction(); et != nil && et.InternalCommitTrigger.GetMergeTrigger() != nil { if atomic.AddInt64(&retries, -1) >= 0 { - return roachpb.NewError(roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE)) + return roachpb.NewError( + roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE, "filter err")) } } if req.GetSubsume() != nil { @@ -658,7 +659,8 @@ func TestStoreRangeMergeTxnFailure(t *testing.T) { for _, req := range ba.Requests { if et := req.GetEndTransaction(); et != nil && et.InternalCommitTrigger.GetMergeTrigger() != nil { if atomic.AddInt64(&retriesBeforeFailure, -1) >= 0 { - return roachpb.NewError(roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE)) + return roachpb.NewError( + roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE, "filter err")) } return roachpb.NewError(errors.New("injected permafail")) } @@ -2601,7 +2603,8 @@ func testMergeWatcher(t *testing.T, injectFailures bool) { for _, req := range ba.Requests { if et := req.GetEndTransaction(); et != nil && et.InternalCommitTrigger.GetMergeTrigger() != nil { if atomic.AddInt64(&mergeTxnRetries, -1) >= 0 { - return roachpb.NewError(roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE)) + return roachpb.NewError( + roachpb.NewTransactionRetryError(roachpb.RETRY_SERIALIZABLE, "filter err")) } } if pt := req.GetPushTxn(); pt != nil { diff --git a/pkg/storage/replica_test.go b/pkg/storage/replica_test.go index 4e1421be21ed..3ad54c989e55 100644 --- a/pkg/storage/replica_test.go +++ b/pkg/storage/replica_test.go @@ -3186,10 +3186,10 @@ func TestEndTransactionDeadline(t *testing.T) { case 1: // Past deadline. - if err := roachpb.CheckTxnDeadlineExceededErr(pErr.GetDetail()); err != nil { - t.Error(err) + retErr, ok := pErr.GetDetail().(*roachpb.TransactionRetryError) + if !ok || retErr.Reason != roachpb.RETRY_COMMIT_DEADLINE_EXCEEDED { + t.Fatalf("expected deadline exceeded, got: %v", pErr) } - case 2: // Equal deadline. if pErr != nil { @@ -3400,8 +3400,9 @@ func TestEndTransactionDeadline_1PC(t *testing.T) { ba.Add(&bt, &put, &et) assignSeqNumsForReqs(txn, &bt, &put, &et) _, pErr := tc.Sender().Send(context.Background(), ba) - if err := roachpb.CheckTxnDeadlineExceededErr(pErr.GetDetail()); err != nil { - t.Error(err) + retErr, ok := pErr.GetDetail().(*roachpb.TransactionRetryError) + if !ok || retErr.Reason != roachpb.RETRY_COMMIT_DEADLINE_EXCEEDED { + t.Fatalf("expected deadline exceeded, got: %v", pErr) } } diff --git a/pkg/storage/replica_write.go b/pkg/storage/replica_write.go index ef4aa58ad787..82c6be7c2d5c 100644 --- a/pkg/storage/replica_write.go +++ b/pkg/storage/replica_write.go @@ -369,7 +369,7 @@ func (r *Replica) evaluateWriteBatch( if pErr != nil { return batch, ms, nil, result.Result{}, pErr } else if ba.Timestamp != br.Timestamp { - err := roachpb.NewTransactionRetryError(roachpb.RETRY_REASON_UNKNOWN) + err := roachpb.NewTransactionRetryError(roachpb.RETRY_REASON_UNKNOWN, "Require1PC batch pushed") return batch, ms, nil, result.Result{}, roachpb.NewError(err) } log.Fatal(ctx, "unreachable") @@ -484,7 +484,7 @@ func isOnePhaseCommit(ba roachpb.BatchRequest, knobs *StoreTestingKnobs) bool { if batcheval.IsEndTransactionExceedingDeadline(ba.Txn.Timestamp, *etArg) { return false } - if retry, _ := batcheval.IsEndTransactionTriggeringRetryError(ba.Txn, *etArg); retry { + if retry, _, _ := batcheval.IsEndTransactionTriggeringRetryError(ba.Txn, *etArg); retry { return false } return !knobs.DisableOptional1PC || etArg.Require1PC diff --git a/pkg/storage/store.go b/pkg/storage/store.go index 10468d61c047..72e9dc9128d3 100644 --- a/pkg/storage/store.go +++ b/pkg/storage/store.go @@ -2894,7 +2894,8 @@ func (s *Store) Send( // If we're not retrying on push txn failures return a txn retry error // after the first failure to guarantee a retry. if ba.Txn != nil { - err := roachpb.NewTransactionRetryError(roachpb.RETRY_REASON_UNKNOWN) + err := roachpb.NewTransactionRetryError( + roachpb.RETRY_REASON_UNKNOWN, "DontRetryPushTxnFailures testing knob") return nil, roachpb.NewErrorWithTxn(err, ba.Txn) } return nil, pErr