From 68ac03c7f269adda3739ef3cdb7a466f38e3b2b2 Mon Sep 17 00:00:00 2001 From: Mate Lakat Date: Thu, 6 Jun 2013 16:22:34 +0100 Subject: [PATCH] xenapi: separate disk for cinder volumes Some kernels have lockup issues while serving cinder volumes from file-loopback-lvm kind of cinder setup. This patch provides a way to create an additional drive to the OpenStack VM, and use that to store cinder volumes, thus eliminating the lockup issue. It will help when testing XenServer. Now, you can specify devices for stack-volumes through: VOLUME_BACKING_DEVICE In case you are using CINDER_MULTI_LVM_BACKEND, you can use VOLUME_BACKING_DEVICE2 as well. Xenserver: Should you whish to use a 10 gig disk backend for your cinder volumes, specify: XEN_XVDB_SIZE_GB=10 VOLUME_BACKING_DEVICE=/dev/xvdb Citrix is using this approach on its internal CI system to run tests against OpenStack. This is a workaround for this bug: https://bugs.launchpad.net/cinder/+bug/1023755 Related to blueprint xenapi-devstack-cleanup Change-Id: Iee633d2704185bfbf9234882654c47b850fa168a --- lib/cinder | 35 ++++++++++++++++++++++------------- tools/xen/install_os_domU.sh | 13 +++++++++++++ tools/xen/xenrc | 10 ++++++++++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/lib/cinder b/lib/cinder index 0eabf400de..c572db49d2 100644 --- a/lib/cinder +++ b/lib/cinder @@ -69,10 +69,12 @@ CINDER_PERIODIC_INTERVAL=${CINDER_PERIODIC_INTERVAL:-60} # Name of the lvm volume groups to use/create for iscsi volumes VOLUME_GROUP=${VOLUME_GROUP:-stack-volumes} VOLUME_BACKING_FILE=${VOLUME_BACKING_FILE:-$DATA_DIR/${VOLUME_GROUP}-backing-file} +VOLUME_BACKING_DEVICE=${VOLUME_BACKING_DEVICE:-} # VOLUME_GROUP2 is used only if CINDER_MULTI_LVM_BACKEND = True VOLUME_GROUP2=${VOLUME_GROUP2:-stack-volumes2} VOLUME_BACKING_FILE2=${VOLUME_BACKING_FILE2:-$DATA_DIR/${VOLUME_GROUP2}-backing-file} +VOLUME_BACKING_DEVICE2=${VOLUME_BACKING_DEVICE2:-} VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-} @@ -335,28 +337,35 @@ create_cinder_volume_group() { # ``/opt/stack/data``. if ! sudo vgs $VOLUME_GROUP; then - # Only create if the file doesn't already exists - [[ -f $VOLUME_BACKING_FILE ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE + if [ -z "$VOLUME_BACKING_DEVICE" ]; then + # Only create if the file doesn't already exists + [[ -f $VOLUME_BACKING_FILE ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE + DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE` - DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE` - - # Only create if the loopback device doesn't contain $VOLUME_GROUP - if ! sudo vgs $VOLUME_GROUP; then - sudo vgcreate $VOLUME_GROUP $DEV + # Only create if the loopback device doesn't contain $VOLUME_GROUP + if ! sudo vgs $VOLUME_GROUP; then + sudo vgcreate $VOLUME_GROUP $DEV + fi + else + sudo vgcreate $VOLUME_GROUP $VOLUME_BACKING_DEVICE fi fi if [ "$CINDER_MULTI_LVM_BACKEND" = "True" ]; then #set up the second volume if CINDER_MULTI_LVM_BACKEND is enabled if ! sudo vgs $VOLUME_GROUP2; then - # Only create if the file doesn't already exists - [[ -f $VOLUME_BACKING_FILE2 ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE2 + if [ -z "$VOLUME_BACKING_DEVICE2" ]; then + # Only create if the file doesn't already exists + [[ -f $VOLUME_BACKING_FILE2 ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE2 - DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE2` + DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE2` - # Only create if the loopback device doesn't contain $VOLUME_GROUP - if ! sudo vgs $VOLUME_GROUP2; then - sudo vgcreate $VOLUME_GROUP2 $DEV + # Only create if the loopback device doesn't contain $VOLUME_GROUP + if ! sudo vgs $VOLUME_GROUP2; then + sudo vgcreate $VOLUME_GROUP2 $DEV + fi + else + sudo vgcreate $VOLUME_GROUP2 $VOLUME_BACKING_DEVICE2 fi fi fi diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh index a744869288..be3b540d4b 100755 --- a/tools/xen/install_os_domU.sh +++ b/tools/xen/install_os_domU.sh @@ -259,6 +259,19 @@ fi FLAT_NETWORK_BRIDGE=$(bridge_for "$VM_BRIDGE_OR_NET_NAME") append_kernel_cmdline "$GUEST_NAME" "flat_network_bridge=${FLAT_NETWORK_BRIDGE}" +# Add a separate xvdb, if it was requested +if [[ "0" != "$XEN_XVDB_SIZE_GB" ]]; then + vm=$(xe vm-list name-label="$GUEST_NAME" --minimal) + + # Add a new disk + localsr=$(get_local_sr) + extra_vdi=$(xe vdi-create \ + name-label=xvdb-added-by-devstack \ + virtual-size="${XEN_XVDB_SIZE_GB}GiB" \ + sr-uuid=$localsr type=user) + xe vbd-create vm-uuid=$vm vdi-uuid=$extra_vdi device=1 +fi + # create a snapshot before the first boot # to allow a quick re-run with the same settings xe vm-snapshot vm="$GUEST_NAME" new-name-label="$SNAME_FIRST_BOOT" diff --git a/tools/xen/xenrc b/tools/xen/xenrc index 0ed3a6a7e5..3e2396438a 100644 --- a/tools/xen/xenrc +++ b/tools/xen/xenrc @@ -76,4 +76,14 @@ UBUNTU_INST_NAMESERVERS="" UBUNTU_INST_NETMASK="" UBUNTU_INST_GATEWAY="" +# Create a separate xvdb. Tis could be used as a backing device for cinder +# volumes. Specify +# XEN_XVDB_SIZE_GB=10 +# VOLUME_BACKING_DEVICE=/dev/xvdb +# in your localrc to avoid kernel lockups: +# https://bugs.launchpad.net/cinder/+bug/1023755 +# +# Set the size to 0 to avoid creation of additional disk. +XEN_XVDB_SIZE_GB=0 + source ../../stackrc