From 58e21349644f42d4aff078e4da26ecd98d76ba19 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Mon, 11 Feb 2013 16:48:12 -0800 Subject: [PATCH] Add option to make screen starting more robust. We have seen a number of failures in ci where a host is overloaded and the 1.5 second sleep before stuffing data into screen is not long enough. This means the service doesn't start and tests fail. This change adds a config option to allow us to turn off the developer friendly option to stuff text into the screen. When SCREEN_DEV is set to False it will use a simple exec in screen instead of stuff. This should be far more reliable because we don't have to wait for bash to start. Change-Id: I7f1b5dbf5329b23507cb767d54a2795be0d73e01 --- functions | 25 +++++++++++++++---------- stackrc | 7 +++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/functions b/functions index 3f26b7fd4b..79c82a459d 100644 --- a/functions +++ b/functions @@ -738,26 +738,31 @@ function restart_service() { # Helper to launch a service in a named screen # screen_it service "command-line" function screen_it { - NL=`echo -ne '\015'` SCREEN_NAME=${SCREEN_NAME:-stack} SERVICE_DIR=${SERVICE_DIR:-${DEST}/status} + SCREEN_DEV=`trueorfalse True $SCREEN_DEV` if is_service_enabled $1; then # Append the service to the screen rc file screen_rc "$1" "$2" screen -S $SCREEN_NAME -X screen -t $1 - # 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 1.5 + if [[ "$SCREEN_DEV" = "True" ]]; then + # 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 1.5 - 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 + 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 + NL=`echo -ne '\015'` + screen -S $SCREEN_NAME -p $1 -X stuff "$2 || touch \"$SERVICE_DIR/$SCREEN_NAME/$1.failure\"$NL" + else + screen -S $SCREEN_NAME -p $1 -X exec /bin/bash -c "$2 || touch \"$SERVICE_DIR/$SCREEN_NAME/$1.failure\"" fi - screen -S $SCREEN_NAME -p $1 -X stuff "$2 || touch \"$SERVICE_DIR/$SCREEN_NAME/$1.failure\"$NL" fi } diff --git a/stackrc b/stackrc index 789fc82d76..91f4e2b5d0 100644 --- a/stackrc +++ b/stackrc @@ -29,6 +29,13 @@ ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,cinder,c-s # Set the default Nova APIs to enable NOVA_ENABLED_APIS=ec2,osapi_compute,metadata +# Whether to use 'dev mode' for screen windows. Dev mode works by +# stuffing text into the screen windows so that a developer can use +# ctrl-c, up-arrow, enter to restart the service. Starting services +# this way is slightly unreliable, and a bit slower, so this can +# be disabled for automated testing by setting this value to false. +SCREEN_DEV=True + # Repositories # ------------