]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/volumes: handle idempotent subvolume marks
authorVenky Shankar <vshankar@redhat.com>
Tue, 25 Aug 2020 06:57:50 +0000 (02:57 -0400)
committerShyamsundar Ranganathan <srangana@redhat.com>
Thu, 28 Jan 2021 15:17:03 +0000 (10:17 -0500)
Fixes: https://tracker.ceph.com/issues/47154
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit 2f5eed200a0710759001ae1a26c739584f32be88)

src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py
src/pybind/mgr/volumes/fs/operations/versions/subvolume_v2.py

index 3d3ede56266922a0b58ecfb9a3ac27ff70f3695b..a4c72ed26d4b3c182a78be72866863d8b031c6b2 100644 (file)
@@ -57,13 +57,11 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate):
     def mark_subvolume(self):
         # set subvolume attr, on subvolume root, marking it as a CephFS subvolume
         # subvolume root is where snapshots would be taken, and hence is the <uuid> dir for v1 subvolumes
-        xattr_val = 1
         try:
-            self.fs.setxattr(self.path, 'ceph.dir.subvolume', str(xattr_val).encode('utf-8'), os.XATTR_CREATE)
-        except cephfs.ObjectExists:
-            return
+            # MDS treats this as a noop for already marked subvolume
+            self.fs.setxattr(self.path, 'ceph.dir.subvolume', b'1', 0)
         except cephfs.InvalidValue as e:
-            raise VolumeException(-errno.EINVAL, "invalid value specified for ceph.dir.subvolume: '{0}'".format(xattr_val))
+            raise VolumeException(-errno.EINVAL, "invalid value specified for ceph.dir.subvolume")
         except cephfs.Error as e:
             raise VolumeException(-e.args[0], e.args[1])
 
index f8b6780507abf03c0a3ea569e5bffe4f8dd3d55b..7b0f55a91c8042a2eb026160201987965b681013 100644 (file)
@@ -96,13 +96,11 @@ class SubvolumeV2(SubvolumeV1):
     def mark_subvolume(self):
         # set subvolume attr, on subvolume root, marking it as a CephFS subvolume
         # subvolume root is where snapshots would be taken, and hence is the base_path for v2 subvolumes
-        xattr_val = 1
         try:
-            self.fs.setxattr(self.base_path, 'ceph.dir.subvolume', str(xattr_val).encode('utf-8'), os.XATTR_CREATE)
-        except cephfs.ObjectExists:
-            return
+            # MDS treats this as a noop for already marked subvolume
+            self.fs.setxattr(self.base_path, 'ceph.dir.subvolume', b'1', 0)
         except cephfs.InvalidValue as e:
-            raise VolumeException(-errno.EINVAL, "invalid value specified for ceph.dir.subvolume: '{0}'".format(xattr_val))
+            raise VolumeException(-errno.EINVAL, "invalid value specified for ceph.dir.subvolume")
         except cephfs.Error as e:
             raise VolumeException(-e.args[0], e.args[1])