Add mechanism to gracefully exit on SIGINT

This commit adds functionality for a user to exit out of a long running
browbeat configuration by using SIGINT. On catchinga  SIGINT, browbeat
compeltes the current workload and then exits.

To keep the code lightweight, browbeat termination on SIGINT happens
only at a workload level. The current running workload (in case of
rally, the scenarios and concurrencies associated with the workload) is
finished.

Change-Id: Iaa1f10233dabd053293327f42f8bd1320f1af95d
This commit is contained in:
Sai Sindhur Malleni 2018-05-23 15:49:41 -06:00
parent 4be23046b8
commit 0966eb930c
1 changed files with 50 additions and 32 deletions

View File

@ -15,9 +15,9 @@ import argparse
import datetime
import logging
import os
import signal
import sys
import time
import browbeat.elastic
import browbeat.tools
import browbeat.workloadbase
@ -28,6 +28,49 @@ _workload_opts = ['perfkit', 'rally', 'shaker', 'yoda']
_config_file = 'browbeat-config.yaml'
debug_log_file = 'log/debug.log'
terminate = False
def handle_signal(signum, stack):
global terminate
terminate = True
signal.signal(signal.SIGINT, handle_signal)
def run_iteration(_config, _cli_args, result_dir_ts, _logger, tools):
global terminate
for workload in _config["workloads"]:
if not workload["enabled"]:
_logger.info("{} workload {} disabled in browbeat config".format(workload["type"],
workload["name"]))
continue
if not workload["type"] in _cli_args.workloads:
_logger.info("{} workload {} disabled via cli".format(workload["type"],
workload["name"]))
continue
_logger.info("{} workload {} is enabled".format(workload["type"], workload["name"]))
tools.run_workload(workload, result_dir_ts, 0)
browbeat.workloadbase.WorkloadBase.display_summary()
if terminate:
return
def run_complete(_config, _cli_args, result_dir_ts, _logger, tools):
global terminate
for iteration in range(0, _config["browbeat"]["rerun"]):
for workload in _config["workloads"]:
if not workload["enabled"]:
_logger.info("{} workload {} disabled in browbeat config"
.format(workload["type"], workload["name"]))
continue
if not workload["type"] in _cli_args.workloads:
_logger.info("{} workload {} disabled via cli".format(workload["type"],
workload["name"]))
continue
_logger.info("{} workload {} is enabled".format(workload["type"], workload["name"]))
tools.run_workload(workload, result_dir_ts, iteration)
browbeat.workloadbase.WorkloadBase.display_summary()
if terminate:
return
def main():
parser = argparse.ArgumentParser(
@ -114,42 +157,17 @@ def main():
tools.gather_metadata()
_logger.info("Running workload(s): {}".format(','.join(_cli_args.workloads)))
# Iteration rerun_type pushes rerun logic down to the workload itself. This allows the workload
# to run multiple times before moving to the next workload
if _config["browbeat"]["rerun_type"] == "iteration":
for workload in _config["workloads"]:
if not workload["enabled"]:
_logger.info("{} workload {} disabled in browbeat config".format(workload["type"],
workload["name"]))
continue
if not workload["type"] in _cli_args.workloads:
_logger.info(
"{} workload {} disabled via cli".format(workload["type"], workload["name"]))
continue
_logger.info("{} workload {} is enabled".format(workload["type"], workload["name"]))
tools.run_workload(workload, result_dir_ts, 0)
browbeat.workloadbase.WorkloadBase.display_summary()
run_iteration(_config, _cli_args, result_dir_ts, _logger, tools)
elif _config["browbeat"]["rerun_type"] == "complete":
# Complete rerun_type, reruns after all workloads have been run.
for run_iteration in range(0, _config["browbeat"]["rerun"]):
for workload in _config["workloads"]:
if not workload["enabled"]:
_logger.info("{} workload {} disabled in browbeat config"
.format(workload["type"], workload["name"]))
continue
if not workload["type"] in _cli_args.workloads:
_logger.info("{} workload {} disabled via cli".format(workload["type"],
workload["name"]))
continue
_logger.info("{} workload {} is enabled".format(workload["type"], workload["name"]))
tools.run_workload(workload, result_dir_ts, run_iteration)
browbeat.workloadbase.WorkloadBase.display_summary()
run_complete(_config, _cli_args, result_dir_ts, _logger, tools)
if terminate:
_logger.info("Browbeat execution halting due to user intervention")
sys.exit(1)
browbeat.workloadbase.WorkloadBase.dump_report(results_path, result_dir_ts)
_logger.info("Saved browbeat result summary to {}"
.format(os.path.join(results_path, "{}.report".format(result_dir_ts))))