3604df
From 2e072bb19d47080ca91c181698cfcf1beb60b8b1 Mon Sep 17 00:00:00 2001
3604df
From: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
3604df
Date: Fri, 16 Sep 2016 13:08:00 +0530
3604df
Subject: [PATCH 37/86] extras: kill processes gracefully
3604df
3604df
Currently all of brick, gsyncd and other glustershd services/processes
3604df
are killed without checking for ongoing tasks such as geo-rep,
3604df
self-heal, rebalance and etc. which may lead to inconsistency after
3604df
the node is brought back.
3604df
3604df
This patch introduce an option '-g' which ensures whether all the
3604df
gluster processes are ready (not busy) to be terminated before we
3604df
executing 'kill' on them
3604df
3604df
Usage: ./extras/stop-all-gluster-processes.sh [-g] [-h]
3604df
    options:
3604df
    -g  Terminate in graceful mode
3604df
    -h  Show this message, then exit
3604df
3604df
 eg:
3604df
  1. ./extras/stop-all-gluster-processes.sh
3604df
  2. ./extras/stop-all-gluster-processes.sh -g
3604df
3604df
By default, this script executes in force mode, processes are killed
3604df
without checking for ongoing tasks, on specifying '-g' option this
3604df
script works in graceful mode, which returns exitcode if some of gluster
3604df
processes are busy in doing their jobs.
3604df
3604df
exitcodes include:
3604df
   0       No errors/Success
3604df
   64      Rebalance is in progress
3604df
   65      Self-Heal is in progress
3604df
   66      Tier daemon running on this node
3604df
   127     option not found
3604df
3604df
Backport of:
3604df
> Change-Id: I2f924b2bf9f04a81788d0f5604895a42755b33a1
3604df
> BUG: 1367771
3604df
> Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
3604df
> Reviewed-on: http://review.gluster.org/15188
3604df
> Tested-by: Prasanna Kumar Kalever <pkalever@redhat.com>
3604df
> Smoke: Gluster Build System <jenkins@build.gluster.org>
3604df
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
3604df
> Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
3604df
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
3604df
> Reviewed-by: Ravishankar N <ravishankar@redhat.com>
3604df
> Reviewed-by: mohammed rafi  kc <rkavunga@redhat.com>
3604df
> Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
3604df
3604df
Change-Id: I2f924b2bf9f04a81788d0f5604895a42755b33a1
3604df
BUG: 1294754
3604df
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
3604df
Reviewed-on: https://code.engineering.redhat.com/gerrit/84768
3604df
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
3604df
---
3604df
 extras/stop-all-gluster-processes.sh |  111 +++++++++++++++++++++++++++++++++-
3604df
 1 files changed, 110 insertions(+), 1 deletions(-)
3604df
3604df
diff --git a/extras/stop-all-gluster-processes.sh b/extras/stop-all-gluster-processes.sh
3604df
index 356a2a6..f11c634 100755
3604df
--- a/extras/stop-all-gluster-processes.sh
3604df
+++ b/extras/stop-all-gluster-processes.sh
3604df
@@ -1,4 +1,37 @@
3604df
 #!/usr/bin/env bash
