Merge "Revert "Build retry loop for screen sessions""
diff --git a/functions-common b/functions-common
index 0bf354f..613a86c 100644
--- a/functions-common
+++ b/functions-common
@@ -1058,100 +1058,44 @@
echo $!
}
-function _start_in_screen {
- local service=$1
- local cmd=$2
- local screen_name=${SCREEN_NAME:-stack}
- local status_dir=${SERVICE_DIR:-${DEST}/status}
- local service_dir="$status_dir/$screen_name"
- local pid="$service_dir/$service.pid"
- local failure="$service_dir/$service.failure"
-
- if [[ -n ${SCREEN_LOGDIR} ]]; then
- local logfile=${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log
- local shortlog=${SCREEN_LOGDIR}/screen-${service}.log
- # this whole dance is done because of slow nodes
- screen -S $screen_name -p $service -X logfile ${logfile}
- screen -S $screen_name -p $service -X log on
- ln -sf ${logfile} ${shortlog}
- fi
-
- NL=`echo -ne '\015'`
- # This fun command does the following:
- # - the passed server command is backgrounded
- # - the pid of the background process is saved in the usual place
- # - the server process is brought back to the foreground
- # - if the server process exits prematurely the fg command errors
- # and a message is written to stdout and the service failure file
- # The pid saved can be used in screen_stop() as a process group
- # id to kill off all child processes
- echo "Running: $cmd & echo \$! >$pid; fg || echo \"$service failed to start\" | tee \"$failure\"$NL"
- screen -S $screen_name -p $service -X stuff "$cmd & echo \$! >$pid; fg || echo \"$service failed to start\" | tee \"$failure\"$NL"
-}
-
-
-function _is_running_in_screen {
- local service=$1
- local screen_name=${SCREEN_NAME:-stack}
- local status_dir=${SERVICE_DIR:-${DEST}/status}
- local service_dir="$status_dir/$screen_name"
- local pid="$service_dir/$service.pid"
- local failure="$service_dir/$service.failure"
- if [[ ! -e "$pid" && ! -e "$failure" ]]; then
- # if we don't have a pid or a failure for why, the command may not
- # have stuffed in there
- echo "Warning: neither $pid nor $failure exist, $service didn't seem to start"
- return 1
- fi
- if [[ -n ${SCREEN_LOGDIR} ]]; then
- # if we should be logging, but we don't have a log file, something is wrong
- local logfile=${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log
- if [[ ! -e "$logfile" ]]; then
- echo "Warning: expected logfile $logfile not found, something wrong with starting $service"
- return 1
- fi
- fi
- return 0
-}
-
# Helper to launch a service in a named screen
# screen_it service "command-line"
function screen_it {
- local service=$1
- local cmd=$2
- local screen_name=${SCREEN_NAME:-stack}
- local status_dir=${SERVICE_DIR:-${DEST}/status}
- local service_dir="$status_dir/$screen_name"
- local use_screen=$(trueorfalse True $USE_SCREEN)
- local pid="$service_dir/$service.pid"
+ SCREEN_NAME=${SCREEN_NAME:-stack}
+ SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
+ USE_SCREEN=$(trueorfalse True $USE_SCREEN)
if is_service_enabled $1; then
# Append the service to the screen rc file
- screen_rc "$service" "$cmd"
+ screen_rc "$1" "$2"
- if [[ "$use_screen" = "True" ]]; then
- screen -S $screen_name -X screen -t $service
+ if [[ "$USE_SCREEN" = "True" ]]; then
+ screen -S $SCREEN_NAME -X screen -t $1
- # this retry loop brought to you by slow compute nodes, screen raciness,
- # and frustration in upgrading.
- local screen_tries=0
- while [ "$screen_tries" -lt 10 ]; do
- _start_in_screen "$service" "$cmd"
- if _is_running_in_screen $service; then
- screen_tries=10
- else
- screen_tries=$[screen_tries + 1]
- echo "Failed to start service after $screen_tries attempt(s), retrying"
- if [[ "$screen_tries" -eq 10 ]]; then
- echo "Too many retries, giving up"
- exit 1
- fi
- sleep 1
- fi
- done
+ if [[ -n ${SCREEN_LOGDIR} ]]; then
+ screen -S $SCREEN_NAME -p $1 -X logfile ${SCREEN_LOGDIR}/screen-${1}.${CURRENT_LOG_TIME}.log
+ screen -S $SCREEN_NAME -p $1 -X log on
+ ln -sf ${SCREEN_LOGDIR}/screen-${1}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${1}.log
+ fi
+
+ # sleep to allow bash to be ready to be send the command - we are
+ # creating a new window in screen and then sends characters, so if
+ # bash isn't running by the time we send the command, nothing happens
+ sleep 3
+
+ NL=`echo -ne '\015'`
+ # This fun command does the following:
+ # - the passed server command is backgrounded
+ # - the pid of the background process is saved in the usual place
+ # - the server process is brought back to the foreground
+ # - if the server process exits prematurely the fg command errors
+ # and a message is written to stdout and the service failure file
+ # The pid saved can be used in screen_stop() as a process group
+ # id to kill off all child processes
+ screen -S $SCREEN_NAME -p $1 -X stuff "$2 & echo \$! >$SERVICE_DIR/$SCREEN_NAME/$1.pid; fg || echo \"$1 failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/$1.failure\"$NL"
else
# Spawn directly without screen
- run_process "$service" "$cmd" >$pid
+ run_process "$1" "$2" >$SERVICE_DIR/$SCREEN_NAME/$1.pid
fi
fi
}