diff --git a/charts/latest/csi-driver-nfs-v0.0.0.tgz b/charts/latest/csi-driver-nfs-v0.0.0.tgz index c1fb0c6c5..0cf947caa 100644 Binary files a/charts/latest/csi-driver-nfs-v0.0.0.tgz and b/charts/latest/csi-driver-nfs-v0.0.0.tgz differ diff --git a/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml b/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml index fe271e7a0..88d74af26 100644 --- a/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml +++ b/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml @@ -181,6 +181,7 @@ spec: - "--mount-permissions={{ .Values.driver.mountPermissions }}" - "--working-mount-dir={{ .Values.controller.workingMountDir }}" - "--default-ondelete-policy={{ .Values.controller.defaultOnDeletePolicy }}" + - "--use-tar-command-in-snapshot={{ .Values.controller.useTarCommandInSnapshot }}" env: - name: NODE_ID valueFrom: diff --git a/charts/latest/csi-driver-nfs/values.yaml b/charts/latest/csi-driver-nfs/values.yaml index 89822cad8..77fdce595 100755 --- a/charts/latest/csi-driver-nfs/values.yaml +++ b/charts/latest/csi-driver-nfs/values.yaml @@ -57,6 +57,7 @@ controller: runOnMaster: false runOnControlPlane: false enableSnapshotter: true + useTarCommandInSnapshot: false livenessProbe: healthPort: 29652 logLevel: 5 diff --git a/cmd/nfsplugin/main.go b/cmd/nfsplugin/main.go index 2bc088bec..a34547ca9 100644 --- a/cmd/nfsplugin/main.go +++ b/cmd/nfsplugin/main.go @@ -34,6 +34,7 @@ var ( defaultOnDeletePolicy = flag.String("default-ondelete-policy", "", "default policy for deleting subdirectory when deleting a volume") volStatsCacheExpireInMinutes = flag.Int("vol-stats-cache-expire-in-minutes", 10, "The cache expire time in minutes for volume stats cache") removeArchivedVolumePath = flag.Bool("remove-archived-volume-path", false, "remove archived volume path in DeleteVolume") + useTarCommandInSnapshot = flag.Bool("use-tar-command-in-snapshot", false, "use tar command to pack and unpack snapshot data") ) func main() { @@ -58,6 +59,7 @@ func handle() { DefaultOnDeletePolicy: *defaultOnDeletePolicy, VolStatsCacheExpireInMinutes: *volStatsCacheExpireInMinutes, RemoveArchivedVolumePath: *removeArchivedVolumePath, + UseTarCommandInSnapshot: *useTarCommandInSnapshot, } d := nfs.NewDriver(&driverOptions) d.Run(false) diff --git a/pkg/nfs/controllerserver.go b/pkg/nfs/controllerserver.go index 50c0ee25f..e403b0d06 100644 --- a/pkg/nfs/controllerserver.go +++ b/pkg/nfs/controllerserver.go @@ -406,9 +406,14 @@ func (cs *ControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateS dstPath := filepath.Join(snapInternalVolPath, snapshot.archiveName()) klog.V(2).Infof("tar %v -> %v", srcPath, dstPath) - err = TarPack(srcPath, dstPath, true) - if err != nil { - return nil, status.Errorf(codes.Internal, "failed to create archive for snapshot: %v", err) + if cs.Driver.useTarCommandInSnapshot { + if out, err := exec.Command("tar", "-C", srcPath, "-czvf", dstPath, ".").CombinedOutput(); err != nil { + return nil, status.Errorf(codes.Internal, "failed to create archive for snapshot: %v: %v", err, string(out)) + } + } else { + if err := TarPack(srcPath, dstPath, true); err != nil { + return nil, status.Errorf(codes.Internal, "failed to create archive for snapshot: %v", err) + } } klog.V(2).Infof("tar %s -> %s complete", srcPath, dstPath) @@ -573,9 +578,14 @@ func (cs *ControllerServer) copyFromSnapshot(ctx context.Context, req *csi.Creat dstPath := getInternalVolumePath(cs.Driver.workingMountDir, dstVol) klog.V(2).Infof("copy volume from snapshot %v -> %v", snapPath, dstPath) - err = TarUnpack(snapPath, dstPath, true) - if err != nil { - return status.Errorf(codes.Internal, "failed to copy volume for snapshot: %v", err) + if cs.Driver.useTarCommandInSnapshot { + if out, err := exec.Command("tar", "-xzvf", snapPath, "-C", dstPath).CombinedOutput(); err != nil { + return status.Errorf(codes.Internal, "failed to copy volume for snapshot: %v: %v", err, string(out)) + } + } else { + if err := TarUnpack(snapPath, dstPath, true); err != nil { + return status.Errorf(codes.Internal, "failed to copy volume for snapshot: %v", err) + } } klog.V(2).Infof("volume copied from snapshot %v -> %v", snapPath, dstPath) return nil diff --git a/pkg/nfs/nfs.go b/pkg/nfs/nfs.go index 5d36e5ecc..03bf04458 100644 --- a/pkg/nfs/nfs.go +++ b/pkg/nfs/nfs.go @@ -38,6 +38,7 @@ type DriverOptions struct { DefaultOnDeletePolicy string VolStatsCacheExpireInMinutes int RemoveArchivedVolumePath bool + UseTarCommandInSnapshot bool } type Driver struct { @@ -49,6 +50,7 @@ type Driver struct { workingMountDir string defaultOnDeletePolicy string removeArchivedVolumePath bool + useTarCommandInSnapshot bool //ids *identityServer ns *NodeServer @@ -96,6 +98,7 @@ func NewDriver(options *DriverOptions) *Driver { workingMountDir: options.WorkingMountDir, volStatsCacheExpireInMinutes: options.VolStatsCacheExpireInMinutes, removeArchivedVolumePath: options.RemoveArchivedVolumePath, + useTarCommandInSnapshot: options.UseTarCommandInSnapshot, } n.AddControllerServiceCapabilities([]csi.ControllerServiceCapability_RPC_Type{