diff options
Diffstat (limited to 'heartbeat/fio.in')
-rw-r--r-- | heartbeat/fio.in | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/heartbeat/fio.in b/heartbeat/fio.in new file mode 100644 index 0000000..4a31251 --- /dev/null +++ b/heartbeat/fio.in @@ -0,0 +1,178 @@ +#!@BASH_SHELL@ +# +# fio RA +# +# Copyright (c) 2010 SUSE Linux Products GmbH, Lars Marowsky-Brée +# All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of version 2 of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Further, this software is distributed without any warranty that it is +# free of the rightful claim of any third person regarding infringement +# or the like. Any license provided herein, whether implied or +# otherwise, applies only to this software file. Patent licenses, if +# any, provided herein do not apply to combinations of this program with +# other software, or any other product whatsoever. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. +# + +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +# Parameter defaults + +OCF_RESKEY_args_default="" + +: ${OCF_RESKEY_args=${OCF_RESKEY_args_default}} + +####################################################################### + +meta_data() { + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="fio" version="1.0"> +<version>1.0</version> + +<longdesc lang="en"> +fio is a generic I/O load generator. This RA allows start/stop of fio +instances to simulate load on a cluster without configuring complex +services. +</longdesc> +<shortdesc lang="en">fio IO load generator</shortdesc> + +<parameters> +<parameter name="args"> +<longdesc lang="en"> +Arguments to the fio client. Minimally, this should be a (list of) job +descriptions to run. +</longdesc> +<shortdesc lang="en">fio arguments</shortdesc> +<content type="string" default="${OCF_RESKEY_args_default}" /> +</parameter> + +</parameters> + +<actions> +<action name="start" timeout="60s" /> +<action name="stop" timeout="60s" /> +<action name="monitor" timeout="60s" interval="10s" /> +<action name="meta-data" timeout="5s" /> +<action name="validate-all" timeout="20s" /> +</actions> +</resource-agent> +END +} + +####################################################################### + +fio_usage() { + cat <<END +usage: $0 {start|stop|monitor|validate-all|meta-data} +END +} + +fio_start() { + fio_monitor ; rc=$? + if [ $rc = $OCF_SUCCESS ]; then + ocf_log info "fio already running." + exit $OCF_SUCCESS + fi + if [ $rc != $OCF_NOT_RUNNING ]; then + ocf_log info "fio apparently dead; cleaning up before restart" + fio_stop + fi + fio $OCF_RESKEY_args >/dev/null 2>&1 </dev/null & + fio_pid=`jobs -p` + echo $fio_pid >${fio_state_file} + ocf_log info "fio started as pid=$fio_pid" + exit $OCF_SUCCESS +} + +fio_stop() { + for sig in SIGINT SIGTERM SIGKILL ; do + fio_monitor ; rc=$? + case $rc in + $OCF_NOT_RUNNING) + ocf_log info "fio already stopped." + exit $OCF_SUCCESS + ;; + $OCF_ERR_GENERIC) + rm $fio_state_file + ocf_log info "fio stopped and cleaned up." + exit $OCF_SUCCESS + ;; + $OCF_SUCCESS) + if [ -n "$fio_pid" ]; then + ocf_log info "Sending $sig to fio (pid=$fio_pid)" + kill -$sig $fio_pid + sleep 3 + continue + fi + ocf_log err "Internal logic failure in fio RA." + ;; + *) ocf_log err "Internal logic failure in fio RA." + ;; + esac + done + ocf_log err "fio did not stop! Perhaps hung on IO?" + exit $OCF_ERR_GENERIC +} + +fio_monitor() { + fio_state_file="${HA_RSCTMP}/fio-${OCF_RESOURCE_INSTANCE}.state" + if [ ! -e $fio_state_file ]; then + return $OCF_NOT_RUNNING + fi + fio_pid=`cat $fio_state_file` + + if [ -z "$fio_pid" ]; then + ocf_log err "State file found, but empty. Assuming stopped." + return $OCF_NOT_RUNNING + fi + + ps=`ps h -o comm $fio_pid 2>&1` + if [ "$ps" != "fio" ]; then + fio_pid="" + return $OCF_ERR_GENERIC + fi + return $OCF_SUCCESS +} + +fio_validate() { + return $OCF_SUCCESS +} + +case $__OCF_ACTION in + meta-data) meta_data + exit $OCF_SUCCESS + ;; + validate-all) fio_validate;; + usage|help) fio_usage + exit $OCF_SUCCESS + ;; +esac + +ocf_is_probe || check_binary fio + +case $__OCF_ACTION in + start) fio_start;; + stop) fio_stop;; + monitor) fio_monitor;; + *) fio_usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac + |