Browse Source

classify grpc errors

pull/7930/head
Chris Lu 1 week ago
parent
commit
998bcf2b3f
  1. 49
      weed/mount/error_classifier.go
  2. 10
      weed/mount/wfs_save.go

49
weed/mount/error_classifier.go

@ -0,0 +1,49 @@
package mount
import (
"strings"
"syscall"
"github.com/hanwen/go-fuse/v2/fuse"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func grpcErrorToFuseStatus(err error) fuse.Status {
if err == nil {
return fuse.OK
}
// Unpack error for inspection
if s, ok := status.FromError(err); ok {
switch s.Code() {
case codes.OK:
return fuse.OK
case codes.Canceled, codes.DeadlineExceeded:
return fuse.Status(syscall.ETIMEDOUT)
case codes.Unavailable:
return fuse.Status(syscall.EAGAIN)
case codes.ResourceExhausted:
return fuse.Status(syscall.EAGAIN) // Or syscall.ENOSPC
case codes.PermissionDenied:
return fuse.Status(syscall.EACCES)
case codes.Unauthenticated:
return fuse.Status(syscall.EPERM)
case codes.NotFound:
return fuse.ENOENT
case codes.AlreadyExists:
return fuse.Status(syscall.EEXIST)
case codes.InvalidArgument:
return fuse.EINVAL
}
}
// String matching for errors that don't have proper gRPC codes but are known
errStr := err.Error()
if strings.Contains(errStr, "transport") {
return fuse.Status(syscall.EAGAIN)
}
// Add other string matches if necessary
return fuse.EIO
}

10
weed/mount/wfs_save.go

@ -40,8 +40,14 @@ func (wfs *WFS) saveEntry(path util.FullPath, entry *filer_pb.Entry) (code fuse.
return nil
})
if err != nil {
glog.Errorf("saveEntry %s: %v", path, err)
return fuse.EIO
// glog.V(0).Infof("saveEntry %s: %v", path, err)
fuseStatus := grpcErrorToFuseStatus(err)
if fuseStatus == fuse.EIO {
glog.Errorf("saveEntry failed for %s: %v (returning EIO)", path, err)
} else {
glog.V(1).Infof("saveEntry failed for %s: %v (returning %v)", path, err, fuseStatus)
}
return fuseStatus
}
return fuse.OK

Loading…
Cancel
Save