Skip to content

Commit 02a0869

Browse files
committed
Merge pull request openstack#130 from cloudbuilders/fix_races
Address races in NBD and images
2 parents 70d2b2c + 6fe687b commit 02a0869

File tree

2 files changed

+45
-26
lines changed

2 files changed

+45
-26
lines changed

tools/build_libvirt.sh

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -229,15 +229,8 @@ EOF
229229
ROOTFS=$VM_DIR/root
230230
mkdir -p $ROOTFS
231231

232-
# Make sure we have nbd-ness
233-
modprobe nbd max_part=63
234-
235-
# Which NBD device to use?
236-
NBD=${NBD:-/dev/nbd$GUEST_NETWORK}
237-
238232
# Clean up from previous runs
239233
umount $ROOTFS || echo 'ok'
240-
qemu-nbd -d $NBD || echo 'ok'
241234

242235
# Clean up old runs
243236
cd $VM_DIR
@@ -246,12 +239,27 @@ rm -f $VM_DIR/disk
246239
# Create our instance fs
247240
qemu-img create -f qcow2 -b $VM_IMAGE disk
248241

249-
# Connect our nbd and wait till it is mountable
250-
qemu-nbd -c $NBD disk
251-
if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then
252-
echo "Couldn't connect $NBD"
242+
# Make sure we have nbd-ness
243+
modprobe nbd max_part=63
244+
245+
# Set up nbd
246+
for i in `seq 0 15`; do
247+
if [ ! -e /sys/block/nbd$i/pid ]; then
248+
NBD=/dev/nbd$i
249+
# Connect to nbd and wait till it is ready
250+
qemu-nbd -c $NBD disk
251+
if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then
252+
echo "Couldn't connect $NBD"
253+
exit 1
254+
fi
255+
break
256+
fi
257+
done
258+
if [ -z "$NBD" ]; then
259+
echo "No free NBD slots"
253260
exit 1
254261
fi
262+
NBD_DEV=`basename $NBD`
255263

256264
# Mount the instance
257265
mount ${NBD}p1 $ROOTFS
@@ -344,9 +352,6 @@ echo "export PS1='${debian_chroot:+($debian_chroot)}\\u@\\H:\\w\\$ '" >> $ROOTFS
344352
# Give stack ownership over $DEST so it may do the work needed
345353
chroot $ROOTFS chown -R stack $DEST
346354

347-
# GRUB 2 wants to see /dev
348-
mount -o bind /dev $ROOTFS/dev
349-
350355
# Set the hostname
351356
echo $GUEST_NAME > $ROOTFS/etc/hostname
352357

@@ -355,6 +360,9 @@ if ! grep -q $GUEST_NAME $ROOTFS/etc/hosts; then
355360
echo "$GUEST_IP $GUEST_NAME" >> $ROOTFS/etc/hosts
356361
fi
357362

363+
# GRUB 2 wants to see /dev
364+
mount -o bind /dev $ROOTFS/dev
365+
358366
# Change boot params so that we get a console log
359367
G_DEV_UUID=`blkid -t LABEL=cloudimg-rootfs -s UUID -o value | head -1`
360368
sed -e "s/GRUB_TIMEOUT=.*$/GRUB_TIMEOUT=3/" -i $ROOTFS/etc/default/grub

tools/get_uec_image.sh

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ fi
5151
# Default args
5252
DIST_NAME=$1
5353
IMG_FILE=$2
54+
IMG_FILE_TMP=`mktemp $IMG_FILE.XXXXXX`
5455

5556
case $FORMAT in
5657
kvm|qcow2) FORMAT=qcow2
@@ -88,11 +89,6 @@ case $DIST_NAME in
8889
;;
8990
esac
9091

91-
# Set up nbd
92-
modprobe nbd max_part=63
93-
NBD=${NBD:-/dev/nbd9}
94-
NBD_DEV=`basename $NBD`
95-
9692
# Prepare the base image
9793

9894
# Get the UEC image
@@ -103,24 +99,37 @@ fi
10399

104100
if [ "$FORMAT" = "qcow2" ]; then
105101
# Just copy image
106-
cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE
102+
cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP
107103
else
108104
# Convert image
109-
qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE
105+
qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP
110106
fi
111107

112108
# Resize the image if necessary
113109
if [ $ROOTSIZE -gt 2000 ]; then
114110
# Resize the container
115-
qemu-img resize $IMG_FILE +$((ROOTSIZE - 2000))M
111+
qemu-img resize $IMG_FILE_TMP +$((ROOTSIZE - 2000))M
116112
fi
117113

118-
# Connect to nbd and wait till it is ready
119-
qemu-nbd -c $NBD $IMG_FILE
120-
if ! timeout 60 sh -c "while ! [ -e /sys/block/$NBD_DEV/pid ]; do sleep 1; done"; then
121-
echo "Couldn't connect $NBD"
114+
# Set up nbd
115+
modprobe nbd max_part=63
116+
for i in `seq 1 15`; do
117+
if [ ! -e /sys/block/nbd$i/pid ]; then
118+
NBD=/dev/nbd$i
119+
# Connect to nbd and wait till it is ready
120+
qemu-nbd -c $NBD $IMG_FILE_TMP
121+
if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then
122+
echo "Couldn't connect $NBD"
123+
exit 1
124+
fi
125+
break
126+
fi
127+
done
128+
if [ -z "$NBD" ]; then
129+
echo "No free NBD slots"
122130
exit 1
123131
fi
132+
NBD_DEV=`basename $NBD`
124133

125134
# Resize partition 1 to full size of the disk image
126135
echo "d
@@ -153,3 +162,5 @@ rm -f $MNTDIR/etc/resolv.conf
153162
umount $MNTDIR
154163
rmdir $MNTDIR
155164
qemu-nbd -d $NBD
165+
166+
mv $IMG_FILE_TMP $IMG_FILE

0 commit comments

Comments
 (0)