Cinder and etcd are enabled by default and by default cinder uses etcd as a distributed lock manager with tooz as an intermediary. We see a lot of ToozConnectionErrors [1] in the cinder logs when etcd is backed up [2] which results in cinder operations timing out causing test failures, like when a volume is not deleted within a given time. This changes ETCD_USE_RAMDISK=True by default to try and alleviate some of the pressure. An alternative is if we know we're in a single-node job we could just not use a DLM for Cinder. [1] http://status.openstack.org/elastic-recheck/#1810526 [2] etcd[26824]: sync duration of 12.076762123s, expected less than 1s Change-Id: I5f82aa40e9d84114e7b7b5cf19ec4942d6552490 Partial-Bug: #1810526
		
			
				
	
	
		
			137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/bash
 | 
						|
#
 | 
						|
# lib/etcd3
 | 
						|
#
 | 
						|
# Functions to control the installation and configuration of etcd 3.x
 | 
						|
# that provides a key-value store (and possibly other functions).
 | 
						|
 | 
						|
# Dependencies:
 | 
						|
#
 | 
						|
# - ``functions`` file
 | 
						|
 | 
						|
# ``stack.sh`` calls the entry points in this order:
 | 
						|
#
 | 
						|
# - start_etcd3
 | 
						|
# - stop_etcd3
 | 
						|
# - cleanup_etcd3
 | 
						|
 | 
						|
# Save trace setting
 | 
						|
_XTRACE_ETCD3=$(set +o | grep xtrace)
 | 
						|
set +o xtrace
 | 
						|
 | 
						|
 | 
						|
# Defaults
 | 
						|
# --------
 | 
						|
 | 
						|
# Set up default values for etcd
 | 
						|
ETCD_DATA_DIR="$DATA_DIR/etcd"
 | 
						|
ETCD_SYSTEMD_SERVICE="devstack@etcd.service"
 | 
						|
ETCD_BIN_DIR="$DEST/bin"
 | 
						|
# Option below will mount ETCD_DATA_DIR as ramdisk, which is useful to run
 | 
						|
# etcd-heavy services in the gate VM's, e.g. Kubernetes.
 | 
						|
ETCD_USE_RAMDISK=$(trueorfalse True ETCD_USE_RAMDISK)
 | 
						|
ETCD_RAMDISK_MB=${ETCD_RAMDISK_MB:-512}
 | 
						|
 | 
						|
if is_ubuntu ; then
 | 
						|
    UBUNTU_RELEASE_BASE_NUM=`lsb_release -r | awk '{print $2}' | cut -d '.' -f 1`
 | 
						|
fi
 | 
						|
 | 
						|
# start_etcd3() - Starts to run the etcd process
 | 
						|
function start_etcd3 {
 | 
						|
    local cmd="$ETCD_BIN_DIR/etcd"
 | 
						|
    cmd+=" --name $HOSTNAME --data-dir $ETCD_DATA_DIR"
 | 
						|
    cmd+=" --initial-cluster-state new --initial-cluster-token etcd-cluster-01"
 | 
						|
    cmd+=" --initial-cluster $HOSTNAME=http://$SERVICE_HOST:$ETCD_PEER_PORT"
 | 
						|
    cmd+=" --initial-advertise-peer-urls http://$SERVICE_HOST:$ETCD_PEER_PORT"
 | 
						|
    cmd+=" --advertise-client-urls http://$SERVICE_HOST:$ETCD_PORT"
 | 
						|
    if [ "$SERVICE_LISTEN_ADDRESS" == "::" ]; then
 | 
						|
        cmd+=" --listen-peer-urls http://[::]:$ETCD_PEER_PORT "
 | 
						|
    else
 | 
						|
        cmd+=" --listen-peer-urls http://0.0.0.0:$ETCD_PEER_PORT "
 | 
						|
    fi
 | 
						|
    cmd+=" --listen-client-urls http://$SERVICE_HOST:$ETCD_PORT"
 | 
						|
    if [ "$ENABLE_DEBUG_LOG_LEVEL" == "True" ]; then
 | 
						|
        cmd+=" --debug"
 | 
						|
    fi
 | 
						|
 | 
						|
    local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
 | 
						|
    write_user_unit_file $ETCD_SYSTEMD_SERVICE "$cmd" "" "root"
 | 
						|
 | 
						|
    iniset -sudo $unitfile "Unit" "After" "network.target"
 | 
						|
    iniset -sudo $unitfile "Service" "Type" "notify"
 | 
						|
    iniset -sudo $unitfile "Service" "Restart" "on-failure"
 | 
						|
    iniset -sudo $unitfile "Service" "LimitNOFILE" "65536"
 | 
						|
    if is_arch "aarch64"; then
 | 
						|
        iniset -sudo $unitfile "Service" "Environment" "ETCD_UNSUPPORTED_ARCH=arm64"
 | 
						|
    fi
 | 
						|
 | 
						|
    $SYSTEMCTL daemon-reload
 | 
						|
    $SYSTEMCTL enable $ETCD_SYSTEMD_SERVICE
 | 
						|
    $SYSTEMCTL start $ETCD_SYSTEMD_SERVICE
 | 
						|
}
 | 
						|
 | 
						|
