From c86f2be2e217e82c80e7ff68904e90ec6c5cba7f Mon Sep 17 00:00:00 2001 From: Duncan Thomas Date: Tue, 13 Jan 2015 18:41:13 +0200 Subject: [PATCH] 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 --- cinder/brick/local_dev/lvm.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cinder/brick/local_dev/lvm.py b/cinder/brick/local_dev/lvm.py index 9d2cdf7ff..9fe2f4de9 100644 --- a/cinder/brick/local_dev/lvm.py +++ b/cinder/brick/local_dev/lvm.py @@ -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}) -- 2.45.2