diff --git a/pkg/cmd/roachtest/follower_reads.go b/pkg/cmd/roachtest/follower_reads.go index aa1bcf5cc1e9..f1beb05146a6 100644 --- a/pkg/cmd/roachtest/follower_reads.go +++ b/pkg/cmd/roachtest/follower_reads.go @@ -40,7 +40,8 @@ func registerFollowerReads(r *registry) { CPUs: 2, Geo: true, }, - Run: runFollowerReadsTest, + MinVersion: "v2.2.0", + Run: runFollowerReadsTest, }) } diff --git a/pkg/kv/txn_coord_sender.go b/pkg/kv/txn_coord_sender.go index 619c64ef487e..e606ff36fb40 100644 --- a/pkg/kv/txn_coord_sender.go +++ b/pkg/kv/txn_coord_sender.go @@ -107,6 +107,9 @@ type TxnCoordSender struct { syncutil.Mutex txnState txnState + // storedErr is set when txnState == txnError. This storedErr is returned to + // clients on Send(). + storedErr *roachpb.Error // active is set whenever the transaction has sent any requests. active bool @@ -139,12 +142,13 @@ type TxnCoordSender struct { // An ordered stack of pluggable request interceptors that can transform // batch requests and responses while each maintaining targeted state. - // The stack is stored in an array and each txnInterceptor implementation - // is embedded in the interceptorAlloc struct, so the entire stack is - // allocated together with TxnCoordSender without any additional heap - // allocations necessary. - interceptorStack [6]txnInterceptor + // The stack is stored in a slice backed by the interceptorAlloc.arr and each + // txnInterceptor implementation is embedded in the interceptorAlloc struct, + // so the entire stack is allocated together with TxnCoordSender without any + // additional heap allocations necessary. + interceptorStack []txnInterceptor interceptorAlloc struct { + arr [6]txnInterceptor txnHeartbeat txnIntentCollector txnPipeliner @@ -416,21 +420,24 @@ func (tcf *TxnCoordSenderFactory) TransactionalSender( if ds, ok := tcf.wrapped.(*DistSender); ok { ri = NewRangeIterator(ds) } - tcs.interceptorAlloc.txnHeartbeat.init( - &tcs.mu.Mutex, - &tcs.mu.txn, - tcf.st, - tcs.clock, - tcs.heartbeatInterval, - &tcs.interceptorAlloc.txnLockGatekeeper, - &tcs.metrics, - tcs.stopper, - tcs.cleanupTxnLocked, - ) - tcs.interceptorAlloc.txnMetrics.init(&tcs.mu.txn, tcs.clock, &tcs.metrics) - tcs.interceptorAlloc.txnIntentCollector = txnIntentCollector{ - st: tcf.st, - ri: ri, + // Some interceptors are only needed by roots. + if typ == client.RootTxn { + tcs.interceptorAlloc.txnHeartbeat.init( + &tcs.mu.Mutex, + &tcs.mu.txn, + tcf.st, + tcs.clock, + tcs.heartbeatInterval, + &tcs.interceptorAlloc.txnLockGatekeeper, + &tcs.metrics, + tcs.stopper, + tcs.cleanupTxnLocked, + ) + tcs.interceptorAlloc.txnMetrics.init(&tcs.mu.txn, tcs.clock, &tcs.metrics) + tcs.interceptorAlloc.txnIntentCollector = txnIntentCollector{ + st: tcf.st, + ri: ri, + } } tcs.interceptorAlloc.txnPipeliner = txnPipeliner{ st: tcf.st, @@ -449,17 +456,29 @@ func (tcf *TxnCoordSenderFactory) TransactionalSender( wrapped: tcs.wrapped, mu: &tcs.mu, } - tcs.interceptorStack = [...]txnInterceptor{ - &tcs.interceptorAlloc.txnHeartbeat, - // The seq num allocator is the below the txnHeartbeat so that it sees the - // BeginTransaction prepended by that interceptor. (An alternative would be - // to not assign seq nums to BeginTransaction; it doesn't need it.) - // Note though that it skips assigning seq nums to heartbeats. - &tcs.interceptorAlloc.txnSeqNumAllocator, - &tcs.interceptorAlloc.txnIntentCollector, - &tcs.interceptorAlloc.txnPipeliner, - &tcs.interceptorAlloc.txnSpanRefresher, - &tcs.interceptorAlloc.txnMetrics, + if typ == client.RootTxn { + tcs.interceptorAlloc.arr = [...]txnInterceptor{ + &tcs.interceptorAlloc.txnHeartbeat, + // The seq num allocator is below the txnHeartbeat so that it sees the + // BeginTransaction prepended by that interceptor. (An alternative would + // be to not assign seq nums to BeginTransaction; it doesn't need it.) + // Note though that it skips assigning seq nums to heartbeats. + &tcs.interceptorAlloc.txnSeqNumAllocator, + &tcs.interceptorAlloc.txnIntentCollector, + &tcs.interceptorAlloc.txnPipeliner, + &tcs.interceptorAlloc.txnSpanRefresher, + &tcs.interceptorAlloc.txnMetrics, + } + tcs.interceptorStack = tcs.interceptorAlloc.arr[:] + } else { + tcs.interceptorAlloc.arr[0] = &tcs.interceptorAlloc.txnSeqNumAllocator + tcs.interceptorAlloc.arr[1] = &tcs.interceptorAlloc.txnPipeliner + // The txnSpanRefresher was configured above to not actually perform + // refreshes for leaves. It is still needed for accumulating the spans to be + // reported to the Root. But the gateway doesn't do much with them; see + // #24798. + tcs.interceptorAlloc.arr[2] = &tcs.interceptorAlloc.txnSpanRefresher + tcs.interceptorStack = tcs.interceptorAlloc.arr[:3] } for i, reqInt := range tcs.interceptorStack { if i < len(tcs.interceptorStack)-1 { @@ -469,7 +488,7 @@ func (tcf *TxnCoordSenderFactory) TransactionalSender( } } - tcs.augmentMetaLocked(meta) + tcs.augmentMetaLocked(context.TODO(), meta) return tcs } @@ -518,10 +537,15 @@ func (tc *TxnCoordSender) AugmentMeta(ctx context.Context, meta roachpb.TxnCoord if tc.mu.txn.ID != meta.Txn.ID { return } - tc.augmentMetaLocked(meta) + tc.augmentMetaLocked(ctx, meta) } -func (tc *TxnCoordSender) augmentMetaLocked(meta roachpb.TxnCoordMeta) { +func (tc *TxnCoordSender) augmentMetaLocked(ctx context.Context, meta roachpb.TxnCoordMeta) { + if meta.Txn.Status != roachpb.PENDING { + // Non-pending transactions should only come in errors, which are not + // handled by this method. + log.Fatalf(ctx, "unexpected non-pending txn in augmentMetaLocked: %s", meta.Txn) + } tc.mu.txn.Update(&meta.Txn) for _, reqInt := range tc.interceptorStack { reqInt.augmentMetaLocked(meta) @@ -670,28 +694,7 @@ func (tc *TxnCoordSender) Send( } } - // Move to the error state on non-retriable errors. if pErr != nil { - log.VEventf(ctx, 2, "failed batch: %s", pErr) - var retriable bool - // Note that unhandled retryable txn errors are allowed from leaf - // transactions. We pass them up through distributed SQL flows to - // the root transactions, at the receiver. - if pErr.TransactionRestart != roachpb.TransactionRestart_NONE { - retriable = true - if tc.typ == client.RootTxn { - log.Fatalf(ctx, - "unexpected retryable error at the client.Txn level: (%T) %s", - pErr.GetDetail(), pErr) - } - } else if _, ok := pErr.GetDetail().(*roachpb.TransactionRetryWithProtoRefreshError); ok { - retriable = true - } - - if !retriable { - tc.mu.txnState = txnError - } - return nil, pErr } @@ -758,7 +761,7 @@ func (tc *TxnCoordSender) maybeRejectClientLocked( return roachpb.NewErrorWithTxn(roachpb.NewTransactionStatusError(msg), &tc.mu.txn) } if tc.mu.txnState == txnError { - return roachpb.NewError(&roachpb.TxnAlreadyEncounteredErrorError{}) + return tc.mu.storedErr } if tc.mu.txn.Status == roachpb.ABORTED { abortedErr := roachpb.NewErrorWithTxn( @@ -809,8 +812,16 @@ func (tc *TxnCoordSender) UpdateStateOnRemoteRetryableErr( ) *roachpb.Error { tc.mu.Lock() defer tc.mu.Unlock() + txnID := tc.mu.txn.ID err := tc.handleRetryableErrLocked(ctx, pErr) - tc.mu.txn.Update(&err.Transaction) + // We'll update our txn, unless this was an abort error. If it was an abort + // error, the transaction has been rolled back and the state was updated in + // handleRetryableErrLocked(). + if err.Transaction.ID == txnID { + // This is where we get a new epoch. + cp := err.Transaction.Clone() + tc.mu.txn.Update(&cp) + } return roachpb.NewError(err) } @@ -824,8 +835,6 @@ func (tc *TxnCoordSender) handleRetryableErrLocked( ) *roachpb.TransactionRetryWithProtoRefreshError { // If the error is a transaction retry error, update metrics to // reflect the reason for the restart. - // TODO(spencer): this code path does not account for retry errors - // experienced by dist sql (see internal/client/txn.go). if tErr, ok := pErr.GetDetail().(*roachpb.TransactionRetryError); ok { switch tErr.Reason { case roachpb.RETRY_WRITE_TOO_OLD: @@ -884,47 +893,79 @@ func (tc *TxnCoordSender) updateStateLocked( br *roachpb.BatchResponse, pErr *roachpb.Error, ) *roachpb.Error { - txnID := ba.Txn.ID - var responseTxn *roachpb.Transaction + + // We handle a couple of different cases: + // 1) A successful response. If that response carries a transaction proto, + // we'll use it to update our proto. + // 2) A non-retriable error. We move to the txnError state and we cleanup. If + // the error carries a transaction in it, we update our proto with it + // (although Andrei doesn't know if that serves any purpose). + // 3) A retriable error. We "handle" it, in the sense that we call + // handleRetryableErrLocked() to transform the error. If the error instructs + // the client to start a new transaction (i.e. TransactionAbortedError), then + // the current transaction is automatically rolled-back. Otherwise, we update + // our proto for a new epoch. + // NOTE: We'd love to move to state txnError in case of new error but alas + // with the current interface we can't: there's no way for the client to ack + // the receipt of the error and control the switching to the new epoch. This + // is a major problem of the current txn interface - it means that concurrent + // users of a txn might operate at the wrong epoch if they race with the + // receipt of such an error. + if pErr == nil { - responseTxn = br.Txn - } else { - // Only handle transaction retry errors if this is a root transaction. - if pErr.TransactionRestart != roachpb.TransactionRestart_NONE && - tc.typ == client.RootTxn { - - errTxnID := pErr.GetTxn().ID // The ID of the txn that needs to be restarted. - if errTxnID != txnID { - // KV should not return errors for transactions other than the one in - // the BatchRequest. - log.Fatalf(ctx, "retryable error for the wrong txn. ba.Txn: %s. pErr: %s", - ba.Txn, pErr) - } + tc.mu.txn.Update(br.Txn) + return nil + } - err := tc.handleRetryableErrLocked(ctx, pErr) - if err.Transaction.ID == ba.Txn.ID { - // We'll update our txn, unless this was an abort error. - cp := err.Transaction.Clone() - responseTxn = &cp - } - pErr = roachpb.NewError(err) - } else { - // We got a non-retryable error, or a retryable error at a leaf - // transaction, and need to pass responsibility for handling it - // up to the root transaction. + if pErr.TransactionRestart != roachpb.TransactionRestart_NONE { + if tc.typ == client.LeafTxn { + // Leaves handle retriable errors differently than roots. The leaf + // transaction is not supposed to be used any more after a retriable + // error. Separately, the error needs to make its way back to the root. - if errTxn := pErr.GetTxn(); errTxn != nil { - responseTxn = errTxn - } + // From now on, clients will get this error whenever they Send(). We want + // clients to get the same retriable error so we don't wrap it in + // TxnAlreadyEncounteredErrorError as we do elsewhere. + tc.mu.txnState = txnError + tc.mu.storedErr = pErr + + // Cleanup. + cp := pErr.GetTxn().Clone() + tc.mu.txn.Update(&cp) + tc.cleanupTxnLocked(ctx) + return pErr } - } - // Update our record of this transaction, even on error. - // Note that multiple retriable errors for the same epoch might arrive; also - // we might get retriable errors for old epochs. We rely on the associativity - // of Transaction.Update to sort out this lack of ordering guarantee. - if responseTxn != nil { - tc.mu.txn.Update(responseTxn) + txnID := ba.Txn.ID + errTxnID := pErr.GetTxn().ID // The ID of the txn that needs to be restarted. + if errTxnID != txnID { + // KV should not return errors for transactions other than the one in + // the BatchRequest. + log.Fatalf(ctx, "retryable error for the wrong txn. ba.Txn: %s. pErr: %s", + ba.Txn, pErr) + } + err := tc.handleRetryableErrLocked(ctx, pErr) + // We'll update our txn, unless this was an abort error. If it was an abort + // error, the transaction has been rolled back and the state was updated in + // handleRetryableErrLocked(). + if err.Transaction.ID == ba.Txn.ID { + // This is where we get a new epoch. + cp := err.Transaction.Clone() + tc.mu.txn.Update(&cp) + } + return roachpb.NewError(err) + } + + // This is the non-retriable error case. + if errTxn := pErr.GetTxn(); errTxn != nil { + tc.mu.txnState = txnError + tc.mu.storedErr = roachpb.NewError(&roachpb.TxnAlreadyEncounteredErrorError{ + PrevError: pErr.String(), + }) + // Cleanup. + cp := errTxn.Clone() + tc.mu.txn.Update(&cp) + tc.cleanupTxnLocked(ctx) } return pErr } diff --git a/pkg/kv/txn_coord_sender_test.go b/pkg/kv/txn_coord_sender_test.go index 57575622efed..2eff2c788396 100644 --- a/pkg/kv/txn_coord_sender_test.go +++ b/pkg/kv/txn_coord_sender_test.go @@ -2414,7 +2414,25 @@ func TestCommitTurnedToRollback(t *testing.T) { // errors and feed them to the root txn. func TestLeafTxnClientRejectError(t *testing.T) { defer leaktest.AfterTest(t)() - s := createTestDB(t) + + // We're going to inject an error so that a leaf txn is "poisoned". This can + // happen, for example, if the leaf is used concurrently by multiple requests, + // where the first one gets a TransactionAbortedError. + errKey := roachpb.Key("a") + knobs := &storage.StoreTestingKnobs{ + TestingRequestFilter: func(ba roachpb.BatchRequest) *roachpb.Error { + if g, ok := ba.GetArg(roachpb.Get); ok && g.(*roachpb.GetRequest).Key.Equal(errKey) { + txn := ba.Txn.Clone() + txn.Status = roachpb.ABORTED + return roachpb.NewErrorWithTxn( + roachpb.NewTransactionAbortedError(roachpb.ABORT_REASON_UNKNOWN), + &txn) + } + return nil + }, + } + + s := createTestDBWithContextAndKnobs(t, client.DefaultDBContext(), knobs) defer s.Stop() ctx := context.Background() @@ -2424,12 +2442,9 @@ func TestLeafTxnClientRejectError(t *testing.T) { leafTxn := client.NewTxnWithCoordMeta( ctx, s.DB, 0 /* gatewayNodeID */, client.LeafTxn, rootTxn.GetTxnCoordMeta(ctx)) - // Poison the leaf. This can happen, for example, if the leaf is used - // concurrently by multiple requests, where the first one gets a - // TransactionAbortedError. - meta := rootTxn.GetTxnCoordMeta(ctx) - meta.Txn.Status = roachpb.ABORTED - leafTxn.AugmentTxnCoordMeta(ctx, meta) + if _, err := leafTxn.Get(ctx, errKey); !testutils.IsError(err, "TransactionAbortedError") { + t.Fatalf("expected injected err, got: %v", err) + } // Now use the leaf and check the error. At the TxnCoordSender level, the // pErr will be TransactionAbortedError. When pErr.GoError() is called, that's diff --git a/pkg/kv/txn_interceptor_heartbeat.go b/pkg/kv/txn_interceptor_heartbeat.go index 17fe1c2e06f0..4822a8b1e63a 100644 --- a/pkg/kv/txn_interceptor_heartbeat.go +++ b/pkg/kv/txn_interceptor_heartbeat.go @@ -487,9 +487,11 @@ func (h *txnHeartbeat) heartbeat(ctx context.Context) bool { return true } - // TODO(nvanbenschoten): Figure out what to do here. The case we're - // handling is TransactionAbortedErrors without corresponding - // transaction protos attached. @andreimatei any suggestions? + // We need to be prepared here to handle the case of a + // TransactionAbortedError with no transaction proto in it. + // + // TODO(nvanbenschoten): Make this the only case where we get back an + // Aborted txn. if _, ok := pErr.GetDetail().(*roachpb.TransactionAbortedError); ok { h.mu.txn.Status = roachpb.ABORTED log.VEventf(ctx, 1, "Heartbeat detected aborted txn. Cleaning up.") diff --git a/pkg/roachpb/errors.go b/pkg/roachpb/errors.go index fc549f797e9b..b3e4d76715b4 100644 --- a/pkg/roachpb/errors.go +++ b/pkg/roachpb/errors.go @@ -616,8 +616,11 @@ func (e *TxnAlreadyEncounteredErrorError) Error() string { return e.message(nil) } -func (*TxnAlreadyEncounteredErrorError) message(_ *Error) string { - return "txn already encountered an error; cannot be used anymore" +func (e *TxnAlreadyEncounteredErrorError) message(_ *Error) string { + return fmt.Sprintf( + "txn already encountered an error; cannot be used anymore (previous err: %s)", + e.PrevError, + ) } var _ ErrorDetailInterface = &TxnAlreadyEncounteredErrorError{} diff --git a/pkg/roachpb/errors.pb.go b/pkg/roachpb/errors.pb.go index 3d3414e56aae..55e73a9eee8a 100644 --- a/pkg/roachpb/errors.pb.go +++ b/pkg/roachpb/errors.pb.go @@ -112,7 +112,7 @@ func (x *TransactionAbortedReason) UnmarshalJSON(data []byte) error { return nil } func (TransactionAbortedReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_06277ae263174498, []int{0} + return fileDescriptor_errors_cef0c035f29ecf49, []int{0} } // TransactionRetryReason specifies what caused a transaction retry. @@ -165,7 +165,7 @@ func (x *TransactionRetryReason) UnmarshalJSON(data []byte) error { return nil } func (TransactionRetryReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_06277ae263174498, []int{1} + return fileDescriptor_errors_cef0c035f29ecf49, []int{1} } // TransactionRestart indicates how an error should be handled in a @@ -216,7 +216,7 @@ func (x *TransactionRestart) UnmarshalJSON(data []byte) error { return nil } func (TransactionRestart) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_06277ae263174498, []int{2} + return fileDescriptor_errors_cef0c035f29ecf49, []int{2} } // Reason specifies what caused the error. @@ -259,7 +259,7 @@ func (x *TransactionStatusError_Reason) UnmarshalJSON(data []byte) error { return nil } func (TransactionStatusError_Reason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_06277ae263174498, []int{9, 0} + return fileDescriptor_errors_cef0c035f29ecf49, []int{9, 0} } // Reason specifies what caused the error. @@ -315,7 +315,7 @@ func (x *RangeFeedRetryError_Reason) UnmarshalJSON(data []byte) error { return nil } func (RangeFeedRetryError_Reason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_06277ae263174498, []int{29, 0} + return fileDescriptor_errors_cef0c035f29ecf49, []int{29, 0} } // A NotLeaseHolderError indicates that the current range is not the lease @@ -344,7 +344,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_06277ae263174498, []int{0} + return fileDescriptor_errors_cef0c035f29ecf49, []int{0} } func (m *NotLeaseHolderError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -381,7 +381,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_06277ae263174498, []int{1} + return fileDescriptor_errors_cef0c035f29ecf49, []int{1} } func (m *NodeUnavailableError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -417,7 +417,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_06277ae263174498, []int{2} + return fileDescriptor_errors_cef0c035f29ecf49, []int{2} } func (m *UnsupportedRequestError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -456,7 +456,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_06277ae263174498, []int{3} + return fileDescriptor_errors_cef0c035f29ecf49, []int{3} } func (m *RangeNotFoundError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -502,7 +502,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_06277ae263174498, []int{4} + return fileDescriptor_errors_cef0c035f29ecf49, []int{4} } func (m *RangeKeyMismatchError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +550,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_06277ae263174498, []int{5} + return fileDescriptor_errors_cef0c035f29ecf49, []int{5} } func (m *ReadWithinUncertaintyIntervalError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -595,7 +595,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_06277ae263174498, []int{6} + return fileDescriptor_errors_cef0c035f29ecf49, []int{6} } func (m *TransactionAbortedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -633,7 +633,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_06277ae263174498, []int{7} + return fileDescriptor_errors_cef0c035f29ecf49, []int{7} } func (m *TransactionPushError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -670,7 +670,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_06277ae263174498, []int{8} + return fileDescriptor_errors_cef0c035f29ecf49, []int{8} } func (m *TransactionRetryError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -712,7 +712,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_06277ae263174498, []int{9} + return fileDescriptor_errors_cef0c035f29ecf49, []int{9} } func (m *TransactionStatusError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -752,7 +752,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_06277ae263174498, []int{10} + return fileDescriptor_errors_cef0c035f29ecf49, []int{10} } func (m *WriteIntentError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -792,7 +792,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_06277ae263174498, []int{11} + return fileDescriptor_errors_cef0c035f29ecf49, []int{11} } func (m *WriteTooOldError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -830,7 +830,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_06277ae263174498, []int{12} + return fileDescriptor_errors_cef0c035f29ecf49, []int{12} } func (m *OpRequiresTxnError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -869,7 +869,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_06277ae263174498, []int{13} + return fileDescriptor_errors_cef0c035f29ecf49, []int{13} } func (m *ConditionFailedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -908,7 +908,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_06277ae263174498, []int{14} + return fileDescriptor_errors_cef0c035f29ecf49, []int{14} } func (m *LeaseRejectedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +945,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_06277ae263174498, []int{15} + return fileDescriptor_errors_cef0c035f29ecf49, []int{15} } func (m *SendError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -985,7 +985,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_06277ae263174498, []int{16} + return fileDescriptor_errors_cef0c035f29ecf49, []int{16} } func (m *AmbiguousResultError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1021,7 +1021,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_06277ae263174498, []int{17} + return fileDescriptor_errors_cef0c035f29ecf49, []int{17} } func (m *RaftGroupDeletedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1061,7 +1061,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_06277ae263174498, []int{18} + return fileDescriptor_errors_cef0c035f29ecf49, []int{18} } func (m *ReplicaCorruptionError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1100,7 +1100,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_06277ae263174498, []int{19} + return fileDescriptor_errors_cef0c035f29ecf49, []int{19} } func (m *ReplicaTooOldError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1137,7 +1137,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_06277ae263174498, []int{20} + return fileDescriptor_errors_cef0c035f29ecf49, []int{20} } func (m *StoreNotFoundError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1185,7 +1185,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_06277ae263174498, []int{21} + return fileDescriptor_errors_cef0c035f29ecf49, []int{21} } func (m *UnhandledRetryableError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1239,7 +1239,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_06277ae263174498, []int{22} + return fileDescriptor_errors_cef0c035f29ecf49, []int{22} } func (m *TransactionRetryWithProtoRefreshError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1268,6 +1268,9 @@ var xxx_messageInfo_TransactionRetryWithProtoRefreshError proto.InternalMessageI // transaction that already received an error from a previous request. Once that // happens, client.Txn rejects future requests. type TxnAlreadyEncounteredErrorError struct { + // prev_error is the message from the error that the txn encountered + // previously. + PrevError string `protobuf:"bytes,1,opt,name=prev_error,json=prevError" json:"prev_error"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` } @@ -1276,7 +1279,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_06277ae263174498, []int{23} + return fileDescriptor_errors_cef0c035f29ecf49, []int{23} } func (m *TxnAlreadyEncounteredErrorError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1315,7 +1318,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_06277ae263174498, []int{24} + return fileDescriptor_errors_cef0c035f29ecf49, []int{24} } func (m *IntegerOverflowError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1353,7 +1356,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_06277ae263174498, []int{25} + return fileDescriptor_errors_cef0c035f29ecf49, []int{25} } func (m *MixedSuccessError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1391,7 +1394,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_06277ae263174498, []int{26} + return fileDescriptor_errors_cef0c035f29ecf49, []int{26} } func (m *BatchTimestampBeforeGCError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1430,7 +1433,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_06277ae263174498, []int{27} + return fileDescriptor_errors_cef0c035f29ecf49, []int{27} } func (m *IntentMissingError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1469,7 +1472,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_06277ae263174498, []int{28} + return fileDescriptor_errors_cef0c035f29ecf49, []int{28} } func (m *MergeInProgressError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1506,7 +1509,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_06277ae263174498, []int{29} + return fileDescriptor_errors_cef0c035f29ecf49, []int{29} } func (m *RangeFeedRetryError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1572,7 +1575,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_06277ae263174498, []int{30} + return fileDescriptor_errors_cef0c035f29ecf49, []int{30} } func (m *ErrorDetail) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2532,7 +2535,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_06277ae263174498, []int{31} + return fileDescriptor_errors_cef0c035f29ecf49, []int{31} } func (m *ErrPosition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2588,7 +2591,7 @@ type Error struct { func (m *Error) Reset() { *m = Error{} } func (*Error) ProtoMessage() {} func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_06277ae263174498, []int{32} + return fileDescriptor_errors_cef0c035f29ecf49, []int{32} } func (m *Error) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3255,6 +3258,9 @@ func (this *TxnAlreadyEncounteredErrorError) Equal(that interface{}) bool { } else if this == nil { return false } + if this.PrevError != that1.PrevError { + return false + } return true } func (this *IntegerOverflowError) Equal(that interface{}) bool { @@ -4882,6 +4888,10 @@ func (m *TxnAlreadyEncounteredErrorError) MarshalTo(dAtA []byte) (int, error) { _ = i var l int _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintErrors(dAtA, i, uint64(len(m.PrevError))) + i += copy(dAtA[i:], m.PrevError) return i, nil } @@ -5903,6 +5913,8 @@ func (m *TxnAlreadyEncounteredErrorError) Size() (n int) { } var l int _ = l + l = len(m.PrevError) + n += 1 + l + sovErrors(uint64(l)) return n } @@ -8626,6 +8638,35 @@ func (m *TxnAlreadyEncounteredErrorError) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: TxnAlreadyEncounteredErrorError: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevError", 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.PrevError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipErrors(dAtA[iNdEx:]) @@ -10556,184 +10597,185 @@ var ( ErrIntOverflowErrors = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/errors.proto", fileDescriptor_errors_06277ae263174498) } - -var fileDescriptor_errors_06277ae263174498 = []byte{ - // 2804 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xcd, 0x73, 0xdb, 0xc6, - 0x15, 0x27, 0x28, 0x4a, 0x94, 0x9e, 0xbe, 0xa0, 0xb5, 0x22, 0xc3, 0x72, 0x4c, 0xc9, 0x72, 0x9c, - 0x38, 0xee, 0x44, 0xea, 0x38, 0xf5, 0xb4, 0x71, 0x93, 0x03, 0x3f, 0x20, 0x91, 0x12, 0x3f, 0x14, - 0x90, 0x8a, 0xe2, 0xa4, 0x1d, 0x0c, 0x44, 0xac, 0x28, 0xc4, 0x24, 0xc0, 0x2e, 0x00, 0x4b, 0xba, - 0xf5, 0x98, 0xe9, 0xa9, 0x9d, 0xe9, 0xa1, 0xb7, 0x66, 0xa6, 0xa7, 0x4c, 0xaf, 0x9d, 0xfc, 0x03, - 0xbd, 0xe4, 0xd8, 0x63, 0xa6, 0x07, 0x4f, 0xeb, 0xce, 0x74, 0x3a, 0xed, 0x7f, 0x90, 0x53, 0x67, - 0x3f, 0x00, 0x02, 0x22, 0x20, 0x33, 0x3e, 0x91, 0x78, 0x5f, 0xfb, 0xf6, 0xed, 0xdb, 0xf7, 0x7e, - 0x6f, 0x61, 0x95, 0x38, 0x46, 0xf7, 0x6c, 0x78, 0xb2, 0x83, 0x09, 0x71, 0x88, 0xbb, 0x3d, 0x24, - 0x8e, 0xe7, 0xa0, 0x95, 0xae, 0xd3, 0x7d, 0xc6, 0x38, 0xdb, 0x82, 0xbf, 0x8e, 0x02, 0x41, 0xd3, - 0xf0, 0x0c, 0x2e, 0xb6, 0xbe, 0x16, 0xd0, 0x06, 0xd8, 0x33, 0x22, 0xf4, 0x7b, 0xae, 0xe7, 0x10, - 0xa3, 0x87, 0x77, 0xb0, 0xdd, 0xb3, 0xec, 0xe0, 0x87, 0xca, 0x3d, 0xef, 0x76, 0xdf, 0x17, 0x42, - 0x8a, 0xef, 0x59, 0xfd, 0x9d, 0xb3, 0x7e, 0x77, 0xc7, 0xb3, 0x06, 0xd8, 0xf5, 0x8c, 0xc1, 0x50, - 0x70, 0x56, 0x7b, 0x4e, 0xcf, 0x61, 0x7f, 0x77, 0xe8, 0x3f, 0x4e, 0xdd, 0xfa, 0x26, 0x0b, 0x37, - 0x9a, 0x8e, 0x57, 0xc7, 0x86, 0x8b, 0xab, 0x4e, 0xdf, 0xc4, 0x44, 0xa5, 0x2e, 0xa3, 0x0a, 0xe4, - 0x09, 0x1e, 0xf6, 0xad, 0xae, 0xa1, 0x48, 0x9b, 0xd2, 0x83, 0xf9, 0x47, 0x6f, 0x6d, 0x8f, 0x79, - 0xbf, 0xad, 0x71, 0x89, 0x0a, 0x76, 0xbb, 0xc4, 0x1a, 0x7a, 0x0e, 0x29, 0xe5, 0xbe, 0x7d, 0xb1, - 0x91, 0xd1, 0x02, 0x55, 0xb4, 0x07, 0x0b, 0x7d, 0x6a, 0x59, 0x3f, 0x63, 0xa6, 0x95, 0xec, 0xe4, - 0xa6, 0xb4, 0xf9, 0xfe, 0xc8, 0x27, 0xf4, 0x18, 0x66, 0x89, 0x61, 0xf7, 0xb0, 0x6e, 0x99, 0xca, - 0xd4, 0xa6, 0xf4, 0x60, 0xaa, 0xb4, 0x4e, 0x57, 0x7a, 0xf9, 0x62, 0x23, 0xaf, 0x51, 0x7a, 0xad, - 0xf2, 0xfd, 0xe8, 0xaf, 0x96, 0x67, 0xb2, 0x35, 0x13, 0x6d, 0xc3, 0x34, 0xb3, 0xa2, 0xe4, 0xd8, - 0xc2, 0x4a, 0xc2, 0xc2, 0x6c, 0xe7, 0x1a, 0x17, 0x43, 0xf7, 0x00, 0xba, 0xbe, 0xeb, 0x39, 0x03, - 0x7d, 0xe0, 0xf6, 0x94, 0xe9, 0x4d, 0xe9, 0xc1, 0x9c, 0xd8, 0xd2, 0x1c, 0xa7, 0x37, 0xdc, 0xde, - 0x93, 0xdc, 0x7f, 0xbe, 0xda, 0x90, 0xb6, 0xde, 0x84, 0xd5, 0xa6, 0x63, 0xe2, 0x23, 0xdb, 0x78, - 0x6e, 0x58, 0x7d, 0xe3, 0xa4, 0x8f, 0x59, 0xe0, 0x04, 0x77, 0x03, 0x6e, 0x1e, 0xd9, 0xae, 0x3f, - 0x1c, 0x3a, 0xc4, 0xc3, 0xa6, 0x86, 0x7f, 0xe5, 0x63, 0xd7, 0x8b, 0x0a, 0x7c, 0x29, 0x01, 0x62, - 0xee, 0x36, 0x1d, 0x6f, 0xd7, 0xf1, 0x6d, 0x93, 0x87, 0x3d, 0xba, 0x4f, 0x69, 0xf2, 0x7d, 0x3e, - 0x86, 0x59, 0x9a, 0x1c, 0x4c, 0x2d, 0x1b, 0x57, 0x6b, 0x53, 0x3a, 0x57, 0x13, 0x7f, 0xb5, 0x3c, - 0x93, 0xad, 0x99, 0xc2, 0x95, 0x3f, 0x66, 0xe1, 0x0d, 0x66, 0xf1, 0x00, 0x5f, 0x36, 0x2c, 0x77, - 0x60, 0x78, 0xdd, 0x33, 0xee, 0xcd, 0xfb, 0xb0, 0x42, 0xb8, 0xeb, 0xba, 0xeb, 0x19, 0xc4, 0xd3, - 0x9f, 0xe1, 0x4b, 0xe6, 0xd6, 0x42, 0x29, 0xff, 0xfd, 0x8b, 0x8d, 0xa9, 0x03, 0x7c, 0xa9, 0x2d, - 0x0b, 0x89, 0x36, 0x15, 0x38, 0xc0, 0x97, 0x68, 0x07, 0x02, 0x92, 0x8e, 0x6d, 0x93, 0xa9, 0x64, - 0xe3, 0x2a, 0x8b, 0x82, 0xaf, 0xda, 0x26, 0x55, 0x68, 0x80, 0x3c, 0x10, 0xcb, 0x62, 0x53, 0x67, - 0x5b, 0x62, 0x67, 0x3c, 0xff, 0x68, 0x2b, 0x29, 0x51, 0x28, 0x3f, 0x92, 0x26, 0xcb, 0x23, 0x5d, - 0xc6, 0x42, 0x07, 0xb0, 0xec, 0xfa, 0xbd, 0x1e, 0x76, 0xbd, 0xd0, 0x5a, 0x6e, 0x62, 0x6b, 0x4b, - 0xa1, 0x2a, 0xe3, 0x88, 0x08, 0xfd, 0x2f, 0x0b, 0x5b, 0x1a, 0x36, 0xcc, 0x63, 0xcb, 0x3b, 0xb3, - 0xec, 0x23, 0xbb, 0x8b, 0x89, 0x67, 0x58, 0xb6, 0x77, 0x59, 0xb3, 0x3d, 0x4c, 0x9e, 0x1b, 0x7d, - 0x1e, 0xae, 0x7d, 0x58, 0x22, 0xd8, 0x30, 0xf5, 0xf0, 0xe6, 0x89, 0xab, 0x73, 0x27, 0xb2, 0x30, - 0xbd, 0x9e, 0xdb, 0x67, 0xfd, 0xee, 0x76, 0x27, 0x10, 0x12, 0x09, 0xb6, 0x48, 0x55, 0x43, 0x22, - 0xd2, 0x00, 0xe1, 0x0b, 0xcb, 0xf5, 0x2c, 0xbb, 0x17, 0xb1, 0x97, 0x9d, 0xdc, 0xde, 0x4a, 0xa0, - 0x3e, 0xb2, 0x59, 0x82, 0xc5, 0x81, 0x71, 0x11, 0x31, 0x37, 0x35, 0x81, 0x39, 0x6d, 0x61, 0x60, - 0x5c, 0x8c, 0x6c, 0x7c, 0x0e, 0x37, 0x9c, 0x13, 0x17, 0x93, 0xe7, 0x38, 0xb2, 0x4f, 0x57, 0xc9, - 0x6d, 0x4e, 0xa5, 0x5c, 0xec, 0x96, 0x90, 0xbe, 0xea, 0x1f, 0x72, 0xae, 0x32, 0x5c, 0x11, 0xed, - 0x2f, 0xe0, 0x66, 0x87, 0x18, 0xb6, 0x6b, 0x74, 0x3d, 0xcb, 0xb1, 0x8b, 0x27, 0xec, 0x0a, 0xf1, - 0x08, 0xd7, 0x60, 0x86, 0x60, 0xc3, 0x75, 0x6c, 0x16, 0xd9, 0xa5, 0x47, 0x3f, 0x4a, 0x58, 0x70, - 0x5c, 0x57, 0x63, 0x2a, 0x62, 0x5d, 0x61, 0x40, 0xac, 0x65, 0xc0, 0x6a, 0x44, 0xfe, 0xd0, 0x77, - 0x45, 0xe6, 0x97, 0x01, 0x86, 0xbe, 0x7b, 0x86, 0xb1, 0xee, 0x5d, 0xd8, 0xe2, 0x18, 0x0b, 0xd7, - 0x2f, 0x16, 0x14, 0x0a, 0xae, 0xd7, 0xb9, 0x08, 0x96, 0x38, 0x85, 0x37, 0x22, 0x52, 0x1a, 0xf6, - 0xc8, 0x25, 0x5f, 0x63, 0xef, 0xca, 0x66, 0xde, 0xbd, 0xde, 0x3e, 0xd3, 0xbc, 0x66, 0x2b, 0xdf, - 0x49, 0xb0, 0x16, 0x11, 0x6f, 0x7b, 0x86, 0xe7, 0xbb, 0x7c, 0xa5, 0x35, 0x98, 0xa2, 0xf5, 0x4c, - 0x8a, 0xd4, 0x33, 0x4a, 0x40, 0xcd, 0xd0, 0x83, 0x2c, 0xf3, 0xe0, 0xc7, 0xd7, 0x7b, 0x10, 0x31, - 0xb9, 0x9d, 0xe4, 0xc8, 0xd6, 0x21, 0xcc, 0x70, 0x3a, 0x42, 0xb0, 0xa4, 0xa9, 0xc5, 0x76, 0xab, - 0xa9, 0x1f, 0x35, 0x0f, 0x9a, 0xad, 0xe3, 0xa6, 0x9c, 0x41, 0x0a, 0xac, 0x0a, 0x5a, 0xe7, 0xd3, - 0xa6, 0xde, 0x6c, 0x75, 0xf4, 0xdd, 0xd6, 0x51, 0xb3, 0x22, 0x4b, 0x57, 0x38, 0xe5, 0x56, 0xa3, - 0x51, 0xeb, 0x74, 0xd4, 0x8a, 0x9c, 0x15, 0x5b, 0x7b, 0x0a, 0xf2, 0x31, 0xb1, 0x3c, 0x4c, 0xaf, - 0x9b, 0xcd, 0xcb, 0x28, 0xfa, 0x00, 0xf2, 0x16, 0xfb, 0x74, 0x15, 0x89, 0x25, 0xdf, 0xad, 0x04, - 0xe7, 0xb9, 0x42, 0xd0, 0x95, 0x84, 0x3c, 0x37, 0xba, 0x9f, 0x9b, 0xcd, 0xca, 0x53, 0x5b, 0x7f, - 0x96, 0x84, 0xed, 0x8e, 0xe3, 0xb4, 0xfa, 0x22, 0xcd, 0x8a, 0x30, 0xf7, 0x5a, 0x77, 0x78, 0xa4, - 0x85, 0x9a, 0x20, 0x1b, 0x5d, 0xcf, 0x37, 0xfa, 0xaf, 0x77, 0x7b, 0x97, 0xb9, 0x72, 0x48, 0x16, - 0x81, 0x58, 0x07, 0xd4, 0x1a, 0xd2, 0x6e, 0x62, 0x11, 0xec, 0x76, 0x2e, 0xec, 0x68, 0x47, 0x79, - 0x0a, 0xab, 0x65, 0xc7, 0x36, 0x2d, 0x7a, 0x52, 0xbb, 0x86, 0xd5, 0x0f, 0xee, 0xcc, 0xcf, 0x61, - 0x41, 0x78, 0xf2, 0xdc, 0xe8, 0xfb, 0x58, 0xec, 0x27, 0xa9, 0x15, 0x7e, 0x42, 0xf9, 0xda, 0x3c, - 0x97, 0x66, 0x1f, 0xc2, 0xf4, 0x5f, 0x24, 0x40, 0xbc, 0x4f, 0xe2, 0x2f, 0x70, 0x37, 0xbc, 0x8d, - 0x05, 0xc8, 0x0f, 0xb0, 0xeb, 0x1a, 0x3d, 0x1c, 0x4b, 0xad, 0x80, 0x88, 0x3e, 0x84, 0x39, 0x51, - 0xe9, 0xb1, 0x29, 0x36, 0x9f, 0xda, 0x81, 0x83, 0x08, 0x86, 0x0a, 0xe8, 0x09, 0xcc, 0x06, 0x25, - 0x4c, 0x14, 0xaa, 0x57, 0x29, 0x87, 0xf2, 0xc2, 0xed, 0x9f, 0xc2, 0x5c, 0x1b, 0xdb, 0x93, 0x39, - 0x1b, 0x4b, 0x8a, 0x73, 0x58, 0x2d, 0x0e, 0x4e, 0xac, 0x9e, 0xef, 0xf8, 0xae, 0x86, 0x5d, 0xbf, - 0xef, 0x4d, 0xb6, 0xe1, 0x0f, 0x60, 0xfe, 0x9c, 0x18, 0xc3, 0x21, 0x36, 0x75, 0x4c, 0xc8, 0x35, - 0x5b, 0x66, 0xe6, 0x34, 0x10, 0xc2, 0x2a, 0x09, 0xce, 0xf0, 0x0e, 0xed, 0xc4, 0xa7, 0xde, 0x1e, - 0x71, 0xfc, 0x61, 0x05, 0xf7, 0x71, 0x10, 0x6a, 0xc1, 0xc6, 0xb0, 0x26, 0x70, 0x52, 0xd9, 0x21, - 0xc4, 0x1f, 0xd2, 0xa3, 0xe6, 0x9e, 0xdd, 0x85, 0x39, 0x06, 0x35, 0xf5, 0xab, 0xf7, 0x7c, 0x96, - 0x91, 0x1b, 0x6e, 0x0f, 0x6d, 0xc1, 0xdc, 0x90, 0x38, 0x5d, 0xec, 0xba, 0xe2, 0x34, 0x66, 0xc3, - 0x8a, 0x15, 0x90, 0xc3, 0x4c, 0x42, 0x62, 0x99, 0xe8, 0xa5, 0xf8, 0x08, 0x40, 0xc0, 0xba, 0x00, - 0x9c, 0x4c, 0x97, 0x0a, 0x02, 0x65, 0xcc, 0x09, 0x79, 0x86, 0x33, 0x46, 0x1f, 0xf4, 0x38, 0xf9, - 0xdf, 0xc0, 0xf4, 0xc7, 0x80, 0x18, 0x0a, 0x19, 0x43, 0x3d, 0x21, 0x7c, 0x91, 0x7e, 0x28, 0x7c, - 0x69, 0x50, 0xa8, 0x75, 0x66, 0xd8, 0x66, 0x9f, 0x56, 0x7a, 0x8f, 0x5c, 0x86, 0x58, 0x0c, 0x3d, - 0x82, 0xdc, 0x50, 0x25, 0xe4, 0x9a, 0x94, 0x67, 0x72, 0x22, 0x0e, 0x4c, 0x76, 0xeb, 0xbf, 0x12, - 0xdc, 0xbf, 0x5a, 0x75, 0x69, 0xdf, 0x3f, 0xa4, 0x70, 0x59, 0xc3, 0xa7, 0x04, 0x07, 0x3d, 0x22, - 0xad, 0xaa, 0x7e, 0x0e, 0x33, 0xde, 0x85, 0x1d, 0x40, 0xb1, 0x85, 0x52, 0x85, 0xb2, 0xfe, 0xfe, - 0x62, 0xe3, 0xfd, 0x9e, 0xe5, 0x9d, 0xf9, 0x27, 0xdb, 0x5d, 0x67, 0xb0, 0x13, 0x7a, 0x62, 0x9e, - 0x8c, 0xfe, 0xef, 0x0c, 0x9f, 0xf5, 0x76, 0x18, 0x7e, 0xf7, 0x7d, 0xcb, 0xdc, 0x3e, 0x3a, 0xaa, - 0x55, 0x5e, 0xbe, 0xd8, 0x98, 0xee, 0x5c, 0xd8, 0xb5, 0x8a, 0x36, 0xed, 0x5d, 0xd8, 0x35, 0x13, - 0xed, 0xc2, 0xbc, 0x37, 0xf2, 0x4e, 0x5c, 0x8c, 0xc9, 0x3a, 0x53, 0x54, 0x51, 0xc4, 0xee, 0x1d, - 0xd8, 0xe8, 0x5c, 0xd8, 0xc5, 0x3e, 0xc5, 0x1e, 0x97, 0xaa, 0xdd, 0x75, 0x7c, 0x0a, 0x68, 0x44, - 0xd2, 0x45, 0x33, 0xef, 0x77, 0x12, 0xac, 0xd2, 0x62, 0xda, 0xc3, 0xa4, 0xf5, 0x1c, 0x93, 0xd3, - 0xbe, 0x73, 0xce, 0x83, 0x70, 0x0b, 0xa6, 0x12, 0x40, 0x21, 0xa5, 0xa1, 0x77, 0x61, 0xb1, 0xeb, - 0x13, 0x82, 0x6d, 0x4f, 0x54, 0x1e, 0x8e, 0x4c, 0xb9, 0x33, 0x0b, 0x82, 0xc5, 0xca, 0x0c, 0x7a, - 0x0f, 0x96, 0x2d, 0xbb, 0x4b, 0xf0, 0x60, 0x24, 0x3c, 0x15, 0x11, 0x5e, 0x0a, 0x99, 0xd1, 0xaa, - 0xd4, 0x80, 0x95, 0x86, 0x75, 0x81, 0xcd, 0xb6, 0xdf, 0xa5, 0xe9, 0x1b, 0x1c, 0x79, 0x5e, 0xdc, - 0xaa, 0x57, 0x9d, 0xba, 0x16, 0x08, 0x0a, 0x73, 0x5f, 0x4b, 0x70, 0xbb, 0x44, 0x81, 0xe4, 0xa8, - 0x16, 0xe3, 0x53, 0x87, 0xe0, 0xbd, 0x72, 0xd8, 0x14, 0x3a, 0xaf, 0xd5, 0x14, 0x46, 0xe0, 0x89, - 0x9a, 0x38, 0xa3, 0x09, 0xe4, 0xf4, 0xcd, 0x1f, 0xd2, 0x0d, 0x46, 0x5a, 0xc2, 0xd7, 0x4f, 0x01, - 0xf1, 0xd6, 0xd6, 0xb0, 0x5c, 0xd7, 0xb2, 0x7b, 0xdc, 0xc3, 0x0f, 0x61, 0xe1, 0x9c, 0x38, 0x76, - 0x4f, 0xe7, 0x8d, 0x4e, 0x38, 0x99, 0xde, 0x17, 0xb5, 0x79, 0x26, 0xce, 0x3f, 0x46, 0x63, 0x4d, - 0x03, 0x93, 0x1e, 0xae, 0xd9, 0x87, 0xc4, 0xe9, 0x91, 0x20, 0xae, 0x82, 0xfb, 0xfb, 0x2c, 0xdc, - 0x60, 0xc0, 0x78, 0x17, 0x8b, 0xcb, 0xc6, 0x57, 0x3e, 0xb8, 0x02, 0x65, 0xde, 0x4b, 0x83, 0xda, - 0x71, 0xbd, 0x64, 0x14, 0xf1, 0xb5, 0x14, 0xc2, 0x88, 0x75, 0x58, 0x13, 0xc0, 0x40, 0x53, 0x0f, - 0xeb, 0xb5, 0x72, 0x51, 0xd7, 0xd4, 0x46, 0xeb, 0x13, 0xb5, 0x22, 0x67, 0xd0, 0x1a, 0xa0, 0x80, - 0x57, 0x6c, 0xee, 0xa9, 0x7a, 0xfb, 0xb0, 0x5e, 0xeb, 0xc8, 0x12, 0xba, 0x09, 0x37, 0x62, 0xf4, - 0x86, 0xaa, 0xed, 0x51, 0x2c, 0x11, 0x41, 0x19, 0x5a, 0x71, 0xb7, 0xa3, 0xb7, 0x9b, 0xc5, 0xc3, - 0x76, 0xb5, 0xd5, 0x91, 0xa7, 0x50, 0x01, 0xd6, 0x05, 0xa7, 0xde, 0xda, 0xab, 0x95, 0x8b, 0x75, - 0xbd, 0x75, 0xd8, 0xd6, 0x1b, 0xb5, 0x76, 0xbb, 0xd6, 0xdc, 0x93, 0x73, 0x11, 0xcd, 0x76, 0xbd, - 0x75, 0xac, 0x97, 0x5b, 0xcd, 0xf6, 0x51, 0x43, 0xd5, 0xe4, 0x69, 0x11, 0x96, 0xbf, 0xae, 0xc2, - 0x3c, 0xdb, 0x50, 0x05, 0x7b, 0x86, 0xd5, 0x47, 0x1a, 0xc8, 0xb6, 0xe3, 0xe9, 0xb1, 0xd1, 0x97, - 0x1f, 0xc6, 0xdb, 0x09, 0x81, 0x49, 0x18, 0xbf, 0xab, 0x19, 0x6d, 0xc9, 0x8e, 0x91, 0x51, 0x0b, - 0x96, 0xf9, 0x64, 0x48, 0x2d, 0x9f, 0xd2, 0xda, 0x29, 0x32, 0xe8, 0x7e, 0x5a, 0xac, 0x63, 0x35, - 0xb6, 0x4a, 0x27, 0x8c, 0x28, 0x15, 0x7d, 0x0a, 0x88, 0x1b, 0x7c, 0x86, 0x2f, 0xf5, 0x60, 0x88, - 0x12, 0x05, 0xe5, 0x41, 0x9a, 0xcd, 0xab, 0x23, 0x62, 0x35, 0xa3, 0xc9, 0xe4, 0x0a, 0x03, 0xfd, - 0x5a, 0x82, 0x4d, 0x36, 0x08, 0x9d, 0xb3, 0x79, 0x49, 0xf7, 0x47, 0x03, 0x13, 0x4b, 0x4d, 0x3a, - 0x31, 0x89, 0x99, 0xec, 0x71, 0xe2, 0x53, 0xc0, 0xab, 0x26, 0xad, 0x6a, 0x46, 0xbb, 0x43, 0xae, - 0x93, 0x42, 0xbf, 0x84, 0x1b, 0x91, 0x6a, 0xa7, 0x1b, 0x7c, 0x10, 0x60, 0x13, 0xfd, 0xfc, 0xa3, - 0x87, 0x13, 0x4d, 0x0d, 0xc1, 0x4a, 0xc8, 0x1b, 0x63, 0xa1, 0x0e, 0xc8, 0x51, 0xf3, 0x14, 0xf2, - 0x2b, 0x33, 0xcc, 0xf6, 0x3b, 0xd7, 0xdb, 0x0e, 0x27, 0x8c, 0x6a, 0x46, 0x5b, 0xf6, 0xe2, 0x74, - 0x74, 0x0c, 0x2b, 0x51, 0xab, 0x84, 0xde, 0x13, 0x25, 0x9f, 0x7a, 0x20, 0x89, 0x53, 0x05, 0x3d, - 0x10, 0xef, 0x0a, 0x03, 0x7d, 0x06, 0xd1, 0x4d, 0xd0, 0x59, 0xde, 0xf3, 0x5d, 0x65, 0x96, 0x59, - 0x7e, 0x77, 0x62, 0xcc, 0x5f, 0xcd, 0x68, 0x51, 0xff, 0x38, 0x07, 0x55, 0x69, 0xd1, 0xb1, 0x3c, - 0x1c, 0x14, 0x9d, 0x39, 0x66, 0xf5, 0x5e, 0x82, 0xd5, 0xab, 0x10, 0xbe, 0x9a, 0xa1, 0x05, 0x28, - 0xa4, 0xa1, 0x1a, 0x2c, 0x72, 0x4b, 0x9e, 0xe3, 0xe8, 0xb4, 0x42, 0xc2, 0xf5, 0xa6, 0x22, 0xe0, - 0x24, 0x34, 0xc5, 0x69, 0xf4, 0xb2, 0x38, 0x43, 0x9d, 0x08, 0xa0, 0xcc, 0x66, 0xb8, 0xf9, 0xd4, - 0xcb, 0x32, 0x8e, 0xa8, 0xe9, 0x65, 0x71, 0xa2, 0x54, 0x7a, 0xe0, 0xdd, 0x00, 0x5c, 0xeb, 0xa7, - 0x0c, 0x5d, 0x2b, 0x0b, 0xa9, 0x07, 0x9e, 0x84, 0xc3, 0xe9, 0x81, 0x77, 0xe3, 0x74, 0xd4, 0x84, - 0x25, 0x5e, 0x23, 0x88, 0xc0, 0xd5, 0xca, 0x62, 0xaa, 0x97, 0xe3, 0xf8, 0x9b, 0x7a, 0xd9, 0x8f, - 0x52, 0xa9, 0x97, 0xb6, 0x63, 0x62, 0xdd, 0x1f, 0x3d, 0x4a, 0x29, 0x4b, 0xa9, 0x5e, 0x26, 0x3d, - 0x5f, 0x51, 0x2f, 0xed, 0x38, 0x9d, 0xa2, 0x28, 0x17, 0xdb, 0xa6, 0xb2, 0xcc, 0x2c, 0xbd, 0x99, - 0x60, 0x29, 0x44, 0xd9, 0xd5, 0x8c, 0xc6, 0x64, 0x79, 0x71, 0x39, 0xf5, 0xf4, 0x1e, 0x45, 0xb2, - 0xba, 0xc9, 0xa1, 0xac, 0x22, 0x5f, 0x53, 0x5c, 0x12, 0x50, 0x2f, 0x2f, 0x2e, 0x71, 0x06, 0xcd, - 0xe5, 0x00, 0x86, 0x76, 0x43, 0x10, 0xac, 0xac, 0xa4, 0xe6, 0x72, 0x32, 0x60, 0xa6, 0xb9, 0x4c, - 0xae, 0x72, 0x58, 0x8d, 0x15, 0xb6, 0x83, 0x1c, 0x44, 0xe9, 0x35, 0x76, 0x0c, 0x22, 0xb3, 0x1a, - 0x1b, 0xa5, 0xd2, 0x03, 0x31, 0x82, 0x41, 0x42, 0x27, 0x6c, 0x92, 0x50, 0xd6, 0x53, 0x0f, 0x24, - 0x69, 0xe6, 0xa0, 0x07, 0x62, 0xc4, 0xe9, 0xd4, 0x4d, 0x0e, 0x97, 0x47, 0xad, 0xe0, 0x76, 0xaa, - 0x9b, 0xe3, 0x70, 0x9b, 0xba, 0xe9, 0x46, 0xa9, 0xe8, 0x37, 0x12, 0xbc, 0x35, 0x56, 0x79, 0x58, - 0xf5, 0xd6, 0xd9, 0x2b, 0xb1, 0x4e, 0x38, 0xee, 0x55, 0xde, 0x64, 0xcb, 0xfc, 0x6c, 0x82, 0x62, - 0x94, 0x08, 0x99, 0xab, 0x19, 0x6d, 0xd3, 0x7b, 0x85, 0x20, 0x8d, 0x99, 0xc5, 0x91, 0xa6, 0xee, - 0x08, 0xa8, 0xa9, 0x6c, 0xa4, 0xc6, 0x2c, 0x09, 0x94, 0xd2, 0x98, 0x59, 0x71, 0x3a, 0x6d, 0x08, - 0xfe, 0xe8, 0x41, 0x56, 0x17, 0x63, 0xa6, 0xb2, 0x99, 0xda, 0x10, 0x52, 0x9e, 0x6f, 0x69, 0x43, - 0xf0, 0xc7, 0x58, 0xe8, 0x00, 0x16, 0x07, 0x14, 0x8b, 0xea, 0x2e, 0x07, 0xa3, 0xca, 0xdd, 0xd4, - 0x97, 0xee, 0x31, 0xcc, 0x5a, 0xcd, 0x68, 0x0b, 0x83, 0x08, 0x11, 0x7d, 0x0e, 0x72, 0xf8, 0x68, - 0xa0, 0x9f, 0x30, 0x10, 0xaa, 0x6c, 0x31, 0x7b, 0xdb, 0x09, 0xf6, 0xae, 0xc1, 0xac, 0xac, 0xc9, - 0xc4, 0x39, 0xe8, 0x1c, 0xee, 0xd0, 0xe9, 0xc4, 0xe0, 0x98, 0x5f, 0xc7, 0x23, 0xd0, 0xaf, 0xb3, - 0x51, 0x51, 0xb9, 0xc7, 0x56, 0x7a, 0x94, 0x74, 0xc6, 0xd7, 0x8f, 0x0a, 0xd5, 0x8c, 0xb6, 0xee, - 0xa5, 0x8a, 0xd0, 0x62, 0xc7, 0x5b, 0x04, 0x05, 0x1b, 0x14, 0xb4, 0x2a, 0x6f, 0xa5, 0x26, 0xed, - 0x38, 0xb8, 0xa5, 0x49, 0x6b, 0x45, 0xa9, 0xe8, 0x08, 0x56, 0x06, 0x14, 0xa9, 0xea, 0x96, 0x4d, - 0xb3, 0x94, 0x61, 0x55, 0xe5, 0x7e, 0x6a, 0xa2, 0x24, 0xa1, 0x5a, 0x1a, 0x9f, 0x41, 0x9c, 0x8e, - 0x3e, 0x16, 0x38, 0xeb, 0x14, 0xb3, 0x34, 0xa1, 0x2d, 0xf8, 0xed, 0x54, 0xe8, 0x96, 0x80, 0x69, - 0x29, 0x74, 0x0b, 0x0d, 0x30, 0x32, 0x07, 0x89, 0xa5, 0x3c, 0x4c, 0xb3, 0xc9, 0x66, 0x3f, 0x37, - 0xbb, 0x26, 0xdf, 0xdc, 0xcf, 0xcd, 0xde, 0x92, 0xd7, 0xf7, 0x73, 0xb3, 0x77, 0xe4, 0xc2, 0x7e, - 0x6e, 0xb6, 0x20, 0x6f, 0x6c, 0xed, 0x30, 0x10, 0x79, 0xe8, 0xb8, 0xac, 0x45, 0xa0, 0x75, 0x98, - 0xb6, 0x6c, 0x13, 0x5f, 0x88, 0x51, 0x9b, 0x63, 0x64, 0x4e, 0x12, 0xb0, 0xf3, 0x9b, 0x29, 0x98, - 0x9e, 0xec, 0x61, 0xe2, 0x17, 0x71, 0x38, 0x44, 0x30, 0x7b, 0xce, 0x67, 0x60, 0x6f, 0x29, 0xf1, - 0x00, 0x62, 0xd7, 0x99, 0x09, 0x07, 0xcf, 0xb6, 0xde, 0x18, 0x07, 0x95, 0x61, 0xd1, 0xb7, 0xf1, - 0xc5, 0xd0, 0x71, 0xb1, 0xc9, 0x7a, 0x6d, 0x6e, 0x92, 0xa9, 0x54, 0x5b, 0x08, 0x95, 0x68, 0x87, - 0xdd, 0x81, 0x79, 0x87, 0x58, 0x3d, 0xcb, 0xd6, 0x69, 0xff, 0x61, 0x48, 0x6d, 0xba, 0xb4, 0x44, - 0xd7, 0xfc, 0xfe, 0xc5, 0xc6, 0x0c, 0xed, 0x55, 0xb5, 0x8a, 0x06, 0x5c, 0x84, 0x7e, 0xa1, 0x0f, - 0x61, 0xc6, 0x64, 0x70, 0x5b, 0x20, 0xaf, 0x42, 0xda, 0xa0, 0xc7, 0x41, 0x79, 0x30, 0x64, 0x70, - 0x1d, 0xf4, 0x93, 0x20, 0xba, 0xf9, 0xeb, 0x94, 0x83, 0xc3, 0x10, 0x71, 0x47, 0x8f, 0x61, 0xca, - 0x76, 0xce, 0x05, 0x72, 0x9a, 0x68, 0x74, 0xa3, 0xf2, 0x4f, 0x66, 0xff, 0xf0, 0xd5, 0x46, 0x66, - 0xf4, 0xbe, 0xf4, 0xf0, 0xdf, 0x59, 0x50, 0xd2, 0x9e, 0xa9, 0xe9, 0xb0, 0x51, 0x2c, 0xb5, 0xb4, - 0x8e, 0x3e, 0xf6, 0x80, 0x7a, 0x1f, 0xee, 0xc6, 0x38, 0xec, 0x43, 0xad, 0xe8, 0x9a, 0x5a, 0x6e, - 0x69, 0x95, 0xf0, 0x35, 0xf5, 0x1d, 0xb8, 0x17, 0x13, 0x6b, 0xaa, 0xc7, 0xec, 0x5d, 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, 0x1d, 0xe3, 0x1f, 0x1e, 0xb5, 0xab, 0xaa, - 0x16, 0x2c, 0x2b, 0xe7, 0xd0, 0x6d, 0xb8, 0x39, 0xee, 0x90, 0xde, 0x3e, 0x2c, 0x36, 0xe5, 0x69, - 0x54, 0x84, 0x8f, 0xe2, 0xcc, 0xba, 0xa6, 0x16, 0x2b, 0x4f, 0x47, 0xcf, 0xbb, 0x7a, 0x4b, 0xd3, - 0xb5, 0x56, 0xbd, 0xae, 0x56, 0xf4, 0x52, 0xb1, 0x7c, 0xa0, 0x1f, 0xb6, 0xda, 0xed, 0x5a, 0xa9, - 0xae, 0xb2, 0x59, 0xaf, 0xf8, 0x54, 0x9e, 0x41, 0x1f, 0xc0, 0xe3, 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, 0xa9, 0x90, 0x79, 0xf8, 0x75, 0xfc, 0x4d, 0x3c, 0xf2, 0x84, 0xce, 0x67, - 0xba, 0x8e, 0xf6, 0x74, 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, 0x2d, 0x78, 0x83, 0xd3, 0xaf, 0xba, 0x91, 0x43, 0x77, 0xe0, 0x16, 0x67, 0x15, 0xdb, - 0x4f, 0x9b, 0x65, 0x61, 0x71, 0xb7, 0x58, 0xab, 0x1f, 0x69, 0xaa, 0x3c, 0xcd, 0xbd, 0xdc, 0xa2, - 0x49, 0x91, 0x7d, 0xf8, 0x04, 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, 0x77, 0xbf, 0xfd, 0x67, 0x21, 0xf3, 0xed, 0xcb, 0x82, - 0xf4, 0xb7, 0x97, 0x05, 0xe9, 0xbb, 0x97, 0x05, 0xe9, 0x1f, 0x2f, 0x0b, 0xd2, 0x6f, 0xff, 0x55, - 0xc8, 0x7c, 0x96, 0x17, 0xd9, 0xfc, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2d, 0xa7, 0xd3, 0x01, - 0x93, 0x1e, 0x00, 0x00, +func init() { proto.RegisterFile("roachpb/errors.proto", fileDescriptor_errors_cef0c035f29ecf49) } + +var fileDescriptor_errors_cef0c035f29ecf49 = []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, } diff --git a/pkg/roachpb/errors.proto b/pkg/roachpb/errors.proto index 0092a5cc5a21..5c0828426961 100644 --- a/pkg/roachpb/errors.proto +++ b/pkg/roachpb/errors.proto @@ -403,6 +403,10 @@ message TransactionRetryWithProtoRefreshError { // happens, client.Txn rejects future requests. message TxnAlreadyEncounteredErrorError{ option (gogoproto.equal) = true; + + // prev_error is the message from the error that the txn encountered + // previously. + optional string prev_error = 1 [(gogoproto.nullable) = false]; } // An IntegerOverflowError indicates that an operation was aborted because