[LVM] Run filesystem check before assigning UUID
We assign a random UUID with tune2fs to snapshots and shares created from snapshots so that they don't conflict with the parent shares/snapshots when both of them are being mounted. tune2fs requires that a filesystem check be performed "recently" before UUID assignments. So, perform a filesystem check right away to allow tune2fs to assign a random UUID. Change-Id: I858a318f7a83e033cc3f2699859e38b6b74c8d24 Related-Bug: #1645751 Closes-Bug: #1798219
This commit is contained in:
parent
33d9101131
commit
817cce347a
@ -174,7 +174,9 @@ docker: CommandFilter, docker, root
|
|||||||
# manila/share/drivers/container/container.py: brctl <whatever>
|
# manila/share/drivers/container/container.py: brctl <whatever>
|
||||||
brctl: CommandFilter, brctl, root
|
brctl: CommandFilter, brctl, root
|
||||||
|
|
||||||
# manila/share/drivers/container/container.py: e2fsck <whatever>
|
# manila/share/drivers/container/storage_helper.py: e2fsck <whatever>
|
||||||
|
# manila/share/drivers/generic.py: e2fsck <whatever>
|
||||||
|
# manila/share/drivers/lvm.py: e2fsck <whatever>
|
||||||
e2fsck: CommandFilter, e2fsck, root
|
e2fsck: CommandFilter, e2fsck, root
|
||||||
|
|
||||||
# manila/share/drivers/lvm.py: lvconvert --merge %s
|
# manila/share/drivers/lvm.py: lvconvert --merge %s
|
||||||
|
@ -355,6 +355,9 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver):
|
|||||||
# 'tune2fs' command can be executed only when device
|
# 'tune2fs' command can be executed only when device
|
||||||
# is not mounted and also, in current case, it takes
|
# is not mounted and also, in current case, it takes
|
||||||
# effect only after it was mounted. Closes #1645751
|
# effect only after it was mounted. Closes #1645751
|
||||||
|
# NOTE(gouthamr): Executing tune2fs -U only works on
|
||||||
|
# a recently checked filesystem. See debian bug 857336
|
||||||
|
'&&', 'sudo', 'e2fsck', '-y', '-f', device_path,
|
||||||
'&&', 'sudo', 'tune2fs', '-U', 'random', device_path,
|
'&&', 'sudo', 'tune2fs', '-U', 'random', device_path,
|
||||||
'&&', 'sudo', 'mount', device_path, mount_path,
|
'&&', 'sudo', 'mount', device_path, mount_path,
|
||||||
)
|
)
|
||||||
|
@ -131,9 +131,21 @@ class LVMMixin(driver.ExecuteMixin):
|
|||||||
'lvcreate', '-L', '%sG' % snapshot['share']['size'],
|
'lvcreate', '-L', '%sG' % snapshot['share']['size'],
|
||||||
'--name', snapshot['name'],
|
'--name', snapshot['name'],
|
||||||
'--snapshot', orig_lv_name, run_as_root=True)
|
'--snapshot', orig_lv_name, run_as_root=True)
|
||||||
snapshot_device_name = self._get_local_path(snapshot)
|
|
||||||
|
self._set_random_uuid_to_device(snapshot)
|
||||||
|
|
||||||
|
def _set_random_uuid_to_device(self, share_or_snapshot):
|
||||||
|
# NOTE(vponomaryov): 'tune2fs' is required to make
|
||||||
|
# filesystem of share created from snapshot have
|
||||||
|
# unique ID, in case of LVM volumes, by default,
|
||||||
|
# it will have the same UUID as source volume. Closes #1645751
|
||||||
|
# NOTE(gouthamr): Executing tune2fs -U only works on
|
||||||
|
# a recently checked filesystem.
|
||||||
|
# See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=857336
|
||||||
|
device_path = self._get_local_path(share_or_snapshot)
|
||||||
|
self._execute('e2fsck', '-y', '-f', device_path, run_as_root=True)
|
||||||
self._execute(
|
self._execute(
|
||||||
'tune2fs', '-U', 'random', snapshot_device_name, run_as_root=True,
|
'tune2fs', '-U', 'random', device_path, run_as_root=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def create_snapshot(self, context, snapshot, share_server=None):
|
def create_snapshot(self, context, snapshot, share_server=None):
|
||||||
@ -248,9 +260,7 @@ class LVMShareDriver(LVMMixin, driver.ShareDriver):
|
|||||||
self._allocate_container(share)
|
self._allocate_container(share)
|
||||||
snapshot_device_name = self._get_local_path(snapshot)
|
snapshot_device_name = self._get_local_path(snapshot)
|
||||||
share_device_name = self._get_local_path(share)
|
share_device_name = self._get_local_path(share)
|
||||||
self._execute(
|
self._set_random_uuid_to_device(share)
|
||||||
'tune2fs', '-U', 'random', share_device_name, run_as_root=True,
|
|
||||||
)
|
|
||||||
self._copy_volume(
|
self._copy_volume(
|
||||||
snapshot_device_name, share_device_name, share['size'])
|
snapshot_device_name, share_device_name, share['size'])
|
||||||
location = self._get_helper(share).create_exports(
|
location = self._get_helper(share).create_exports(
|
||||||
|
@ -323,6 +323,7 @@ class GenericShareDriverTestCase(test.TestCase):
|
|||||||
'&&', 'sudo', 'mount', volume['mountpoint'], mount_path,
|
'&&', 'sudo', 'mount', volume['mountpoint'], mount_path,
|
||||||
'&&', 'sudo', 'chmod', '777', mount_path,
|
'&&', 'sudo', 'chmod', '777', mount_path,
|
||||||
'&&', 'sudo', 'umount', mount_path,
|
'&&', 'sudo', 'umount', mount_path,
|
||||||
|
'&&', 'sudo', 'e2fsck', '-y', '-f', volume['mountpoint'],
|
||||||
'&&', 'sudo', 'tune2fs', '-U', 'random', volume['mountpoint'],
|
'&&', 'sudo', 'tune2fs', '-U', 'random', volume['mountpoint'],
|
||||||
'&&', 'sudo', 'mount', volume['mountpoint'], mount_path,
|
'&&', 'sudo', 'mount', volume['mountpoint'], mount_path,
|
||||||
),
|
),
|
||||||
|
@ -228,6 +228,7 @@ class LVMShareDriverTestCase(test.TestCase):
|
|||||||
expected_exec = [
|
expected_exec = [
|
||||||
'lvcreate -L 1G -n fakename fakevg',
|
'lvcreate -L 1G -n fakename fakevg',
|
||||||
'mkfs.ext4 /dev/mapper/fakevg-fakename',
|
'mkfs.ext4 /dev/mapper/fakevg-fakename',
|
||||||
|
'e2fsck -y -f %s' % mount_share,
|
||||||
'tune2fs -U random %s' % mount_share,
|
'tune2fs -U random %s' % mount_share,
|
||||||
("dd count=0 if=%s of=%s iflag=direct oflag=direct" %
|
("dd count=0 if=%s of=%s iflag=direct oflag=direct" %
|
||||||
(mount_snapshot, mount_share)),
|
(mount_snapshot, mount_share)),
|
||||||
@ -333,6 +334,7 @@ class LVMShareDriverTestCase(test.TestCase):
|
|||||||
expected_exec = [
|
expected_exec = [
|
||||||
("lvcreate -L 1G --name fakesnapshotname --snapshot "
|
("lvcreate -L 1G --name fakesnapshotname --snapshot "
|
||||||
"%s/fakename" % (CONF.lvm_share_volume_group,)),
|
"%s/fakename" % (CONF.lvm_share_volume_group,)),
|
||||||
|
"e2fsck -y -f /dev/mapper/fakevg-%s" % self.snapshot['name'],
|
||||||
"tune2fs -U random /dev/mapper/fakevg-%s" % self.snapshot['name'],
|
"tune2fs -U random /dev/mapper/fakevg-%s" % self.snapshot['name'],
|
||||||
"mkdir -p " + mount_path,
|
"mkdir -p " + mount_path,
|
||||||
"mount /dev/mapper/fakevg-fakesnapshotname " + mount_path,
|
"mount /dev/mapper/fakevg-fakesnapshotname " + mount_path,
|
||||||
@ -579,7 +581,9 @@ class LVMShareDriverTestCase(test.TestCase):
|
|||||||
("lvconvert --merge %s" % snap_lv),
|
("lvconvert --merge %s" % snap_lv),
|
||||||
("lvcreate -L 1G --name fakesnapshotname --snapshot %s" %
|
("lvcreate -L 1G --name fakesnapshotname --snapshot %s" %
|
||||||
share_lv),
|
share_lv),
|
||||||
('tune2fs -U random /dev/mapper/%s-fakesnapshotname' %
|
("e2fsck -y -f /dev/mapper/%s-fakesnapshotname" %
|
||||||
|
CONF.lvm_share_volume_group),
|
||||||
|
("tune2fs -U random /dev/mapper/%s-fakesnapshotname" %
|
||||||
CONF.lvm_share_volume_group),
|
CONF.lvm_share_volume_group),
|
||||||
("mkdir -p %s" % share_mount_path),
|
("mkdir -p %s" % share_mount_path),
|
||||||
("mount /dev/mapper/%s-fakename %s" %
|
("mount /dev/mapper/%s-fakename %s" %
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
The generic and LVM drivers have been fixed to always perform a filesystem
|
||||||
|
check on newly created snapshots and derivative shares before attempting
|
||||||
|
to assign a UUID to them. See
|
||||||
|
`Launchpad bug 1798219 <https://bugs.launchpad.net/manila/+bug/1798219>`_
|
||||||
|
for more details.
|
Loading…
Reference in New Issue
Block a user