diff --git a/connection.go b/connection.go index 021f4a2..7dfd29f 100644 --- a/connection.go +++ b/connection.go @@ -476,9 +476,9 @@ func (c *Connection) Reply(ctx context.Context, opErr error) { // Debug logging if c.debugLogger != nil { if opErr == nil { - c.debugLog(fuseID, 1, "-> OK: %s", describeResponse(op)) + c.debugLog(fuseID, 1, "-> OK") } else { - c.debugLog(fuseID, 1, "-> error: %v", opErr) + c.debugLog(fuseID, 1, "-> Error: %q", opErr.Error()) } } diff --git a/debug.go b/debug.go index 8d5ec9e..2003fc0 100644 --- a/debug.go +++ b/debug.go @@ -17,31 +17,55 @@ package fuse import ( "fmt" "reflect" + "strings" + + "github.com/jacobsa/fuse/fuseops" ) +// Decide on the name of the given op. +func opName(op interface{}) string { + // We expect all ops to be pointers. + t := reflect.TypeOf(op).Elem() + + // Strip the "Op" from "FooOp". + return strings.TrimSuffix(t.Name(), "Op") +} + func describeRequest(op interface{}) (s string) { - // Handle special cases with custom formatting. + v := reflect.ValueOf(op).Elem() + + // We will set up a comma-separated list of components. + var components []string + addComponent := func(format string, v ...interface{}) { + components = append(components, fmt.Sprintf(format, v...)) + } + + // Include an inode number, if available. + if f := v.FieldByName("Inode"); f.IsValid() { + addComponent("inode %v", f.Interface()) + } + + // Handle special cases. switch typed := op.(type) { case *interruptOp: - s = fmt.Sprintf("interruptOp(fuseid=0x%08x)", typed.FuseID) - return + addComponent("fuseid 0x%08x", typed.FuseID) + + case *fuseops.ReadFileOp: + addComponent("handle %d", typed.Handle) + addComponent("offset %d", typed.Offset) + addComponent("%d bytes", len(typed.Dst)) + + case *fuseops.WriteFileOp: + addComponent("handle %d", typed.Handle) + addComponent("offset %d", typed.Offset) + addComponent("%d bytes", len(typed.Data)) } - v := reflect.ValueOf(op).Elem() - t := v.Type() - - // Find the inode number involved, if possible. - var inodeDesc string - if f := v.FieldByName("Inode"); f.IsValid() { - inodeDesc = fmt.Sprintf("(inode=%v)", f.Interface()) + // Use just the name if there is no extra info. + if len(components) == 0 { + return opName(op) } - // Use the type name. - s = fmt.Sprintf("%s%s", t.Name(), inodeDesc) - - return -} - -func describeResponse(op interface{}) (s string) { - return describeRequest(op) + // Otherwise, include the extra info. + return fmt.Sprintf("%s (%s)", opName(op), strings.Join(components, ", ")) }