diff --git a/internal/fusefs/create.go b/internal/fusefs/create.go index 2b9b5b3..1c21ee0 100644 --- a/internal/fusefs/create.go +++ b/internal/fusefs/create.go @@ -2,6 +2,7 @@ package fusefs import ( "context" + "log/slog" "os" "path/filepath" "syscall" @@ -19,6 +20,7 @@ func (r *RootNode) Create(ctx context.Context, name string, flags uint32, mode u path := filepath.Join(r.fs.localDir, name) f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR|int(flags)&^os.O_EXCL, os.FileMode(mode)) if err != nil { + slog.Error("FUSE create: file creation failed", "op", "Create", "file", name, "err", err) return nil, nil, 0, syscall.EIO } @@ -32,6 +34,7 @@ func (r *RootNode) Create(ctx context.Context, name string, flags uint32, mode u } if err := r.fs.st.UpsertFile(entry); err != nil { f.Close() + slog.Error("FUSE create: store upsert failed", "op", "Create", "file", name, "err", err) return nil, nil, 0, syscall.EIO } diff --git a/internal/fusefs/node.go b/internal/fusefs/node.go index 6baf14f..cc3a46c 100644 --- a/internal/fusefs/node.go +++ b/internal/fusefs/node.go @@ -2,6 +2,7 @@ package fusefs import ( "context" + "log/slog" "os" "path/filepath" "syscall" @@ -93,6 +94,7 @@ func (n *FileNode) Open(ctx context.Context, flags uint32) (fs.FileHandle, uint3 path := filepath.Join(n.fs.localDir, n.filename) f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644) if err != nil { + slog.Error("FUSE open: failed to open active file", "op", "Open", "file", n.filename, "err", err) return nil, 0, syscall.EIO } wh := &WriteHandle{fs: n.fs, filename: n.filename, file: f} diff --git a/internal/fusefs/write.go b/internal/fusefs/write.go index 553f6e3..67c196a 100644 --- a/internal/fusefs/write.go +++ b/internal/fusefs/write.go @@ -5,6 +5,7 @@ import ( "crypto/sha256" "encoding/hex" "io" + "log/slog" "os" "path/filepath" "syscall" @@ -30,15 +31,18 @@ type WriteHandle struct { func (h *WriteHandle) Write(ctx context.Context, data []byte, off int64) (uint32, syscall.Errno) { entry, err := h.fs.st.GetFile(h.filename) if err != nil { + slog.Warn("FUSE write: file not found in store", "op", "Write", "file", h.filename, "err", err) return 0, syscall.ENOENT } if !state.IsWritable(entry.State) { + slog.Warn("FUSE write: file not writable", "op", "Write", "file", h.filename, "state", entry.State) return 0, syscall.EACCES } n, err := h.file.WriteAt(data, off) if err != nil { + slog.Error("FUSE write: WriteAt failed", "op", "Write", "file", h.filename, "offset", off, "len", len(data), "err", err) return 0, syscall.EIO } @@ -57,10 +61,12 @@ func (h *WriteHandle) Write(ctx context.Context, data []byte, off int64) (uint32 func (h *WriteHandle) Fsync(ctx context.Context, flags uint32) syscall.Errno { entry, err := h.fs.st.GetFile(h.filename) if err != nil { + slog.Warn("FUSE fsync: file not found in store", "op", "Fsync", "file", h.filename, "err", err) return fs.OK } if entry.State == store.FileStateActive { if err := h.file.Sync(); err != nil { + slog.Error("FUSE fsync: sync failed", "op", "Fsync", "file", h.filename, "err", err) return syscall.EIO } } @@ -71,11 +77,13 @@ func (h *WriteHandle) finalize(entry *store.FileEntry) { path := filepath.Join(h.fs.localDir, h.filename) sha, err := fileSHA256(path) if err != nil { + slog.Warn("finalize: SHA256 computation failed", "op", "finalize", "file", h.filename, "err", err) return } info, err := os.Stat(path) if err != nil { + slog.Warn("finalize: stat failed", "op", "finalize", "file", h.filename, "err", err) return } @@ -83,7 +91,9 @@ func (h *WriteHandle) finalize(entry *store.FileEntry) { entry.SHA256 = sha entry.Size = info.Size() entry.LastAccess = time.Now() - _ = h.fs.st.UpsertFile(entry) + if err := h.fs.st.UpsertFile(entry); err != nil { + slog.Warn("finalize: store update failed", "op", "finalize", "file", h.filename, "err", err) + } select { case h.fs.finCh <- h.filename: