fix: 🐛 fix force umount
fix force umount
This commit is contained in:
		
							parent
							
								
									f8aa58a3be
								
							
						
					
					
						commit
						df80de8392
					
				| @ -29,7 +29,7 @@ var ( | |||||||
| 	nodeID                = flag.String("nodeid", "", "node id") | 	nodeID                = flag.String("nodeid", "", "node id") | ||||||
| 	mountPermissions      = flag.Uint64("mount-permissions", 0, "mounted folder permissions") | 	mountPermissions      = flag.Uint64("mount-permissions", 0, "mounted folder permissions") | ||||||
| 	driverName            = flag.String("drivername", "", "name of the driver") | 	driverName            = flag.String("drivername", "", "name of the driver") | ||||||
| 	workingMountDir       = flag.String("working-mount-dir", "/tmp", "working directory for provisioner to mount davfs shares temporarily") | 	workingMountDir       = flag.String("working-mount-dir", "/tmp/csi-storage", "working directory for provisioner to mount davfs shares temporarily") | ||||||
| 	defaultOnDeletePolicy = flag.String("default-ondelete-policy", "", "default policy for deleting subdirectory when deleting a volume") | 	defaultOnDeletePolicy = flag.String("default-ondelete-policy", "", "default policy for deleting subdirectory when deleting a volume") | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -79,7 +79,7 @@ spec: | |||||||
|           securityContext: |           securityContext: | ||||||
|             privileged: true |             privileged: true | ||||||
|             capabilities: |             capabilities: | ||||||
|               add: ["ALL"] |               add: ["SYS_ADMIN"] | ||||||
|             allowPrivilegeEscalation: true |             allowPrivilegeEscalation: true | ||||||
|           args: |           args: | ||||||
|             - "-v=5" |             - "-v=5" | ||||||
|  | |||||||
| @ -96,12 +96,6 @@ func (c *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolu | |||||||
| 		return nil, status.Errorf(codes.Internal, fmt.Sprintf("mount failed: %v", err.Error())) | 		return nil, status.Errorf(codes.Internal, fmt.Sprintf("mount failed: %v", err.Error())) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	defer func() { |  | ||||||
| 		if err = umount(c.mounter, targetPath); err != nil { |  | ||||||
| 			klog.Warningf("failed to unmount src webdav server after snapshot volume copy: %v", err) |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
| 
 |  | ||||||
| 	internalVolumePath := filepath.Join(targetPath, req.Name) | 	internalVolumePath := filepath.Join(targetPath, req.Name) | ||||||
| 	if err = os.Mkdir(internalVolumePath, 0777); err != nil && !os.IsExist(err) { | 	if err = os.Mkdir(internalVolumePath, 0777); err != nil && !os.IsExist(err) { | ||||||
| 		return nil, status.Errorf(codes.Internal, "failed to make subdirectory: %v", err.Error()) | 		return nil, status.Errorf(codes.Internal, "failed to make subdirectory: %v", err.Error()) | ||||||
| @ -114,6 +108,10 @@ func (c *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolu | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if err = c.mounter.Unmount(targetPath); err != nil { | ||||||
|  | 		return nil, status.Errorf(codes.Internal, "failed to unmount targetpath %s %v", targetPath, err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return &csi.CreateVolumeResponse{ | 	return &csi.CreateVolumeResponse{ | ||||||
| 		Volume: &csi.Volume{ | 		Volume: &csi.Volume{ | ||||||
| 			VolumeId:      MakeVolumeId(sourcePath, req.Name), | 			VolumeId:      MakeVolumeId(sourcePath, req.Name), | ||||||
| @ -144,18 +142,16 @@ func (c *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolu | |||||||
| 		return nil, status.Errorf(codes.Internal, fmt.Sprintf("mount failed: %v", err.Error())) | 		return nil, status.Errorf(codes.Internal, fmt.Sprintf("mount failed: %v", err.Error())) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	defer func() { |  | ||||||
| 		if err = umount(c.mounter, targetPath); err != nil { |  | ||||||
| 			klog.Warningf("failed to unmount src webdav server after snapshot volume copy: %v", err) |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
| 
 |  | ||||||
| 	internalVolumePath := filepath.Join(targetPath, subDir) | 	internalVolumePath := filepath.Join(targetPath, subDir) | ||||||
| 	klog.V(2).Infof("Removing subdirectory at %v", internalVolumePath) | 	klog.V(2).Infof("Removing subdirectory at %v", internalVolumePath) | ||||||
| 	if err = os.RemoveAll(internalVolumePath); err != nil { | 	if err = os.RemoveAll(internalVolumePath); err != nil { | ||||||
| 		return nil, status.Errorf(codes.Internal, "failed to delete subdirectory: %v", err.Error()) | 		return nil, status.Errorf(codes.Internal, "failed to delete subdirectory: %v", err.Error()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if err = c.mounter.Unmount(targetPath); err != nil { | ||||||
|  | 		return nil, status.Errorf(codes.Internal, "failed to unmount targetpath %s %v", targetPath, err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return &csi.DeleteVolumeResponse{}, nil | 	return &csi.DeleteVolumeResponse{}, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,8 +17,6 @@ limitations under the License. | |||||||
| package webdav | package webdav | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"runtime" |  | ||||||
| 
 |  | ||||||
| 	"github.com/container-storage-interface/spec/lib/go/csi" | 	"github.com/container-storage-interface/spec/lib/go/csi" | ||||||
| 	"github.com/sys-liqian/csi-driver-webdav/pkg/webdav/mount" | 	"github.com/sys-liqian/csi-driver-webdav/pkg/webdav/mount" | ||||||
| 
 | 
 | ||||||
| @ -98,10 +96,6 @@ func (d *Driver) Run() { | |||||||
| 	klog.V(2).Infof("\nDRIVER INFORMATION:\n-------------------\n%s\n\nStreaming logs below:", versionMeta) | 	klog.V(2).Infof("\nDRIVER INFORMATION:\n-------------------\n%s\n\nStreaming logs below:", versionMeta) | ||||||
| 
 | 
 | ||||||
| 	mounter := mount.New("") | 	mounter := mount.New("") | ||||||
| 	if runtime.GOOS == "linux" { |  | ||||||
| 		// MounterForceUnmounter is only implemented on Linux now |  | ||||||
| 		mounter = mounter.(mount.MounterForceUnmounter) |  | ||||||
| 	} |  | ||||||
| 	server := NewNonBlockingGRPCServer() | 	server := NewNonBlockingGRPCServer() | ||||||
| 	server.Start(d.endpoint, | 	server.Start(d.endpoint, | ||||||
| 		NewIdentityServer(d), | 		NewIdentityServer(d), | ||||||
|  | |||||||
| @ -113,7 +113,7 @@ func (n *NodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeUnpub | |||||||
| 	} | 	} | ||||||
| 	klog.V(2).Infof("NodeUnpublishVolume: unmounting volume %s on %s", volumeID, targetPath) | 	klog.V(2).Infof("NodeUnpublishVolume: unmounting volume %s on %s", volumeID, targetPath) | ||||||
| 
 | 
 | ||||||
| 	err := umount(n.mounter, targetPath) | 	err := n.mounter.Unmount(targetPath) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, status.Errorf(codes.Internal, "failed to unmount target %q: %v", targetPath, err) | 		return nil, status.Errorf(codes.Internal, "failed to unmount target %q: %v", targetPath, err) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -21,10 +21,8 @@ import ( | |||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" |  | ||||||
| 
 | 
 | ||||||
| 	"github.com/container-storage-interface/spec/lib/go/csi" | 	"github.com/container-storage-interface/spec/lib/go/csi" | ||||||
| 	"github.com/sys-liqian/csi-driver-webdav/pkg/webdav/mount" |  | ||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
| 	"k8s.io/klog/v2" | 	"k8s.io/klog/v2" | ||||||
| ) | ) | ||||||
| @ -93,15 +91,3 @@ func ParseVolumeId(volumeId string) (webdavSharePath, subDir string, err error) | |||||||
| 	} | 	} | ||||||
| 	return arr[0], arr[1], nil | 	return arr[0], arr[1], nil | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func umount(mounter mount.Interface, path string) (err error) { |  | ||||||
| 	extensiveMountPointCheck := true |  | ||||||
| 	forceUnmounter, ok := mounter.(mount.MounterForceUnmounter) |  | ||||||
| 	if ok { |  | ||||||
| 		klog.V(2).Infof("force unmount %s", path) |  | ||||||
| 		err = mount.CleanupMountWithForce(path, forceUnmounter, extensiveMountPointCheck, 30*time.Second) |  | ||||||
| 	} else { |  | ||||||
| 		err = mount.CleanupMountPoint(path, mounter, extensiveMountPointCheck) |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user