growvols: reserve space for spare metadata volume
Currently space is reserved for the metadata volume, but there is also a spare metadata volume which is used for metadata check and restore. This change reserves space for the spare. It also changes the volume reference in the lvextend call to vg/lv_thinpool, the path based reference results in the spare not growing. Resolves: rhbz#2232632 Change-Id: If78743bb37f24756c049939645db202261df6775
This commit is contained in:
parent
deb1869c6e
commit
420fb14e8f
@ -475,7 +475,7 @@ def find_thin_pool(devices, group):
|
|||||||
break
|
break
|
||||||
|
|
||||||
if not thin_pool_device:
|
if not thin_pool_device:
|
||||||
return
|
return None, None
|
||||||
|
|
||||||
# ensure every volume uses the pool
|
# ensure every volume uses the pool
|
||||||
for d in lvs_devices:
|
for d in lvs_devices:
|
||||||
@ -490,7 +490,7 @@ def find_thin_pool(devices, group):
|
|||||||
raise Exception('All volumes need to be in pool %s. '
|
raise Exception('All volumes need to be in pool %s. '
|
||||||
'%s is in pool %s' %
|
'%s is in pool %s' %
|
||||||
(thin_pool_name, lv_name, pool_lv))
|
(thin_pool_name, lv_name, pool_lv))
|
||||||
return thin_pool_device
|
return thin_pool_device, thin_pool_name
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
@ -522,13 +522,16 @@ def main(argv):
|
|||||||
group = find_group(opts)
|
group = find_group(opts)
|
||||||
partnum = find_next_partnum(devices, disk_name)
|
partnum = find_next_partnum(devices, disk_name)
|
||||||
devname = find_next_device_name(devices, disk_name, partnum)
|
devname = find_next_device_name(devices, disk_name, partnum)
|
||||||
thin_pool = find_thin_pool(devices, group)
|
thin_pool, thin_pool_name = find_thin_pool(devices, group)
|
||||||
if thin_pool:
|
if thin_pool:
|
||||||
# total size available, reduced by POOL_METADATA_SIZE
|
# reserve for the size of the metadata volume
|
||||||
# rounded down to whole extent and reduced by 1 extent
|
|
||||||
# for metadata overhead
|
|
||||||
size_bytes -= POOL_METADATA_SIZE
|
size_bytes -= POOL_METADATA_SIZE
|
||||||
|
# reserve for the size of the spare metadata volume,
|
||||||
|
# used for metadata check and repair
|
||||||
|
size_bytes -= POOL_METADATA_SIZE
|
||||||
|
# round down to a whole extent
|
||||||
size_bytes -= size_bytes % PHYSICAL_EXTENT_BYTES
|
size_bytes -= size_bytes % PHYSICAL_EXTENT_BYTES
|
||||||
|
# reduce for metadata overhead
|
||||||
size_bytes -= PHYSICAL_EXTENT_BYTES
|
size_bytes -= PHYSICAL_EXTENT_BYTES
|
||||||
dev_path = '/dev/%s' % devname
|
dev_path = '/dev/%s' % devname
|
||||||
grow_vols = find_grow_vols(opts, devices, group, size_bytes)
|
grow_vols = find_grow_vols(opts, devices, group, size_bytes)
|
||||||
@ -562,8 +565,7 @@ def main(argv):
|
|||||||
'lvextend',
|
'lvextend',
|
||||||
'--poolmetadatasize',
|
'--poolmetadatasize',
|
||||||
'+%sB' % POOL_METADATA_SIZE,
|
'+%sB' % POOL_METADATA_SIZE,
|
||||||
thin_pool,
|
'%s/%s' % (group, thin_pool_name)
|
||||||
dev_path
|
|
||||||
], 'Add %s to thin pool metadata %s' % (
|
], 'Add %s to thin pool metadata %s' % (
|
||||||
convert_bytes(POOL_METADATA_SIZE), thin_pool)))
|
convert_bytes(POOL_METADATA_SIZE), thin_pool)))
|
||||||
commands.append(Command([
|
commands.append(Command([
|
||||||
|
@ -433,14 +433,14 @@ class TestGrowvols(base.BaseTestCase):
|
|||||||
def test_find_thin_pool(self, mock_execute):
|
def test_find_thin_pool(self, mock_execute):
|
||||||
# No thin pool
|
# No thin pool
|
||||||
mock_execute.return_value = LVS
|
mock_execute.return_value = LVS
|
||||||
self.assertIsNone(growvols.find_thin_pool(DEVICES, 'vg'))
|
self.assertEqual((None, None), growvols.find_thin_pool(DEVICES, 'vg'))
|
||||||
mock_execute.assert_called_once_with([
|
mock_execute.assert_called_once_with([
|
||||||
'lvs', '--noheadings', '--options',
|
'lvs', '--noheadings', '--options',
|
||||||
'lv_name,lv_dm_path,lv_attr,pool_lv'])
|
'lv_name,lv_dm_path,lv_attr,pool_lv'])
|
||||||
|
|
||||||
# One thin pool, all volumes use it
|
# One thin pool, all volumes use it
|
||||||
mock_execute.return_value = LVS_THIN
|
mock_execute.return_value = LVS_THIN
|
||||||
self.assertEqual('/dev/mapper/vg-lv_thinpool',
|
self.assertEqual(('/dev/mapper/vg-lv_thinpool', 'lv_thinpool'),
|
||||||
growvols.find_thin_pool(DEVICES, 'vg'))
|
growvols.find_thin_pool(DEVICES, 'vg'))
|
||||||
|
|
||||||
# One pool, not used by all volumes
|
# One pool, not used by all volumes
|
||||||
@ -621,14 +621,14 @@ class TestGrowvols(base.BaseTestCase):
|
|||||||
mock.call(['pvcreate', '/dev/sda5']),
|
mock.call(['pvcreate', '/dev/sda5']),
|
||||||
mock.call(['vgextend', 'vg', '/dev/sda5']),
|
mock.call(['vgextend', 'vg', '/dev/sda5']),
|
||||||
mock.call(['lvextend', '--poolmetadatasize', '+1073741824B',
|
mock.call(['lvextend', '--poolmetadatasize', '+1073741824B',
|
||||||
|
'vg/lv_thinpool']),
|
||||||
|
mock.call(['lvextend', '-L+207253143552B',
|
||||||
'/dev/mapper/vg-lv_thinpool', '/dev/sda5']),
|
'/dev/mapper/vg-lv_thinpool', '/dev/sda5']),
|
||||||
mock.call(['lvextend', '-L+208326885376B',
|
mock.call(['lvextend', '--size', '+41448112128B',
|
||||||
'/dev/mapper/vg-lv_thinpool', '/dev/sda5']),
|
|
||||||
mock.call(['lvextend', '--size', '+41662021632B',
|
|
||||||
'/dev/mapper/vg-lv_home']),
|
'/dev/mapper/vg-lv_home']),
|
||||||
mock.call(['lvextend', '--size', '+83328237568B',
|
mock.call(['lvextend', '--size', '+82900418560B',
|
||||||
'/dev/mapper/vg-lv_var']),
|
'/dev/mapper/vg-lv_var']),
|
||||||
mock.call(['lvextend', '--size', '+83336626176B',
|
mock.call(['lvextend', '--size', '+82904612864B',
|
||||||
'/dev/mapper/vg-lv_root']),
|
'/dev/mapper/vg-lv_root']),
|
||||||
mock.call(['xfs_growfs', '/dev/mapper/vg-lv_home']),
|
mock.call(['xfs_growfs', '/dev/mapper/vg-lv_home']),
|
||||||
mock.call(['xfs_growfs', '/dev/mapper/vg-lv_var']),
|
mock.call(['xfs_growfs', '/dev/mapper/vg-lv_var']),
|
||||||
|
Loading…
Reference in New Issue
Block a user