You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whirr.apache.org by gr...@apache.org on 2013/05/03 09:27:44 UTC

git commit: WHIRR-721: Improve robustness of volume device detection

Updated Branches:
  refs/heads/trunk 1507d9959 -> 4c45b6fe4


WHIRR-721: Improve robustness of volume device detection


Project: http://git-wip-us.apache.org/repos/asf/whirr/repo
Commit: http://git-wip-us.apache.org/repos/asf/whirr/commit/4c45b6fe
Tree: http://git-wip-us.apache.org/repos/asf/whirr/tree/4c45b6fe
Diff: http://git-wip-us.apache.org/repos/asf/whirr/diff/4c45b6fe

Branch: refs/heads/trunk
Commit: 4c45b6fe4a38f90d6e0eb78d7cab6e2cb147025f
Parents: 1507d99
Author: Graham Gear <gr...@gmail.com>
Authored: Fri May 3 08:24:03 2013 +0100
Committer: Graham Gear <gr...@gmail.com>
Committed: Fri May 3 08:24:03 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                        |    2 +
 .../apache/whirr/service/hadoop/VolumeManager.java |   24 ++++--
 .../main/resources/functions/prepare_all_disks.sh  |   64 +++++++++------
 3 files changed, 58 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/whirr/blob/4c45b6fe/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 1006d6a..f3fc5ba 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -6,6 +6,8 @@ Release 0.9.0 (Unreleased Changes)
 
   IMPROVEMENTS
 
+    WHIRR-721. Improve robustness of volume device detection. (graham)
+
   BUG FIXES
 
 Release 0.8.2 - 2013-04-23

http://git-wip-us.apache.org/repos/asf/whirr/blob/4c45b6fe/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/VolumeManager.java
----------------------------------------------------------------------
diff --git a/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/VolumeManager.java b/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/VolumeManager.java
index cd73e23..23da91e 100644
--- a/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/VolumeManager.java
+++ b/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/VolumeManager.java
@@ -18,16 +18,18 @@
 
 package org.apache.whirr.service.hadoop;
 
-import com.google.common.collect.Maps;
-
 import java.util.List;
 import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.apache.whirr.Cluster.Instance;
 import org.apache.whirr.ClusterSpec;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.Volume;
 
+import com.google.common.collect.Maps;
+
 public class VolumeManager {
   
   public static final String MOUNT_PREFIX = "/data";
@@ -41,12 +43,22 @@ public class VolumeManager {
     if (hardware != null) {
         List<? extends Volume> volumes =
             instance.getNodeMetadata().getHardware().getVolumes();
+        boolean foundBootDevice = false;
+        SortedSet<String> volumeDevicesSansBoot = new TreeSet<String>();
         for (Volume volume : volumes) {
-            if (volume.isBootDevice()) {
-                continue;
+            if (!volume.isBootDevice()) {
+              volumeDevicesSansBoot.add(volume.getDevice());
+            } else {
+              foundBootDevice = true;
             }
-            
-            mappings.put(MOUNT_PREFIX + number++, volume.getDevice());
+        }
+        // if no boot device is reported from the cloud provider (as is sometimes the case)
+        // assume it is the first in the natural order list of devices
+        if (!foundBootDevice && !volumeDevicesSansBoot.isEmpty()) {
+          volumeDevicesSansBoot.remove(volumeDevicesSansBoot.iterator().next());
+        }
+        for (String device : volumeDevicesSansBoot) {            
+            mappings.put(MOUNT_PREFIX + number++, device);
         }
     }
     return mappings;

http://git-wip-us.apache.org/repos/asf/whirr/blob/4c45b6fe/services/hadoop/src/main/resources/functions/prepare_all_disks.sh
----------------------------------------------------------------------
diff --git a/services/hadoop/src/main/resources/functions/prepare_all_disks.sh b/services/hadoop/src/main/resources/functions/prepare_all_disks.sh
index 1681cf3..e8e5fa6 100644
--- a/services/hadoop/src/main/resources/functions/prepare_all_disks.sh
+++ b/services/hadoop/src/main/resources/functions/prepare_all_disks.sh
@@ -55,34 +55,46 @@ function prep_disk() {
       device=$(echo "$device"|sed -e 's/\/sd/\/xvd/')
   fi
 
-  # is device formatted?
-  if [ $(mountpoint -q -x $device) ]; then
-    echo "$device is formatted"
-  else
-    if which dpkg &> /dev/null; then
-      apt-get install -y xfsprogs
-    elif which rpm &> /dev/null; then
-      yum install -y xfsprogs
-    fi
-    echo "warning: ERASING CONTENTS OF $device"
-    mkfs.xfs -f $device
+  # match /dev/sd* devices to their Xen VPS equivalents and set device if found
+  deviceXen=$(echo "$device"|sed -e 's/\/sd/\/xvd/')
+  if [ ! -e $deviceXen ]; then
+    # match /dev/sd(.) to a new RHEL 6.1 Xen VPS naming scheme - https://bugzilla.redhat.com/show_bug.cgi?id=729586
+    deviceXen=$(echo "$device"|sed -e 's/\/sd./\/xvd/'|xargs -I £ echo "£"$(printf \\$(printf '%03o' $(($(printf "%d\n" \'${device:${#device} - 1})+4)) )))
   fi
-  # is device mounted?
-  mount | grep -q $device
-  if [ $? == 0 ]; then 
-    echo "$device is mounted"
-    if [ ! -d $mount ]; then
-      echo "Symlinking to $mount"
-      ln -s $(grep $device /proc/mounts | awk '{print $2}') $mount
-    fi
-  else
-    echo "Mounting $device on $mount"
-    if [ ! -e $mount ]; then
-      mkdir $mount
+  if [ -e $deviceXen ]; then
+    device=$deviceXen
+  fi
+
+  if [ -e $device ]; then
+    # is device formatted?
+    if [ $(mountpoint -q -x $device) ]; then
+      echo "$device is formatted"
+    else
+      if which dpkg &> /dev/null; then
+        apt-get install -y xfsprogs
+      elif which rpm &> /dev/null; then
+        yum install -y xfsprogs
+      fi
+      echo "warning: ERASING CONTENTS OF $device"
+      mkfs.xfs -f $device
     fi
-    mount -o defaults,noatime $device $mount
-    if $automount ; then
-      echo "$device $mount xfs defaults,noatime 0 0" >> /etc/fstab
+    # is device mounted?
+    mount | grep -q $device
+    if [ $? == 0 ]; then 
+      echo "$device is mounted"
+      if [ ! -d $mount ]; then
+        echo "Symlinking to $mount"
+        ln -s $(grep $device /proc/mounts | awk '{print $2}') $mount
+      fi
+    else
+      echo "Mounting $device on $mount"
+      if [ ! -e $mount ]; then
+        mkdir $mount
+      fi
+      mount -o defaults,noatime $device $mount
+      if $automount ; then
+        echo "$device $mount xfs defaults,noatime 0 0" >> /etc/fstab
+      fi
     fi
   fi
 }