diff --git a/changelogs/172-pawanpraka1 b/changelogs/172-pawanpraka1 new file mode 100644 index 0000000..81e2f63 --- /dev/null +++ b/changelogs/172-pawanpraka1 @@ -0,0 +1 @@ +fixing duplicate UUID issue with btrfs diff --git a/pkg/zfs/btrfs_util.go b/pkg/zfs/btrfs_util.go new file mode 100644 index 0000000..f83901c --- /dev/null +++ b/pkg/zfs/btrfs_util.go @@ -0,0 +1,42 @@ +/* +Copyright 2020 The OpenEBS Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package zfs + +import ( + "k8s.io/klog" + "os/exec" +) + +/* +* We have to generate a new UUID for the cloned volumes with btrfs filesystem +* otherwise system will mount the same volume if UUID is same. Here, since cloned +* volume refers to the same block because of the way ZFS clone works, it will +* also have the same UUID. + */ +func btrfsGenerateUuid(volume string) error { + device := ZFS_DEVPATH + volume + + // for mounting the cloned volume for btrfs, a new UUID has to be generated + cmd := exec.Command("btrfstune", "-f", "-u", device) + out, err := cmd.CombinedOutput() + if err != nil { + klog.Errorf("btrfs: uuid generate failed %s error: %s", volume, string(out)) + return err + } + klog.Infof("btrfs: generated UUID for the cloned volume %s \n %v", volume, string(out)) + return nil +} diff --git a/pkg/zfs/mount.go b/pkg/zfs/mount.go index 0e87ba2..11082dc 100644 --- a/pkg/zfs/mount.go +++ b/pkg/zfs/mount.go @@ -139,6 +139,9 @@ func verifyMountRequest(vol *apis.ZFSVolume, mountpath string) error { vol.Spec.OwnerNodeID != NodeID { return status.Error(codes.Internal, "verifyMount: volume is owned by different node") } + if vol.Finalizers == nil { + return status.Error(codes.Internal, "verifyMount: volume is not ready, driver has not yet set the finalizer") + } devicePath, err := GetVolumeDevPath(vol) if err != nil { diff --git a/pkg/zfs/zfs_util.go b/pkg/zfs/zfs_util.go index b84ea42..4a6ff2e 100644 --- a/pkg/zfs/zfs_util.go +++ b/pkg/zfs/zfs_util.go @@ -367,6 +367,9 @@ func CreateClone(vol *apis.ZFSVolume) error { if vol.Spec.FsType == "xfs" { return xfsGenerateUuid(volume) } + if vol.Spec.FsType == "btrfs" { + return btrfsGenerateUuid(volume) + } return nil }