# stop_etcd3() stops the etcd3 process
 | 
						|
function stop_etcd3 {
 | 
						|
    # Don't install in sub nodes (multinode scenario)
 | 
						|
    if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
 | 
						|
        return
 | 
						|
    fi
 | 
						|
 | 
						|
    $SYSTEMCTL stop $ETCD_SYSTEMD_SERVICE
 | 
						|
}
 | 
						|
 | 
						|
function cleanup_etcd3 {
 | 
						|
    # Don't install in sub nodes (multinode scenario)
 | 
						|
    if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
 | 
						|
        return
 | 
						|
    fi
 | 
						|
 | 
						|
    $SYSTEMCTL disable $ETCD_SYSTEMD_SERVICE
 | 
						|
 | 
						|
    local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
 | 
						|
    sudo rm -f $unitfile
 | 
						|
 | 
						|
    $SYSTEMCTL daemon-reload
 | 
						|
 | 
						|
    if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
 | 
						|
        sudo umount $ETCD_DATA_DIR
 | 
						|
    fi
 | 
						|
    sudo rm -rf $ETCD_DATA_DIR
 | 
						|
}
 | 
						|
 | 
						|
function install_etcd3 {
 | 
						|
    echo "Installing etcd"
 | 
						|
 | 
						|
    # Create the necessary directories
 | 
						|
    sudo mkdir -p $ETCD_BIN_DIR
 | 
						|
    sudo mkdir -p $ETCD_DATA_DIR
 | 
						|
    if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
 | 
						|
        sudo mount -t tmpfs -o nodev,nosuid,size=${ETCD_RAMDISK_MB}M tmpfs $ETCD_DATA_DIR
 | 
						|
    fi
 | 
						|
 | 
						|
    # Download and cache the etcd tgz for subsequent use
 | 
						|
    local etcd_file
 | 
						|
    etcd_file="$(get_extra_file $ETCD_DOWNLOAD_LOCATION)"
 | 
						|
    if [ ! -f "$FILES/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd" ]; then
 | 
						|
        echo "${ETCD_SHA256} $etcd_file" > $FILES/etcd.sha256sum
 | 
						|
        # NOTE(yuanke wei): rm the damaged file when checksum fails
 | 
						|
        sha256sum -c $FILES/etcd.sha256sum || (sudo rm -f $etcd_file; exit 1)
 | 
						|
 | 
						|
        tar xzvf $etcd_file -C $FILES
 | 
						|
        sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
 | 
						|
        sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
 | 
						|
    fi
 | 
						|
    if [ ! -f "$ETCD_BIN_DIR/etcd" ]; then
 | 
						|
        sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
 | 
						|
        sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# Restore xtrace
 | 
						|
$_XTRACE_ETCD3
 | 
						|
 | 
						|
# Tell emacs to use shell-script-mode
 | 
						|
## Local variables:
 | 
						|
## mode: shell-script
 | 
						|
## End:
 |