Do dmsetup remove device in rollback
Without this change, the final unmount will timeout after the rollbacks are called when the partitioning fails due to a user error. dmsetup remove is called both for partition and LVM volume devices. Change-Id: I99679ea00338d4018a95d4da9b21685161cd5049
This commit is contained in:
parent
6b42cb23ee
commit
1a4fb0b89b
@ -20,6 +20,7 @@ from diskimage_builder.block_device.plugin import NodeBase
|
|||||||
from diskimage_builder.block_device.plugin import PluginBase
|
from diskimage_builder.block_device.plugin import PluginBase
|
||||||
from diskimage_builder.block_device.utils import exec_sudo
|
from diskimage_builder.block_device.utils import exec_sudo
|
||||||
from diskimage_builder.block_device.utils import parse_abs_size_spec
|
from diskimage_builder.block_device.utils import parse_abs_size_spec
|
||||||
|
from diskimage_builder.block_device.utils import remove_device
|
||||||
|
|
||||||
PHYSICAL_EXTENT_BYTES = parse_abs_size_spec('4MiB')
|
PHYSICAL_EXTENT_BYTES = parse_abs_size_spec('4MiB')
|
||||||
|
|
||||||
@ -211,13 +212,15 @@ class LvsNode(NodeBase):
|
|||||||
exec_sudo(cmd)
|
exec_sudo(cmd)
|
||||||
|
|
||||||
# save state
|
# save state
|
||||||
|
device_name = '%s-%s' % (self.base, self.name)
|
||||||
self.state['blockdev'][self.name] = {
|
self.state['blockdev'][self.name] = {
|
||||||
'vgs': self.base,
|
'vgs': self.base,
|
||||||
'size': self.size,
|
'size': self.size,
|
||||||
'extents': self.extents,
|
'extents': self.extents,
|
||||||
'opts': self.options,
|
'opts': self.options,
|
||||||
'device': '/dev/mapper/%s-%s' % (self.base, self.name)
|
'device': '/dev/mapper/%s' % device_name
|
||||||
}
|
}
|
||||||
|
self.add_rollback(remove_device, device_name)
|
||||||
|
|
||||||
def _umount(self):
|
def _umount(self):
|
||||||
exec_sudo(['lvchange', '-an',
|
exec_sudo(['lvchange', '-an',
|
||||||
|
@ -23,6 +23,7 @@ from diskimage_builder.block_device.plugin import PluginBase
|
|||||||
from diskimage_builder.block_device.utils import exec_sudo
|
from diskimage_builder.block_device.utils import exec_sudo
|
||||||
from diskimage_builder.block_device.utils import parse_abs_size_spec
|
from diskimage_builder.block_device.utils import parse_abs_size_spec
|
||||||
from diskimage_builder.block_device.utils import parse_rel_size_spec
|
from diskimage_builder.block_device.utils import parse_rel_size_spec
|
||||||
|
from diskimage_builder.block_device.utils import remove_device
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -117,10 +118,11 @@ class Partitioning(PluginBase):
|
|||||||
# below once we're done. So the device this partition
|
# below once we're done. So the device this partition
|
||||||
# will be seen at becomes "/dev/mapper/loop0pX"
|
# will be seen at becomes "/dev/mapper/loop0pX"
|
||||||
assert self.device_path[:5] == "/dev/"
|
assert self.device_path[:5] == "/dev/"
|
||||||
partition_device_name = "/dev/mapper/%sp%d" % \
|
device_name = "%sp%d" % (self.device_path[5:], part_no)
|
||||||
(self.device_path[5:], part_no)
|
device_path = "/dev/mapper/%s" % device_name
|
||||||
self.state['blockdev'][part_name] \
|
self.state['blockdev'][part_name] \
|
||||||
= {'device': partition_device_name}
|
= {'device': device_path}
|
||||||
|
part_cfg.add_rollback(remove_device, device_name)
|
||||||
|
|
||||||
def _create_gpt(self):
|
def _create_gpt(self):
|
||||||
"""Create partitions with GPT"""
|
"""Create partitions with GPT"""
|
||||||
@ -158,14 +160,16 @@ class Partitioning(PluginBase):
|
|||||||
# below once we're done. So the device this partition
|
# below once we're done. So the device this partition
|
||||||
# will be seen at becomes "/dev/mapper/loop0pX"
|
# will be seen at becomes "/dev/mapper/loop0pX"
|
||||||
assert self.device_path[:5] == "/dev/"
|
assert self.device_path[:5] == "/dev/"
|
||||||
device_name = "/dev/mapper/%sp%d" % (self.device_path[5:], pnum)
|
device_name = "%sp%d" % (self.device_path[5:], pnum)
|
||||||
|
device_path = "/dev/mapper/%s" % device_name
|
||||||
self.state['blockdev'][p.get_name()] \
|
self.state['blockdev'][p.get_name()] \
|
||||||
= {'device': device_name}
|
= {'device': device_path}
|
||||||
|
|
||||||
disk_free = disk_free - size
|
disk_free = disk_free - size
|
||||||
pnum = pnum + 1
|
pnum = pnum + 1
|
||||||
logger.debug("Partition %s added, %s remaining in disk",
|
logger.debug("Partition %s added, %s remaining in disk",
|
||||||
pnum, disk_free)
|
pnum, disk_free)
|
||||||
|
p.add_rollback(remove_device, device_name)
|
||||||
|
|
||||||
logger.debug("cmd: %s", ' '.join(cmd))
|
logger.debug("cmd: %s", ' '.join(cmd))
|
||||||
exec_sudo(cmd)
|
exec_sudo(cmd)
|
||||||
|
@ -143,3 +143,20 @@ def exec_sudo(cmd):
|
|||||||
raise e
|
raise e
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def remove_device(device_name):
|
||||||
|
"""Attempt to remove a device-mapper device
|
||||||
|
|
||||||
|
Convenience rollback function to attempt to delete a device,
|
||||||
|
logging a warning if the delete fails.
|
||||||
|
|
||||||
|
:param device_name: Name of device to run dmsetup remove on
|
||||||
|
"""
|
||||||
|
logger.debug('Removing device %s', device_name)
|
||||||
|
try:
|
||||||
|
exec_sudo(["dmsetup", "remove", device_name])
|
||||||
|
except BlockDeviceSetupException as e:
|
||||||
|
# Do not raise an error - maybe other cleanup methods
|
||||||
|
# can at least do some more work.
|
||||||
|
logger.warning("Removing device failed (%s)", e.returncode)
|
||||||
|
Loading…
Reference in New Issue
Block a user