From ad2196b51b919c7f8b1705f612fe590fa9d86bf0 Mon Sep 17 00:00:00 2001 From: Tobias Grieger Date: Thu, 12 Nov 2020 10:27:17 +0100 Subject: [PATCH] roachpb: use EncodedError in Error `roachpb.Error` has long been poor to work with. It could only transport structured errors for a hard-coded enum message (`ErrorDetail`) and had a complex and circuituous interaction with the standard library's `error` type: `pErr.GoError()` would return an `error` that was sometimes just `pErr` itself (hidden behind an identical type); other times it was an `UnhandledRetryableError` wrapping `pErr`, and then of course sometimes it would be the structured error from which `pErr` was created in the first place. Thanks to `cockroachdb/errors`, there's a much better option around, namely `errorspb.EncodedError` which has powerful capabilities to essentially carry any error across RPC boundaries (and notably does so "out of the box" for protobuf-backed errors) while retaining its original structure, as long as the error type is known on both sides of the RPC. The simplifications that result from this primitive would be enough to motivate this change in itself, but additionally after this change we will be able to reliably detect context cancellations, etc, without relying on error-prone and insecure string matching. Going into more detail, this commit makes the following changes: - adds an `EncodedError` to `Error` - deprecates the following fields on `Error`, which are henceforth deduced from the `EncodedError` where present: - `transaction_restart` - `message` - `detail` These fields are populated for the time being so that 20.2 nodes understand the errors emitted by 21.1 nodes. In 21.2, we can drop them all. - deprecates `(*Error).SetDetail`, which has only one real caller anyway (and that caller will be able to replace EncodedError instead once 21.2 comes around). - makes `(*Error).SafeFormat` redact properly based on `EncodedError` (yay!), though there's a larger TODO that's left for a follow-up change (around the fact that error details can depend on the surrounding Error for rendering, particularly relevant when SetTxn is called) We can capitalize on EncodedError before the 21.2 cycle, but this is left for future PRs. Fixes #54939. Release note: None --- pkg/ccl/backupccl/backup_processor.go | 2 +- pkg/kv/kvclient/kvcoord/txn_coord_sender.go | 6 +- pkg/kv/kvserver/client_merge_test.go | 6 +- pkg/kv/kvserver/closed_timestamp_test.go | 4 +- .../testdata/concurrency_manager/deadlocks | 10 +- .../concurrency_manager/discovered_lock | 2 +- pkg/kv/kvserver/replica_evaluate.go | 6 +- pkg/kv/kvserver/replica_range_lease.go | 1 + pkg/kv/kvserver/replica_test.go | 6 +- pkg/kv/kvserver/store_send.go | 2 + pkg/kv/txn.go | 2 +- pkg/kv/txn_test.go | 4 +- pkg/roachpb/BUILD.bazel | 1 + pkg/roachpb/data.go | 2 +- pkg/roachpb/errors.go | 157 +++-- pkg/roachpb/errors.pb.go | 535 ++++++++++-------- pkg/roachpb/errors.proto | 18 +- pkg/roachpb/errors_test.go | 4 +- pkg/server/node.go | 2 +- pkg/sql/execinfra/processorsbase.go | 3 +- pkg/testutils/error.go | 2 +- 21 files changed, 461 insertions(+), 314 deletions(-) diff --git a/pkg/ccl/backupccl/backup_processor.go b/pkg/ccl/backupccl/backup_processor.go index 25b31582d20c..fede602a4cfa 100644 --- a/pkg/ccl/backupccl/backup_processor.go +++ b/pkg/ccl/backupccl/backup_processor.go @@ -224,7 +224,7 @@ func runBackupProcessor( span.span, span.attempts+1, header.UserPriority.String()) rawRes, pErr := kv.SendWrappedWith(ctx, flowCtx.Cfg.DB.NonTransactionalSender(), header, req) if pErr != nil { - if err := pErr.Detail.GetWriteIntent(); err != nil { + if _, ok := pErr.GetDetail().(*roachpb.WriteIntentError); ok { span.lastTried = timeutil.Now() span.attempts++ todo <- span diff --git a/pkg/kv/kvclient/kvcoord/txn_coord_sender.go b/pkg/kv/kvclient/kvcoord/txn_coord_sender.go index e39372f6751e..2233813822c6 100644 --- a/pkg/kv/kvclient/kvcoord/txn_coord_sender.go +++ b/pkg/kv/kvclient/kvcoord/txn_coord_sender.go @@ -608,7 +608,7 @@ func (tc *TxnCoordSender) maybeRejectClientLocked( newTxn := roachpb.PrepareTransactionForRetry( ctx, abortedErr, roachpb.NormalUserPriority, tc.clock) return roachpb.NewError(roachpb.NewTransactionRetryWithProtoRefreshError( - abortedErr.Message, tc.mu.txn.ID, newTxn)) + abortedErr.String(), tc.mu.txn.ID, newTxn)) case protoStatus != roachpb.PENDING || hbObservedStatus != roachpb.PENDING: // The transaction proto is in an unexpected state. return roachpb.NewErrorf( @@ -687,7 +687,7 @@ func (tc *TxnCoordSender) handleRetryableErrLocked( // We'll pass a TransactionRetryWithProtoRefreshError up to the next layer. retErr := roachpb.NewTransactionRetryWithProtoRefreshError( - pErr.Message, + pErr.String(), errTxnID, // the id of the transaction that encountered the error newTxn) @@ -747,7 +747,7 @@ func (tc *TxnCoordSender) updateStateLocked( return nil } - if pErr.TransactionRestart != roachpb.TransactionRestart_NONE { + if pErr.TransactionRestart() != roachpb.TransactionRestart_NONE { if tc.typ == kv.LeafTxn { // Leaves handle retriable errors differently than roots. The leaf // transaction is not supposed to be used any more after a retriable diff --git a/pkg/kv/kvserver/client_merge_test.go b/pkg/kv/kvserver/client_merge_test.go index 16fa5f2e6624..af9e453289ed 100644 --- a/pkg/kv/kvserver/client_merge_test.go +++ b/pkg/kv/kvserver/client_merge_test.go @@ -1590,9 +1590,7 @@ func TestStoreRangeMergeCheckConsistencyAfterSubsumption(t *testing.T) { if et := r.GetEndTxn(); et != nil && et.InternalCommitTrigger.GetMergeTrigger() != nil { mergeEndTxnReceived <- ba.Txn <-abortMergeTxn - return &roachpb.Error{ - Message: "abort the merge for test", - } + return roachpb.NewError(errors.New("abort the merge for test")) } } return nil @@ -1653,7 +1651,7 @@ func TestStoreRangeMergeCheckConsistencyAfterSubsumption(t *testing.T) { pErr := <-mergeErr require.IsType(t, &roachpb.Error{}, pErr) - require.Regexp(t, "abort the merge for test", pErr.Message) + require.Regexp(t, "abort the merge for test", pErr.String()) testutils.SucceedsSoon(t, func() error { pErr := <-checkConsistencyResp diff --git a/pkg/kv/kvserver/closed_timestamp_test.go b/pkg/kv/kvserver/closed_timestamp_test.go index c741efa6fb76..adafc32c8c3e 100644 --- a/pkg/kv/kvserver/closed_timestamp_test.go +++ b/pkg/kv/kvserver/closed_timestamp_test.go @@ -1239,12 +1239,12 @@ func retryOnError(f func(*roachpb.Error) bool) respFunc { } var retryOnRangeKeyMismatch = retryOnError(func(pErr *roachpb.Error) bool { - _, isRangeKeyMismatch := pErr.Detail.Value.(*roachpb.ErrorDetail_RangeKeyMismatch) + _, isRangeKeyMismatch := pErr.GetDetail().(*roachpb.RangeKeyMismatchError) return isRangeKeyMismatch }) var retryOnRangeNotFound = retryOnError(func(pErr *roachpb.Error) bool { - _, isRangeNotFound := pErr.Detail.Value.(*roachpb.ErrorDetail_RangeNotFound) + _, isRangeNotFound := pErr.GetDetail().(*roachpb.RangeNotFoundError) return isRangeNotFound }) diff --git a/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/deadlocks b/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/deadlocks index 246b5b89f177..32740c5cc87e 100644 --- a/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/deadlocks +++ b/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/deadlocks @@ -161,7 +161,7 @@ on-txn-updated txn=txn1 status=aborted ---- [-] update txn: aborting txn1 [4] sequence req1r: detected pusher aborted -[4] sequence req1r: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED) +[4] sequence req1r: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED): [6] sequence req3r: resolving intent "a" for txn 00000001 with ABORTED status [6] sequence req3r: acquiring latches [6] sequence req3r: scanning lock table for conflicting locks @@ -380,7 +380,7 @@ on-txn-updated txn=txn1 status=aborted [4] sequence req4w: scanning lock table for conflicting locks [4] sequence req4w: sequencing complete, returned guard [5] sequence req1w2: detected pusher aborted -[5] sequence req1w2: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED) +[5] sequence req1w2: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED): [7] sequence req3w2: resolving intent "a" for txn 00000001 with ABORTED status [7] sequence req3w2: pushing txn 00000004 to detect request deadlock [7] sequence req3w2: blocked on select in concurrency_test.(*cluster).PushTransaction @@ -612,7 +612,7 @@ on-txn-updated txn=txn4 status=aborted ---- [-] update txn: aborting txn4 [4] sequence req4w: detected pusher aborted -[4] sequence req4w: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED) +[4] sequence req4w: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED): [5] sequence req1w2: acquiring latches [5] sequence req1w2: scanning lock table for conflicting locks [5] sequence req1w2: sequencing complete, returned guard @@ -836,7 +836,7 @@ on-txn-updated txn=txn1 status=aborted ---- [-] update txn: aborting txn1 [5] sequence req1w2: detected pusher aborted -[5] sequence req1w2: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED) +[5] sequence req1w2: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED): [6] sequence req3w2: resolving intent "a" for txn 00000001 with ABORTED status [6] sequence req3w2: acquiring latches [6] sequence req3w2: scanning lock table for conflicting locks @@ -1081,7 +1081,7 @@ on-txn-updated txn=txn4 status=aborted ---- [-] update txn: aborting txn4 [5] sequence req4w: detected pusher aborted -[5] sequence req4w: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED) +[5] sequence req4w: sequencing complete, returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED): [6] sequence req3w2: acquiring latches [6] sequence req3w2: scanning lock table for conflicting locks [6] sequence req3w2: sequencing complete, returned guard diff --git a/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/discovered_lock b/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/discovered_lock index 0d4194f21f2f..75e4496961c4 100644 --- a/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/discovered_lock +++ b/pkg/kv/kvserver/concurrency/testdata/concurrency_manager/discovered_lock @@ -210,7 +210,7 @@ on-txn-updated txn=txn2 status=aborted ---- [-] update txn: aborting txn2 [2] handle write intent error req1: detected pusher aborted -[2] handle write intent error req1: handled conflicting intents on "k", returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED) +[2] handle write intent error req1: handled conflicting intents on "k", returned error: TransactionAbortedError(ABORT_REASON_PUSHER_ABORTED): debug-lock-table ---- diff --git a/pkg/kv/kvserver/replica_evaluate.go b/pkg/kv/kvserver/replica_evaluate.go index e8b9693f8262..f99dca597e8a 100644 --- a/pkg/kv/kvserver/replica_evaluate.go +++ b/pkg/kv/kvserver/replica_evaluate.go @@ -249,7 +249,11 @@ func evaluateBatch( retErr, ok := pErr.GetDetail().(*roachpb.TransactionRetryError) if ok && retErr.Reason == roachpb.RETRY_WRITE_TOO_OLD && args.Method() == roachpb.EndTxn && writeTooOldState.err != nil { - pErr.SetDetail(writeTooOldState.err) + // TODO(tbg): this is the only real caller of this method. In 21.2, + // we should be able to simply replace EncodedError. Or even better, + // we stop manually crafting and mutating errors in the way this code + // does. + pErr.DeprecatedSetDetail(writeTooOldState.err) // Don't defer this error. We could perhaps rely on the client observing // the WriteTooOld flag and retry the batch, but we choose not too. writeTooOldState.cantDeferWTOE = true diff --git a/pkg/kv/kvserver/replica_range_lease.go b/pkg/kv/kvserver/replica_range_lease.go index 3aeea905c4a5..fa1851cd5f22 100644 --- a/pkg/kv/kvserver/replica_range_lease.go +++ b/pkg/kv/kvserver/replica_range_lease.go @@ -422,6 +422,7 @@ func (p *pendingLeaseRequest) requestLeaseAsync( // Don't send the same transaction object twice; this can lead to races. if pErr != nil { pErrClone := *pErr + // TODO(tbg): why? pErrClone.SetTxn(pErr.GetTxn()) llHandle.resolve(&pErrClone) } else { diff --git a/pkg/kv/kvserver/replica_test.go b/pkg/kv/kvserver/replica_test.go index 95130821a54e..f1c2305991e0 100644 --- a/pkg/kv/kvserver/replica_test.go +++ b/pkg/kv/kvserver/replica_test.go @@ -2290,16 +2290,16 @@ func TestLeaseConcurrent(t *testing.T) { pErrs[i] = <-pErrCh } - newMsg := "moob" + newErr := errors.New("moob") for i, pErr := range pErrs { if withError != (pErr != nil) { t.Errorf("%d: wanted error: %t, got error %v", i, withError, pErr) } - if testutils.IsPError(pErr, newMsg) { + if testutils.IsPError(pErr, newErr.Error()) { t.Errorf("%d: errors shared memory: %v", i, pErr) } else if testutils.IsPError(pErr, origMsg) { // Mess with anyone holding the same reference. - pErr.Message = newMsg + pErr.EncodedError = errors.EncodeError(context.Background(), newErr) } else if pErr != nil { t.Errorf("%d: unexpected error: %s", i, pErr) } diff --git a/pkg/kv/kvserver/store_send.go b/pkg/kv/kvserver/store_send.go index d35da82b5bd2..232576d9c4a8 100644 --- a/pkg/kv/kvserver/store_send.go +++ b/pkg/kv/kvserver/store_send.go @@ -244,6 +244,8 @@ func (s *Store) Send( return true // continue visiting } t.AppendRangeInfo(ctx, desc, l) + // We have to write `t` back to `pErr` so that it picks up the changes. + pErr.DeprecatedSetDetail(t) return true // continue visiting }) case *roachpb.RaftGroupDeletedError: diff --git a/pkg/kv/txn.go b/pkg/kv/txn.go index b14db9585687..460d44a125c3 100644 --- a/pkg/kv/txn.go +++ b/pkg/kv/txn.go @@ -1040,7 +1040,7 @@ func (txn *Txn) UpdateStateOnRemoteRetryableErr(ctx context.Context, pErr *roach txn.mu.Lock() defer txn.mu.Unlock() - if pErr.TransactionRestart == roachpb.TransactionRestart_NONE { + if pErr.TransactionRestart() == roachpb.TransactionRestart_NONE { log.Fatalf(ctx, "unexpected non-retryable error: %s", pErr) } diff --git a/pkg/kv/txn_test.go b/pkg/kv/txn_test.go index 2b574fb35f98..87552efcee02 100644 --- a/pkg/kv/txn_test.go +++ b/pkg/kv/txn_test.go @@ -287,11 +287,11 @@ func TestRunTransactionRetryOnErrors(t *testing.T) { pErr = roachpb.NewErrorWithTxn(test.err, ba.Txn) } - if pErr.TransactionRestart != roachpb.TransactionRestart_NONE { + if pErr.TransactionRestart() != roachpb.TransactionRestart_NONE { // HACK ALERT: to do without a TxnCoordSender, we jump through // hoops to get the retryable error expected by db.Txn(). return nil, roachpb.NewError(roachpb.NewTransactionRetryWithProtoRefreshError( - pErr.Message, ba.Txn.ID, *ba.Txn)) + "foo", ba.Txn.ID, *ba.Txn)) } return nil, pErr } diff --git a/pkg/roachpb/BUILD.bazel b/pkg/roachpb/BUILD.bazel index 5b8ff9e2e12d..b451ec74511e 100644 --- a/pkg/roachpb/BUILD.bazel +++ b/pkg/roachpb/BUILD.bazel @@ -52,6 +52,7 @@ go_library( "//vendor/github.com/aws/aws-sdk-go/aws/credentials", "//vendor/github.com/cockroachdb/apd/v2:apd", "//vendor/github.com/cockroachdb/errors", + "//vendor/github.com/cockroachdb/errors/errorspb", "//vendor/github.com/cockroachdb/redact", "//vendor/github.com/gogo/protobuf/proto", "//vendor/github.com/gogo/protobuf/sortkeys", diff --git a/pkg/roachpb/data.go b/pkg/roachpb/data.go index 0d1cb9c23c15..09cc327d9f16 100644 --- a/pkg/roachpb/data.go +++ b/pkg/roachpb/data.go @@ -1361,7 +1361,7 @@ func (tr *TransactionRecord) AsTransaction() Transaction { func PrepareTransactionForRetry( ctx context.Context, pErr *Error, pri UserPriority, clock *hlc.Clock, ) Transaction { - if pErr.TransactionRestart == TransactionRestart_NONE { + if pErr.TransactionRestart() == TransactionRestart_NONE { log.Fatalf(ctx, "invalid retryable err (%T): %s", pErr.GetDetail(), pErr) } diff --git a/pkg/roachpb/errors.go b/pkg/roachpb/errors.go index 733b1884f822..6931eb49e826 100644 --- a/pkg/roachpb/errors.go +++ b/pkg/roachpb/errors.go @@ -21,6 +21,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/protoutil" "github.com/cockroachdb/cockroach/pkg/util/uuid" "github.com/cockroachdb/errors" + "github.com/cockroachdb/errors/errorspb" "github.com/cockroachdb/redact" ) @@ -145,13 +146,21 @@ func NewError(err error) *Error { if err == nil { return nil } - e := &Error{} - if intErr, ok := err.(*internalError); ok { - *e = *(*Error)(intErr) - } else if msg, ok := err.(ErrorDetailInterface); ok { - e.SetDetail(msg) - } else { - e.Message = err.Error() + e := &Error{ + EncodedError: errors.EncodeError(context.Background(), err), + } + + // This block is deprecated behavior retained for compat with + // 20.2 nodes. It makes sure that if applicable, deprecatedMessage, + // ErrorDetail, and deprecatedTransactionRestart are set. + { + if intErr, ok := err.(*internalError); ok { + *e = *(*Error)(intErr) + } else if msg, ok := err.(ErrorDetailInterface); ok { + e.DeprecatedSetDetail(msg) + } else { + e.deprecatedMessage = err.Error() + } } return e } @@ -181,26 +190,44 @@ func (e *Error) SafeFormat(s redact.SafePrinter, _ rune) { s.Print(nil) return } - // NB: There's lots of potential for infinite recursion here. For example, - // e.GoError() sometimes prepends an UnhandledRetryableError, so if we rely - // on it here we may catch a recursive call. Also, *internalError is just the - // an alias to *Error and is returned from GetDetail(), so we have to make - // sure to terminate it here as well. These are all hints that *Error is not - // well constructed. - switch t := e.GetDetail().(type) { - case nil: - // No detail was returned. All we have is a message - // that will get stripped during redaction. - // - // TODO(tbg): improve this after this issue has been addressed: - // https://github.com/cockroachdb/cockroach/issues/54939 - s.Print(e.Message) - default: - // We have a detail and ignore e.Message. We do assume that if a detail is - // present, e.Message does correspond to that detail's message. This - // assumption is not enforced but appears sane. - s.Print(t) + + if e.EncodedError != (errors.EncodedError{}) { + err := errors.DecodeError(context.Background(), e.EncodedError) + var iface ErrorDetailInterface + if errors.As(err, &iface) { + // Deprecated code: if there is a detail and the message produced by the detail + // (which gets to see the surrounding Error) is different, then use that message. + // What is likely the cause of that is that someone passed an updated Transaction + // to the Error via SetTxn, and the error detail prints that txn. + // + // TODO(tbg): change SetTxn so that instead of stashing the transaction on the + // Error struct, it wraps the EncodedError with an error containing the updated + // txn. Make GetTxn retrieve the first one it sees (overriden by UnexposedTxn + // while it's still around). Remove the `message(Error)` methods from ErrorDetailInterface. + // We also have to remove GetDetail() in the process since it doesn't understand the + // wrapping; instead we need a method that looks for a specific kind of detail, i.e. + // we basically want to use `errors.As` instead. + deprecatedMsg := iface.message(e) + if deprecatedMsg != err.Error() { + s.Print(deprecatedMsg) + return + } + } + s.Print(err) + } else { + // TODO(tbg): remove this block in the 21.2 cycle and rely on EncodedError + // always being populated. + switch t := e.GetDetail().(type) { + case nil: + s.Print(e.deprecatedMessage) + default: + // We have a detail and ignore e.deprecatedMessage. We do assume that if a detail is + // present, e.deprecatedMessage does correspond to that detail's message. This + // assumption is not enforced but appears sane. + s.Print(t) + } } + if txn := e.GetTxn(); txn != nil { s.SafeString(": ") s.Print(txn) @@ -212,6 +239,21 @@ func (e *Error) String() string { return redact.StringWithoutMarkers(e) } +// TransactionRestart returns the TransactionRestart for this Error. +func (e *Error) TransactionRestart() TransactionRestart { + if e.EncodedError == (errorspb.EncodedError{}) { + // Legacy code. + // + // TODO(tbg): delete in 21.2. + return e.deprecatedTransactionRestart + } + var iface transactionRestartError + if errors.As(errors.DecodeError(context.Background(), e.EncodedError), &iface) { + return iface.canRestartTransaction() + } + return TransactionRestart_NONE +} + type internalError Error func (e *internalError) Error() string { @@ -221,7 +263,7 @@ func (e *internalError) Error() string { // ErrorDetailInterface is an interface for each error detail. // These must not be implemented by anything other than our protobuf-backed error details // as we rely on a 1:1 correspondence between the interface and what can be stored via -// `Error.SetDetail`. +// `Error.DeprecatedSetDetail`. type ErrorDetailInterface interface { error protoutil.Message @@ -287,8 +329,23 @@ func (e *Error) GoError() error { if e == nil { return nil } + if e.EncodedError != (errorspb.EncodedError{}) { + err := errors.DecodeError(context.Background(), e.EncodedError) + var iface transactionRestartError + if errors.As(err, &iface) { + if txnRestart := iface.canRestartTransaction(); txnRestart != TransactionRestart_NONE { + // TODO(tbg): revisit this unintuitive error wrapping here and see if + // a better solution can be found. + return &UnhandledRetryableError{ + PErr: *e, + } + } + } + return err + } - if e.TransactionRestart != TransactionRestart_NONE { + // Everything below is legacy behavior that can be deleted in 21.2. + if e.TransactionRestart() != TransactionRestart_NONE { return &UnhandledRetryableError{ PErr: *e, } @@ -299,18 +356,22 @@ func (e *Error) GoError() error { return (*internalError)(e) } -// SetDetail sets the error detail for the error. The argument cannot be nil. -func (e *Error) SetDetail(detail ErrorDetailInterface) { +// DeprecatedSetDetail sets the error detail for the error. The argument cannot be nil. +// +// DEPRECATED: see Error.EncodedError instead. +func (e *Error) DeprecatedSetDetail(detail ErrorDetailInterface) { if detail == nil { panic("nil detail argument") } - e.Message = detail.message(e) + e.EncodedError = errors.EncodeError(context.Background(), detail) + + e.deprecatedMessage = detail.message(e) if r, ok := detail.(transactionRestartError); ok { - e.TransactionRestart = r.canRestartTransaction() + e.deprecatedTransactionRestart = r.canRestartTransaction() } else { - e.TransactionRestart = TransactionRestart_NONE + e.deprecatedTransactionRestart = TransactionRestart_NONE } - e.Detail.MustSetInner(detail) + e.deprecatedDetail.MustSetInner(detail) e.checkTxnStatusValid() } @@ -319,7 +380,15 @@ func (e *Error) GetDetail() ErrorDetailInterface { if e == nil { return nil } - detail, _ := e.Detail.GetInner().(ErrorDetailInterface) + var detail ErrorDetailInterface + if e.EncodedError != (errorspb.EncodedError{}) { + errors.As(errors.DecodeError(context.Background(), e.EncodedError), &detail) + } else { + // Legacy behavior. + // + // TODO(tbg): delete in v21.2. + detail, _ = e.deprecatedDetail.GetInner().(ErrorDetailInterface) + } return detail } @@ -341,9 +410,11 @@ func (e *Error) UpdateTxn(o *Transaction) { } else { e.UnexposedTxn.Update(o) } - if sErr, ok := e.Detail.GetInner().(ErrorDetailInterface); ok { + if sErr, ok := e.deprecatedDetail.GetInner().(ErrorDetailInterface); ok { // Refresh the message as the txn is updated. - e.Message = sErr.message(e) + // + // TODO(tbg): deprecated, remove in 21.2. + e.deprecatedMessage = sErr.message(e) } e.checkTxnStatusValid() } @@ -351,12 +422,15 @@ func (e *Error) UpdateTxn(o *Transaction) { // checkTxnStatusValid verifies that the transaction status is in-sync with the // error detail. func (e *Error) checkTxnStatusValid() { + // TODO(tbg): this will need to be updated when we + // remove all of these deprecated fields in 21.2. + txn := e.UnexposedTxn - err := e.Detail.GetInner() + err := e.deprecatedDetail.GetInner() if txn == nil { return } - if e.TransactionRestart == TransactionRestart_NONE { + if e.deprecatedTransactionRestart == TransactionRestart_NONE { return } if errors.HasType(err, (*TransactionAbortedError)(nil)) { @@ -649,6 +723,11 @@ func NewTransactionAbortedError(reason TransactionAbortedReason) *TransactionAbo // // txnID is the ID of the transaction being restarted. // txn is the transaction that the client should use for the next attempts. +// +// TODO(tbg): the message passed here is usually pErr.String(), which is a bad +// pattern (loses structure, thus redaction). We can leverage error chaining +// to improve this: wrap `pErr.GoError()` with a barrier and then with the +// TransactionRetryWithProtoRefreshError. func NewTransactionRetryWithProtoRefreshError( msg string, txnID uuid.UUID, txn Transaction, ) *TransactionRetryWithProtoRefreshError { diff --git a/pkg/roachpb/errors.pb.go b/pkg/roachpb/errors.pb.go index 7e379fa3cc7b..1139f73db267 100644 --- a/pkg/roachpb/errors.pb.go +++ b/pkg/roachpb/errors.pb.go @@ -6,6 +6,7 @@ package roachpb import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import errorspb "github.com/cockroachdb/errors/errorspb" import hlc "github.com/cockroachdb/cockroach/pkg/util/hlc" import github_com_cockroachdb_cockroach_pkg_util_uuid "github.com/cockroachdb/cockroach/pkg/util/uuid" @@ -121,7 +122,7 @@ func (x *TransactionAbortedReason) UnmarshalJSON(data []byte) error { return nil } func (TransactionAbortedReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{0} + return fileDescriptor_errors_7f973735b5f2ff97, []int{0} } // TransactionRetryReason specifies what caused a transaction retry. @@ -172,7 +173,7 @@ func (x *TransactionRetryReason) UnmarshalJSON(data []byte) error { return nil } func (TransactionRetryReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{1} + return fileDescriptor_errors_7f973735b5f2ff97, []int{1} } // TransactionRestart indicates how an error should be handled in a @@ -223,7 +224,7 @@ func (x *TransactionRestart) UnmarshalJSON(data []byte) error { return nil } func (TransactionRestart) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{2} + return fileDescriptor_errors_7f973735b5f2ff97, []int{2} } // Reason specifies what caused the error. @@ -262,7 +263,7 @@ func (x *TransactionStatusError_Reason) UnmarshalJSON(data []byte) error { return nil } func (TransactionStatusError_Reason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{9, 0} + return fileDescriptor_errors_7f973735b5f2ff97, []int{9, 0} } // Reason specifies what caused the error. @@ -318,7 +319,7 @@ func (x *RangeFeedRetryError_Reason) UnmarshalJSON(data []byte) error { return nil } func (RangeFeedRetryError_Reason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{27, 0} + return fileDescriptor_errors_7f973735b5f2ff97, []int{27, 0} } // A NotLeaseHolderError indicates that the current range is not the lease @@ -349,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_ac652c3579d4362e, []int{0} + return fileDescriptor_errors_7f973735b5f2ff97, []int{0} } func (m *NotLeaseHolderError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -384,7 +385,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_ac652c3579d4362e, []int{1} + return fileDescriptor_errors_7f973735b5f2ff97, []int{1} } func (m *NodeUnavailableError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -418,7 +419,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_ac652c3579d4362e, []int{2} + return fileDescriptor_errors_7f973735b5f2ff97, []int{2} } func (m *UnsupportedRequestError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -455,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_ac652c3579d4362e, []int{3} + return fileDescriptor_errors_7f973735b5f2ff97, []int{3} } func (m *RangeNotFoundError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -506,7 +507,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_ac652c3579d4362e, []int{4} + return fileDescriptor_errors_7f973735b5f2ff97, []int{4} } func (m *RangeKeyMismatchError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -551,7 +552,7 @@ type ReadWithinUncertaintyIntervalError struct { func (m *ReadWithinUncertaintyIntervalError) Reset() { *m = ReadWithinUncertaintyIntervalError{} } func (*ReadWithinUncertaintyIntervalError) ProtoMessage() {} func (*ReadWithinUncertaintyIntervalError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{5} + return fileDescriptor_errors_7f973735b5f2ff97, []int{5} } func (m *ReadWithinUncertaintyIntervalError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -594,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_ac652c3579d4362e, []int{6} + return fileDescriptor_errors_7f973735b5f2ff97, []int{6} } func (m *TransactionAbortedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -630,7 +631,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_ac652c3579d4362e, []int{7} + return fileDescriptor_errors_7f973735b5f2ff97, []int{7} } func (m *TransactionPushError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -666,7 +667,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_ac652c3579d4362e, []int{8} + return fileDescriptor_errors_7f973735b5f2ff97, []int{8} } func (m *TransactionRetryError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -706,7 +707,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_ac652c3579d4362e, []int{9} + return fileDescriptor_errors_7f973735b5f2ff97, []int{9} } func (m *TransactionStatusError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -744,7 +745,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_ac652c3579d4362e, []int{10} + return fileDescriptor_errors_7f973735b5f2ff97, []int{10} } func (m *WriteIntentError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -782,7 +783,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_ac652c3579d4362e, []int{11} + return fileDescriptor_errors_7f973735b5f2ff97, []int{11} } func (m *WriteTooOldError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +819,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_ac652c3579d4362e, []int{12} + return fileDescriptor_errors_7f973735b5f2ff97, []int{12} } func (m *OpRequiresTxnError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -855,7 +856,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_ac652c3579d4362e, []int{13} + return fileDescriptor_errors_7f973735b5f2ff97, []int{13} } func (m *ConditionFailedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -892,7 +893,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_ac652c3579d4362e, []int{14} + return fileDescriptor_errors_7f973735b5f2ff97, []int{14} } func (m *LeaseRejectedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -930,7 +931,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_ac652c3579d4362e, []int{15} + return fileDescriptor_errors_7f973735b5f2ff97, []int{15} } func (m *AmbiguousResultError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -964,7 +965,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_ac652c3579d4362e, []int{16} + return fileDescriptor_errors_7f973735b5f2ff97, []int{16} } func (m *RaftGroupDeletedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1002,7 +1003,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_ac652c3579d4362e, []int{17} + return fileDescriptor_errors_7f973735b5f2ff97, []int{17} } func (m *ReplicaCorruptionError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1039,7 +1040,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_ac652c3579d4362e, []int{18} + return fileDescriptor_errors_7f973735b5f2ff97, []int{18} } func (m *ReplicaTooOldError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1074,7 +1075,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_ac652c3579d4362e, []int{19} + return fileDescriptor_errors_7f973735b5f2ff97, []int{19} } func (m *StoreNotFoundError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1119,7 +1120,7 @@ type UnhandledRetryableError struct { func (m *UnhandledRetryableError) Reset() { *m = UnhandledRetryableError{} } func (*UnhandledRetryableError) ProtoMessage() {} func (*UnhandledRetryableError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{20} + return fileDescriptor_errors_7f973735b5f2ff97, []int{20} } func (m *UnhandledRetryableError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1171,7 +1172,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_ac652c3579d4362e, []int{21} + return fileDescriptor_errors_7f973735b5f2ff97, []int{21} } func (m *TransactionRetryWithProtoRefreshError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1209,7 +1210,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_ac652c3579d4362e, []int{22} + return fileDescriptor_errors_7f973735b5f2ff97, []int{22} } func (m *TxnAlreadyEncounteredErrorError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1246,7 +1247,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_ac652c3579d4362e, []int{23} + return fileDescriptor_errors_7f973735b5f2ff97, []int{23} } func (m *IntegerOverflowError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,7 +1283,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_ac652c3579d4362e, []int{24} + return fileDescriptor_errors_7f973735b5f2ff97, []int{24} } func (m *BatchTimestampBeforeGCError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1321,7 +1322,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_ac652c3579d4362e, []int{25} + return fileDescriptor_errors_7f973735b5f2ff97, []int{25} } func (m *IntentMissingError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1358,7 +1359,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_ac652c3579d4362e, []int{26} + return fileDescriptor_errors_7f973735b5f2ff97, []int{26} } func (m *MergeInProgressError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1393,7 +1394,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_ac652c3579d4362e, []int{27} + return fileDescriptor_errors_7f973735b5f2ff97, []int{27} } func (m *RangeFeedRetryError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1432,7 +1433,7 @@ func (m *IndeterminateCommitError) Reset() { *m = IndeterminateCommitErr func (m *IndeterminateCommitError) String() string { return proto.CompactTextString(m) } func (*IndeterminateCommitError) ProtoMessage() {} func (*IndeterminateCommitError) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{28} + return fileDescriptor_errors_7f973735b5f2ff97, []int{28} } func (m *IndeterminateCommitError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1495,7 +1496,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_ac652c3579d4362e, []int{29} + return fileDescriptor_errors_7f973735b5f2ff97, []int{29} } func (m *ErrorDetail) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2422,7 +2423,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_ac652c3579d4362e, []int{30} + return fileDescriptor_errors_7f973735b5f2ff97, []int{30} } func (m *ErrPosition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2451,20 +2452,28 @@ var xxx_messageInfo_ErrPosition proto.InternalMessageInfo // and information about retryability. type Error struct { // message is a human-readable error message. - Message string `protobuf:"bytes,1,opt,name=message" json:"message"` + // + // DEPRECATED. + deprecatedMessage string `protobuf:"bytes,1,opt,name=message" json:"message"` // If transaction_restart is not NONE, the error condition may be handled by // restarting the transaction. - TransactionRestart TransactionRestart `protobuf:"varint,3,opt,name=transaction_restart,json=transactionRestart,enum=cockroach.roachpb.TransactionRestart" json:"transaction_restart"` + // + // DEPRECATED. + deprecatedTransactionRestart TransactionRestart `protobuf:"varint,3,opt,name=transaction_restart,json=transactionRestart,enum=cockroach.roachpb.TransactionRestart" json:"transaction_restart"` // An optional updated transaction. This is to be used by the client in case // of retryable errors. // - // Not to be accessed directly - use Error.GetTxn(). + // Not to be accessed directly - use Error.GetTxn() and Error.SetTxn(). UnexposedTxn *Transaction `protobuf:"bytes,4,opt,name=unexposed_txn,json=unexposedTxn" json:"unexposed_txn,omitempty"` // Node at which the error was generated (zero if does not apply). OriginNode NodeID `protobuf:"varint,5,opt,name=origin_node,json=originNode,casttype=NodeID" json:"origin_node"` // If an ErrorDetail is present, it may contain additional structured data // about the error. - Detail ErrorDetail `protobuf:"bytes,6,opt,name=detail" json:"detail"` + // + // DEPRECATED - consult encoded_error instead. + deprecatedDetail ErrorDetail `protobuf:"bytes,6,opt,name=detail" json:"detail"` + // encoded_error is the Go error that caused this Error. + EncodedError errorspb.EncodedError `protobuf:"bytes,9,opt,name=encoded_error,json=encodedError" json:"encoded_error"` // The index, if given, contains the index of the request (in the batch) // whose execution caused the error. Index *ErrPosition `protobuf:"bytes,7,opt,name=index" json:"index,omitempty"` @@ -2476,7 +2485,7 @@ type Error struct { func (m *Error) Reset() { *m = Error{} } func (*Error) ProtoMessage() {} func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_errors_ac652c3579d4362e, []int{31} + return fileDescriptor_errors_7f973735b5f2ff97, []int{31} } func (m *Error) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3868,11 +3877,11 @@ func (m *Error) MarshalTo(dAtA []byte) (int, error) { _ = l dAtA[i] = 0xa i++ - i = encodeVarintErrors(dAtA, i, uint64(len(m.Message))) - i += copy(dAtA[i:], m.Message) + i = encodeVarintErrors(dAtA, i, uint64(len(m.deprecatedMessage))) + i += copy(dAtA[i:], m.deprecatedMessage) dAtA[i] = 0x18 i++ - i = encodeVarintErrors(dAtA, i, uint64(m.TransactionRestart)) + i = encodeVarintErrors(dAtA, i, uint64(m.deprecatedTransactionRestart)) if m.UnexposedTxn != nil { dAtA[i] = 0x22 i++ @@ -3888,8 +3897,8 @@ func (m *Error) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintErrors(dAtA, i, uint64(m.OriginNode)) dAtA[i] = 0x32 i++ - i = encodeVarintErrors(dAtA, i, uint64(m.Detail.Size())) - n53, err := m.Detail.MarshalTo(dAtA[i:]) + i = encodeVarintErrors(dAtA, i, uint64(m.deprecatedDetail.Size())) + n53, err := m.deprecatedDetail.MarshalTo(dAtA[i:]) if err != nil { return 0, err } @@ -3912,6 +3921,14 @@ func (m *Error) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n55 + dAtA[i] = 0x4a + i++ + i = encodeVarintErrors(dAtA, i, uint64(m.EncodedError.Size())) + n56, err := m.EncodedError.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n56 return i, nil } @@ -4669,15 +4686,15 @@ func (m *Error) Size() (n int) { } var l int _ = l - l = len(m.Message) + l = len(m.deprecatedMessage) n += 1 + l + sovErrors(uint64(l)) - n += 1 + sovErrors(uint64(m.TransactionRestart)) + n += 1 + sovErrors(uint64(m.deprecatedTransactionRestart)) if m.UnexposedTxn != nil { l = m.UnexposedTxn.Size() n += 1 + l + sovErrors(uint64(l)) } n += 1 + sovErrors(uint64(m.OriginNode)) - l = m.Detail.Size() + l = m.deprecatedDetail.Size() n += 1 + l + sovErrors(uint64(l)) if m.Index != nil { l = m.Index.Size() @@ -4685,6 +4702,8 @@ func (m *Error) Size() (n int) { } l = m.Now.Size() n += 1 + l + sovErrors(uint64(l)) + l = m.EncodedError.Size() + n += 1 + l + sovErrors(uint64(l)) return n } @@ -8556,7 +8575,7 @@ func (m *Error) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field deprecatedMessage", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8581,13 +8600,13 @@ func (m *Error) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Message = string(dAtA[iNdEx:postIndex]) + m.deprecatedMessage = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TransactionRestart", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field deprecatedTransactionRestart", wireType) } - m.TransactionRestart = 0 + m.deprecatedTransactionRestart = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowErrors @@ -8597,7 +8616,7 @@ func (m *Error) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TransactionRestart |= (TransactionRestart(b) & 0x7F) << shift + m.deprecatedTransactionRestart |= (TransactionRestart(b) & 0x7F) << shift if b < 0x80 { break } @@ -8656,7 +8675,7 @@ func (m *Error) Unmarshal(dAtA []byte) error { } case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Detail", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field deprecatedDetail", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8680,7 +8699,7 @@ func (m *Error) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Detail.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.deprecatedDetail.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -8747,6 +8766,36 @@ func (m *Error) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncodedError", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErrors + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthErrors + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EncodedError.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipErrors(dAtA[iNdEx:]) @@ -8873,189 +8922,193 @@ var ( ErrIntOverflowErrors = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/errors.proto", fileDescriptor_errors_ac652c3579d4362e) } - -var fileDescriptor_errors_ac652c3579d4362e = []byte{ - // 2894 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xcb, 0x6f, 0x1b, 0xd7, - 0xb9, 0xe7, 0x50, 0x94, 0x44, 0x7d, 0x7a, 0x78, 0x7c, 0x2c, 0xcb, 0x63, 0x39, 0xa6, 0x9c, 0x71, - 0x9c, 0xd8, 0x0e, 0x22, 0x5d, 0x38, 0xd7, 0xc0, 0x4d, 0xae, 0xb3, 0xe0, 0x63, 0x24, 0x0e, 0xcd, - 0x87, 0xee, 0x90, 0x8a, 0xec, 0xf8, 0x16, 0x27, 0x23, 0xce, 0x11, 0x35, 0x35, 0x39, 0xc3, 0x9c, - 0x19, 0xda, 0xd2, 0xae, 0x68, 0x37, 0x45, 0x0b, 0x14, 0xdd, 0xb5, 0xcb, 0x02, 0x41, 0x17, 0x05, - 0x8a, 0xa2, 0xe8, 0x1f, 0xd0, 0xb5, 0x97, 0x59, 0x06, 0x45, 0x61, 0xb4, 0x4e, 0x77, 0xfd, 0x0f, - 0xb2, 0x2a, 0xce, 0x63, 0xc8, 0xa1, 0x38, 0x54, 0x98, 0xec, 0x66, 0xbe, 0xc7, 0xef, 0x7c, 0xe7, - 0xf5, 0x7d, 0xbf, 0xef, 0xc0, 0x3a, 0xf5, 0xed, 0xf6, 0x49, 0xff, 0x68, 0x87, 0x50, 0xea, 0xd3, - 0x60, 0xbb, 0x4f, 0xfd, 0xd0, 0x47, 0x97, 0xdb, 0x7e, 0xfb, 0x39, 0xd7, 0x6c, 0x4b, 0xfd, 0x26, - 0x8a, 0x0c, 0x1d, 0x3b, 0xb4, 0x85, 0xd9, 0xe6, 0x46, 0x24, 0xeb, 0x91, 0xd0, 0x8e, 0xc9, 0xb5, - 0x41, 0xe8, 0x76, 0x77, 0x4e, 0xba, 0xed, 0x9d, 0xd0, 0xed, 0x91, 0x20, 0xb4, 0x7b, 0x7d, 0xa9, - 0x59, 0xef, 0xf8, 0x1d, 0x9f, 0x7f, 0xee, 0xb0, 0x2f, 0x21, 0xd5, 0xff, 0x9c, 0x86, 0x2b, 0x75, - 0x3f, 0xac, 0x12, 0x3b, 0x20, 0x65, 0xbf, 0xeb, 0x10, 0x6a, 0xb0, 0x68, 0x50, 0x09, 0x16, 0x29, - 0xe9, 0x77, 0xdd, 0xb6, 0xad, 0x29, 0xb7, 0x94, 0xbb, 0xcb, 0x0f, 0xde, 0xd9, 0x9e, 0x08, 0x6c, - 0xdb, 0x12, 0x16, 0x25, 0x12, 0xb4, 0xa9, 0xdb, 0x0f, 0x7d, 0x5a, 0xc8, 0xbc, 0x7a, 0xbd, 0x95, - 0xb2, 0x22, 0x57, 0xb4, 0x07, 0x2b, 0x5d, 0x86, 0x8c, 0x4f, 0x38, 0xb4, 0x96, 0x9e, 0x1d, 0xca, - 0x5a, 0xee, 0x8e, 0x62, 0x42, 0x0f, 0x21, 0x4b, 0x6d, 0xaf, 0x43, 0xb0, 0xeb, 0x68, 0x73, 0xb7, - 0x94, 0xbb, 0x73, 0x85, 0x4d, 0x36, 0xd2, 0x9b, 0xd7, 0x5b, 0x8b, 0x16, 0x93, 0x9b, 0xa5, 0x6f, - 0x47, 0x9f, 0xd6, 0x22, 0xb7, 0x35, 0x1d, 0xb4, 0x0d, 0xf3, 0x1c, 0x45, 0xcb, 0xf0, 0x81, 0xb5, - 0x84, 0x81, 0xf9, 0xcc, 0x2d, 0x61, 0x86, 0x6e, 0x03, 0xb4, 0x07, 0x41, 0xe8, 0xf7, 0x70, 0x2f, - 0xe8, 0x68, 0xf3, 0xb7, 0x94, 0xbb, 0x4b, 0x72, 0x4a, 0x4b, 0x42, 0x5e, 0x0b, 0x3a, 0xfa, 0x06, - 0xac, 0xd7, 0x7d, 0x87, 0x1c, 0x78, 0xf6, 0x0b, 0xdb, 0xed, 0xda, 0x47, 0x5d, 0xc2, 0x97, 0x4c, - 0xbf, 0x0e, 0xd7, 0x0e, 0xbc, 0x60, 0xd0, 0xef, 0xfb, 0x34, 0x24, 0x8e, 0x45, 0xbe, 0x18, 0x90, - 0x20, 0x14, 0xaa, 0x9f, 0x2a, 0x80, 0x78, 0x70, 0x75, 0x3f, 0xdc, 0xf5, 0x07, 0x9e, 0x23, 0x16, - 0x39, 0x3e, 0x2b, 0x65, 0xf6, 0x59, 0x3d, 0x84, 0x6c, 0x10, 0xfa, 0x94, 0xbb, 0xa5, 0xc7, 0xdd, - 0x9a, 0x4c, 0x2e, 0xdc, 0xe4, 0xa7, 0xb5, 0xc8, 0x6d, 0x4d, 0x47, 0xff, 0xcd, 0x1c, 0x5c, 0xe5, - 0x58, 0x8f, 0xc9, 0x59, 0xcd, 0x0d, 0x7a, 0x76, 0xd8, 0x3e, 0x11, 0x71, 0x7c, 0x08, 0x97, 0xa9, - 0x08, 0x17, 0x07, 0xa1, 0x4d, 0x43, 0xfc, 0x9c, 0x9c, 0xf1, 0x80, 0x56, 0x0a, 0x8b, 0xdf, 0xbe, - 0xde, 0x9a, 0x7b, 0x4c, 0xce, 0xac, 0x4b, 0xd2, 0xa2, 0xc9, 0x0c, 0x1e, 0x93, 0x33, 0xb4, 0x03, - 0x91, 0x08, 0x13, 0xcf, 0xe1, 0x2e, 0xe9, 0x71, 0x97, 0x55, 0xa9, 0x37, 0x3c, 0x87, 0x39, 0x9c, - 0xc0, 0x0d, 0x87, 0xf4, 0x29, 0x69, 0xdb, 0x21, 0x71, 0x70, 0x4f, 0x46, 0x40, 0x1c, 0xcc, 0xe7, - 0xc5, 0xb7, 0x75, 0xf9, 0x81, 0x9e, 0x74, 0x36, 0x98, 0x7e, 0xe2, 0x90, 0x5d, 0x1f, 0x81, 0xd5, - 0x86, 0x58, 0xdc, 0x14, 0x7d, 0x0e, 0x9b, 0xb1, 0x91, 0x82, 0x41, 0xa7, 0x43, 0x82, 0x70, 0x38, - 0x50, 0x66, 0xd6, 0x81, 0x2c, 0x6d, 0x84, 0xd2, 0x8c, 0x40, 0xc4, 0x08, 0x55, 0x58, 0xe0, 0x60, - 0x81, 0x36, 0x7f, 0x6b, 0xee, 0xee, 0xf2, 0x83, 0xb7, 0xa6, 0xa1, 0x99, 0xde, 0xb1, 0x5f, 0xd8, - 0x90, 0xdb, 0xb3, 0x26, 0x7c, 0x4c, 0x2f, 0x24, 0xd4, 0xb3, 0xbb, 0x96, 0xc4, 0xd0, 0xff, 0x9d, - 0x06, 0xdd, 0x22, 0xb6, 0x73, 0xe8, 0x86, 0x27, 0xae, 0x77, 0xe0, 0xb5, 0x09, 0x0d, 0x6d, 0xd7, - 0x0b, 0xcf, 0xb8, 0xe5, 0x0b, 0xbb, 0x2b, 0xb6, 0xa9, 0x02, 0x6b, 0x94, 0xd8, 0x0e, 0x1e, 0xde, - 0x6c, 0x79, 0x35, 0x6f, 0xc6, 0x06, 0x67, 0xd7, 0x7f, 0xfb, 0xa4, 0xdb, 0xde, 0x6e, 0x45, 0x46, - 0x72, 0xb9, 0x56, 0x99, 0xeb, 0x50, 0x88, 0x2c, 0x40, 0xe4, 0xd4, 0x0d, 0x42, 0xd7, 0xeb, 0xc4, - 0xf0, 0xd2, 0xb3, 0xe3, 0x5d, 0x8e, 0xdc, 0x47, 0x98, 0x05, 0x58, 0xed, 0xd9, 0xa7, 0x31, 0xb8, - 0xb9, 0x19, 0xe0, 0xac, 0x95, 0x9e, 0x7d, 0x3a, 0xc2, 0x78, 0x06, 0x57, 0xfc, 0xa3, 0x80, 0xd0, - 0x17, 0x24, 0x36, 0xcf, 0x40, 0xcb, 0xf0, 0x55, 0x4e, 0x4a, 0x1c, 0x0d, 0x69, 0x7d, 0x3e, 0x3e, - 0xe4, 0x9f, 0x57, 0x04, 0x1f, 0x67, 0x7e, 0xfb, 0xbb, 0xad, 0x94, 0xee, 0xc0, 0xb5, 0x16, 0xb5, - 0xbd, 0xc0, 0x6e, 0x87, 0xae, 0xef, 0xe5, 0x8f, 0xf8, 0x75, 0x15, 0x2b, 0x6c, 0xc2, 0x02, 0x25, - 0x76, 0xe0, 0x7b, 0x7c, 0x65, 0xd7, 0x1e, 0xbc, 0x9f, 0x30, 0xe0, 0xa4, 0xaf, 0xc5, 0x5d, 0xe4, - 0xb8, 0x12, 0x40, 0x7f, 0x06, 0xeb, 0x31, 0xcb, 0xfd, 0x41, 0x20, 0xef, 0x5a, 0x11, 0xa0, 0x3f, - 0x08, 0x4e, 0x08, 0xc1, 0xe1, 0xa9, 0x27, 0x37, 0x30, 0x77, 0xf1, 0x30, 0x51, 0x0a, 0x12, 0x7e, - 0xad, 0x53, 0x4f, 0xff, 0x99, 0x02, 0x57, 0x63, 0x06, 0x16, 0x09, 0xe9, 0x99, 0x80, 0xdf, 0x3b, - 0x37, 0x83, 0x7b, 0x17, 0x43, 0x73, 0xcf, 0xa4, 0xf8, 0xd1, 0xdb, 0xb0, 0x44, 0x4e, 0x43, 0x6a, - 0xf3, 0x4c, 0x98, 0x8e, 0x65, 0xc2, 0x2c, 0x17, 0xb3, 0x44, 0xf8, 0x57, 0x05, 0x36, 0x62, 0x58, - 0xcd, 0xd0, 0x0e, 0x07, 0x81, 0x08, 0x63, 0x03, 0xe6, 0x98, 0x9f, 0x12, 0xf3, 0x63, 0x02, 0x54, - 0x1f, 0x86, 0x97, 0xe6, 0xe1, 0xfd, 0xd7, 0xc5, 0xe1, 0xc5, 0x20, 0xb7, 0x13, 0x57, 0xf9, 0x11, - 0x2c, 0x08, 0x39, 0x42, 0xb0, 0x66, 0x19, 0xf9, 0x66, 0xa3, 0x8e, 0x0f, 0xea, 0x8f, 0xeb, 0x8d, - 0xc3, 0xba, 0x9a, 0x42, 0x1a, 0xac, 0x4b, 0x59, 0xeb, 0x49, 0x1d, 0x17, 0x1b, 0xb5, 0x9a, 0xd9, - 0x6a, 0x19, 0x25, 0x35, 0xad, 0x67, 0xb2, 0x8a, 0xaa, 0xe8, 0x4d, 0x50, 0x0f, 0xa9, 0x1b, 0x12, - 0x76, 0xcd, 0x3c, 0x91, 0xaa, 0xd1, 0x47, 0xb0, 0xe8, 0xf2, 0xdf, 0x40, 0x53, 0xf8, 0xa1, 0xbb, - 0x9e, 0x10, 0xa2, 0x70, 0x88, 0xaa, 0x9d, 0xb4, 0xaf, 0x64, 0xb2, 0x69, 0x75, 0x4e, 0xff, 0xbd, - 0x22, 0x51, 0x5b, 0xbe, 0xdf, 0xe8, 0xca, 0x83, 0x95, 0x87, 0xa5, 0x1f, 0x74, 0x6b, 0x47, 0x5e, - 0xa8, 0x0e, 0xaa, 0xdd, 0x0e, 0x07, 0x76, 0xf7, 0x87, 0xdd, 0xd7, 0x4b, 0xc2, 0x79, 0x28, 0xd6, - 0xd7, 0x01, 0x35, 0xfa, 0xac, 0x4a, 0xb9, 0x94, 0x04, 0xad, 0x53, 0x4f, 0x54, 0xaa, 0x26, 0xac, - 0x17, 0x7d, 0xcf, 0x71, 0xd9, 0xea, 0xef, 0xda, 0x6e, 0x37, 0xba, 0x19, 0xff, 0x0b, 0x2b, 0x72, - 0xf4, 0x17, 0x76, 0x77, 0x40, 0xe4, 0x1c, 0x92, 0x0a, 0xea, 0xa7, 0x4c, 0x6f, 0x2d, 0x0b, 0x6b, - 0xfe, 0xa3, 0xff, 0x49, 0x01, 0x24, 0xea, 0x2c, 0xf9, 0x31, 0x69, 0x0f, 0x6f, 0x5b, 0x0e, 0x16, - 0x7b, 0x24, 0x08, 0xec, 0x0e, 0x19, 0x3b, 0x28, 0x91, 0x10, 0x3d, 0x82, 0x25, 0x59, 0x41, 0x88, - 0x23, 0xa7, 0x3a, 0xb5, 0x82, 0x47, 0xeb, 0x35, 0x74, 0x40, 0x1f, 0x43, 0x36, 0x4a, 0x51, 0x32, - 0x11, 0x7d, 0x97, 0xf3, 0xd0, 0x5e, 0xff, 0x02, 0xd6, 0xf3, 0xbd, 0x23, 0xb7, 0x33, 0xf0, 0x07, - 0x81, 0x45, 0x82, 0x41, 0x37, 0x9c, 0x2d, 0xe2, 0x8f, 0x60, 0xf9, 0x25, 0xb5, 0xfb, 0x7d, 0xe2, - 0x60, 0x42, 0xe9, 0x05, 0x31, 0x73, 0x38, 0x0b, 0xa4, 0xb1, 0x41, 0xa9, 0x7e, 0x8d, 0x15, 0xe7, - 0xe3, 0x70, 0x8f, 0xfa, 0x83, 0x7e, 0x89, 0x74, 0x49, 0xb4, 0x4a, 0x3a, 0x86, 0x0d, 0x49, 0x8e, - 0x8a, 0x3e, 0xa5, 0x83, 0x3e, 0xdb, 0x19, 0x11, 0x0d, 0xbb, 0xa2, 0xec, 0x03, 0x9f, 0xbf, 0x6a, - 0x59, 0x2e, 0xae, 0x05, 0x1d, 0xa4, 0xc3, 0x52, 0x9f, 0xfa, 0x6d, 0x12, 0x04, 0x72, 0x09, 0xb3, - 0xc3, 0x64, 0x12, 0x89, 0xf5, 0x26, 0x20, 0x39, 0x40, 0xfc, 0xc4, 0x7e, 0x02, 0x20, 0x59, 0x5c, - 0xc4, 0x4e, 0xe6, 0x0b, 0x39, 0x59, 0xc7, 0x96, 0xa4, 0x3d, 0x27, 0x1a, 0xa3, 0x1f, 0xb6, 0xfa, - 0xe2, 0xd3, 0xd1, 0x1f, 0x03, 0xe2, 0x04, 0x64, 0x82, 0xf0, 0x0c, 0x99, 0x8b, 0x32, 0x3b, 0x73, - 0x69, 0x32, 0x66, 0x75, 0x62, 0x7b, 0x4e, 0x97, 0x25, 0xdb, 0x90, 0x9e, 0x0d, 0x49, 0x17, 0x7a, - 0x00, 0x99, 0xbe, 0x41, 0xe9, 0x05, 0xe7, 0x91, 0xdb, 0xc9, 0x59, 0x73, 0x5b, 0x59, 0x06, 0xfe, - 0xa5, 0xc0, 0x9d, 0xf3, 0x99, 0x90, 0x15, 0xe0, 0x7d, 0xc6, 0x8b, 0x2d, 0x72, 0x4c, 0x49, 0x94, - 0xb2, 0xa7, 0x25, 0xb3, 0x67, 0xb0, 0x10, 0x9e, 0x7a, 0x11, 0x0b, 0x5b, 0x29, 0x94, 0x98, 0xea, - 0x6f, 0xaf, 0xb7, 0x3e, 0xec, 0xb8, 0xe1, 0xc9, 0xe0, 0x68, 0xbb, 0xed, 0xf7, 0x76, 0x86, 0xf1, - 0x38, 0x47, 0xa3, 0xef, 0x9d, 0xfe, 0xf3, 0xce, 0x0e, 0x27, 0xea, 0x83, 0x81, 0xeb, 0x6c, 0x1f, - 0x1c, 0x98, 0xa5, 0x37, 0xaf, 0xb7, 0xe6, 0x5b, 0xa7, 0x9e, 0x59, 0xb2, 0xe6, 0xc3, 0x53, 0xcf, - 0x74, 0xd0, 0x2e, 0x2c, 0x87, 0xa3, 0xe8, 0xe4, 0x09, 0x9e, 0xad, 0x50, 0xc4, 0x1d, 0xf5, 0x5d, - 0xd8, 0x6a, 0x9d, 0x7a, 0xf9, 0x2e, 0x2b, 0xff, 0x67, 0x86, 0xd7, 0xf6, 0x07, 0x8c, 0x53, 0xc8, - 0xc3, 0x25, 0xe6, 0x77, 0x1b, 0xa0, 0x4f, 0xc9, 0x0b, 0xcc, 0x4f, 0xcd, 0xd8, 0x34, 0x97, 0x98, - 0x5c, 0x1c, 0xc3, 0x5f, 0x2a, 0xb0, 0xce, 0xd2, 0x5e, 0x87, 0xd0, 0xc6, 0x0b, 0x42, 0x8f, 0xbb, - 0xfe, 0x4b, 0xe1, 0x7d, 0x1d, 0xe6, 0x12, 0xe8, 0x22, 0x93, 0xa1, 0x7b, 0xb0, 0xda, 0x1e, 0x50, - 0x4a, 0xbc, 0x50, 0x66, 0x0d, 0xc1, 0x56, 0x05, 0xf6, 0x8a, 0x54, 0xf1, 0x14, 0x81, 0x3e, 0x80, - 0x4b, 0xae, 0xd7, 0xa6, 0xa4, 0x37, 0x32, 0x9e, 0x8b, 0x19, 0xaf, 0x0d, 0x95, 0x22, 0xa3, 0x7c, - 0xa9, 0xc0, 0x8d, 0x02, 0xa3, 0x7c, 0xa3, 0x34, 0x47, 0x8e, 0x7d, 0x4a, 0xf6, 0x8a, 0xc3, 0x7c, - 0xdb, 0xfa, 0x41, 0xf9, 0x76, 0xc4, 0x44, 0x18, 0xc4, 0x09, 0x3b, 0x04, 0x7e, 0xd7, 0xf9, 0x3e, - 0x89, 0x76, 0xe4, 0xa5, 0xf7, 0x00, 0x89, 0x4a, 0x51, 0x73, 0x83, 0xc0, 0xf5, 0x3a, 0x22, 0xb6, - 0x47, 0xb0, 0xf2, 0x92, 0xfa, 0x5e, 0x07, 0x8b, 0xba, 0x21, 0xc3, 0x9b, 0x5e, 0x66, 0xac, 0x65, - 0x6e, 0x2e, 0x7e, 0xa2, 0xe5, 0x4e, 0x4f, 0x2e, 0x37, 0x6b, 0x4c, 0x6a, 0x84, 0x32, 0xce, 0xb9, - 0x4f, 0xfd, 0x0e, 0x25, 0x81, 0xa8, 0x9c, 0xfa, 0xaf, 0xd2, 0x70, 0x85, 0x93, 0xd1, 0x5d, 0x22, - 0xef, 0x8f, 0x08, 0xe4, 0xf1, 0x39, 0xae, 0xf0, 0xc1, 0x34, 0x12, 0x3b, 0xee, 0x97, 0x5c, 0x89, - 0xff, 0xa0, 0x0c, 0x4b, 0xf1, 0x26, 0x6c, 0xc8, 0xb2, 0x6b, 0x19, 0xfb, 0x55, 0xb3, 0x98, 0xc7, - 0x96, 0x51, 0x6b, 0x7c, 0x6a, 0x94, 0xd4, 0x14, 0xda, 0x00, 0x14, 0xe9, 0xf2, 0xf5, 0x3d, 0x03, - 0x37, 0xf7, 0xab, 0x66, 0x4b, 0x55, 0xd0, 0x35, 0xb8, 0x32, 0x26, 0xaf, 0x19, 0xd6, 0x1e, 0xab, - 0xd4, 0xb1, 0x1a, 0x6e, 0xe5, 0x77, 0x5b, 0xb8, 0x59, 0xcf, 0xef, 0x37, 0xcb, 0x8d, 0x96, 0x3a, - 0x87, 0x72, 0xb0, 0x29, 0x35, 0xd5, 0xc6, 0x9e, 0x59, 0xcc, 0x57, 0x71, 0x63, 0xbf, 0x89, 0x6b, - 0x66, 0xb3, 0x69, 0xd6, 0xf7, 0xd4, 0x4c, 0xcc, 0xb3, 0x59, 0x6d, 0x1c, 0xe2, 0x62, 0xa3, 0xde, - 0x3c, 0xa8, 0x19, 0x96, 0x3a, 0xaf, 0xdb, 0xa0, 0x99, 0x9e, 0x43, 0x42, 0x42, 0x7b, 0xae, 0x67, - 0x87, 0xa4, 0xe8, 0xf7, 0x7a, 0xae, 0x4c, 0xf1, 0x06, 0x2c, 0x07, 0xa1, 0xdd, 0xe1, 0xbc, 0xf8, - 0x7b, 0x12, 0x34, 0x90, 0x8e, 0x8c, 0xa1, 0xbd, 0x5a, 0x87, 0x65, 0x0e, 0x58, 0x22, 0xa1, 0xed, - 0x76, 0x91, 0x05, 0xaa, 0xe7, 0x87, 0x78, 0xac, 0x1b, 0x16, 0xd8, 0xef, 0x26, 0x60, 0x27, 0x74, - 0xe4, 0xe5, 0x94, 0xb5, 0xe6, 0x8d, 0x89, 0x51, 0x03, 0x2e, 0x89, 0xf6, 0x91, 0x21, 0x1f, 0xb3, - 0x2c, 0x2b, 0xcf, 0xe9, 0x9d, 0x69, 0x1b, 0x39, 0x96, 0x8d, 0xcb, 0xac, 0x29, 0x88, 0x4b, 0xd1, - 0x13, 0x40, 0x02, 0xf0, 0x39, 0x39, 0x1b, 0x36, 0x68, 0x32, 0xf5, 0xdc, 0x9d, 0x86, 0x79, 0xbe, - 0x9b, 0x2c, 0xa7, 0x2c, 0x95, 0x9e, 0x53, 0xa0, 0x9f, 0x28, 0x70, 0x8b, 0xf7, 0x2e, 0x2f, 0x79, - 0x8b, 0x83, 0x07, 0xa3, 0x1e, 0x87, 0x5f, 0x03, 0xd6, 0xe4, 0xc8, 0xc6, 0xec, 0x61, 0xe2, 0xeb, - 0xc0, 0x77, 0x35, 0x47, 0xe5, 0x94, 0x75, 0x93, 0x5e, 0x64, 0x85, 0x7e, 0x04, 0x57, 0x62, 0x79, - 0x11, 0xdb, 0x82, 0xbb, 0xf3, 0x26, 0x7f, 0xf9, 0xc1, 0xfd, 0x99, 0x88, 0x7e, 0x34, 0x12, 0x0a, - 0x27, 0x54, 0xa8, 0x05, 0x6a, 0x1c, 0x9e, 0x71, 0x75, 0x6d, 0x81, 0x63, 0xbf, 0x77, 0x31, 0xf6, - 0xb0, 0x35, 0x28, 0xa7, 0xac, 0x4b, 0xe1, 0xb8, 0x1c, 0x1d, 0xc2, 0xe5, 0x38, 0x2a, 0x65, 0x97, - 0x50, 0x5b, 0x9c, 0xba, 0x21, 0x89, 0x3d, 0x01, 0xdb, 0x90, 0xf0, 0x9c, 0x02, 0x7d, 0x06, 0xf1, - 0x49, 0xb0, 0xb6, 0x3f, 0x1c, 0x04, 0x5a, 0x96, 0x23, 0xdf, 0x9b, 0x99, 0x94, 0x97, 0x53, 0x56, - 0x3c, 0x3e, 0xa1, 0x41, 0x65, 0x96, 0xe0, 0xdc, 0x90, 0x44, 0x09, 0x6e, 0x89, 0xa3, 0xde, 0x4e, - 0x40, 0x3d, 0xcf, 0xbe, 0xcb, 0x29, 0x96, 0xec, 0x86, 0x32, 0x64, 0xc2, 0xaa, 0x40, 0x0a, 0x7d, - 0x1f, 0xb3, 0x3c, 0x0c, 0x17, 0x43, 0xc5, 0x08, 0xcc, 0x10, 0x4a, 0xc8, 0xd8, 0x65, 0xf1, 0xfb, - 0x98, 0x4a, 0xbe, 0xcb, 0xef, 0xf6, 0xf2, 0xd4, 0xcb, 0x32, 0x49, 0x8c, 0xd9, 0x65, 0xf1, 0xe3, - 0x52, 0xb6, 0xe1, 0xed, 0x88, 0x29, 0xe3, 0x63, 0x4e, 0x95, 0xb5, 0x95, 0xa9, 0x1b, 0x9e, 0x44, - 0xaa, 0xd9, 0x86, 0xb7, 0xc7, 0xe5, 0xa8, 0x0e, 0x6b, 0x22, 0x47, 0x50, 0x49, 0x95, 0xb5, 0xd5, - 0xa9, 0x51, 0x4e, 0x52, 0x6a, 0x16, 0x65, 0x37, 0x2e, 0x65, 0x51, 0x7a, 0xbe, 0x43, 0xf0, 0x60, - 0xf4, 0x5a, 0xa5, 0xad, 0x4d, 0x8d, 0x32, 0xe9, 0x5d, 0x8b, 0x45, 0xe9, 0x8d, 0xcb, 0x45, 0xa2, - 0x38, 0x0e, 0x71, 0x87, 0xb1, 0x55, 0xec, 0x08, 0xba, 0xaa, 0xa9, 0x17, 0x24, 0x8a, 0x04, 0x66, - 0x2b, 0x12, 0xc5, 0xb8, 0x82, 0x9d, 0xcb, 0x88, 0x76, 0xb6, 0x87, 0x74, 0x57, 0xbb, 0x3c, 0xf5, - 0x5c, 0x26, 0x53, 0x63, 0x76, 0x2e, 0xe9, 0x79, 0x0d, 0xcf, 0x97, 0x12, 0x3b, 0x3a, 0x4f, 0x68, - 0x7a, 0xbe, 0x9c, 0xa0, 0xc4, 0x3c, 0x5f, 0xc6, 0xa5, 0x6c, 0x71, 0xed, 0xa8, 0x4d, 0xc0, 0x94, - 0xf7, 0x09, 0xda, 0xe6, 0xd4, 0xc5, 0x4d, 0xea, 0x28, 0xd8, 0xe2, 0xda, 0xe3, 0x72, 0x16, 0xa6, - 0x20, 0xc9, 0xa3, 0xb4, 0x7e, 0x63, 0x6a, 0x98, 0x93, 0x24, 0x9b, 0x85, 0x19, 0xc4, 0xa5, 0xe8, - 0x17, 0x0a, 0xbc, 0x33, 0x91, 0x45, 0x78, 0x26, 0xc6, 0xfc, 0x11, 0x18, 0x53, 0xc1, 0x76, 0xb5, - 0xb7, 0xf8, 0x30, 0xff, 0x33, 0x43, 0x62, 0x49, 0x24, 0xca, 0xe5, 0x94, 0x75, 0x2b, 0xfc, 0x0e, - 0x43, 0xb6, 0x66, 0xae, 0xa0, 0x91, 0xd8, 0x97, 0x3c, 0x52, 0xdb, 0x9a, 0xba, 0x66, 0x49, 0x8c, - 0x93, 0xad, 0x99, 0x3b, 0x2e, 0x67, 0xc9, 0x7d, 0x30, 0x7a, 0x7b, 0xc5, 0xb2, 0x0b, 0xd4, 0x6e, - 0x4d, 0x4d, 0xee, 0x53, 0x5e, 0x6a, 0x59, 0x72, 0x1f, 0x4c, 0xa8, 0xd0, 0x33, 0x50, 0x87, 0x4d, - 0x37, 0x3e, 0xe2, 0x4c, 0x53, 0xd3, 0x39, 0xf6, 0x76, 0x02, 0xf6, 0x05, 0xc4, 0x94, 0xe7, 0xf8, - 0x71, 0x0d, 0x7a, 0x09, 0x37, 0x59, 0x1b, 0x61, 0x0b, 0x8a, 0x8e, 0xc9, 0x88, 0xa3, 0x4b, 0x46, - 0x7e, 0x9b, 0x8f, 0xf4, 0x20, 0x69, 0x5b, 0x2e, 0x66, 0xf6, 0xe5, 0x94, 0xb5, 0x19, 0x4e, 0x35, - 0x61, 0xb9, 0x46, 0x64, 0x68, 0x56, 0xeb, 0x19, 0x3f, 0xd5, 0xde, 0x99, 0x7a, 0xce, 0x26, 0x79, - 0x2c, 0x3b, 0x67, 0x6e, 0x5c, 0x8a, 0x0e, 0xe0, 0x72, 0x8f, 0xf1, 0x4f, 0xec, 0x7a, 0xec, 0x60, - 0x71, 0x06, 0xaa, 0xdd, 0x99, 0xba, 0xb7, 0x49, 0x5c, 0x95, 0xad, 0x4f, 0x6f, 0x5c, 0x8e, 0xfe, - 0x4f, 0xd2, 0x9c, 0x63, 0xc2, 0x77, 0x96, 0x55, 0xc0, 0x77, 0xa7, 0x32, 0xa7, 0x04, 0xbe, 0xca, - 0x98, 0xd3, 0x10, 0x40, 0x54, 0xbf, 0xcf, 0x61, 0xdd, 0x8d, 0x13, 0x40, 0xdc, 0xe6, 0x0c, 0x50, - 0x7b, 0x8f, 0xe3, 0xbe, 0x9f, 0x38, 0xff, 0x64, 0xbe, 0x58, 0x4e, 0x59, 0x57, 0xdc, 0x49, 0x5d, - 0x61, 0x11, 0xe6, 0x79, 0x17, 0x53, 0xc9, 0x64, 0x2f, 0xa9, 0x6a, 0x25, 0x93, 0xbd, 0xa2, 0xae, - 0x57, 0x32, 0xd9, 0x75, 0xf5, 0x6a, 0x25, 0x93, 0xbd, 0xaa, 0x6e, 0x54, 0x32, 0xd9, 0x0d, 0xf5, - 0x5a, 0x25, 0x93, 0xbd, 0xa6, 0x6a, 0x95, 0x4c, 0x56, 0x53, 0xaf, 0x57, 0x32, 0xd9, 0xeb, 0xea, - 0x66, 0x25, 0x93, 0xbd, 0xa9, 0xe6, 0x2a, 0x99, 0x6c, 0x4e, 0xdd, 0xaa, 0x64, 0xb2, 0x6f, 0xab, - 0xba, 0x7e, 0x8f, 0x33, 0xc9, 0x7d, 0x3f, 0xe0, 0x75, 0x02, 0x6d, 0xc2, 0x3c, 0x1b, 0xf0, 0x54, - 0xf6, 0xe4, 0x82, 0x7a, 0x0a, 0x91, 0xfe, 0x97, 0x39, 0x98, 0x9f, 0xed, 0xa5, 0xe2, 0xff, 0xc7, - 0xd9, 0x10, 0x25, 0xfc, 0xe1, 0x9f, 0x73, 0xbd, 0xb5, 0xc4, 0x03, 0x30, 0x96, 0x01, 0xb8, 0x71, - 0xf4, 0xd0, 0x1a, 0x4e, 0x68, 0x50, 0x11, 0x56, 0x07, 0x1e, 0x39, 0xed, 0xfb, 0x01, 0x71, 0x78, - 0xa9, 0xcd, 0xcc, 0x42, 0xa3, 0xad, 0x95, 0xa1, 0x13, 0x2b, 0xb0, 0x3b, 0xb0, 0xec, 0x53, 0xb7, - 0xe3, 0x7a, 0x98, 0x95, 0x1f, 0x4e, 0xd4, 0xe6, 0x0b, 0x6b, 0x6c, 0xcc, 0x6f, 0x5f, 0x6f, 0x2d, - 0xb0, 0x52, 0x65, 0x96, 0x2c, 0x10, 0x26, 0xec, 0x0f, 0x3d, 0x82, 0x05, 0x87, 0xb3, 0x6d, 0x49, - 0xbc, 0x72, 0xd3, 0x5e, 0x03, 0x04, 0x27, 0x8f, 0x1a, 0x18, 0xe1, 0x83, 0xfe, 0x3b, 0x5a, 0xd7, - 0xc5, 0x8b, 0x9c, 0xa3, 0x6d, 0x90, 0x2b, 0x8e, 0x1e, 0xc2, 0x9c, 0xe7, 0xbf, 0x94, 0xc4, 0x69, - 0xa6, 0xfe, 0x90, 0xd9, 0x8b, 0x27, 0x08, 0xf1, 0x60, 0x78, 0xff, 0xef, 0x69, 0xd0, 0xa6, 0x3d, - 0x2a, 0xb3, 0x26, 0x26, 0x5f, 0x68, 0x58, 0x2d, 0x3c, 0xf1, 0xb8, 0x79, 0x07, 0xde, 0x1e, 0xd3, - 0xf0, 0x1f, 0xa3, 0x84, 0x2d, 0xa3, 0xd8, 0xb0, 0x4a, 0x78, 0xb7, 0x71, 0x50, 0x2f, 0xa9, 0x0a, - 0xeb, 0x92, 0xc6, 0xcc, 0x8a, 0x55, 0xd3, 0xa8, 0xb3, 0xbf, 0x8a, 0x51, 0x64, 0x5d, 0xd4, 0x16, - 0xdc, 0x18, 0xd3, 0xef, 0x1f, 0x34, 0xcb, 0x86, 0x15, 0xa1, 0xa9, 0x19, 0x74, 0x03, 0xae, 0x4d, - 0x8e, 0x83, 0x9b, 0xfb, 0xf9, 0xba, 0x3a, 0x8f, 0xf2, 0xf0, 0xc9, 0xb8, 0xb2, 0x6a, 0x19, 0xf9, - 0xd2, 0xd3, 0xd1, 0x5b, 0x2b, 0x6e, 0x58, 0xd8, 0x6a, 0x54, 0xab, 0x46, 0x09, 0x17, 0xf2, 0xc5, - 0xc7, 0x78, 0xbf, 0xd1, 0x6c, 0x9a, 0x85, 0xaa, 0xc1, 0x5b, 0xc3, 0xfc, 0x53, 0x75, 0x01, 0xbd, - 0x07, 0xb7, 0xc7, 0x20, 0xea, 0xc6, 0x21, 0xae, 0x1a, 0xf9, 0xa6, 0x81, 0xf7, 0x2d, 0xe3, 0x53, - 0xa3, 0xde, 0x6a, 0xe2, 0xd6, 0x93, 0xba, 0x9a, 0x45, 0xf7, 0xe0, 0xce, 0x98, 0x61, 0xcb, 0xac, - 0x19, 0xcd, 0x56, 0xbe, 0xb6, 0x8f, 0x8b, 0xf9, 0x62, 0xd9, 0x90, 0x53, 0x32, 0x4a, 0xea, 0xe2, - 0x66, 0xe6, 0xe7, 0x5f, 0xe6, 0x52, 0x3a, 0x5b, 0xde, 0xf4, 0xfd, 0x3f, 0x8e, 0xbf, 0x52, 0xc7, - 0x5e, 0xbc, 0x45, 0x87, 0xd8, 0xb2, 0x9e, 0x4e, 0x2e, 0x2e, 0x6f, 0x47, 0x99, 0xe6, 0xd0, 0x32, - 0x5b, 0x06, 0x6e, 0x35, 0x1a, 0xb8, 0x51, 0x65, 0xcb, 0xc9, 0xfb, 0x57, 0xa6, 0x68, 0x1a, 0x96, - 0x99, 0xaf, 0x9a, 0x9f, 0xe5, 0x0b, 0x55, 0x43, 0x9d, 0x43, 0x37, 0xe1, 0xba, 0x90, 0xe7, 0x9b, - 0x4f, 0xeb, 0x45, 0xe9, 0xb6, 0x9b, 0x37, 0xab, 0x07, 0x96, 0xa1, 0xce, 0x23, 0x1d, 0x72, 0x42, - 0x2d, 0x16, 0x06, 0x97, 0x8c, 0x7c, 0xa9, 0x6a, 0xd6, 0x0d, 0x6c, 0x3c, 0x29, 0x1a, 0x46, 0xc9, - 0x28, 0xa9, 0x0b, 0x22, 0xe8, 0xfb, 0x1f, 0x03, 0x9a, 0xbc, 0x6a, 0x28, 0x0b, 0x99, 0x7a, 0xa3, - 0x6e, 0xa8, 0x29, 0xb4, 0x0c, 0x8b, 0x6c, 0x21, 0x1b, 0xbb, 0xbb, 0xaa, 0x82, 0x56, 0x61, 0xc9, - 0xac, 0xd5, 0x8c, 0x92, 0x99, 0x6f, 0x19, 0x6a, 0xba, 0x70, 0xef, 0xd5, 0x3f, 0x73, 0xa9, 0x57, - 0x6f, 0x72, 0xca, 0x57, 0x6f, 0x72, 0xca, 0xd7, 0x6f, 0x72, 0xca, 0x3f, 0xde, 0xe4, 0x94, 0x5f, - 0x7f, 0x93, 0x4b, 0x7d, 0xf5, 0x4d, 0x2e, 0xf5, 0xf5, 0x37, 0xb9, 0xd4, 0x67, 0x8b, 0xf2, 0x28, - 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x67, 0xff, 0x10, 0xba, 0x7d, 0x1e, 0x00, 0x00, +func init() { proto.RegisterFile("roachpb/errors.proto", fileDescriptor_errors_7f973735b5f2ff97) } + +var fileDescriptor_errors_7f973735b5f2ff97 = []byte{ + // 2954 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x59, 0xcb, 0x6f, 0x1b, 0xd7, + 0xd5, 0xe7, 0x50, 0x94, 0x44, 0x1d, 0x3d, 0x3c, 0xbe, 0x96, 0xe5, 0x91, 0x1c, 0x53, 0xca, 0xd8, + 0x4e, 0x6c, 0x07, 0x91, 0x3e, 0x38, 0x9f, 0x81, 0x2f, 0xf9, 0x92, 0x05, 0x1f, 0x23, 0x71, 0x24, + 0xbe, 0x3a, 0xa4, 0x62, 0x3b, 0x46, 0x71, 0x33, 0xe2, 0x5c, 0x51, 0x53, 0x93, 0x33, 0xcc, 0x9d, + 0xa1, 0x2d, 0x01, 0x5d, 0x14, 0xed, 0xa6, 0x68, 0x81, 0xa2, 0xbb, 0x76, 0x59, 0x20, 0xe8, 0xa2, + 0x40, 0x51, 0xf4, 0x2f, 0xe8, 0xda, 0xcb, 0x2c, 0x83, 0xa2, 0x30, 0x5a, 0xa7, 0xbb, 0xfe, 0x07, + 0x59, 0x15, 0xf7, 0x31, 0xe4, 0x50, 0x1c, 0x2a, 0x4a, 0x76, 0x9c, 0xf3, 0xf8, 0xdd, 0x73, 0x5f, + 0xe7, 0xfc, 0xce, 0x25, 0xac, 0x52, 0xdf, 0x6e, 0x9f, 0xf4, 0x8f, 0x76, 0x08, 0xa5, 0x3e, 0x0d, + 0xb6, 0xfb, 0xd4, 0x0f, 0x7d, 0x74, 0xb5, 0xed, 0xb7, 0x9f, 0x73, 0xcd, 0xb6, 0xd4, 0x6f, 0x5c, + 0x17, 0x06, 0xe7, 0x2c, 0x37, 0x50, 0xe4, 0xef, 0xd8, 0xa1, 0x2d, 0x65, 0x6b, 0x91, 0xac, 0x47, + 0x42, 0x3b, 0x26, 0xd7, 0x06, 0xa1, 0xdb, 0xdd, 0x39, 0xe9, 0xb6, 0x77, 0x42, 0xb7, 0x47, 0x82, + 0xd0, 0xee, 0xf5, 0xa5, 0x66, 0xb5, 0xe3, 0x77, 0x7c, 0xfe, 0x73, 0x87, 0xfd, 0x12, 0x52, 0xfd, + 0xaf, 0x69, 0xb8, 0x56, 0xf3, 0xc3, 0x0a, 0xb1, 0x03, 0x52, 0xf6, 0xbb, 0x0e, 0xa1, 0x06, 0x1b, + 0x1a, 0x95, 0x60, 0x9e, 0x92, 0x7e, 0xd7, 0x6d, 0xdb, 0x9a, 0xb2, 0xa5, 0xdc, 0x5b, 0x7c, 0x78, + 0x67, 0x7b, 0x22, 0xde, 0x6d, 0x4b, 0x58, 0x94, 0x48, 0xd0, 0xa6, 0x6e, 0x3f, 0xf4, 0x69, 0x21, + 0xf3, 0xea, 0xf5, 0x66, 0xca, 0x8a, 0x5c, 0xd1, 0x1e, 0x2c, 0x75, 0x19, 0x32, 0x3e, 0xe1, 0xd0, + 0x5a, 0xfa, 0xf2, 0x50, 0xd6, 0x62, 0x77, 0x14, 0x13, 0x7a, 0x04, 0x59, 0x6a, 0x7b, 0x1d, 0x82, + 0x5d, 0x47, 0x9b, 0xd9, 0x52, 0xee, 0xcd, 0x14, 0x36, 0xd8, 0x48, 0x6f, 0x5e, 0x6f, 0xce, 0x5b, + 0x4c, 0x6e, 0x96, 0xbe, 0x1d, 0xfd, 0xb4, 0xe6, 0xb9, 0xad, 0xe9, 0xa0, 0x6d, 0x98, 0xe5, 0x28, + 0x5a, 0x86, 0x0f, 0xac, 0x25, 0x0c, 0xcc, 0x67, 0x6e, 0x09, 0x33, 0x74, 0x1b, 0xa0, 0x3d, 0x08, + 0x42, 0xbf, 0x87, 0x7b, 0x41, 0x47, 0x9b, 0xdd, 0x52, 0xee, 0x2d, 0xc8, 0x29, 0x2d, 0x08, 0x79, + 0x35, 0xe8, 0xe8, 0x6b, 0xb0, 0x5a, 0xf3, 0x1d, 0x72, 0xe8, 0xd9, 0x2f, 0x6c, 0xb7, 0x6b, 0x1f, + 0x75, 0x09, 0x5f, 0x32, 0x7d, 0x1d, 0x6e, 0x1c, 0x7a, 0xc1, 0xa0, 0xdf, 0xf7, 0x69, 0x48, 0x1c, + 0x8b, 0x7c, 0x31, 0x20, 0x41, 0x28, 0x54, 0x3f, 0x57, 0x00, 0xf1, 0xe0, 0x6a, 0x7e, 0xb8, 0xeb, + 0x0f, 0x3c, 0x47, 0x2c, 0x72, 0x7c, 0x56, 0xca, 0xe5, 0x67, 0xf5, 0x08, 0xb2, 0x41, 0xe8, 0x53, + 0xee, 0x96, 0x1e, 0x77, 0x6b, 0x32, 0xb9, 0x70, 0x93, 0x3f, 0xad, 0x79, 0x6e, 0x6b, 0x3a, 0xfa, + 0xef, 0x66, 0xe0, 0x3a, 0xc7, 0x3a, 0x20, 0x67, 0x55, 0x37, 0xe8, 0xd9, 0x61, 0xfb, 0x44, 0xc4, + 0xf1, 0x01, 0x5c, 0xa5, 0x22, 0x5c, 0x1c, 0x84, 0x36, 0x0d, 0xf1, 0x73, 0x72, 0xc6, 0x03, 0x5a, + 0x2a, 0xcc, 0x7f, 0xfb, 0x7a, 0x73, 0xe6, 0x80, 0x9c, 0x59, 0x57, 0xa4, 0x45, 0x93, 0x19, 0x1c, + 0x90, 0x33, 0xb4, 0x03, 0x91, 0x08, 0x13, 0xcf, 0xe1, 0x2e, 0xe9, 0x71, 0x97, 0x65, 0xa9, 0x37, + 0x3c, 0x87, 0x39, 0x9c, 0xc0, 0x4d, 0x87, 0xf4, 0x29, 0x69, 0xdb, 0x21, 0x71, 0x70, 0x4f, 0x46, + 0x40, 0x1c, 0xcc, 0xe7, 0xc5, 0xb7, 0x75, 0xf1, 0xa1, 0x9e, 0x74, 0x36, 0x98, 0x7e, 0xe2, 0x90, + 0xad, 0x8f, 0xc0, 0xaa, 0x43, 0x2c, 0x6e, 0x8a, 0x3e, 0x87, 0x8d, 0xd8, 0x48, 0xc1, 0xa0, 0xd3, + 0x21, 0x41, 0x38, 0x1c, 0x28, 0x73, 0xd9, 0x81, 0x2c, 0x6d, 0x84, 0xd2, 0x8c, 0x40, 0xc4, 0x08, + 0x15, 0x98, 0xe3, 0x60, 0x81, 0x36, 0xbb, 0x35, 0x73, 0x6f, 0xf1, 0xe1, 0x5b, 0xd3, 0xd0, 0x4c, + 0xef, 0xd8, 0x2f, 0xac, 0xc9, 0xed, 0x59, 0x11, 0x3e, 0xa6, 0x17, 0x12, 0xea, 0xd9, 0x5d, 0x4b, + 0x62, 0xe8, 0xff, 0x49, 0x83, 0x6e, 0x11, 0xdb, 0x79, 0xec, 0x86, 0x27, 0xae, 0x77, 0xe8, 0xb5, + 0x09, 0x0d, 0x6d, 0xd7, 0x0b, 0xcf, 0xb8, 0xe5, 0x0b, 0xbb, 0x2b, 0xb6, 0x69, 0x1f, 0x56, 0x28, + 0xb1, 0x1d, 0x3c, 0xbc, 0xd9, 0xf2, 0x6a, 0xde, 0x8a, 0x0d, 0xce, 0xae, 0xff, 0xf6, 0x49, 0xb7, + 0xbd, 0xdd, 0x8a, 0x8c, 0xe4, 0x72, 0x2d, 0x33, 0xd7, 0xa1, 0x10, 0x59, 0x80, 0xc8, 0xa9, 0x1b, + 0x84, 0xae, 0xd7, 0x89, 0xe1, 0xa5, 0x2f, 0x8f, 0x77, 0x35, 0x72, 0x1f, 0x61, 0x16, 0x60, 0xb9, + 0x67, 0x9f, 0xc6, 0xe0, 0x66, 0x2e, 0x01, 0x67, 0x2d, 0xf5, 0xec, 0xd3, 0x11, 0xc6, 0x33, 0xb8, + 0xe6, 0x1f, 0x05, 0x84, 0xbe, 0x20, 0xb1, 0x79, 0x06, 0x5a, 0x86, 0xaf, 0x72, 0x52, 0xe2, 0xa8, + 0x4b, 0xeb, 0xf3, 0xf1, 0x21, 0xff, 0xbc, 0x22, 0xf8, 0x28, 0xf3, 0xfb, 0x3f, 0x6c, 0xa6, 0x74, + 0x07, 0x6e, 0xb4, 0xa8, 0xed, 0x05, 0x76, 0x3b, 0x74, 0x7d, 0x2f, 0x7f, 0xc4, 0xaf, 0xab, 0x58, + 0x61, 0x13, 0xe6, 0x28, 0xb1, 0x03, 0xdf, 0xe3, 0x2b, 0xbb, 0xf2, 0xf0, 0xbd, 0x84, 0x01, 0x27, + 0x7d, 0x2d, 0xee, 0x22, 0xc7, 0x95, 0x00, 0xfa, 0x33, 0x58, 0x8d, 0x59, 0x36, 0x06, 0x81, 0xbc, + 0x6b, 0x45, 0x80, 0xfe, 0x20, 0x38, 0x21, 0x04, 0x87, 0xa7, 0x9e, 0xdc, 0xc0, 0xdc, 0xc5, 0xc3, + 0x44, 0x29, 0x48, 0xf8, 0xb5, 0x4e, 0x3d, 0xfd, 0x17, 0x0a, 0x5c, 0x8f, 0x19, 0x58, 0x24, 0xa4, + 0x67, 0x02, 0x7e, 0xef, 0xdc, 0x0c, 0xee, 0x5f, 0x0c, 0xcd, 0x3d, 0x93, 0xe2, 0x47, 0x6f, 0xc3, + 0x02, 0x39, 0x0d, 0xa9, 0xcd, 0x33, 0x61, 0x3a, 0x96, 0x09, 0xb3, 0x5c, 0xcc, 0x12, 0xe1, 0xdf, + 0x14, 0x58, 0x8b, 0x61, 0x35, 0x43, 0x3b, 0x1c, 0x04, 0x22, 0x8c, 0x35, 0x98, 0x61, 0x7e, 0x4a, + 0xcc, 0x8f, 0x09, 0x50, 0x6d, 0x18, 0x5e, 0x9a, 0x87, 0xf7, 0x3f, 0x17, 0x87, 0x17, 0x83, 0xdc, + 0x4e, 0x5c, 0xe5, 0x8f, 0x61, 0x4e, 0xc8, 0x11, 0x82, 0x15, 0xcb, 0xc8, 0x37, 0xeb, 0x35, 0x7c, + 0x58, 0x3b, 0xa8, 0xd5, 0x1f, 0xd7, 0xd4, 0x14, 0xd2, 0x60, 0x55, 0xca, 0x5a, 0x4f, 0x6a, 0xb8, + 0x58, 0xaf, 0x56, 0xcd, 0x56, 0xcb, 0x28, 0xa9, 0x69, 0x3d, 0x93, 0x55, 0x54, 0x45, 0x6f, 0x82, + 0xfa, 0x98, 0xba, 0x21, 0x61, 0xd7, 0xcc, 0x13, 0xa9, 0x1a, 0x7d, 0x08, 0xf3, 0x2e, 0xff, 0x0c, + 0x34, 0x85, 0x1f, 0xba, 0xf5, 0x84, 0x10, 0x85, 0x43, 0x54, 0xed, 0xa4, 0xfd, 0x7e, 0x26, 0x9b, + 0x56, 0x67, 0xf4, 0x3f, 0x2a, 0x12, 0xb5, 0xe5, 0xfb, 0xf5, 0xae, 0x3c, 0x58, 0x79, 0x58, 0xf8, + 0x41, 0xb7, 0x76, 0xe4, 0x85, 0x6a, 0xa0, 0xda, 0xed, 0x70, 0x60, 0x77, 0x7f, 0xd8, 0x7d, 0xbd, + 0x22, 0x9c, 0x87, 0x62, 0x7d, 0x15, 0x50, 0xbd, 0xcf, 0xaa, 0x94, 0x4b, 0x49, 0xd0, 0x3a, 0xf5, + 0x44, 0xa5, 0x6a, 0xc2, 0x6a, 0xd1, 0xf7, 0x1c, 0x97, 0xad, 0xfe, 0xae, 0xed, 0x76, 0xa3, 0x9b, + 0xf1, 0xff, 0xb0, 0x24, 0x47, 0x7f, 0x61, 0x77, 0x07, 0x44, 0xce, 0x21, 0xa9, 0xa0, 0x7e, 0xca, + 0xf4, 0xd6, 0xa2, 0xb0, 0xe6, 0x1f, 0xfa, 0x5f, 0x14, 0x40, 0xa2, 0xce, 0x92, 0x9f, 0x90, 0xf6, + 0xf0, 0xb6, 0xe5, 0x60, 0xbe, 0x47, 0x82, 0xc0, 0xee, 0x90, 0xb1, 0x83, 0x12, 0x09, 0xd1, 0xc7, + 0xb0, 0x20, 0x2b, 0x08, 0x71, 0xe4, 0x54, 0xa7, 0x56, 0xf0, 0x68, 0xbd, 0x86, 0x0e, 0xe8, 0x23, + 0xc8, 0x46, 0x29, 0x4a, 0x26, 0xa2, 0xef, 0x72, 0x1e, 0xda, 0xeb, 0x5f, 0xc0, 0x6a, 0xbe, 0x77, + 0xe4, 0x76, 0x06, 0xfe, 0x20, 0xb0, 0x48, 0x30, 0xe8, 0x86, 0x97, 0x8b, 0xf8, 0x43, 0x58, 0x7c, + 0x49, 0xed, 0x7e, 0x9f, 0x38, 0x98, 0x50, 0x7a, 0x41, 0xcc, 0x1c, 0xce, 0x02, 0x69, 0x6c, 0x50, + 0xaa, 0xdf, 0x60, 0xc5, 0xf9, 0x38, 0xdc, 0xa3, 0xfe, 0xa0, 0x5f, 0x22, 0x5d, 0x12, 0xad, 0x92, + 0x8e, 0x61, 0x4d, 0x92, 0xa3, 0xa2, 0x4f, 0xe9, 0xa0, 0xcf, 0x76, 0x46, 0x44, 0xc3, 0xae, 0x28, + 0xfb, 0x81, 0xcf, 0x5f, 0xb5, 0x2c, 0x17, 0x57, 0x83, 0x0e, 0xd2, 0x61, 0xa1, 0x4f, 0xfd, 0x36, + 0x09, 0x02, 0xb9, 0x84, 0xd9, 0x61, 0x32, 0x89, 0xc4, 0x7a, 0x13, 0x90, 0x1c, 0x20, 0x7e, 0x62, + 0x3f, 0x01, 0x90, 0x2c, 0x2e, 0x62, 0x27, 0xb3, 0x85, 0x9c, 0xac, 0x63, 0x0b, 0xd2, 0x9e, 0x13, + 0x8d, 0xd1, 0x07, 0x5b, 0x7d, 0xf1, 0xd3, 0xd1, 0x0f, 0x00, 0x71, 0x02, 0x32, 0x41, 0x78, 0x86, + 0xcc, 0x45, 0xb9, 0x3c, 0x73, 0x69, 0x32, 0x66, 0x75, 0x62, 0x7b, 0x4e, 0x97, 0x25, 0xdb, 0x90, + 0x9e, 0x0d, 0x49, 0x17, 0x7a, 0x08, 0x99, 0xbe, 0x41, 0xe9, 0x05, 0xe7, 0x91, 0xdb, 0xc9, 0x59, + 0x73, 0x5b, 0x59, 0x06, 0xfe, 0xad, 0xc0, 0xdd, 0xf3, 0x99, 0x90, 0x15, 0xe0, 0x06, 0xe3, 0xc5, + 0x16, 0x39, 0xa6, 0x24, 0x4a, 0xd9, 0xd3, 0x92, 0xd9, 0x33, 0x98, 0x0b, 0x4f, 0xbd, 0x88, 0x85, + 0x2d, 0x15, 0x4a, 0x4c, 0xf5, 0xf7, 0xd7, 0x9b, 0x1f, 0x74, 0xdc, 0xf0, 0x64, 0x70, 0xb4, 0xdd, + 0xf6, 0x7b, 0x3b, 0xc3, 0x78, 0x9c, 0xa3, 0xd1, 0xef, 0x9d, 0xfe, 0xf3, 0xce, 0x0e, 0x27, 0xea, + 0x83, 0x81, 0xeb, 0x6c, 0x1f, 0x1e, 0x9a, 0xa5, 0x37, 0xaf, 0x37, 0x67, 0x5b, 0xa7, 0x9e, 0x59, + 0xb2, 0x66, 0xc3, 0x53, 0xcf, 0x74, 0xd0, 0x2e, 0x2c, 0x86, 0xa3, 0xe8, 0xe4, 0x09, 0xbe, 0x5c, + 0xa1, 0x88, 0x3b, 0xea, 0xbb, 0xb0, 0xd9, 0x3a, 0xf5, 0xf2, 0x5d, 0x56, 0xfe, 0xcf, 0x0c, 0xaf, + 0xed, 0x0f, 0x18, 0xa7, 0x90, 0x87, 0x4b, 0xcc, 0xef, 0x36, 0x40, 0x9f, 0x92, 0x17, 0x98, 0x9f, + 0x9a, 0xb1, 0x69, 0x2e, 0x30, 0xb9, 0x38, 0x86, 0xbf, 0x56, 0x60, 0x95, 0xa5, 0xbd, 0x0e, 0xa1, + 0xf5, 0x17, 0x84, 0x1e, 0x77, 0xfd, 0x97, 0xc2, 0x7b, 0x1d, 0x66, 0x12, 0xe8, 0x22, 0x93, 0xa1, + 0xfb, 0xb0, 0xdc, 0x1e, 0x50, 0x4a, 0xbc, 0x50, 0x66, 0x0d, 0xc1, 0x56, 0x05, 0xf6, 0x92, 0x54, + 0xf1, 0x14, 0x81, 0xde, 0x87, 0x2b, 0xae, 0xd7, 0xa6, 0xa4, 0x37, 0x32, 0x9e, 0x89, 0x19, 0xaf, + 0x0c, 0x95, 0x22, 0xa3, 0x7c, 0xa9, 0xc0, 0xcd, 0x02, 0xa3, 0x7c, 0xa3, 0x34, 0x47, 0x8e, 0x7d, + 0x4a, 0xf6, 0x8a, 0xc3, 0x7c, 0xdb, 0xfa, 0x41, 0xf9, 0x76, 0xc4, 0x44, 0x18, 0xc4, 0x09, 0x3b, + 0x04, 0x7e, 0xd7, 0xf9, 0x3e, 0x89, 0x76, 0xe4, 0xa5, 0xf7, 0x00, 0x89, 0x4a, 0x51, 0x75, 0x83, + 0xc0, 0xf5, 0x3a, 0x22, 0xb6, 0x8f, 0x61, 0xe9, 0x25, 0xf5, 0xbd, 0x0e, 0x16, 0x75, 0x43, 0x86, + 0x37, 0xbd, 0xcc, 0x58, 0x8b, 0xdc, 0x5c, 0x7c, 0x44, 0xcb, 0x9d, 0x9e, 0x5c, 0x6e, 0xd6, 0x98, + 0x54, 0x09, 0x65, 0x9c, 0xb3, 0x41, 0xfd, 0x0e, 0x25, 0x81, 0xa8, 0x9c, 0xfa, 0x6f, 0xd2, 0x70, + 0x8d, 0x93, 0xd1, 0x5d, 0x22, 0xef, 0x8f, 0x08, 0xe4, 0xe0, 0x1c, 0x57, 0x78, 0x7f, 0x1a, 0x89, + 0x1d, 0xf7, 0x4b, 0xae, 0xc4, 0x7f, 0x52, 0x86, 0xa5, 0x78, 0x03, 0xd6, 0x64, 0xd9, 0xb5, 0x8c, + 0x46, 0xc5, 0x2c, 0xe6, 0xb1, 0x65, 0x54, 0xeb, 0x9f, 0x1a, 0x25, 0x35, 0x85, 0xd6, 0x00, 0x45, + 0xba, 0x7c, 0x6d, 0xcf, 0xc0, 0xcd, 0x46, 0xc5, 0x6c, 0xa9, 0x0a, 0xba, 0x01, 0xd7, 0xc6, 0xe4, + 0x55, 0xc3, 0xda, 0x63, 0x95, 0x3a, 0x56, 0xc3, 0xad, 0xfc, 0x6e, 0x0b, 0x37, 0x6b, 0xf9, 0x46, + 0xb3, 0x5c, 0x6f, 0xa9, 0x33, 0x28, 0x07, 0x1b, 0x52, 0x53, 0xa9, 0xef, 0x99, 0xc5, 0x7c, 0x05, + 0xd7, 0x1b, 0x4d, 0x5c, 0x35, 0x9b, 0x4d, 0xb3, 0xb6, 0xa7, 0x66, 0x62, 0x9e, 0xcd, 0x4a, 0xfd, + 0x31, 0x2e, 0xd6, 0x6b, 0xcd, 0xc3, 0xaa, 0x61, 0xa9, 0xb3, 0xba, 0x0d, 0x9a, 0xe9, 0x39, 0x24, + 0x24, 0xb4, 0xe7, 0x7a, 0x76, 0x48, 0x8a, 0x7e, 0xaf, 0xe7, 0xca, 0x14, 0x6f, 0xc0, 0x62, 0x10, + 0xda, 0x1d, 0xce, 0x8b, 0xbf, 0x27, 0x41, 0x03, 0xe9, 0xc8, 0x18, 0xda, 0xab, 0x55, 0x58, 0xe4, + 0x80, 0x25, 0x12, 0xda, 0x6e, 0x17, 0x59, 0xa0, 0x7a, 0x7e, 0x88, 0xc7, 0xba, 0x61, 0x81, 0xfd, + 0x4e, 0x02, 0x76, 0x42, 0x47, 0x5e, 0x4e, 0x59, 0x2b, 0xde, 0x98, 0x18, 0xd5, 0xe1, 0x8a, 0x68, + 0x1f, 0x19, 0xf2, 0x31, 0xcb, 0xb2, 0xf2, 0x9c, 0xde, 0x9d, 0xb6, 0x91, 0x63, 0xd9, 0xb8, 0xcc, + 0x9a, 0x82, 0xb8, 0x14, 0x3d, 0x01, 0x24, 0x00, 0x9f, 0x93, 0xb3, 0x61, 0x83, 0x26, 0x53, 0xcf, + 0xbd, 0x69, 0x98, 0xe7, 0xbb, 0xc9, 0x72, 0xca, 0x52, 0xe9, 0x39, 0x05, 0xfa, 0x99, 0x02, 0x5b, + 0xbc, 0x77, 0x79, 0xc9, 0x5b, 0x1c, 0x3c, 0x18, 0xf5, 0x38, 0xfc, 0x1a, 0xb0, 0x26, 0x47, 0x36, + 0x66, 0x8f, 0x12, 0x5f, 0x07, 0xbe, 0xab, 0x39, 0x2a, 0xa7, 0xac, 0x5b, 0xf4, 0x22, 0x2b, 0xf4, + 0x63, 0xb8, 0x16, 0xcb, 0x8b, 0xd8, 0x16, 0xdc, 0x9d, 0x37, 0xf9, 0x8b, 0x0f, 0x1f, 0x5c, 0x8a, + 0xe8, 0x47, 0x23, 0xa1, 0x70, 0x42, 0x85, 0x5a, 0xa0, 0xc6, 0xe1, 0x19, 0x57, 0xd7, 0xe6, 0x38, + 0xf6, 0xbb, 0x17, 0x63, 0x0f, 0x5b, 0x83, 0x72, 0xca, 0xba, 0x12, 0x8e, 0xcb, 0xd1, 0x63, 0xb8, + 0x1a, 0x47, 0xa5, 0xec, 0x12, 0x6a, 0xf3, 0x53, 0x37, 0x24, 0xb1, 0x27, 0x60, 0x1b, 0x12, 0x9e, + 0x53, 0xa0, 0xcf, 0x20, 0x3e, 0x09, 0xd6, 0xf6, 0x87, 0x83, 0x40, 0xcb, 0x72, 0xe4, 0xfb, 0x97, + 0x26, 0xe5, 0xe5, 0x94, 0x15, 0x8f, 0x4f, 0x68, 0x50, 0x99, 0x25, 0x38, 0x37, 0x24, 0x51, 0x82, + 0x5b, 0xe0, 0xa8, 0xb7, 0x13, 0x50, 0xcf, 0xb3, 0xef, 0x72, 0x8a, 0x25, 0xbb, 0xa1, 0x0c, 0x99, + 0xb0, 0x2c, 0x90, 0x42, 0xdf, 0xc7, 0x2c, 0x0f, 0xc3, 0xc5, 0x50, 0x31, 0x02, 0x33, 0x84, 0x12, + 0x32, 0x76, 0x59, 0xfc, 0x3e, 0xa6, 0x92, 0xef, 0xf2, 0xbb, 0xbd, 0x38, 0xf5, 0xb2, 0x4c, 0x12, + 0x63, 0x76, 0x59, 0xfc, 0xb8, 0x94, 0x6d, 0x78, 0x3b, 0x62, 0xca, 0xf8, 0x98, 0x53, 0x65, 0x6d, + 0x69, 0xea, 0x86, 0x27, 0x91, 0x6a, 0xb6, 0xe1, 0xed, 0x71, 0x39, 0xaa, 0xc1, 0x8a, 0xc8, 0x11, + 0x54, 0x52, 0x65, 0x6d, 0x79, 0x6a, 0x94, 0x93, 0x94, 0x9a, 0x45, 0xd9, 0x8d, 0x4b, 0x59, 0x94, + 0x9e, 0xef, 0x10, 0x3c, 0x18, 0xbd, 0x56, 0x69, 0x2b, 0x53, 0xa3, 0x4c, 0x7a, 0xd7, 0x62, 0x51, + 0x7a, 0xe3, 0x72, 0x91, 0x28, 0x8e, 0x43, 0xdc, 0x61, 0x6c, 0x15, 0x3b, 0x82, 0xae, 0x6a, 0xea, + 0x05, 0x89, 0x22, 0x81, 0xd9, 0x8a, 0x44, 0x31, 0xae, 0x60, 0xe7, 0x32, 0xa2, 0x9d, 0xed, 0x21, + 0xdd, 0xd5, 0xae, 0x4e, 0x3d, 0x97, 0xc9, 0xd4, 0x98, 0x9d, 0x4b, 0x7a, 0x5e, 0xc3, 0xf3, 0xa5, + 0xc4, 0x8e, 0xce, 0x13, 0x9a, 0x9e, 0x2f, 0x27, 0x28, 0x31, 0xcf, 0x97, 0x71, 0x29, 0x5b, 0x5c, + 0x3b, 0x6a, 0x13, 0x30, 0xe5, 0x7d, 0x82, 0xb6, 0x31, 0x75, 0x71, 0x93, 0x3a, 0x0a, 0xb6, 0xb8, + 0xf6, 0xb8, 0x9c, 0x85, 0x29, 0x48, 0xf2, 0x28, 0xad, 0xdf, 0x9c, 0x1a, 0xe6, 0x24, 0xc9, 0x66, + 0x61, 0x06, 0x71, 0x29, 0xfa, 0x95, 0x02, 0x77, 0x26, 0xb2, 0x08, 0xcf, 0xc4, 0x98, 0x3f, 0x02, + 0x63, 0x2a, 0xd8, 0xae, 0xf6, 0x16, 0x1f, 0xe6, 0xff, 0x2e, 0x91, 0x58, 0x12, 0x89, 0x72, 0x39, + 0x65, 0x6d, 0x85, 0xdf, 0x61, 0xc8, 0xd6, 0xcc, 0x15, 0x34, 0x12, 0xfb, 0x92, 0x47, 0x6a, 0x9b, + 0x53, 0xd7, 0x2c, 0x89, 0x71, 0xb2, 0x35, 0x73, 0xc7, 0xe5, 0x2c, 0xb9, 0x0f, 0x46, 0x6f, 0xaf, + 0x58, 0x76, 0x81, 0xda, 0xd6, 0xd4, 0xe4, 0x3e, 0xe5, 0xa5, 0x96, 0x25, 0xf7, 0xc1, 0x84, 0x0a, + 0x3d, 0x03, 0x75, 0xd8, 0x74, 0xe3, 0x23, 0xce, 0x34, 0x35, 0x9d, 0x63, 0x6f, 0x27, 0x60, 0x5f, + 0x40, 0x4c, 0x79, 0x8e, 0x1f, 0xd7, 0xa0, 0x97, 0x70, 0x8b, 0xb5, 0x11, 0xb6, 0xa0, 0xe8, 0x98, + 0x8c, 0x38, 0xba, 0x64, 0xe4, 0xb7, 0xf9, 0x48, 0x0f, 0x93, 0xb6, 0xe5, 0x62, 0x66, 0x5f, 0x4e, + 0x59, 0x1b, 0xe1, 0x54, 0x13, 0x96, 0x6b, 0x44, 0x86, 0x66, 0xb5, 0x9e, 0xf1, 0x53, 0xed, 0xce, + 0xd4, 0x73, 0x36, 0xc9, 0x63, 0xd9, 0x39, 0x73, 0xe3, 0x52, 0x74, 0x08, 0x57, 0x7b, 0x8c, 0x7f, + 0x62, 0xd7, 0x63, 0x07, 0x8b, 0x33, 0x50, 0xed, 0xee, 0xd4, 0xbd, 0x4d, 0xe2, 0xaa, 0x6c, 0x7d, + 0x7a, 0xe3, 0x72, 0xf4, 0x23, 0x49, 0x73, 0x8e, 0x09, 0xdf, 0x59, 0x56, 0x01, 0xdf, 0x99, 0xca, + 0x9c, 0x12, 0xf8, 0x2a, 0x63, 0x4e, 0x43, 0x00, 0x51, 0xfd, 0x3e, 0x87, 0x55, 0x37, 0x4e, 0x00, + 0x71, 0x9b, 0x33, 0x40, 0xed, 0x5d, 0x8e, 0xfb, 0x5e, 0xe2, 0xfc, 0x93, 0xf9, 0x62, 0x39, 0x65, + 0x5d, 0x73, 0x27, 0x75, 0x85, 0x79, 0x98, 0xe5, 0x5d, 0xcc, 0x7e, 0x26, 0x7b, 0x45, 0x55, 0xf7, + 0x33, 0xd9, 0x6b, 0xea, 0xea, 0x7e, 0x26, 0xbb, 0xaa, 0x5e, 0xdf, 0xcf, 0x64, 0xaf, 0xab, 0x6b, + 0xfb, 0x99, 0xec, 0x9a, 0x7a, 0x63, 0x3f, 0x93, 0xbd, 0xa1, 0x6a, 0xfb, 0x99, 0xac, 0xa6, 0xae, + 0xef, 0x67, 0xb2, 0xeb, 0xea, 0xc6, 0x7e, 0x26, 0x7b, 0x4b, 0xcd, 0xed, 0x67, 0xb2, 0x39, 0x75, + 0x73, 0x3f, 0x93, 0x7d, 0x5b, 0xd5, 0xf5, 0xfb, 0x9c, 0x49, 0x36, 0xfc, 0x80, 0xd7, 0x09, 0xb4, + 0x01, 0xb3, 0x6c, 0xc0, 0x53, 0xd9, 0x93, 0x0b, 0xea, 0x29, 0x44, 0xfa, 0xab, 0x0c, 0xcc, 0x46, + 0x4f, 0xfa, 0xe7, 0x5e, 0x2a, 0xd6, 0x65, 0xa3, 0x7d, 0x35, 0xf6, 0x6c, 0x2e, 0x0c, 0x46, 0xcf, + 0x17, 0x3f, 0x1d, 0xa7, 0x48, 0x94, 0xf0, 0x7f, 0x03, 0x38, 0x01, 0x5c, 0x49, 0x3c, 0x15, 0x63, + 0x69, 0x81, 0x1b, 0x17, 0xee, 0xc8, 0x71, 0xde, 0x1a, 0x8d, 0x33, 0x69, 0x35, 0xc6, 0xa0, 0xa4, + 0x0c, 0x15, 0x61, 0x79, 0xe0, 0x91, 0xd3, 0xbe, 0x1f, 0x10, 0x87, 0xd7, 0xe7, 0xcc, 0x65, 0xb8, + 0xb7, 0xb5, 0x34, 0x74, 0x62, 0x55, 0x79, 0x07, 0x16, 0x7d, 0xea, 0x76, 0x5c, 0x0f, 0xb3, 0x9a, + 0xc5, 0xd9, 0xdd, 0x6c, 0x61, 0x85, 0xc5, 0xf4, 0xed, 0xeb, 0xcd, 0x39, 0x56, 0xdf, 0xcc, 0x92, + 0x05, 0xc2, 0x84, 0x7d, 0xa1, 0x06, 0xcc, 0x39, 0x9c, 0xa2, 0x4b, 0xb6, 0x96, 0x9b, 0xf6, 0x84, + 0x20, 0x88, 0x7c, 0x41, 0x93, 0xf3, 0x53, 0x47, 0xf3, 0x13, 0x1a, 0x4b, 0xe2, 0xa0, 0xff, 0x8d, + 0x36, 0x68, 0xfe, 0x22, 0xc0, 0x68, 0x3f, 0xe5, 0xd6, 0xa1, 0x47, 0x30, 0xe3, 0xf9, 0x2f, 0x25, + 0x03, 0xbb, 0x54, 0xa3, 0xc9, 0xec, 0xd1, 0x01, 0x2c, 0xb3, 0x84, 0xe1, 0x0c, 0x93, 0x85, 0x20, + 0x5b, 0x5b, 0x31, 0x80, 0xe8, 0x4f, 0xc5, 0x6d, 0x43, 0x18, 0xc6, 0x1f, 0x44, 0x96, 0x48, 0x4c, + 0x26, 0x1e, 0x46, 0xc4, 0x33, 0xe6, 0x83, 0x7f, 0xa4, 0x41, 0x9b, 0xf6, 0xd4, 0xcd, 0x5a, 0xab, + 0x7c, 0xa1, 0x6e, 0xb5, 0xf0, 0xc4, 0x93, 0xeb, 0x5d, 0x78, 0x7b, 0x4c, 0xc3, 0x3f, 0x8c, 0x12, + 0xb6, 0x8c, 0x62, 0xdd, 0x2a, 0xe1, 0xdd, 0xfa, 0x61, 0xad, 0xa4, 0x2a, 0xac, 0x77, 0x1b, 0x33, + 0x2b, 0x56, 0x4c, 0xa3, 0xc6, 0xbe, 0xf6, 0x8d, 0x22, 0xeb, 0xed, 0x36, 0xe1, 0xe6, 0x98, 0xbe, + 0x71, 0xd8, 0x2c, 0x1b, 0x56, 0x84, 0xa6, 0x66, 0xd0, 0x4d, 0xb8, 0x31, 0x39, 0x0e, 0x6e, 0x36, + 0xf2, 0x35, 0x75, 0x16, 0xe5, 0xe1, 0x93, 0x71, 0x65, 0xc5, 0x32, 0xf2, 0xa5, 0xa7, 0xa3, 0x17, + 0x60, 0x5c, 0xb7, 0xb0, 0x55, 0xaf, 0x54, 0x8c, 0x12, 0x2e, 0xe4, 0x8b, 0x07, 0xb8, 0x51, 0x6f, + 0x36, 0xcd, 0x42, 0xc5, 0xe0, 0x0d, 0x6b, 0xfe, 0xa9, 0x3a, 0x87, 0xde, 0x85, 0xdb, 0x63, 0x10, + 0x35, 0xe3, 0x31, 0xae, 0x18, 0xf9, 0xa6, 0x81, 0x1b, 0x96, 0xf1, 0xa9, 0x51, 0x6b, 0x35, 0x71, + 0xeb, 0x49, 0x4d, 0xcd, 0xa2, 0xfb, 0x70, 0x77, 0xcc, 0xb0, 0x65, 0x56, 0x8d, 0x66, 0x2b, 0x5f, + 0x6d, 0xe0, 0x62, 0xbe, 0x58, 0x36, 0xe4, 0x94, 0x8c, 0x92, 0x3a, 0xbf, 0x91, 0xf9, 0xe5, 0x97, + 0xb9, 0x94, 0xce, 0x96, 0x37, 0xfd, 0xe0, 0xcf, 0xe3, 0x6f, 0xe7, 0xb1, 0x77, 0x78, 0xd1, 0xb7, + 0xb6, 0xac, 0xa7, 0x93, 0x8b, 0xcb, 0x9b, 0x64, 0xa6, 0x79, 0x6c, 0x99, 0x2d, 0x03, 0xb7, 0xea, + 0x75, 0x5c, 0xaf, 0xb0, 0xe5, 0xe4, 0x5d, 0x35, 0x53, 0x34, 0x0d, 0xcb, 0xcc, 0x57, 0xcc, 0xcf, + 0xf2, 0x85, 0x8a, 0xa1, 0xce, 0xa0, 0x5b, 0xb0, 0x2e, 0xe4, 0xf9, 0xe6, 0xd3, 0x5a, 0x51, 0xba, + 0xed, 0xe6, 0xcd, 0xca, 0xa1, 0x65, 0xa8, 0xb3, 0x48, 0x87, 0x9c, 0x50, 0x8b, 0x85, 0xc1, 0x25, + 0x23, 0x5f, 0xaa, 0x98, 0x35, 0x03, 0x1b, 0x4f, 0x8a, 0x86, 0x51, 0x32, 0x4a, 0xea, 0x9c, 0x08, + 0xfa, 0xc1, 0x47, 0x80, 0x26, 0x6f, 0x31, 0xca, 0x42, 0xa6, 0x56, 0xaf, 0x19, 0x6a, 0x0a, 0x2d, + 0xc2, 0x3c, 0x5b, 0xc8, 0xfa, 0xee, 0xae, 0xaa, 0xa0, 0x65, 0x58, 0x30, 0xab, 0x55, 0xa3, 0x64, + 0xe6, 0x5b, 0x86, 0x9a, 0x2e, 0xdc, 0x7f, 0xf5, 0xaf, 0x5c, 0xea, 0xd5, 0x9b, 0x9c, 0xf2, 0xd5, + 0x9b, 0x9c, 0xf2, 0xf5, 0x9b, 0x9c, 0xf2, 0xcf, 0x37, 0x39, 0xe5, 0xb7, 0xdf, 0xe4, 0x52, 0x5f, + 0x7d, 0x93, 0x4b, 0x7d, 0xfd, 0x4d, 0x2e, 0xf5, 0xd9, 0xbc, 0xbc, 0x17, 0xff, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0xc9, 0x7a, 0x3c, 0x56, 0x2a, 0x1f, 0x00, 0x00, } diff --git a/pkg/roachpb/errors.proto b/pkg/roachpb/errors.proto index 60e84a331df6..f84d4dc9c503 100644 --- a/pkg/roachpb/errors.proto +++ b/pkg/roachpb/errors.proto @@ -12,6 +12,7 @@ syntax = "proto2"; package cockroach.roachpb; option go_package = "roachpb"; +import "errorspb/errors.proto"; import "roachpb/data.proto"; import "roachpb/metadata.proto"; import "util/hlc/timestamp.proto"; @@ -523,16 +524,20 @@ message Error { option (gogoproto.goproto_stringer) = false; // message is a human-readable error message. - optional string message = 1 [(gogoproto.nullable) = false]; + // + // DEPRECATED. + optional string message = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "deprecatedMessage"]; // If transaction_restart is not NONE, the error condition may be handled by // restarting the transaction. - optional TransactionRestart transaction_restart = 3 [(gogoproto.nullable) = false]; + // + // DEPRECATED. + optional TransactionRestart transaction_restart = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "deprecatedTransactionRestart"]; // An optional updated transaction. This is to be used by the client in case // of retryable errors. // - // Not to be accessed directly - use Error.GetTxn(). + // Not to be accessed directly - use Error.GetTxn() and Error.SetTxn(). optional Transaction unexposed_txn = 4; // Node at which the error was generated (zero if does not apply). @@ -540,7 +545,12 @@ message Error { // If an ErrorDetail is present, it may contain additional structured data // about the error. - optional ErrorDetail detail = 6 [(gogoproto.nullable) = false]; + // + // DEPRECATED - consult encoded_error instead. + optional ErrorDetail detail = 6 [(gogoproto.nullable) = false, (gogoproto.customname) = "deprecatedDetail"]; + + // encoded_error is the Go error that caused this Error. + optional errorspb.EncodedError encoded_error = 9 [(gogoproto.nullable) = false]; // The index, if given, contains the index of the request (in the batch) // whose execution caused the error. diff --git a/pkg/roachpb/errors_test.go b/pkg/roachpb/errors_test.go index a4e478706467..8389abe9c8d8 100644 --- a/pkg/roachpb/errors_test.go +++ b/pkg/roachpb/errors_test.go @@ -50,8 +50,8 @@ func TestSetTxn(t *testing.T) { txn := MakeTransaction("test", Key("a"), 1, hlc.Timestamp{}, 0) e.SetTxn(&txn) if !strings.HasPrefix( - e.Message, "TransactionAbortedError(ABORT_REASON_ABORTED_RECORD_FOUND): \"test\"") { - t.Errorf("unexpected message: %s", e.Message) + e.String(), "TransactionAbortedError(ABORT_REASON_ABORTED_RECORD_FOUND): \"test\"") { + t.Errorf("unexpected message: %s", e.String()) } } diff --git a/pkg/server/node.go b/pkg/server/node.go index e9d11ee18e6e..40b1f838727a 100644 --- a/pkg/server/node.go +++ b/pkg/server/node.go @@ -131,7 +131,7 @@ func makeNodeMetrics(reg *metric.Registry, histogramWindow time.Duration) nodeMe // calls and their latency. Currently, this only records statistics at the batch // level; stats on specific lower-level kv operations are not recorded. func (nm nodeMetrics) callComplete(d time.Duration, pErr *roachpb.Error) { - if pErr != nil && pErr.TransactionRestart == roachpb.TransactionRestart_NONE { + if pErr != nil && pErr.TransactionRestart() == roachpb.TransactionRestart_NONE { nm.Err.Inc(1) } else { nm.Success.Inc(1) diff --git a/pkg/sql/execinfra/processorsbase.go b/pkg/sql/execinfra/processorsbase.go index 3e910369b7d6..009efaa03d08 100644 --- a/pkg/sql/execinfra/processorsbase.go +++ b/pkg/sql/execinfra/processorsbase.go @@ -667,8 +667,7 @@ func (pb *ProcessorBase) DrainHelper() *execinfrapb.ProducerMetadata { // be transformed by the Root TxnCoordSender into // TransactionRetryWithProtoRefreshErrors) don't have any uncertainty. if ure := (*roachpb.UnhandledRetryableError)(nil); errors.As(err, &ure) { - uncertain := ure.PErr.Detail.GetReadWithinUncertaintyInterval() - if uncertain != nil { + if _, uncertain := ure.PErr.GetDetail().(*roachpb.ReadWithinUncertaintyIntervalError); uncertain { continue } } diff --git a/pkg/testutils/error.go b/pkg/testutils/error.go index 493c62f4560a..e2dff22b1e32 100644 --- a/pkg/testutils/error.go +++ b/pkg/testutils/error.go @@ -43,7 +43,7 @@ func IsPError(pErr *roachpb.Error, re string) bool { if pErr == nil || re == "" { return false } - matched, merr := regexp.MatchString(re, pErr.Message) + matched, merr := regexp.MatchString(re, pErr.String()) if merr != nil { return false }