stack: remove helper functions from error stack traces

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
v0.8
Tonis Tiigi 2020-10-18 23:36:05 -07:00
parent 4f3fb6155a
commit ca46949277
3 changed files with 45 additions and 2 deletions

View File

@ -181,6 +181,10 @@ func FromGRPC(err error) error {
err = d.WrapError(err)
}
if err != nil {
stack.Helper()
}
return stack.Enable(err)
}

View File

@ -5,6 +5,7 @@ import (
"log"
"os"
"github.com/moby/buildkit/util/stack"
"github.com/pkg/errors"
"google.golang.org/grpc"
)
@ -13,6 +14,7 @@ func UnaryServerInterceptor(ctx context.Context, req interface{}, info *grpc.Una
resp, err = handler(ctx, req)
oldErr := err
if err != nil {
stack.Helper()
err = ToGRPC(err)
}
if oldErr != nil && err == nil {
@ -28,14 +30,25 @@ func UnaryServerInterceptor(ctx context.Context, req interface{}, info *grpc.Una
}
func StreamServerInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
return ToGRPC(handler(srv, ss))
err := ToGRPC(handler(srv, ss))
if err != nil {
stack.Helper()
}
return err
}
func UnaryClientInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
return FromGRPC(invoker(ctx, method, req, reply, cc, opts...))
err := FromGRPC(invoker(ctx, method, req, reply, cc, opts...))
if err != nil {
stack.Helper()
}
return err
}
func StreamClientInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
s, err := streamer(ctx, desc, cc, method, opts...)
if err != nil {
stack.Helper()
}
return s, ToGRPC(err)
}

View File

@ -4,15 +4,22 @@ import (
"fmt"
io "io"
"os"
"runtime"
"strconv"
"strings"
"sync"
"github.com/containerd/typeurl"
"github.com/pkg/errors"
)
var helpers map[string]struct{}
var helpersMu sync.RWMutex
func init() {
typeurl.Register((*Stack)(nil), "github.com/moby/buildkit", "stack.Stack+json")
helpers = map[string]struct{}{}
}
var version string
@ -23,6 +30,19 @@ func SetVersionInfo(v, r string) {
revision = r
}
func Helper() {
var pc [1]uintptr
n := runtime.Callers(2, pc[:])
if n == 0 {
return
}
frames := runtime.CallersFrames(pc[:n])
frame, _ := frames.Next()
helpersMu.Lock()
helpers[frame.Function] = struct{}{}
helpersMu.Unlock()
}
func Traces(err error) []*Stack {
var st []*Stack
@ -52,6 +72,7 @@ func Enable(err error) error {
if err == nil {
return nil
}
Helper()
if !hasLocalStackTrace(err) {
return errors.WithStack(err)
}
@ -112,6 +133,8 @@ func (w *formatter) Format(s fmt.State, verb rune) {
func convertStack(s errors.StackTrace) *Stack {
var out Stack
helpersMu.RLock()
defer helpersMu.RUnlock()
for _, f := range s {
dt, err := f.MarshalText()
if err != nil {
@ -121,6 +144,9 @@ func convertStack(s errors.StackTrace) *Stack {
if len(p) != 2 {
continue
}
if _, ok := helpers[p[0]]; ok {
continue
}
idx := strings.LastIndexByte(p[1], ':')
if idx == -1 {
continue