Skip to content

Commit 5b03f2f

Browse files
committed
c-foreach-restart: added option to execute command on shutdown
1 parent ad53c72 commit 5b03f2f

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

c-foreach-restart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,22 @@ from cassandra.tools.config import LOG_LEVEL
1111
logging.basicConfig(level=LOG_LEVEL)
1212

1313

14-
def main(retries, delay):
14+
def main(retries, delay, post_shutdown):
1515
for instance in get_instances():
16-
instance.restart(retries=retries, delay=delay)
16+
instance.restart(retries=retries, delay=delay, post_shutdown=post_shutdown)
1717

1818
def parse_args():
1919
parser = argparse.ArgumentParser(description="Cassandra instance restarter")
2020
parser.add_argument("-r", "--retries", metavar="RETRIES", default=10, type=int,
2121
help="Maximum number of times to check if service is up.")
2222
parser.add_argument("-d", "--delay", metavar="DELAY", default=6, type=int,
2323
help="Number seconds between connection attempts, in seconds.")
24+
parser.add_argument("--execute-post-shutdown", metavar="CMD", type=str,
25+
help="Command to execute after Cassandra has been shutdown, and before it "
26+
"is started back up.")
2427
return parser.parse_args(sys.argv[1:])
2528

2629

2730
if __name__ == "__main__":
2831
args = parse_args()
29-
main(args.retries, args.delay)
32+
main(args.retries, args.delay, args.execute_post_shutdown)

cassandra/tools/instances.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,36 @@ def __get(key):
4444
"""
4545
Restart this Cassandra instance.
4646
"""
47-
def restart(self, retries=10, delay=6):
47+
def restart(self, retries=10, delay=6, post_shutdown=None):
4848
self.__log_debug("Restarting instance... (retries=%s, delay=%s)", retries, delay)
4949
self.__log_info("Disabling client ports...")
5050
self.nodetool.run("disablebinary")
5151
self.nodetool.run("disablethrift")
5252
self.__log_info("Draining...")
5353
self.nodetool.run("drain")
5454

55-
# Restart Cassandra
56-
self.__log_info("Restarting service %s", self.service_name)
57-
(retcode, stdout, stderr) = call("systemctl", "restart", self.service_name)
58-
if retcode != 0:
59-
self.__log_error("systemctl returned exit code %s", retcode)
55+
def exec_command(*args):
56+
(retcode, stdout, stderr) = call(*args)
6057
stdout = stdout.rstrip()
6158
stderr = stderr.rstrip()
6259
if stdout:
6360
for line in stdout.splitlines():
64-
self.__log_error(line)
61+
self.__log_info(line)
6562
if stderr:
6663
for line in stderr.splitlines():
6764
self.__log_error(line)
65+
if retcode != 0:
66+
self.__log_error("%s returned exit code %s", args[0], retcode)
67+
raise RuntimeError("{} returned exit code {}".format(args[0], retcode))
68+
69+
# Restart Cassandra
70+
self.__log_info("Stopping service %s", self.service_name)
71+
exec_command("systemctl", "stop", self.service_name)
72+
if post_shutdown:
73+
self.__log_info("Executing post-shutdown command: %s", post_shutdown)
74+
exec_command(*(post_shutdown.strip().split()))
75+
self.__log_info("Starting service %s", self.service_name)
76+
exec_command("systemctl", "start", self.service_name)
6877

6978
# Wait for Cassandra to come back up before continuing
7079
listening = False

0 commit comments

Comments
 (0)