From 5f881d2fd52dd08cc735b42e3e6f6775ea7dc1a9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 3 Apr 2020 00:21:03 -0700 Subject: [PATCH] mount: fail early rather than after mounted the directory fix https://github.com/chrislusf/seaweedfs/issues/1258 --- weed/command/mount_std.go | 60 +++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index dbef84d21..eea3a78ab 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -13,8 +13,6 @@ import ( "strings" "time" - "github.com/jacobsa/daemonize" - "github.com/chrislusf/seaweedfs/weed/filesys" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb" @@ -41,6 +39,29 @@ func runMount(cmd *Command, args []string) bool { func RunMount(option *MountOptions, umask os.FileMode) bool { filer := *option.filer + // parse filer grpc address + filerGrpcAddress, err := pb.ParseFilerGrpcAddress(filer) + if err != nil { + glog.V(0).Infof("ParseFilerGrpcAddress: %v", err) + return true + } + + // try to connect to filer, filerBucketsPath may be useful later + grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") + var cipher bool + err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) + if err != nil { + return fmt.Errorf("get filer %s configuration: %v", filerGrpcAddress, err) + } + cipher = resp.Cipher + return nil + }) + if err != nil { + glog.Infof("failed to talk to filer %s: %v", filerGrpcAddress, err) + return true + } + filerMountRootPath := *option.filerMountRootPath dir := *option.dir chunkSizeLimitMB := *mountOptions.chunkSizeLimitMB @@ -85,7 +106,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { // Ensure target mount point availability if isValid := checkMountPointAvailable(dir); !isValid { glog.Fatalf("Expected mount to still be active, target mount point: %s, please check!", dir) - return false + return true } mountName := path.Base(dir) @@ -119,47 +140,22 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { c, err := fuse.Mount(dir, options...) if err != nil { glog.V(0).Infof("mount: %v", err) - daemonize.SignalOutcome(err) return true } + defer fuse.Unmount(dir) + util.OnInterrupt(func() { fuse.Unmount(dir) c.Close() }) - // parse filer grpc address - filerGrpcAddress, err := pb.ParseFilerGrpcAddress(filer) - if err != nil { - glog.V(0).Infof("ParseFilerGrpcAddress: %v", err) - daemonize.SignalOutcome(err) - return true - } - - // try to connect to filer, filerBucketsPath may be useful later - grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") - var cipher bool - err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) - if err != nil { - return fmt.Errorf("get filer %s configuration: %v", filerGrpcAddress, err) - } - cipher = resp.Cipher - return nil - }) - if err != nil { - glog.Fatal(err) - return false - } - // find mount point mountRoot := filerMountRootPath if mountRoot != "/" && strings.HasSuffix(mountRoot, "/") { mountRoot = mountRoot[0 : len(mountRoot)-1] } - daemonize.SignalOutcome(nil) - err = fs.Serve(c, filesys.NewSeaweedFileSystem(&filesys.Option{ FilerGrpcAddress: filerGrpcAddress, GrpcDialOption: grpcDialOption, @@ -181,15 +177,11 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { OutsideContainerClusterMode: *mountOptions.outsideContainerClusterMode, Cipher: cipher, })) - if err != nil { - fuse.Unmount(dir) - } // check if the mount process has an error to report <-c.Ready if err := c.MountError; err != nil { glog.V(0).Infof("mount process: %v", err) - daemonize.SignalOutcome(err) return true }