Browse code

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

Mate Lakat authored on 2013/06/07 00:22:34
Showing 3 changed files
... ...
@@ -69,10 +69,12 @@ CINDER_PERIODIC_INTERVAL=${CINDER_PERIODIC_INTERVAL:-60}
69 69
 # Name of the lvm volume groups to use/create for iscsi volumes
70 70
 VOLUME_GROUP=${VOLUME_GROUP:-stack-volumes}
71 71
 VOLUME_BACKING_FILE=${VOLUME_BACKING_FILE:-$DATA_DIR/${VOLUME_GROUP}-backing-file}
72
+VOLUME_BACKING_DEVICE=${VOLUME_BACKING_DEVICE:-}
72 73
 
73 74
 # VOLUME_GROUP2 is used only if CINDER_MULTI_LVM_BACKEND = True
74 75
 VOLUME_GROUP2=${VOLUME_GROUP2:-stack-volumes2}
75 76
 VOLUME_BACKING_FILE2=${VOLUME_BACKING_FILE2:-$DATA_DIR/${VOLUME_GROUP2}-backing-file}
77
+VOLUME_BACKING_DEVICE2=${VOLUME_BACKING_DEVICE2:-}
76 78
 
77 79
 VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}
78 80
 
... ...
@@ -335,28 +337,35 @@ create_cinder_volume_group() {
335 335
     # ``/opt/stack/data``.
336 336
 
337 337
     if ! sudo vgs $VOLUME_GROUP; then
338
-        # Only create if the file doesn't already exists
339
-        [[ -f $VOLUME_BACKING_FILE ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE
340
-
341
-        DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE`
338
+        if [ -z "$VOLUME_BACKING_DEVICE" ]; then
339
+            # Only create if the file doesn't already exists
340
+            [[ -f $VOLUME_BACKING_FILE ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE
341
+            DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE`
342 342
 
343
-        # Only create if the loopback device doesn't contain $VOLUME_GROUP
344
-        if ! sudo vgs $VOLUME_GROUP; then
345
-            sudo vgcreate $VOLUME_GROUP $DEV
343
+            # Only create if the loopback device doesn't contain $VOLUME_GROUP
344
+            if ! sudo vgs $VOLUME_GROUP; then
345
+                sudo vgcreate $VOLUME_GROUP $DEV
346
+            fi
347
+        else
348
+            sudo vgcreate $VOLUME_GROUP $VOLUME_BACKING_DEVICE
346 349
         fi
347 350
     fi
348 351
     if [ "$CINDER_MULTI_LVM_BACKEND" = "True" ]; then
349 352
         #set up the second volume if CINDER_MULTI_LVM_BACKEND is enabled
350 353
 
351 354
         if ! sudo vgs $VOLUME_GROUP2; then
352
-            # Only create if the file doesn't already exists
353
-            [[ -f $VOLUME_BACKING_FILE2 ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE2
354
-
355
-            DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE2`
356
-
357
-            # Only create if the loopback device doesn't contain $VOLUME_GROUP
358
-            if ! sudo vgs $VOLUME_GROUP2; then
359
-                sudo vgcreate $VOLUME_GROUP2 $DEV
355
+            if [ -z "$VOLUME_BACKING_DEVICE2" ]; then
356
+                # Only create if the file doesn't already exists
357
+                [[ -f $VOLUME_BACKING_FILE2 ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE2
358
+
359
+                DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE2`
360
+
361
+                # Only create if the loopback device doesn't contain $VOLUME_GROUP
362
+                if ! sudo vgs $VOLUME_GROUP2; then
363
+                    sudo vgcreate $VOLUME_GROUP2 $DEV
364
+                fi
365
+            else
366
+                sudo vgcreate $VOLUME_GROUP2 $VOLUME_BACKING_DEVICE2
360 367
             fi
361 368
         fi
362 369
     fi
... ...
@@ -259,6 +259,19 @@ fi
259 259
 FLAT_NETWORK_BRIDGE=$(bridge_for "$VM_BRIDGE_OR_NET_NAME")
260 260
 append_kernel_cmdline "$GUEST_NAME" "flat_network_bridge=${FLAT_NETWORK_BRIDGE}"
261 261
 
262
+# Add a separate xvdb, if it was requested
263
+if [[ "0" != "$XEN_XVDB_SIZE_GB" ]]; then
264
+    vm=$(xe vm-list name-label="$GUEST_NAME" --minimal)
265
+
266
+    # Add a new disk
267
+    localsr=$(get_local_sr)
268
+    extra_vdi=$(xe vdi-create \
269
+        name-label=xvdb-added-by-devstack \
270
+        virtual-size="${XEN_XVDB_SIZE_GB}GiB" \
271
+        sr-uuid=$localsr type=user)
272
+    xe vbd-create vm-uuid=$vm vdi-uuid=$extra_vdi device=1
273
+fi
274
+
262 275
 # create a snapshot before the first boot
263 276
 # to allow a quick re-run with the same settings
264 277
 xe vm-snapshot vm="$GUEST_NAME" new-name-label="$SNAME_FIRST_BOOT"
... ...
@@ -76,4 +76,14 @@ UBUNTU_INST_NAMESERVERS=""
76 76
 UBUNTU_INST_NETMASK=""
77 77
 UBUNTU_INST_GATEWAY=""
78 78
 
79
+# Create a separate xvdb. Tis could be used as a backing device for cinder
80
+# volumes. Specify
81
+#   XEN_XVDB_SIZE_GB=10
82
+#   VOLUME_BACKING_DEVICE=/dev/xvdb
83
+# in your localrc to avoid kernel lockups:
84
+#   https://bugs.launchpad.net/cinder/+bug/1023755
85
+#
86
+# Set the size to 0 to avoid creation of additional disk.
87
+XEN_XVDB_SIZE_GB=0
88
+
79 89
 source ../../stackrc