mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-20 15:04:37 +00:00
fix(command): preserve fuse option after writers (#9972)
* fix(command): preserve fuse option after writers Problem: FUSE mount option parsing skipped the option immediately following concurrentWriters, so values such as concurrentReaders could be silently ignored. Root cause: runFuse incremented the options loop index inside the concurrentWriters case in addition to the loop increment. Co-authored-by: Codex <noreply@openai.com> * test: save and restore mountOptions pointers, not their values The fields are reassigned to fresh heap variables during runFuse, so dereferencing to back up/restore mutated throwaways instead of the flag-bound originals and could nil-panic on unset fields. --------- Co-authored-by: Codex <noreply@openai.com> Co-authored-by: Chris Lu <chris.lu@gmail.com>
This commit is contained in:
@@ -165,7 +165,6 @@ func runFuse(cmd *Command, args []string) bool {
|
||||
panic(fmt.Errorf("dirIdleEvictSec: %s", err))
|
||||
}
|
||||
case "concurrentWriters":
|
||||
i++
|
||||
if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err == nil {
|
||||
intValue := int(parsed)
|
||||
mountOptions.concurrentWriters = &intValue
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
//go:build darwin || freebsd || linux
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestRunFuseDoesNotSkipOptionAfterConcurrentWriters(t *testing.T) {
|
||||
oldUmask := mountOptions.umaskString
|
||||
oldWriters := mountOptions.concurrentWriters
|
||||
oldReaders := mountOptions.concurrentReaders
|
||||
oldFuseCommandPid := mountOptions.fuseCommandPid
|
||||
oldDir := mountOptions.dir
|
||||
defer func() {
|
||||
mountOptions.umaskString = oldUmask
|
||||
mountOptions.concurrentWriters = oldWriters
|
||||
mountOptions.concurrentReaders = oldReaders
|
||||
mountOptions.fuseCommandPid = oldFuseCommandPid
|
||||
mountOptions.dir = oldDir
|
||||
|
||||
recovered := recover()
|
||||
if recovered == nil {
|
||||
t.Fatal("expected invalid concurrentReaders option to be parsed")
|
||||
}
|
||||
if !strings.Contains(fmt.Sprint(recovered), "concurrentReaders") {
|
||||
t.Fatalf("expected concurrentReaders parse error, got %v", recovered)
|
||||
}
|
||||
}()
|
||||
|
||||
runFuse(cmdMount, []string{
|
||||
"/mnt",
|
||||
"-o",
|
||||
"child=1,concurrentWriters=2,concurrentReaders=bad,umask=bad",
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user