From 5a135f8c5a46db042b38a0c62602961264810c33 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 31 Dec 2025 01:04:16 -0800 Subject: [PATCH] fuse: add FUSE performance options to weed fuse command (#7925) This adds support for the new FUSE performance options to the 'weed fuse' command, matching the functionality available in 'weed mount'. Added options: - writebackCache: Enable FUSE writeback cache for improved write performance - asyncDio: Enable async direct I/O for better concurrency - cacheSymlink: Enable symlink caching to reduce metadata lookups - sys.novncache: (macOS only) Disable vnode name caching to avoid stale data These options can now be used with mount -t weed: mount -t weed fuse /mnt -o "filer=localhost:8888,writebackCache=true,asyncDio=true" This ensures feature parity between 'weed mount' and 'weed fuse' commands. --- weed/command/fuse_std.go | 30 ++++++++++++++++++++++++++++++ weed/command/mount_std.go | 8 ++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/weed/command/fuse_std.go b/weed/command/fuse_std.go index bd274f651..29628a8ef 100644 --- a/weed/command/fuse_std.go +++ b/weed/command/fuse_std.go @@ -224,6 +224,36 @@ func runFuse(cmd *Command, args []string) bool { fusermountPath = parameter.value case "config_dir": util.ConfigurationFileDirectory.Set(parameter.value) + // FUSE performance options + case "writebackCache": + if parsed, err := strconv.ParseBool(parameter.value); err == nil { + mountOptions.writebackCache = &parsed + } else { + fmt.Fprintf(os.Stderr, "failed to parse 'writebackCache' value %q: %v\n", parameter.value, err) + return false + } + case "asyncDio": + if parsed, err := strconv.ParseBool(parameter.value); err == nil { + mountOptions.asyncDio = &parsed + } else { + fmt.Fprintf(os.Stderr, "failed to parse 'asyncDio' value %q: %v\n", parameter.value, err) + return false + } + case "cacheSymlink": + if parsed, err := strconv.ParseBool(parameter.value); err == nil { + mountOptions.cacheSymlink = &parsed + } else { + fmt.Fprintf(os.Stderr, "failed to parse 'cacheSymlink' value %q: %v\n", parameter.value, err) + return false + } + // macOS-specific FUSE options + case "sys.novncache": + if parsed, err := strconv.ParseBool(parameter.value); err == nil { + mountOptions.novncache = &parsed + } else { + fmt.Fprintf(os.Stderr, "failed to parse 'sys.novncache' value %q: %v\n", parameter.value, err) + return false + } default: t := parameter.name if parameter.value != "true" { diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 497a1eec8..a4cbfe820 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -208,7 +208,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { if runtime.GOARCH == "amd64" { fuseMountOptions.Options = append(fuseMountOptions.Options, "noapplexattr") } - if *option.novncache { + if option.novncache != nil && *option.novncache { fuseMountOptions.Options = append(fuseMountOptions.Options, "novncache") } fuseMountOptions.Options = append(fuseMountOptions.Options, "slow_statfs") @@ -216,13 +216,13 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { fuseMountOptions.Options = append(fuseMountOptions.Options, fmt.Sprintf("iosize=%d", ioSizeMB*1024*1024)) } - if *option.writebackCache { + if option.writebackCache != nil && *option.writebackCache { fuseMountOptions.Options = append(fuseMountOptions.Options, "writeback_cache") } - if *option.asyncDio { + if option.asyncDio != nil && *option.asyncDio { fuseMountOptions.Options = append(fuseMountOptions.Options, "async_dio") } - if *option.cacheSymlink { + if option.cacheSymlink != nil && *option.cacheSymlink { fuseMountOptions.EnableSymlinkCaching = true }