def config_path(self):
return os.path.join(self.base_path, b".meta")
+ def mark_meta(self):
+ """
+ Set "ceph.quiesce.block" flag on the .meta file inode. It must remain
+ available while a subvolume is quiesced in order to allow some
+ interactions with the subvolume, snapshots in particular.
+ """
+ try:
+ self.fs.setxattr(self.config_path, 'ceph.quiesce.block', b'1', 0)
+ except cephfs.InvalidValue:
+ raise VolumeException(-errno.EINVAL, "invalid value specified for ceph.quiesce.block")
+ except cephfs.Error as e:
+ raise VolumeException(-e.args[0], e.args[1])
+
@property
def legacy_dir(self):
return (os.path.join(self.vol_spec.base_dir.encode('utf-8'),
qpath = subvol_path.decode('utf-8')
self.init_config(SubvolumeV1.VERSION, subvolume_type, qpath, initial_state)
self.mark_subvolume()
+ self.mark_meta()
except (VolumeException, MetadataMgrException, cephfs.Error) as e:
try:
log.info("cleaning up subvolume with path: {0}".format(self.subvolname))
# create directory and set attributes
self.fs.mkdirs(subvol_path, attrs.get("mode"))
self.mark_subvolume()
+ self.mark_meta()
self.set_attrs(subvol_path, attrs)
# persist subvolume metadata and clone source
st = self.fs.stat(subvol_path)
# unconditionally mark as subvolume, to handle pre-existing subvolumes without the mark
self.mark_subvolume()
+ self.mark_meta()
self.uid = int(st.st_uid)
self.gid = int(st.st_gid)
# Create the subvolume metadata file which manages auth-ids if it doesn't exist
self.auth_mdata_mgr.create_subvolume_metadata_file(self.group.groupname, self.subvolname)
+ self.mark_meta()
except (VolumeException, MetadataMgrException, cephfs.Error) as e:
try:
self._remove_on_failure(subvol_path, retained)
self.metadata_mgr.init(SubvolumeV2.VERSION, subvolume_type.value, qpath, initial_state.value)
self.add_clone_source(source_volname, source_subvolume, snapname)
self.metadata_mgr.flush()
+ self.mark_meta()
except (VolumeException, MetadataMgrException, cephfs.Error) as e:
try:
self._remove_on_failure(subvol_path, retained)
self.metadata_mgr.refresh()
# unconditionally mark as subvolume, to handle pre-existing subvolumes without the mark
self.mark_subvolume()
+ self.mark_meta()
etype = self.subvol_type
if op_type not in self.allowed_ops_by_type(etype):