ef53db76d0
As far as I could tell, the global_filter config added in change I5d5c48e188cbb9b4208096736807f082bce524e8 wasn't actually making it into the lvm.conf. Given the volume (or rather LVM volume) related issues we've been seeing in the gate recently, we can give this a try to see if the global_filter setting has any positive effect. This also adds the contents of /etc/lvm/* to the logs collected by the jobs, so that we can see the LVM config. Change-Id: I2b39acd352669231d16b5cb2e151f290648355c0
212 lines
6.2 KiB
Bash
212 lines
6.2 KiB
Bash
#!/bin/bash
|
|
#
|
|
# lib/lvm
|
|
# Configure the default LVM volume group used by Cinder and Nova
|
|
|
|
# Dependencies:
|
|
#
|
|
# - ``functions`` file
|
|
# - ``cinder`` configurations
|
|
|
|
# DATA_DIR
|
|
|
|
# clean_default_volume_group - called from clean()
|
|
# configure_default_volume_group - called from configure()
|
|
# init_default_volume_group - called from init()
|
|
|
|
|
|
# Save trace setting
|
|
_XTRACE_LVM=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
|
|
|
|
# Defaults
|
|
# --------
|
|
# Name of the lvm volume groups to use/create for iscsi volumes
|
|
VOLUME_GROUP_NAME=${VOLUME_GROUP_NAME:-stack-volumes}
|
|
DEFAULT_VOLUME_GROUP_NAME=$VOLUME_GROUP_NAME-default
|
|
|
|
# Backing file name is of the form $VOLUME_GROUP$BACKING_FILE_SUFFIX
|
|
BACKING_FILE_SUFFIX=-backing-file
|
|
|
|
|
|
# Functions
|
|
# ---------
|
|
|
|
# _clean_lvm_volume_group removes all default LVM volumes
|
|
#
|
|
# Usage: _clean_lvm_volume_group $vg
|
|
function _clean_lvm_volume_group {
|
|
local vg=$1
|
|
|
|
# Clean out existing volumes
|
|
sudo lvremove -f $vg
|
|
}
|
|
|
|
# _remove_lvm_volume_group removes the volume group
|
|
#
|
|
# Usage: _remove_lvm_volume_group $vg
|
|
function _remove_lvm_volume_group {
|
|
local vg=$1
|
|
|
|
# Remove the volume group
|
|
sudo vgremove -f $vg
|
|
}
|
|
|
|
# clean_lvm_volume_group() cleans up the volume group and removes the
|
|
# backing file
|
|
#
|
|
# Usage: clean_lvm_volume_group() $vg
|
|
function clean_lvm_volume_group {
|
|
local vg=$1
|
|
|
|
_clean_lvm_volume_group $vg
|
|
_remove_lvm_volume_group $vg
|
|
# if there is no logical volume left, it's safe to attempt a cleanup
|
|
# of the backing file
|
|
if [[ -z "$(sudo lvs --noheadings -o lv_name $vg 2>/dev/null)" ]]; then
|
|
local backing_file=$DATA_DIR/$vg$BACKING_FILE_SUFFIX
|
|
|
|
if [[ -n "$vg$BACKING_FILE_SUFFIX" ]] && \
|
|
[[ -e "/etc/systemd/system/$vg$BACKING_FILE_SUFFIX.service" ]]; then
|
|
sudo systemctl disable --now $vg$BACKING_FILE_SUFFIX.service
|
|
sudo rm -f /etc/systemd/system/$vg$BACKING_FILE_SUFFIX.service
|
|
sudo systemctl daemon-reload
|
|
fi
|
|
|
|
# If the backing physical device is a loop device, it was probably setup by DevStack
|
|
if [[ -n "$backing_file" ]] && [[ -e "$backing_file" ]]; then
|
|
rm -f $backing_file
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# _create_lvm_volume_group creates default volume group
|
|
#
|
|
# Usage: _create_lvm_volume_group() $vg $size
|
|
function _create_lvm_volume_group {
|
|
local vg=$1
|
|
local size=$2
|
|
|
|
local backing_file=$DATA_DIR/$vg$BACKING_FILE_SUFFIX
|
|
if ! sudo vgs $vg; then
|
|
# Only create if the file doesn't already exists
|
|
[[ -f $backing_file ]] || truncate -s $size $backing_file
|
|
|
|
local directio=""
|
|
# Check to see if we can do direct-io
|
|
if losetup -h | grep -q direct-io; then
|
|
directio="--direct-io=on"
|
|
fi
|
|
|
|
# Only create systemd service if it doesn't already exists
|
|
if [[ ! -e "/etc/systemd/system/$vg$BACKING_FILE_SUFFIX.service" ]]; then
|
|
sed -e "
|
|
s|%DIRECTIO%|${directio}|g;
|
|
s|%BACKING_FILE%|${backing_file}|g;
|
|
" $FILES/lvm-backing-file.template | sudo tee \
|
|
/etc/systemd/system/$vg$BACKING_FILE_SUFFIX.service
|
|
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now $vg$BACKING_FILE_SUFFIX.service
|
|
fi
|
|
|
|
local vg_dev
|
|
vg_dev=$(sudo losetup --associated $backing_file -O NAME -n)
|
|
|
|
# Only create volume group if it doesn't already exist
|
|
if ! sudo vgs $vg; then
|
|
sudo vgcreate $vg $vg_dev
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# init_lvm_volume_group() initializes the volume group creating the backing
|
|
# file if necessary
|
|
#
|
|
# Usage: init_lvm_volume_group() $vg $size
|
|
function init_lvm_volume_group {
|
|
local vg=$1
|
|
local size=$2
|
|
|
|
# Start the tgtd service on Fedora if tgtadm is used
|
|
if is_fedora; then
|
|
start_service tgtd
|
|
fi
|
|
|
|
# Start with a clean volume group
|
|
_create_lvm_volume_group $vg $size
|
|
|
|
if is_service_enabled cinder; then
|
|
# Remove iscsi targets
|
|
if [ "$CINDER_TARGET_HELPER" = "lioadm" ]; then
|
|
sudo cinder-rtstool get-targets | sudo xargs -rn 1 cinder-rtstool delete
|
|
elif [ "$CINDER_TARGET_HELPER" = "tgtadm" ]; then
|
|
sudo tgtadm --op show --mode target | awk '/Target/ {print $3}' | sudo xargs -r -n1 tgt-admin --delete
|
|
elif [ "$CINDER_TARGET_HELPER" = "nvmet" ]; then
|
|
# If we don't disconnect everything vgremove will block
|
|
sudo nvme disconnect-all
|
|
sudo nvmetcli clear
|
|
fi
|
|
fi
|
|
_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
|
|
}
|
|
|
|
# clean_lvm_filter() Remove the filter rule set in set_lvm_filter()
|
|
#
|
|
# Usage: clean_lvm_filter()
|
|
function clean_lvm_filter {
|
|
sudo sed -i "s/^.*# from devstack$//" /etc/lvm/lvm.conf
|
|
}
|
|
|
|
# set_lvm_filter() Gather all devices configured for LVM and
|
|
# use them to build a global device filter
|
|
# set_lvm_filter() Create a device filter
|
|
# and add to /etc/lvm.conf. Note this uses
|
|
# all current PV's in use by LVM on the
|
|
# system to build it's filter.
|
|
#
|
|
# Usage: set_lvm_filter()
|
|
function set_lvm_filter {
|
|
local filter_suffix='"r|.*|" ] # from devstack'
|
|
local filter_string="global_filter = [ "
|
|
local pv
|
|
local vg
|
|
local line
|
|
|
|
for pv_info in $(sudo pvs --noheadings -o name); do
|
|
pv=$(echo -e "${pv_info}" | sed 's/ //g' | sed 's/\/dev\///g')
|
|
new="\"a|$pv|\", "
|
|
filter_string=$filter_string$new
|
|
done
|
|
filter_string=$filter_string$filter_suffix
|
|
|
|
clean_lvm_filter
|
|
sudo sed -i "/# global_filter = \[.*\]/a\ $filter_string" /etc/lvm/lvm.conf
|
|
echo_summary "set lvm.conf device global_filter to: $filter_string"
|
|
}
|
|
|
|
# Restore xtrace
|
|
$_XTRACE_LVM
|
|
|
|
# mode: shell-script
|
|
# End:
|