Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Unified Diff: grpc/grpcutil/errors.go

Issue 2951393002: [errors] de-specialize Transient in favor of Tags. (Closed)
Patch Set: copyright Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: grpc/grpcutil/errors.go
diff --git a/grpc/grpcutil/errors.go b/grpc/grpcutil/errors.go
index 760892e5f5a6c0232add46d4037538043869e238..5a4323422d82323e2fb480e634b4a43c21e0b0b1 100644
--- a/grpc/grpcutil/errors.go
+++ b/grpc/grpcutil/errors.go
@@ -5,17 +5,26 @@
package grpcutil
import (
- "github.com/luci/luci-go/common/errors"
-
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
+
+ "github.com/luci/luci-go/common/errors"
+ "github.com/luci/luci-go/common/retry"
)
-var (
- // Errf falls through to grpc.Errorf, with the notable exception that it isn't
- // named "Errorf" and, consequently, won't trigger "go vet" misuse errors.
- Errf = grpc.Errorf
+// Errf falls through to grpc.Errorf, but will tag the resulting error with
+// retry.Tag if it's transient.
+//
+// This is named `Errf` so that it won't trigger "go vet" misuse errors.
+func Errf(code codes.Code, fmt string, a ...interface{}) error {
+ ret := grpc.Errorf(code, fmt, a...)
+ if IsTransientCode(code) {
+ ret = retry.Tag.Apply(ret)
dnj 2017/06/24 14:53:55 This is concerning to me WRT current behavior. I l
iannucci 2017/06/24 20:16:10 I'll undo this for now then
+ }
+ return ret
+}
+var (
// OK is an empty grpc.OK status error.
OK = Errf(codes.OK, "")
@@ -81,30 +90,29 @@ func WrapIfTransient(err error) error {
}
if IsTransientCode(Code(err)) {
- err = errors.WrapTransient(err)
+ err = retry.Tag.Apply(err)
}
return err
}
-const grpcCodeKey = "__grpcutil.Code"
+// Tag may be used to associate a gRPC status code with this error.
+//
+// The tag value MUST be a "google.golang.org/grpc/codes".Code.
+var Tag = errors.NewTagger("gRPC Code", func(v interface{}) {
+ _ = v.(codes.Code)
+})
// Code returns the gRPC code for a given error.
//
// In addition to the functionality of grpc.Code, this will unwrap any wrapped
// errors before asking for its code.
func Code(err error) codes.Code {
- if code := errors.ExtractData(err, grpcCodeKey); code != nil {
+ if code, ok := Tag.ValueIn(err); ok {
return code.(codes.Code)
}
return grpc.Code(errors.Unwrap(err))
}
-// Annotate begins annotating the error, and adds the given gRPC code.
-// This code may be extracted with the Code function in this package.
-func Annotate(err error, code codes.Code) *errors.Annotator {
- return errors.Annotate(err).D(grpcCodeKey, code)
-}
-
// ToGRPCErr is a shorthand for Errf(Code(err), "%s", err)
func ToGRPCErr(err error) error {
return Errf(Code(err), "%s", err)

Powered by Google App Engine
This is Rietveld 408576698