diff options
| author | Avra Sengupta <asengupt@redhat.com> | 2015-04-06 14:34:45 +0530 | 
|---|---|---|
| committer | Krishnan Parthasarathi <kparthas@redhat.com> | 2015-04-10 04:59:32 +0000 | 
| commit | 3f21a347932d741de24bccffb761689c5b368e7e (patch) | |
| tree | bc489399a7903eccfbe3536cc848590e7489a160 /extras | |
| parent | 1c25d5f1492c2186e2c9f468a6c109bd4894fc4f (diff) | |
snapshot/scheduler: Only run if shared storage is mounted
Before running any snapshot scheduler op command,
verify if /var/run/gluster/snaps/shared_storage/ exists
and if the shared storage is mounted at it.
Change-Id: Ibb6ba6c01c227cacf9a19d1bf9264500373a4ed6
BUG: 1209112
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-on: http://review.gluster.org/10135
Reviewed-by: Aravinda VK <avishwan@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Tested-by: Krishnan Parthasarathi <kparthas@redhat.com>
Diffstat (limited to 'extras')
| -rwxr-xr-x | extras/snap_scheduler/snap_scheduler.py | 109 | 
1 files changed, 70 insertions, 39 deletions
diff --git a/extras/snap_scheduler/snap_scheduler.py b/extras/snap_scheduler/snap_scheduler.py index 3a168a91c08..a20216d2492 100755 --- a/extras/snap_scheduler/snap_scheduler.py +++ b/extras/snap_scheduler/snap_scheduler.py @@ -16,19 +16,21 @@ import logging  import argparse  import fcntl  import logging.handlers +import sys  from errno import EEXIST  SCRIPT_NAME = "snap_scheduler"  scheduler_enabled = False  log = logging.getLogger(SCRIPT_NAME) -GCRON_DISABLED = "/var/run/gluster/snaps/shared_storage/gcron_disabled" -GCRON_ENABLED = "/var/run/gluster/snaps/shared_storage/gcron_enabled" -GCRON_TASKS = "/var/run/gluster/snaps/shared_storage/glusterfs_snap_cron_tasks" +SHARED_STORAGE_DIR="/var/run/gluster/snaps/shared_storage/" +GCRON_DISABLED = SHARED_STORAGE_DIR+"gcron_disabled" +GCRON_ENABLED = SHARED_STORAGE_DIR+"gcron_enabled" +GCRON_TASKS = SHARED_STORAGE_DIR+"glusterfs_snap_cron_tasks"  GCRON_CROND_TASK = "/etc/cron.d/glusterfs_snap_cron_tasks" -LOCK_FILE_DIR = "/var/run/gluster/snaps/shared_storage/lock_files/" -LOCK_FILE = "/var/run/gluster/snaps/shared_storage/lock_files/lock_file" -TMP_FILE = "/var/run/gluster/snaps/shared_storage/tmp_file" +LOCK_FILE_DIR = SHARED_STORAGE_DIR+"lock_files/" +LOCK_FILE = LOCK_FILE_DIR+"lock_file" +TMP_FILE = SHARED_STORAGE_DIR+"tmp_file"  GCRON_UPDATE_TASK = "/etc/cron.d/gcron_update_task"  tasks = {}  longest_field = 12 @@ -102,14 +104,21 @@ def enable_scheduler():                  log.info("Snapshot scheduling is enabled")                  output("Snapshot scheduling is enabled")              except IOError as (errno, strerror): -                log.error("Failed to enable snapshot scheduling. Error: %s.", -                          strerror) +                print_str = "Failed to enable snapshot scheduling. Error: "+strerror +                log.error(print_str) +                output(print_str)                  ret = False          else:              print_str = "Failed to enable snapshot scheduling. " \                          "Error: Snapshot scheduling is already enabled."              log.error(print_str)              output(print_str) +            ret = False +    else: +        print_str = "Failed to enable snapshot scheduling. " \ +                    "Error: Failed to check scheduler status." +        log.error(print_str) +        output(print_str)      return ret @@ -130,14 +139,21 @@ def disable_scheduler():                  log.info("Snapshot scheduling is disabled")                  output("Snapshot scheduling is disabled")              except IOError as (errno, strerror): -                log.error("Failed to disable snapshot scheduling. Error: %s.", -                          strerror) +                print_str = "Failed to disable snapshot scheduling. Error: "+strerror +                log.error(print_str) +                output(print_str)                  ret = False          else:              print_str = "Failed to disable scheduling. " \                          "Error: Snapshot scheduling is already disabled."              log.error(print_str)              output(print_str) +            ret = False +    else: +        print_str = "Failed to disable snapshot scheduling. " \ +                    "Error: Failed to check scheduler status." +        log.error(print_str) +        output(print_str)      return ret @@ -190,7 +206,10 @@ def list_schedules():                  operation = "Snapshot Create".ljust(longest_field+5)                  print(jobname+schedule+operation+volname)      else: -        log.error("Failed to load tasks from %s.", GCRON_ENABLED) +        print_str = "Failed to list snapshot schedules. " \ +                    "Error: Failed to load tasks from "+GCRON_ENABLED +        log.error(print_str) +        output(print_str)      return ret @@ -230,6 +249,7 @@ def add_schedules(jobname, schedule, volname):                           "'edit' to modify %s" % (jobname, jobname))              log.error(print_str)              output(print_str) +            ret = False          else:              tasks[jobname] = schedule + ":" + volname              ret = write_tasks_to_file() @@ -247,7 +267,10 @@ def add_schedules(jobname, schedule, volname):                  log.info("Successfully added snapshot schedule %s" % jobname)                  output("Successfully added snapshot schedule")      else: -        log.error("Failed to load tasks from %s.", GCRON_ENABLED) +        print_str = "Failed to add snapshot schedule. " \ +                    "Error: Failed to load tasks from "+GCRON_ENABLED +        log.error(print_str) +        output(print_str)      return ret @@ -275,8 +298,12 @@ def delete_schedules(jobname):                           "job scheduled" % jobname)              log.error(print_str)              output(print_str) +            ret = False      else: -        log.error("Failed to load tasks from %s.", GCRON_ENABLED) +        print_str = "Failed to delete snapshot schedule. " \ +                    "Error: Failed to load tasks from "+GCRON_ENABLED +        log.error(print_str) +        output(print_str)      return ret @@ -296,8 +323,12 @@ def edit_schedules(jobname, schedule, volname):                           "job scheduled" % jobname)              log.error(print_str)              output(print_str) +            ret = False      else: -        log.error("Failed to load tasks from %s.", GCRON_ENABLED) +        print_str = "Failed to edit snapshot schedule. " \ +                    "Error: Failed to load tasks from "+GCRON_ENABLED +        log.error(print_str) +        output(print_str)      return ret @@ -364,18 +395,17 @@ def perform_operation(args):          ret = initialise_scheduler()          if not ret:              output("Failed to initialise snapshot scheduling") -        else: -            return ret +        return ret      # Check if the symlink to GCRON_TASKS is properly set in the shared storage      if (not os.path.lexists(GCRON_UPDATE_TASK) or -       not os.path.lexists(GCRON_CROND_TASK) or -       os.readlink(GCRON_CROND_TASK) != GCRON_TASKS): +        not os.path.lexists(GCRON_CROND_TASK) or +        os.readlink(GCRON_CROND_TASK) != GCRON_TASKS):          print_str = ("Please run 'snap_scheduler.py' init to initialise "                       "the snap scheduler for the local node.")          log.error(print_str)          output(print_str) -        return +        return ret      # Check status of snapshot scheduler.      if args.action == "status": @@ -392,26 +422,20 @@ def perform_operation(args):      # Enable snapshot scheduler      if args.action == "enable":          ret = enable_scheduler() -        if not ret: -            output("Failed to enable snapshot scheduling") -        else: +        if ret:              subprocess.Popen(["touch", "-h", GCRON_TASKS])          return ret      # Disable snapshot scheduler      if args.action == "disable":          ret = disable_scheduler() -        if not ret: -            output("Failed to disable snapshot scheduling") -        else: +        if ret:              subprocess.Popen(["touch", "-h", GCRON_TASKS])          return ret      # List snapshot schedules      if args.action == "list":          ret = list_schedules() -        if not ret: -            output("Failed to list snapshot schedules")          return ret      # Add snapshot schedules @@ -420,9 +444,7 @@ def perform_operation(args):          if not ret:              return ret          ret = add_schedules(args.jobname, args.schedule, args.volname) -        if not ret: -            output("Failed to add snapshot schedule") -        else: +        if ret:              subprocess.Popen(["touch", "-h", GCRON_TASKS])          return ret @@ -432,9 +454,7 @@ def perform_operation(args):          if not ret:              return ret          ret = delete_schedules(args.jobname) -        if not ret: -            output("Failed to delete snapshot schedule") -        else: +        if ret:              subprocess.Popen(["touch", "-h", GCRON_TASKS])          return ret @@ -444,9 +464,7 @@ def perform_operation(args):          if not ret:              return ret          ret = edit_schedules(args.jobname, args.schedule, args.volname) -        if not ret: -            output("Failed to edit snapshot schedule") -        else: +        if ret:              subprocess.Popen(["touch", "-h", GCRON_TASKS])          return ret @@ -455,6 +473,7 @@ def perform_operation(args):  def main():      initLogger() +    ret = -1      parser = argparse.ArgumentParser()      subparsers = parser.add_subparsers(dest="action")      subparsers.add_parser('init', @@ -486,6 +505,14 @@ def main():      args = parser.parse_args() +    if not os.path.exists(SHARED_STORAGE_DIR): +        output("Failed: "+SHARED_STORAGE_DIR+" does not exist.") +        return ret + +    if not os.path.ismount(SHARED_STORAGE_DIR): +        output("Failed: Shared storage is not mounted at "+SHARED_STORAGE_DIR) +        return ret +      if not os.path.exists(LOCK_FILE_DIR):          try:              os.makedirs(LOCK_FILE_DIR) @@ -499,7 +526,11 @@ def main():          f = os.open(LOCK_FILE, os.O_CREAT | os.O_RDWR | os.O_NONBLOCK, 0644)          try:              fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB) -            perform_operation(args) +            ret = perform_operation(args) +            if not ret: +                ret = 1 +            else: +                ret = 0              fcntl.flock(f, fcntl.LOCK_UN)          except IOError as (errno, strerror):              log.info("%s is being processed by another agent.", LOCK_FILE) @@ -510,8 +541,8 @@ def main():          log.error("Failed to open %s : %s", LOCK_FILE, strerror)          output("Failed to open %s. Error: %s" % (LOCK_FILE, strerror)) -    return +    return ret  if __name__ == "__main__": -    main() +    sys.exit(main())  | 
