Skip to content

Commit 0d6893f

Browse files
Reuse common syscall error status objects instead of allocating new ones. (#8200)
1 parent ce883aa commit 0d6893f

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

enterprise/server/util/vfs_server/vfs_server.go

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,45 @@ const (
4545
_OFD_SETLKW = 38
4646
)
4747

48+
var (
49+
syscallStatusENOENT = makeSyscallErrStatus(syscall.ENOENT)
50+
syscallStatusEPERM = makeSyscallErrStatus(syscall.EPERM)
51+
syscallStatusEEXIST = makeSyscallErrStatus(syscall.EEXIST)
52+
syscallStatusENOTEMPTY = makeSyscallErrStatus(syscall.ENOTEMPTY)
53+
syscallStatusEINVAL = makeSyscallErrStatus(syscall.EINVAL)
54+
)
55+
56+
// makeSyscallErrStatus creates a gRPC status error that includes the given syscall error code.
57+
func makeSyscallErrStatus(sysErr error) error {
58+
s := gstatus.New(codes.Unknown, fmt.Sprintf("syscall error: %s", sysErr))
59+
s, err := s.WithDetails(syscallErrProto(sysErr))
60+
// should never happen
61+
if err != nil {
62+
alert.UnexpectedEvent("could_not_make_syscall_err", "err: %s", err)
63+
}
64+
return s.Err()
65+
}
66+
67+
// syscallErrStatus returns a gRPC status error that includes the given syscall error code.
68+
func syscallErrStatus(sysErr error) error {
69+
// Return predefined types for common errors.
70+
if errno, ok := sysErr.(syscall.Errno); ok {
71+
switch errno {
72+
case syscall.ENOENT:
73+
return syscallStatusENOENT
74+
case syscall.EPERM:
75+
return syscallStatusEPERM
76+
case syscall.EEXIST:
77+
return syscallStatusEEXIST
78+
case syscall.ENOTEMPTY:
79+
return syscallStatusENOTEMPTY
80+
case syscall.EINVAL:
81+
return syscallStatusEINVAL
82+
}
83+
}
84+
return makeSyscallErrStatus(sysErr)
85+
}
86+
4887
type fileHandle struct {
4988
node *fsNode
5089

@@ -439,17 +478,6 @@ func syscallErrProto(sysErr error) *vfspb.SyscallError {
439478
return &vfspb.SyscallError{Errno: uint32(errno)}
440479
}
441480

442-
// syscallErrStatus creates a gRPC status error that includes the given syscall error code.
443-
func syscallErrStatus(sysErr error) error {
444-
s := gstatus.New(codes.Unknown, fmt.Sprintf("syscall error: %s", sysErr))
445-
s, err := s.WithDetails(syscallErrProto(sysErr))
446-
// should never happen
447-
if err != nil {
448-
alert.UnexpectedEvent("could_not_make_syscall_err", "err: %s", err)
449-
}
450-
return s.Err()
451-
}
452-
453481
func (p *Server) lookupNode(id uint64) (*fsNode, error) {
454482
p.mu.Lock()
455483
node, ok := p.nodes[id]

0 commit comments

Comments
 (0)