Fix LVM thin pool creation race

In the event that two copied of the LVM driver get init called at
the same time (e.g. cinder-volume and cinder-backup getting
started in parallel, on the same host), it is possible for the
thin pool check/create to race. Add a simple recheck if the create
fails, to cover this window.

Change-Id: I006970736ba0e62df383bacc79b5754dea2e9a3e
Closes-Bug: #1410341
This commit is contained in:
Duncan Thomas
2015-01-13 18:41:13 +02:00
committed by Duncan Thomas
parent fadc833474
commit c86f2be2e2

View File

@@ -89,10 +89,16 @@ class LVM(executor.Executor):
if lvm_type == 'thin':
pool_name = "%s-pool" % self.vg_name
if self.get_volume(pool_name) is None:
self.create_thin_pool(pool_name)
else:
self.vg_thin_pool = pool_name
try:
self.create_thin_pool(pool_name)
except putils.ProcessExecutionError:
# Maybe we just lost the race against another copy of
# this driver being in init in parallel - e.g.
# cinder-volume and cinder-backup starting in parallel
if self.get_volume(pool_name) is None:
raise
self.vg_thin_pool = pool_name
self.activate_lv(self.vg_thin_pool)
self.pv_list = self.get_all_physical_volumes(root_helper, vg_name)
@@ -460,7 +466,7 @@ class LVM(executor.Executor):
size_str = self._calculate_thin_pool_size()
cmd = ['lvcreate', '-T', '-L', size_str, vg_pool_name]
LOG.debug('Created thin pool \'%(pool)s\' with size %(size)s of '
LOG.debug('Creating thin pool \'%(pool)s\' with size %(size)s of '
'total %(free)sg' % {'pool': vg_pool_name,
'size': size_str,
'free': self.vg_free_space})