lucene/solr/server/scripts/cloud-scripts/snapshotscli.sh

177 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
run_solr_snapshot_tool() {
JVM="java"
scriptDir=$(dirname "$0")
if [ -n "$LOG4J_PROPS" ]; then
log4j_config="file:${LOG4J_PROPS}"
else
log4j_config="file:${scriptDir}/log4j2.xml"
fi
PATH=${JAVA_HOME}/bin:${PATH} ${JVM} ${ZKCLI_JVM_FLAGS} -Dlog4j.configurationFile=${log4j_config} \
-classpath "${solrLibPath}" org.apache.solr.core.snapshots.SolrSnapshotsTool "$@" 2> /dev/null
}
usage() {
run_solr_snapshot_tool --help
}
distcp_warning() {
echo "SOLR_USE_DISTCP environment variable is not set. \
Do you want to use hadoop distcp tool for exporting Solr collection snapshot ?"
}
parse_options() {
OPTIND=3
while getopts ":c:d:s:z:p:r:i:" o ; do
case "${o}" in
d)
destPath=${OPTARG}
;;
s)
sourcePath=${OPTARG}
;;
c)
collectionName=${OPTARG}
;;
z)
solrZkEnsemble=${OPTARG}
;;
p)
pathPrefix=${OPTARG}
;;
r)
backupRepoName=${OPTARG}
;;
i)
aysncReqId=${OPTARG}
;;
*)
echo "Unknown option ${OPTARG}"
usage 1>&2
exit 1
;;
esac
done
}
prepare_snapshot_export() {
#Make sure to cleanup the temporary files.
scratch=$(mktemp -d -t solrsnaps.XXXXXXXXXX)
function finish {
rm -rf "${scratch}"
}
trap finish EXIT
if hdfs dfs -test -d "${destPath}" ; then
run_solr_snapshot_tool --prepare-snapshot-export "$@" -t "${scratch}"
hdfs dfs -mkdir -p "${copyListingDirPath}" > /dev/null
find "${scratch}" -type f -printf "%f\n" | while read shardId; do
echo "Copying the copy-listing for $shardId"
hdfs dfs -copyFromLocal "${scratch}/${shardId}" "${copyListingDirPath}" > /dev/null
done
else
echo "Directory ${destPath} does not exist."
exit 1
fi
}
copy_snapshot_files() {
copylisting_dir_path="$1"
if hdfs dfs -test -d "${copylisting_dir_path}" ; then
for shardId in $(hdfs dfs -stat "%n" "${copylisting_dir_path}/*"); do
oPath="${destPath}/${snapshotName}/snapshot.${shardId}"
echo "Copying the index files for ${shardId} to ${oPath}"
${distCpCmd} -f "${copylisting_dir_path}/${shardId}" "${oPath}" > /dev/null
done
else
echo "Directory ${copylisting_dir_path} does not exist."
exit 1
fi
}
collectionName=""
solrZkEnsemble=""
pathPrefix=""
destPath=""
sourcePath=""
cmd="$1"
snapshotName="$2"
copyListingDirPath=""
distCpCmd="${SOLR_DISTCP_CMD:-hadoop distcp}"
scriptDir=$(dirname "$0")
solrLibPath="${SOLR_LIB_PATH:-${scriptDir}/../../solr-webapp/webapp/WEB-INF/lib/*:${scriptDir}/../../lib/ext/*}"
case "${cmd}" in
--create)
run_solr_snapshot_tool "$@"
;;
--delete)
run_solr_snapshot_tool "$@"
;;
--list)
run_solr_snapshot_tool "$@"
;;
--describe)
run_solr_snapshot_tool "$@"
;;
--prepare-snapshot-export)
: "${SOLR_USE_DISTCP:? $(distcp_warning)}"
parse_options "$@"
: "${destPath:? Please specify destination directory using -d option}"
copyListingDirPath="${destPath}/copylistings"
prepare_snapshot_export "${@:2}"
echo "Done. GoodBye!"
;;
--export)
if [ -z "${SOLR_USE_DISTCP}" ]; then
run_solr_snapshot_tool "$@"
echo "Done. GoodBye!"
exit 0
fi
parse_options "$@"
: "${snapshotName:? Please specify the name of the snapshot}"
: "${destPath:? Please specify destination directory using -d option}"
if [ -n "${collectionName}" ] && [ -n "${sourcePath}" ]; then
echo "The -c and -s options can not be specified together"
exit 1
fi
if [ -z "${collectionName}" ] && [ -z "${sourcePath}" ]; then
echo "At least one of options (-c or -s) must be specified"
exit 1
fi
if [ -n "${collectionName}" ]; then
copyListingDirPath="${destPath}/${snapshotName}/copylistings"
prepare_snapshot_export "${@:2}"
copy_snapshot_files "${destPath}/${snapshotName}/copylistings"
hdfs dfs -rm -r -f -skipTrash "${destPath}/${snapshotName}/copylistings" > /dev/null
else
copy_snapshot_files "${sourcePath}/copylistings"
echo "Copying the collection meta-data to ${destPath}/${snapshotName}"
${distCpCmd} "${sourcePath}/${snapshotName}/*" "${destPath}/${snapshotName}/" > /dev/null
fi
echo "Done. GoodBye!"
;;
--help)
usage 1>&2
;;
*)
echo "Unknown command ${cmd}"
usage 1>&2
exit 1
esac