| #!/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}/../../resources/log4j2-console.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 |
| |