blob: 6df5b84eb039ec1cc9c2408b28c5d615c660b01a [file] [log] [blame]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF 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.
: ${JAVA_HOME:?"Please set the JAVA_HOME variable!"}
JVM="java"
sdir="`dirname \"$0\"`"
ldir="`dirname "$(readlink -f "$0")"`"
DIR="$sdir"
if [ "$sdir" != "$ldir" ]; then
DIR="$ldir"
fi
function print_help() {
cat << EOF
Usage: [<command>] [<arguments with flags>]
commands:
upgrade-index Check and upgrade solr index data in core directories.
run-check-index-tool call 'java -cp ... org.apache.lucene.index.IndexUpgrader' directly
run-upgrade-index-tool call 'java -cp ... org.apache.lucene.index.CheckIndex' directly
help print usage
upgrade-index command arguments:
-d, --index-data-dir <DIRECTORY> Location of the solr cores (e.g.: /opt/ambari_infra_solr/data)
-c, --core-filter <FILTER1,FILTER2> Comma separated name filters of core directoies (default: hadoop_logs,audit_logs,history)
-b, --backup-enabled Use indexer tool with backup snapshots. (core filter won't be used)
-g, --debug Enable debug mode, IndexUpgrader output will be verbose.
-f, --force Force to start index upgrade, even is the version is at least 6.
-v, --version Lucene version to upgrade (default: 6.6.2, available: 6.6.2, 7.6.0)
EOF
}
function upgrade_core() {
local INDEX_DIR=${1:?"usage: <index_base_dir> e.g.: /opt/ambari_infra_solr/data"}
local FORCE_UPDATE=${2:?"usage <force_update_flag> e.g.: true"}
local SOLR_CORE_FILTERS=${3:?"usage: <comma separated core filters> e.g.: hadoop_logs,audit_logs,history"}
local LUCENE_VERSION=${4:?"usage <lucene_index_version> e.g.: 7.6.0"}
local BACKUP_MODE=${5:?"usage <backup_mode_enabled> e.g.: true"}
local DEBUG_MODE=${6:?"usage <debug_mode> e.g.: true"}
SOLR_CORE_FILTER_ARR=$(echo $SOLR_CORE_FILTERS | sed "s/,/ /g")
local version_prefix="$(echo $LUCENE_VERSION | head -c 1)"
local write_lock_exists="false"
local core_str="Core"
if [[ "$BACKUP_MODE" == "true" ]]; then
core_str="Snapshot"
fi
local verbose=""
if [[ "$DEBUG_MODE" == "true" ]]; then
verbose="-verbose"
fi
if [[ -f "$INDEX_DIR/write.lock" ]]; then
echo "Deleting $INDEX_DIR/write.lock file..."
write_lock_exists="true"
rm "$INDEX_DIR/write.lock"
fi
for coll in $SOLR_CORE_FILTER_ARR; do
if [[ "$1" == *"$coll"* ]]; then
echo "$core_str '$1' dir name contains $coll (core filter)'";
version=$(PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/migrate/lucene-core-$LUCENE_VERSION.jar:$DIR/migrate/lucene-backward-codecs-$LUCENE_VERSION.jar" org.apache.lucene.index.CheckIndex -fast $1|grep " version="|sed -e 's/.*=//g'|head -1)
if [ -z $version ] ; then
echo "$core_str '$1' - Empty index?"
return
fi
majorVersion=$(echo $version|cut -c 1)
if [ $majorVersion -ge $version_prefix ] && [ $FORCE_UPDATE == "false" ] ; then
echo "$core_str '$1' - Already on version $version, not upgrading. Use -f or --force option to run upgrade anyway."
else
echo "$core_str '$1' - Index version is $version, upgrading ..."
echo "Run: PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/migrate/lucene-core-$LUCENE_VERSION.jar:$DIR/migrate/lucene-backward-codecs-$LUCENE_VERSION.jar" org.apache.lucene.index.IndexUpgrader -delete-prior-commits $verbose $1"
PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/migrate/lucene-core-$LUCENE_VERSION.jar:$DIR/migrate/lucene-backward-codecs-$LUCENE_VERSION.jar" org.apache.lucene.index.IndexUpgrader -delete-prior-commits $verbose $1
echo "Upgrading core '$1' has finished"
fi
fi
done
if [[ "$write_lock_exists" == "true" ]]; then
echo "Putting write.lock file back..."
touch "$INDEX_DIR/write.lock"
fi
}
function upgrade_index() {
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-c|--core-filters)
local SOLR_CORE_FILTERS="$2"
shift 2
;;
-f|--force)
local FORCE_UPDATE="true"
shift
;;
-b|--backup-enabled)
local BACKUP_ENABLED="true"
shift
;;
-g|--debug)
local DEBUG_ENABLED="true"
shift
;;
-d|--index-data-dir)
local INDEX_DIR="$2"
shift 2
;;
-v|--version)
local LUCENE_VERSION="$2"
shift 2
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
if [[ -z "$INDEX_DIR" ]] ; then
echo "Index data dirctory option is required (-d or --index-data-dir). Exiting..."
exit 1
fi
if [[ -z "$BACKUP_ENABLED" ]] ; then
BACKUP_ENABLED="false"
else
if [[ -z "$SOLR_CORE_FILTERS" ]]; then
SOLR_CORE_FILTERS="snapshot"
echo "NOTE: Use 'snapshot' as filter."
fi
fi
if [[ -z "$SOLR_CORE_FILTERS" ]] ; then
SOLR_CORE_FILTERS="hadoop_logs,audit_logs,history"
echo "NOTE: Use 'hadoop_logs,audit_logs,history' as filte."
fi
if [[ -z "$LUCENE_VERSION" ]] ; then
LUCENE_VERSION="6.6.2"
fi
if [[ -z "$FORCE_UPDATE" ]] ; then
FORCE_UPDATE="false"
else
echo "NOTE: Forcing index upgrade is set."
fi
if [[ -z "$DEBUG_ENABLED" ]] ; then
DEBUG_ENABLED="false"
else
echo "NOTE: Debug mode is enabled."
fi
if [[ "$BACKUP_ENABLED" == "true" ]]; then
for SNAPSHOT_DIR in $(find $INDEX_DIR -maxdepth 1 -mindepth 1); do
if $(test -d ${SNAPSHOT_DIR}); then
abspath=$(cd "$(dirname "$SNAPSHOT_DIR")"; pwd)/$(basename "$SNAPSHOT_DIR")
echo "--------------------------------"
echo "Checking snapshot: $abspath"
upgrade_core "$abspath" "$FORCE_UPDATE" "$SOLR_CORE_FILTERS" "$LUCENE_VERSION" "$BACKUP_ENABLED" "$DEBUG_ENABLED"
fi;
done
else
CORES=$(for replica_dir in `find $INDEX_DIR -name data`; do dirname $replica_dir; done);
if [[ -z "$CORES" ]] ; then
echo "No indices found on path $INDEX_DIR"
else
for c in $CORES ; do
if find $c/data -maxdepth 1 -type d -name 'index*' 1> /dev/null 2>&1; then
name=$(echo $c | sed -e 's/.*\///g')
abspath=$(cd "$(dirname "$c")"; pwd)/$(basename "$c")
find $c/data -maxdepth 1 -type d -name 'index*' | while read indexDir; do
echo "--------------------------------"
echo "Checking core $name - $abspath"
upgrade_core "$indexDir" "$FORCE_UPDATE" "$SOLR_CORE_FILTERS" "$LUCENE_VERSION" "$BACKUP_ENABLED" "$DEBUG_ENABLED"
done
else
echo "No index folder found for $name"
fi
done
echo "DONE"
fi
fi
}
function upgrade_index_tool() {
# see: https://cwiki.apache.org/confluence/display/solr/IndexUpgrader+Tool
: ${INDEX_VERSION:?"Please set the INDEX_VERSION variable! (6.6.2 or 7.6.0)"}
PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/migrate/lucene-core-$INDEX_VERSION.jar:$DIR/migrate/lucene-backward-codecs-$INDEX_VERSION.jar" org.apache.lucene.index.IndexUpgrader ${@}
}
function check_index_tool() {
: ${INDEX_VERSION:?"Please set the INDEX_VERSION variable! (6.6.2 or 7.6.0)"}
PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/migrate/lucene-core-$INDEX_VERSION.jar:$DIR/migrate/lucene-backward-codecs-$INDEX_VERSION.jar" org.apache.lucene.index.CheckIndex ${@}
}
function main() {
command="$1"
case $command in
"upgrade-index")
upgrade_index "${@:2}"
;;
"run-check-index-tool")
check_index_tool "${@:2}"
;;
"run-upgrade-index-tool")
upgrade_index_tool "${@:2}"
;;
"help")
print_help
;;
*)
echo "Available commands: (upgrade-index | run-check-index-tool | run-upgrade-index-tool | help)"
;;
esac
}
main ${1+"$@"}