blob: 84d4c663443192be79bca53c6c7e334a7308116b [file]
#!/usr/bin/env bash
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
##########################################################################################
#
# Internal helper script to actually run either solr-orbit or its daemon.
#
# Do not invoke directly but rather use the `benchmark` and `benchmarkd` scripts.
#
##########################################################################################
readonly BINARY_NAME="${__BENCHMARK_INTERNAL_BINARY_NAME}"
readonly HUMAN_NAME="${__BENCHMARK_INTERNAL_HUMAN_NAME}"
install_solrorbit () {
# Check if optional parameter with benchmark binary path, points to an existing executable file.
if [[ $# -ge 1 && -n $1 ]]; then
if [[ -f $1 && -x $1 ]]; then return; fi
fi
# Workaround system pip conflicts, https://github.com/pypa/pip/issues/5599
if [[ ${IN_VIRTUALENV} == 0 ]]; then
python3 -m pip install --quiet --user --upgrade --editable .[develop]
else
python3 -m pip install --quiet --upgrade --editable .[develop]
fi
}
# Attempt to update solr-orbit itself by default but allow user to skip it.
SELF_UPDATE=YES
# Assume that the "main remote" is called "origin"
REMOTE="origin"
# While we could also check via the presence of `VIRTUAL_ENV` this is a bit more reliable.
# Check for both pyvenv and normal venv environments
# https://www.python.org/dev/peps/pep-0405/
if python3 -c 'import os, sys; sys.exit(0) if "VIRTUAL_ENV" in os.environ else sys.exit(1)' >/dev/null 2>&1
then
IN_VIRTUALENV=1
else
IN_VIRTUALENV=0
fi
# Check for parameters that are intended for this script. Note that they only work if they're specified at the beginning (due to how
# the shell builtin `shift` works. We could make it work for arbitrary positions but that's not worth the complexity for such an
# edge case).
for i in "$@"
do
case ${i} in
--update-from-remote=*)
REMOTE="${i#*=}"
shift # past argument=value
;;
--skip-update)
SELF_UPDATE=NO
shift # past argument with no value
;;
# inspect command line options and skip update also if the user has specified --offline.
#
# Note that we do NOT consume this option as it needs to be passed to the benchmark script.
--offline)
SELF_UPDATE=NO
# DO NOT CONSUME!!
;;
# Do not consume unknown parameters; they should still be passed to the actual benchmark script
#*)
esac
done
if [[ $SELF_UPDATE == YES ]]
then
# see http://unix.stackexchange.com/a/155077
if output=$(git status --porcelain) && [ -z "$output" ] && on_master=$(git rev-parse --abbrev-ref HEAD) && [ "$on_master" == "master" ]
then
# Working directory clean -> we assume this is a user that is not actively developing solr-orbit and just upgrade it every time it is invoked
set +e
# this will fail if the user is offline
git fetch ${REMOTE} --quiet >/dev/null 2>&1
exit_code=$?
set -e
if [[ $exit_code == 0 ]]
then
echo "Auto-updating solr-orbit from ${REMOTE}"
git rebase ${REMOTE}/master --quiet
install_solrorbit
#else
# offline - skipping update
fi
else
>&2 echo "There are uncommitted changes. Please cleanup your working copy or specify --skip-update."
exit 1
fi
#else -> No self update
fi
popd >/dev/null 2>&1
# write the actor system's log file to a well-known location (but let the user override it with the same env variable)
export THESPLOG_FILE="${THESPLOG_FILE:-${HOME}/.solr-orbit/logs/actor-system-internal.log}"
# this value is in bytes, the default is 50kB. We increase it to 200kiB.
export THESPLOG_FILE_MAXSIZE=${THESPLOG_FILE_MAXSIZE:-204800}
# adjust the default log level from WARNING
export THESPLOG_THRESHOLD="INFO"
# Provide a consistent binary name to the user and hide the fact that we call another binary under the hood.
export BENCHMARK_ALTERNATIVE_BINARY_NAME=$(basename "$0")
if [[ $IN_VIRTUALENV == 0 ]]
then
BENCHMARK_ROOT=$(python3 -c "import site; print(site.USER_BASE)")
BENCHMARK_BIN=${BENCHMARK_ROOT}/bin/${BINARY_NAME}
install_solrorbit "${BENCHMARK_BIN}"
if [[ -x $BENCHMARK_BIN ]]; then
${BENCHMARK_BIN} "$@"
else
echo "Cannot execute ${HUMAN_NAME} in ${BENCHMARK_BIN}."
fi
else
install_solrorbit "${BINARY_NAME}"
${BINARY_NAME} "$@"
fi