Loading

GlusterFS Split Brain

  1. #!/bin/bash
  2.  
  3. #
  4. # Fix Split brain with gluster
  5. #
  6.  
  7. SCRIPTPID=$!
  8.  
  9. usage()
  10. {
  11.         echo "Fix Split-brain with Gluster"
  12.         echo "Usage:"
  13.         echo "$0 -f <filelist> -b <brick> -m <mountpoint>"
  14.         echo ""
  15.         echo "  -f <filelist>"
  16.         echo "          Filelist should contain files as"
  17.         echo "          shown in 'gluster volume heal volumename info'"
  18.         echo "  -b <brick>"
  19.         echo "          Brick contains the actual brick folder"
  20.         echo "  -m <mountpoint>"
  21.         echo "          Mountpoint as it is locally mounted"
  22. }
  23.  
  24. checkFiles()
  25. {
  26.         CONFIRM=0
  27.         while read LINE
  28.         do
  29.                 echo $LINE
  30.                 [ ! -f $MOUNTPOINT/$LINE ] && CONFIRM=1
  31.         done
  32.         return $CONFIRM
  33. }
  34.  
  35. confirm () {
  36.         # call with a prompt string or use a default
  37.         read -r -p "${1:-Are you sure? [y/N]} " response
  38.         case $response in
  39.                 [yY][eE][sS]|[yY])
  40.                         return 0
  41.                         ;;
  42.                 *)
  43.                         return 1
  44.                         ;;
  45.         esac
  46. }
  47.  
  48. doFixSplitBrain()
  49. {
  50.         echo "Mah brain hurts...."
  51.         echo " Processing filelist: $1"
  52.         echo " GlusterFS brick: $2"
  53.         echo " Mountpoint for data: $3"
  54.         echo "-------------------------------------------"
  55.         while read LINE
  56.         do
  57.                 if [ ! -z $LINE ]
  58.                 then
  59.                         find $2 -samefile $2/$LINE -print -delete
  60.                         stat $3/$LINE 2>&1 > /dev/null
  61.                 fi
  62.         done < $1
  63. }
  64.  
  65.  
  66.  
  67. while getopts "hf:b:m:" OPTION
  68. do
  69.         case $OPTION in
  70.                 h)
  71.                         usage
  72.                         exit 1
  73.                         ;;
  74.                 f)
  75.                         INPUTFILE=$OPTARG
  76.                         ;;
  77.                 b)
  78.                         BRICK=${OPTARG%/}
  79.                         ;;
  80.                 m)
  81.                         MOUNTPOINT=${OPTARG%/}
  82.                         ;;
  83.                 ?)
  84.                         usage
  85.                         exit
  86.                         ;;
  87.         esac
  88. done
  89.  
  90. if [[ -z $INPUTFILE ]] || [[ -z $BRICK ]] || [[ -z $MOUNTPOINT ]] || [[ ! -f $INPUTFILE ]] || [[ ! -d $BRICK ]] || [[ ! -d $MOUNTPOINT ]]
  91. then
  92.         usage
  93.         exit 1
  94. fi
  95.  
  96. grep $MOUNTPOINT /proc/mounts | grep -i ' fuse.glusterfs ' 2>&1 /dev/null
  97.  
  98. wait $SCRIPTID
  99.  
  100. MOUNTEXISTS=$?
  101.  
  102. if [ $MOUNTEXISTS == 0 ]
  103. then
  104.         echo "Mountpoint is correct!"
  105.  
  106.         confirm "Are you sure you want to continue? [y/N]"
  107.  
  108.         CONFIRMATION=$?
  109.  
  110.         if [[ $CONFIRMATION -eq 0 ]]
  111.         then
  112.                 doFixSplitBrain $INPUTFILE $BRICK $MOUNTPOINT
  113.         else
  114.                 echo "Wise choice young grashoppah!"
  115.         fi
  116. fi

Comments