3604df
+#
3604df
+# Kill all the processes/services except glusterd
3604df
+#
3604df
+# Usage: ./extras/stop-all-gluster-processes.sh [-g] [-h]
3604df
+#    options:
3604df
+#    -g  Terminate in graceful mode
3604df
+#    -h  Show this message, then exit
3604df
+#
3604df
+# eg:
3604df
+#  1. ./extras/stop-all-gluster-processes.sh
3604df
+#  2. ./extras/stop-all-gluster-processes.sh -g
3604df
+#
3604df
+# By default, this script executes in force mode, i.e. all of brick, gsyncd
3604df
+# and other glustershd services/processes are killed without checking for
3604df
+# ongoing tasks such as geo-rep, self-heal, rebalance and etc. which may lead
3604df
+# to inconsistency after the node is brought back.
3604df
+#
3604df
+# On specifying '-g' option this script works in graceful mode, to maintain
3604df
+# data consistency the script fails with a valid exit code incase if any of
3604df
+# the gluster processes are busy in doing their jobs.
3604df
+#
3604df
+# The author of page [1] proposes user-defined exit codes to the range 64 - 113
3604df
+# Find the better explanation behind the choice in the link
3604df
+#
3604df
+# The exit code returned by stop-all-gluster-processes.sh:
3604df
+#   0       No errors/Success
3604df
+#   64      Rebalance is in progress
3604df
+#   65      Self-Heal is in progress
3604df
+#   66      Tier daemon running on this node
3604df
+#   127     option not found
3604df
+#
3604df
+# [1] http://www.tldp.org/LDP/abs/html/exitcodes.html
3604df
+
3604df
 
3604df
 # global
3604df
 errors=0
3604df
@@ -64,8 +97,84 @@ kill_georep_gsync()
3604df
     fi
3604df
 }
3604df
 
3604df
+# check if all processes are ready to die
3604df
+check_background_tasks()
3604df
+{
3604df
+    volumes=$(gluster vol list)
3604df
+    quit=0
3604df
+    for volname in ${volumes};
3604df
+    do
3604df
+        # tiering
3604df
+        if [[ $(gluster volume tier ${volname} status 2> /dev/null |
3604df
+                grep "localhost" | grep -c "in progress") -gt 0 ]]
3604df
+        then
3604df
+            quit=66
3604df
+            break;
3604df
+        fi
3604df
+
3604df
+        # rebalance
3604df
+        if [[ $(gluster volume rebalance ${volname} status 2> /dev/null |
3604df
+                grep -c "in progress") -gt 0 ]]
3604df
+        then
3604df
+            quit=64
3604df
+            break;
3604df
+        fi
3604df
+
3604df
+        # self heal
3604df
+        if [[ $(gluster volume heal ${volname} info | grep "Number of entries" |
3604df
+                awk '{ sum+=$4} END {print sum}') -gt 0 ]];
3604df
+        then
3604df
+            quit=65
3604df
+            break;
3604df
+        fi
3604df
+
3604df
+        # geo-rep, snapshot and quota doesn't need grace checks,
3604df
+        # as they ensures the consistancy on force kills
3604df
+    done
3604df
+
3604df
+    echo ${quit}
3604df
+}
3604df
+
3604df
+usage()
3604df
+{
3604df
+    cat <
3604df
+Usage: $0 [-g] [-h]
3604df
+    options:
3604df
+    -g  Terminate in graceful mode
3604df
+    -h  Show this message, then exit
3604df
+
3604df
+eg:
3604df
+ 1. $0
3604df
+ 2. $0 -g
3604df
+EOM
3604df
+}
3604df
+
3604df
 main()
3604df
 {
3604df
+    while getopts "gh" opt; do
3604df
+        case $opt in
3604df
+            g)
3604df
+                # graceful mode
3604df
+                quit=$(check_background_tasks)
3604df
+                if [[ ${quit} -ne 0 ]]
3604df
+                then
3604df
+                    exit ${quit};
3604df
+                fi
3604df
+                # else safe to kill
3604df
+                ;;
3604df
+            h)
3604df
+                usage
3604df
+                exit 0;
3604df
+                ;;
3604df
+            *)
3604df
+                usage
3604df
+                exit 127;
3604df
+                ;;
3604df
+        esac
3604df
+    done
3604df
+    # remove all the options that have been parsed by getopts
3604df
+    shift $((OPTIND-1))
3604df
+
3604df
     kill_mounts TERM
3604df
     kill_bricks_and_services TERM
3604df
     kill_georep_gsync TERM
3604df
@@ -81,4 +190,4 @@ main()
3604df
     exit ${errors};
3604df
 }
3604df
 
3604df
-main
3604df
+main "$@"
3604df
-- 
3604df
1.7.1
3604df