diff --git a/WORKSPACE b/WORKSPACE index 39bf3e8eb..98c030b24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -3226,6 +3226,6 @@ go_repository( go_repository( name = "com_github_hanwen_go_fuse_v2", importpath = "github.com/hanwen/go-fuse/v2", - sum = "h1:fOTuYWxywhaliwMobGTP/6NUCgGdal6pCpuch4MHCnU=", - version = "v2.1.1-0.20220627082937-d01fda7edf17", + sum = "h1:t5ivNIH2PK+zw4OBul/iJjsoG9K6kXo4nMDoBpciC8A=", + version = "v2.3.0", ) diff --git a/go.mod b/go.mod index 5ce6b61b6..bcc3d6811 100644 --- a/go.mod +++ b/go.mod @@ -50,6 +50,7 @@ require ( github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/googleapis/gnostic v0.5.5 // indirect + github.com/hanwen/go-fuse/v2 v2.3.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-multierror v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect diff --git a/go.sum b/go.sum index 81d067025..a7f95f9cd 100644 --- a/go.sum +++ b/go.sum @@ -129,6 +129,8 @@ github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2c github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/hanwen/go-fuse/v2 v2.3.0 h1:t5ivNIH2PK+zw4OBul/iJjsoG9K6kXo4nMDoBpciC8A= +github.com/hanwen/go-fuse/v2 v2.3.0/go.mod h1:xKwi1cF7nXAOBCXujD5ie0ZKsxc8GGSA1rlMJc+8IJs= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= @@ -150,11 +152,13 @@ github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a h1:+J2gw7Bw77w/fbK7wnNJJDKmw1IbWft2Ul5BzrG1Qm8= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -286,6 +290,7 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/test/perf/BUILD b/test/perf/BUILD index 3c5bb3e4e..efccbc1c8 100644 --- a/test/perf/BUILD +++ b/test/perf/BUILD @@ -67,6 +67,7 @@ syscall_test( syscall_test( size = "large", + add_fusefs = True, add_overlay = True, debug = False, test = "//test/perf/linux:open_benchmark", @@ -86,6 +87,7 @@ syscall_test( syscall_test( size = "large", + add_fusefs = True, add_overlay = True, debug = False, test = "//test/perf/linux:randread_benchmark", @@ -93,6 +95,7 @@ syscall_test( syscall_test( size = "large", + add_fusefs = True, add_overlay = True, debug = False, test = "//test/perf/linux:read_benchmark", @@ -112,6 +115,7 @@ syscall_test( syscall_test( size = "large", + add_fusefs = True, add_overlay = True, debug = False, test = "//test/perf/linux:seqwrite_benchmark", @@ -130,6 +134,7 @@ syscall_test( syscall_test( size = "large", + add_fusefs = True, add_overlay = True, debug = False, test = "//test/perf/linux:stat_benchmark", @@ -137,6 +142,7 @@ syscall_test( syscall_test( size = "large", + add_fusefs = True, add_overlay = True, debug = False, tags = ["nogotsan"], @@ -145,6 +151,7 @@ syscall_test( syscall_test( size = "large", + add_fusefs = True, add_overlay = True, debug = False, test = "//test/perf/linux:write_benchmark", diff --git a/test/runner/fuse/fuse.go b/test/runner/fuse/fuse.go index dbd106fa3..64bc0cba0 100644 --- a/test/runner/fuse/fuse.go +++ b/test/runner/fuse/fuse.go @@ -17,9 +17,11 @@ package main import ( + "flag" golog "log" "os" "os/exec" + "strings" "github.com/hanwen/go-fuse/v2/fs" "github.com/hanwen/go-fuse/v2/fuse" @@ -28,29 +30,15 @@ import ( "gvisor.dev/gvisor/runsc/specutils" ) -func main() { - loopbackRoot, err := fs.NewLoopbackRoot("/fuse") - if err != nil { - log.Warningf("could not create loopback root: %v", err) - os.Exit(1) - } - opts := &fuse.MountOptions{DirectMount: true, Debug: true, AllowOther: true, Options: []string{"default_permissions"}} - rawFS := fs.NewNodeFS(loopbackRoot, &fs.Options{NullPermissions: true, Logger: golog.Default()}) - server, err := fuse.NewServer(rawFS, "/tmp", opts) - if err != nil { - log.Warningf("could not create fuse server: %v", err) - os.Exit(1) - } - // Clear umask so that it doesn't affect the mode bits twice. - unix.Umask(0) +var ( + dir = flag.String("dir", "/tmp", "The directory to mount the fuse filesystem on.") + cmd = flag.String("cmd", "", "Command to execute after starting the fuse server. If empty, just wait after starting.") + debug = flag.Bool("debug", true, "Whether to log FUSE traffic. Set to false for benchmarks.") +) - go server.Serve() - defer func() { - server.Unmount() - server.Wait() - }() +func waitOnMount(s *fuse.Server) { if _, _, err := specutils.RetryEintr(func() (uintptr, uintptr, error) { - if err := server.WaitMount(); err != nil { + if err := s.WaitMount(); err != nil { return 0, 0, err } return 0, 0, nil @@ -60,8 +48,40 @@ func main() { log.Warningf(`Could not mount fuse submount "/tmp": %v`, err) os.Exit(1) } - cmd := exec.Command(os.Args[1], os.Args[2:]...) - if err := cmd.Run(); err != nil { +} + +func main() { + flag.Parse() + loopbackRoot, err := fs.NewLoopbackRoot("/fuse") + if err != nil { + log.Warningf("could not create loopback root: %v", err) + os.Exit(1) + } + opts := &fuse.MountOptions{DirectMountStrict: true, Debug: *debug, AllowOther: true, Options: []string{"default_permissions"}} + rawFS := fs.NewNodeFS(loopbackRoot, &fs.Options{NullPermissions: true, Logger: golog.Default()}) + server, err := fuse.NewServer(rawFS, "/tmp", opts) + if err != nil { + log.Warningf("could not create fuse server: %v", err) + os.Exit(1) + } + // Clear umask so that it doesn't affect the mode bits twice. + unix.Umask(0) + + if *cmd == "" { + server.Serve() + waitOnMount(server) + return + } + go server.Serve() + waitOnMount(server) + defer func() { + server.Unmount() + server.Wait() + }() + + cmdArgs := strings.Split(strings.Trim(*cmd, "\""), " ") + c := exec.Command(cmdArgs[0], cmdArgs[1:]...) + if err := c.Run(); err != nil { log.Warningf(err.Error()) os.Exit(1) } diff --git a/test/runner/main.go b/test/runner/main.go index ff8bdce0e..a6c339a79 100644 --- a/test/runner/main.go +++ b/test/runner/main.go @@ -517,7 +517,9 @@ func runTestCaseRunsc(testBin string, tc *gtest.TestCase, args []string, t *test if err != nil { fatalf("cannot find fuse: %v", err) } - spec = testutil.NewSpecWithArgs(append([]string{fuseServer, testBin}, args...)...) + cmdArgs := append([]string{testBin}, args...) + cmd := strings.Join(cmdArgs, " ") + spec = testutil.NewSpecWithArgs([]string{fuseServer, fmt.Sprintf("--debug=%t", *debug), fmt.Sprintf("--cmd=\"%s\"", cmd)}...) } else { spec = testutil.NewSpecWithArgs(append([]string{testBin}, args...)...) }