Don't log errors that we expect to happen regularly.

For GoogleCloudPlatform/gcsfuse#99.
geesefs-0-30-9
Aaron Jacobs 2015-08-03 13:15:29 +10:00
parent 13eb2958d3
commit 263bbab5dd
1 changed files with 35 additions and 1 deletions

View File

@ -26,6 +26,7 @@ import (
"golang.org/x/net/context"
"github.com/jacobsa/fuse/fuseops"
"github.com/jacobsa/fuse/internal/buffer"
"github.com/jacobsa/fuse/internal/freelist"
"github.com/jacobsa/fuse/internal/fusekernel"
@ -418,6 +419,39 @@ func (c *Connection) ReadOp() (ctx context.Context, op interface{}, err error) {
}
}
// Skip errors that happen as a matter of course, since they spook users.
func (c *Connection) shouldLogError(
op interface{},
err error) bool {
// We don't log non-errors.
if err == nil {
return false
}
// We can't log if there's nothing to log to.
if c.errorLogger == nil {
return false
}
switch op.(type) {
case *fuseops.LookUpInodeOp:
// It is totally normal for the kernel to ask to look up an inode by name
// and find the name doesn't exist. For example, this happens when linking
// a new file.
if err == syscall.ENOENT {
return false
}
case *unknownOp:
// Don't bother the user with methods we intentionally don't support.
if err == syscall.ENOSYS {
return false
}
}
return true
}
// Reply to an op previously read using ReadOp, with the supplied error (or nil
// if successful). The context must be the context returned by ReadOp.
//
@ -453,7 +487,7 @@ func (c *Connection) Reply(ctx context.Context, opErr error) {
}
// Error logging
if opErr != nil && c.errorLogger != nil {
if c.shouldLogError(op, opErr) {
c.errorLogger.Printf("%T error: %v", op, opErr)
}