Init default lvm volume group only if required
A recent patch [1] added support for lvm ephemeral storage for nova,
but at the cost of initializing a default lvm volume group even if it
was not required. This change ensures that init of the default volume
group is only performed when nova and/or cinder are configured to use
lvm.
1: https://review.openstack.org/#/c/132333
Change-Id: I7634ca0ed0ffe1b13464e4d66744918f85149f2e
Closes-Bug: #1414820
diff --git a/lib/cinder b/lib/cinder
index 6eee880..03e2e28 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -399,6 +399,10 @@
be_type=${be%%:*}
be_name=${be##*:}
if type init_cinder_backend_${be_type} >/dev/null 2>&1; then
+ # Always init the default volume group for lvm.
+ if [[ "$be_type" == "lvm" ]]; then
+ init_default_lvm_volume_group
+ fi
init_cinder_backend_${be_type} ${be_name}
fi
done
diff --git a/lib/lvm b/lib/lvm
index 4ef260d..ed24487 100644
--- a/lib/lvm
+++ b/lib/lvm
@@ -117,6 +117,25 @@
_clean_lvm_volume_group $vg
}
+# Sentinal value to ensure that init of default lvm volume group is
+# only performed once across calls of init_default_lvm_volume_group.
+_DEFAULT_LVM_INIT=${_DEFAULT_LVM_INIT:-0}
+
+# init_default_lvm_volume_group() initializes a default volume group
+# intended to be shared between cinder and nova. It is idempotent;
+# the init of the default volume group is guaranteed to be performed
+# only once so that either or both of the dependent services can
+# safely call this function.
+#
+# Usage: init_default_lvm_volume_group()
+function init_default_lvm_volume_group {
+ if [[ "$_DEFAULT_LVM_INIT" = "0" ]]; then
+ init_lvm_volume_group $DEFAULT_VOLUME_GROUP_NAME $VOLUME_BACKING_FILE_SIZE
+ _DEFAULT_LVM_INIT=1
+ fi
+}
+
+
# Restore xtrace
$MY_XTRACE
diff --git a/lib/nova b/lib/nova
index 76212ed..a4b1bb1 100644
--- a/lib/nova
+++ b/lib/nova
@@ -640,6 +640,10 @@
create_nova_cache_dir
create_nova_keys_dir
+
+ if [[ "$NOVA_BACKEND" == "LVM" ]]; then
+ init_default_lvm_volume_group
+ fi
}
# install_novaclient() - Collect source and prepare