Auto add a cinder lvm.conf file

We have a number of issues where LVM scan commands hang during
test runs.  Looking closer at this with strace it turns out
that what seems to be happening is that we're scanning all of the
devices on the node, this includes the loop devices for swift and
other projects as well as the Cinder devices that are being attached
to the system during the test.

This is particularly messy for example when we issue a VG or LV scan
on a device like /dev/vdb and at the same time issue a detach.  The
result is LVM scan commands hanging waiting for timeout.

This patch adds a function to the cinder_backend/lvm module which
is called as the last part of cinder init.  If Cinder LVM is in use
as per cinder.conf this function will copy the default
/etc/lvm/lvm.conf to /etc/cinder/lvm.conf and use the cinder.conf file
and PVS to create filters so that ONLY the devices actually being used
by Cinder are included in scans.

There are two pieces to this fix; the first is to properly setup an
lvm.conf file with filters.  The second step is to merge the Cinder
change that modifies the Cinder LVM commands to specify the lvm.conf
file usage.

The Cinder part of this fix can be found here:

Change-Id: I962b6e21cbfb6f5612b6c973053d86828ca8071a
Partial-Bug: #1373513
John Griffith 8 years ago
parent 1acfc028a6
commit 0b9e76f280

@ -395,15 +395,32 @@ function init_cinder {
if is_service_enabled c-vol && [[ -n "$CINDER_ENABLED_BACKENDS" ]]; then
local be be_name be_type
local has_lvm=0
for be in ${CINDER_ENABLED_BACKENDS//,/ }; do
if [[ $be_type == 'lvm' ]]; then
if type init_cinder_backend_${be_type} >/dev/null 2>&1; then
init_cinder_backend_${be_type} ${be_name}
# Keep it simple, set a marker if there's an LVM backend
# use the created VG's to setup lvm filters
if [[ $has_lvm == 1 ]]; then
# Order matters here, not only obviously to make
# sure the VG's are created, but also some distros
# do some customizations to lvm.conf on init, we
# want to make sure we copy those over
sudo cp /etc/lvm/lvm.conf /etc/cinder/lvm.conf
mkdir -p $CINDER_STATE_PATH/volumes

@ -19,6 +19,7 @@
# clean_cinder_backend_lvm - called from clean_cinder()
# configure_cinder_backend_lvm - called from configure_cinder()
# init_cinder_backend_lvm - called from init_cinder()
# configure_cinder_backend_conf_lvm - called from configure_cinder()
# Save trace setting
@ -64,6 +65,35 @@ function init_cinder_backend_lvm {
init_lvm_volume_group $VOLUME_GROUP_NAME-$be_name $VOLUME_BACKING_FILE_SIZE
# configure_cinder_backend_conf_lvm - Sets device filter in /etc/cinder/lvm.conf
# init_cinder_backend_lvm
function configure_cinder_backend_conf_lvm {
local filter_suffix='"r/.*/" ]'
local filter_string="filter = [ "
local conf_entries=$(grep volume_group /etc/cinder/cinder.conf | sed "s/ //g")
local pv
local vg
local line
for pv_info in $(sudo pvs --noheadings -o name,vg_name --separator ';'); do
IFS=';' read pv vg <<< $pv_info
for line in ${conf_entries}; do
IFS='=' read label group <<< $line
group=$(echo $group|sed "s/^ *//g")
if [[ "$vg" == "$group" ]]; then
new="\"a$pv/\", "
# FIXME(jdg): Possible odd case that the lvm.conf file has been modified
# and doesn't have a filter entry to search/replace. For devstack don't
# know that we care, but could consider adding a check and add
sudo sed -i "s#^[ \t]*filter.*# $filter_string#g" /etc/cinder/lvm.conf
echo "set LVM filter_strings: $filter_string"
# Restore xtrace