From 6662a12c71bb0e42405a905b1d58d0399a1bf91d Mon Sep 17 00:00:00 2001 From: Timothy Potter Date: Wed, 6 Aug 2014 16:30:01 +0000 Subject: [PATCH] SOLR-3617: start/stop script with support for running examples git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1616271 13f79535-47bb-0310-9956-ffa450edef68 --- solr/bin/oom_solr.sh | 29 ++ solr/bin/solr | 859 +++++++++++++++++++++++++++++++++++++++++++ solr/bin/solr.cmd | 653 ++++++++++++++++++++++++++++++++ solr/bin/solr.in.cmd | 67 ++++ solr/bin/solr.in.sh | 70 ++++ solr/build.xml | 2 +- 6 files changed, 1679 insertions(+), 1 deletion(-) create mode 100755 solr/bin/oom_solr.sh create mode 100755 solr/bin/solr create mode 100644 solr/bin/solr.cmd create mode 100644 solr/bin/solr.in.cmd create mode 100644 solr/bin/solr.in.sh diff --git a/solr/bin/oom_solr.sh b/solr/bin/oom_solr.sh new file mode 100755 index 00000000000..705280324c9 --- /dev/null +++ b/solr/bin/oom_solr.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# 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. + +SOLR_PORT=$1 +SOLR_PID=`ps waux | grep start.jar | grep $SOLR_PORT | grep -v grep | awk '{print $2}' | sort -r` +if [ "$SOLR_PID" == "" ]; then + echo "Couldn't find Solr process running on port $SOLR_PORT!" + exit +fi +NOW=$(date +"%F%T") +( +echo "Running OOM killer script for process $SOLR_PID for Solr on port $SOLR_PORT" +kill -9 $SOLR_PID +echo "Killed process $SOLR_PID" +) | tee solr_oom_killer-$SOLR_PORT-$NOW.log diff --git a/solr/bin/solr b/solr/bin/solr new file mode 100755 index 00000000000..45334e77262 --- /dev/null +++ b/solr/bin/solr @@ -0,0 +1,859 @@ +#!/usr/bin/env 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. + + +# CONTROLLING STARTUP: +# +# Use solr -help to see available command-line options. In addition +# to passing command-line options, this script looks for an include +# file named solr.in.sh to set environment variables. Specifically, +# the following locations are searched: +# +# ./ +# $HOME/.solr.in.sh +# /usr/share/solr +# /usr/local/share/solr +# /opt/solr +# +# Another option is to specify the full path to the include file in the +# environment. For example: +# +# $ SOLR_INCLUDE=/path/to/solr.in.sh solr start +# +# Note: This is particularly handy for running multiple instances on a +# single installation, or for quick tests. +# +# Finally, developers and enthusiasts who frequently run from an SVN +# checkout, and do not want to locally modify bin/solr.in.sh, can put +# a customized include file at ~/.solr.in.sh. +# +# If you would rather configure startup entirely from the environment, you +# can disable the include by exporting an empty SOLR_INCLUDE, or by +# ensuring that no include files exist in the aforementioned search list. + +SOLR_SCRIPT="$0" +verbose=false +isLegacyExampleDir=false + +# Resolve symlinks to this script +while [ -h "$SOLR_SCRIPT" ] ; do + ls=`ls -ld "$SOLR_SCRIPT"` + # Drop everything prior to -> + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SOLR_SCRIPT="$link" + else + SOLR_SCRIPT=`dirname "$SOLR_SCRIPT"`/"$link" + fi +done + +SOLR_TIP=`dirname "$SOLR_SCRIPT"`/.. +SOLR_TIP=`cd "$SOLR_TIP"; pwd` + +# TODO: see SOLR-3619, need to support server or example +# depending on the version of Solr +if [ -e "$SOLR_TIP/server/start.jar" ]; then + DEFAULT_SERVER_DIR=$SOLR_TIP/server +else + DEFAULT_SERVER_DIR=$SOLR_TIP/example + isLegacyExampleDir=true +fi + +if [ "$SOLR_JAVA_HOME" != "" ]; then + JAVA=$SOLR_JAVA_HOME/bin/java +elif [ -n "$JAVA_HOME" ]; then + for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do + if [ -x "$java" ]; then + JAVA="$java" + break + fi + done +else + JAVA=java +fi + +# test that Java exists and is executable on this server +$JAVA -version >/dev/null 2>&1 || { echo >&2 "Java is required to run Solr! Please install Java 7 or 8 before running this script."; exit 1; } + +function print_usage() { + CMD="$1" + ERROR_MSG="$2" + + if [ "$ERROR_MSG" != "" ]; then + echo "$ERROR_MSG" + fi + + if [ "$CMD" == "" ]; then + echo "" + echo "Usage: solr COMMAND OPTIONS" + echo " where COMMAND is one of: start, stop, restart, healthcheck" + echo "" + echo " Example: Start Solr running in the background on port 8984:" + echo "" + echo " ./solr start -p 8984" + echo "" + echo "Pass -help after any COMMAND to see command-specific usage information," + echo " such as: ./solr start -help" + echo "" + elif [[ "$CMD" == "start" || "$CMD" == "restart" ]]; then + echo "" + echo "Usage: solr $CMD [-f] [-c] [-h hostname] [-p port] [-d directory] [-z zkHost] [-m memory] [-e example] [-V]" + echo "" + echo " -f Start Solr in foreground; default starts Solr in the background" + echo " and sends stdout / stderr to solr-PORT-console.log" + echo "" + echo " -c or -cloud Start Solr in SolrCloud mode; if -z not supplied, an embedded ZooKeeper" + echo " instance is started on Solr port+1000, such as 9983 if Solr is bound to 8983" + echo "" + echo " -h Specify the hostname for this Solr instance" + echo "" + echo " -p Specify the port to start the Solr HTTP listener on; default is 8983" + echo "" + echo " -d Specify the Solr server directory; defaults to server" + echo "" + echo " -z ZooKeeper connection string; only used when running in SolrCloud mode using -c" + echo " To launch an embedded ZooKeeper instance, don't pass this parameter." + echo "" + echo " -m Sets the min (-Xms) and max (-Xmx) heap size for the JVM, such as: -m 4g" + echo " results in: -Xms4g -Xmx4g; by default, this script sets the heap size to 512m" + echo "" + echo " -e Name of the example to run; available examples:" + echo " cloud: SolrCloud example" + echo " default: Solr default example" + echo " dih: Data Import Handler" + echo " schemaless: Schema-less example" + echo " multicore: Multicore" + echo "" + echo " -noprompt Don't prompt for input; accept all defaults when running examples that accept user input" + echo "" + echo " -V Verbose messages from this script" + echo "" + elif [ "$CMD" == "stop" ]; then + echo "" + echo "Usage: solr stop [-k key] [-p port]" + echo "" + echo " -k Stop key; default is solrrocks" + echo "" + echo " -p Specify the port to start the Solr HTTP listener on; default is 8983" + echo "" + echo " -V Verbose messages from this script" + echo "" + echo "NOTE: If port is not specified, then all running Solr servers are stopped." + echo "" + elif [ "$CMD" == "healthcheck" ]; then + echo "" + echo "Usage: solr healthcheck [-c collection] [-z zkHost]" + echo "" + echo " -c Collection to run healthcheck against." + echo "" + echo " -z ZooKeeper connection string; default is localhost:9983" + echo "" + fi +} # end print_usage + +# used to show the script is still alive when waiting on work to complete +spinner() +{ + local pid=$1 + local delay=0.5 + local spinstr='|/-\' + while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do + local temp=${spinstr#?} + printf " [%c] " "$spinstr" + local spinstr=$temp${spinstr%"$temp"} + sleep $delay + printf "\b\b\b\b\b\b" + done + printf " \b\b\b\b" +} + +# extract the value of the -Djetty.port parameter from a running Solr process +function jetty_port() { + SOLR_PID="$1" + SOLR_PROC=`ps waux | grep $SOLR_PID | grep start.jar | grep jetty.port` + IFS=' ' read -a proc_args <<< "$SOLR_PROC" + for arg in "${proc_args[@]}" + do + IFS='=' read -a pair <<< "$arg" + if [ "${pair[0]}" == "-Djetty.port" ]; then + local jetty_port="${pair[1]}" + break + fi + done + echo "$jetty_port" +} # end jetty_port func + +# run a Solr command-line tool using the SolrCLI class; +# useful for doing cross-platform work from the command-line using Java +function run_tool() { + + # Extract the solr.war if it hasn't been done already (so we can access the SolrCLI class) + if [ ! -d "$DEFAULT_SERVER_DIR/solr-webapp/webapp" ]; then + (mkdir -p $DEFAULT_SERVER_DIR/solr-webapp/webapp && cd $DEFAULT_SERVER_DIR/solr-webapp/webapp && jar xf $DEFAULT_SERVER_DIR/webapps/solr.war) + fi + + "$JAVA" -Dlog4j.configuration=file:$DEFAULT_SERVER_DIR/scripts/cloud-scripts/log4j.properties \ + -classpath "$DEFAULT_SERVER_DIR/solr-webapp/webapp/WEB-INF/lib/*:$DEFAULT_SERVER_DIR/lib/ext/*" \ + org.apache.solr.util.SolrCLI $* + +} # end run_tool function + +# get information about any Solr nodes running on this host +function get_info() { + # first, see if Solr is running + numSolrs=`ps waux | grep java | grep start.jar | wc -l | sed -e 's/^[ \t]*//'` + if [ "$numSolrs" != "0" ]; then + echo -e "\nFound $numSolrs Solr nodes: " + for ID in `ps waux | grep java | grep start.jar | awk '{print $2}' | sort -r` + do + port=`jetty_port "$ID"` + if [ "$port" != "" ]; then + echo "" + echo "Found Solr process $ID running on port $port" + run_tool status -solr http://localhost:$port/solr + echo "" + fi + done + else + echo -e "\nNo Solr nodes are running.\n" + fi + +} # end get_info + +# tries to gracefully stop Solr using the Jetty +# stop command and if that fails, then uses kill -9 +function stop_solr() { + + DIR="$1" + SOLR_PORT="$2" + STOP_PORT="79${SOLR_PORT: -2}" + STOP_KEY="$3" + + SOLR_PID=`ps waux | grep start.jar | grep $SOLR_PORT | grep -v grep | awk '{print $2}' | sort -r` + if [ "$SOLR_PID" != "" ]; then + echo -e "Sending stop command to Jetty stop port $STOP_PORT ... waiting 5 seconds to allow process $SOLR_PID to stop gracefully." + $JAVA -jar $DIR/start.jar STOP.PORT=$STOP_PORT STOP.KEY=$STOP_KEY --stop || true + sleep 5 + else + echo -e "No Solr nodes found to stop." + exit 0 + fi + + SOLR_PID=`ps waux | grep start.jar | grep $SOLR_PORT | grep -v grep | awk '{print $2}' | sort -r` + if [ "$SOLR_PID" != "" ]; then + echo -e "Solr process $SOLR_PID is still running; forcefully killing it now." + kill -9 $SOLR_PID + echo "Killed process $SOLR_PID" + fi + + SOLR_PID=`ps waux | grep start.jar | grep $SOLR_PORT | grep -v grep | awk '{print $2}' | sort -r` + if [ "$SOLR_PID" != "" ]; then + echo "ERROR: Failed to kill previous Solr Java process $SOLR_PID ... script fails." + exit 1 + fi +} # end stop_solr + +if [ $# -eq 1 ]; then + case $1 in + -help|-usage) + print_usage "" + exit + ;; + -info|-i) + get_info + exit + ;; + esac +fi + +if [ $# -gt 0 ]; then + # if first arg starts with a dash (and it's not -help or -info), + # then assume they are starting Solr, such as: solr -f + if [[ $1 == -* ]]; then + SCRIPT_CMD="start" + else + SCRIPT_CMD=$1 + shift + fi +else + # no args - just show usage and exit + print_usage "" + exit +fi + +# run a healthcheck and exit if requested +if [ "$SCRIPT_CMD" == "healthcheck" ]; then + + if [ $# -gt 0 ]; then + while true; do + case $1 in + -c|-collection) + HEALTHCHECK_COLLECTION=$2 + shift 2 + ;; + -z|-zkhost) + ZK_HOST="$2" + shift 2 + ;; + -help|-usage) + print_usage "$SCRIPT_CMD" "" + exit 0 + ;; + --) + shift + break + ;; + *) + if [ "$1" != "" ]; then + echo "Error parsing argument $1!" >&2 + print_usage "$SCRIPT_CMD" + exit 1 + else + break # out-of-args, stop looping + fi + ;; + esac + done + fi + + if [ "$ZK_HOST" == "" ]; then + ZK_HOST=localhost:9983 + fi + + run_tool healthcheck -zkHost $ZK_HOST -collection $HEALTHCHECK_COLLECTION + + exit $? +fi + +# verify the command given is supported +if [ "$SCRIPT_CMD" != "stop" ] && [ "$SCRIPT_CMD" != "start" ] && [ "$SCRIPT_CMD" != "restart" ]; then + print_usage "" "$SCRIPT_CMD not supported!" + exit 1 +fi + +# If an include wasn't specified in the environment, then search for one... +if [ "x$SOLR_INCLUDE" == "x" ]; then + # Locations (in order) to use when searching for an include file. + for include in "`dirname "$0"`/solr.in.sh" \ + "$HOME/.solr.in.sh" \ + /usr/share/solr/solr.in.sh \ + /usr/local/share/solr/solr.in.sh \ + /opt/solr/solr.in.sh; do + if [ -r "$include" ]; then + . "$include" + break + fi + done +elif [ -r "$SOLR_INCLUDE" ]; then + . "$SOLR_INCLUDE" +fi + +# Run in foreground (default is to run in the background) +FG="false" +noprompt=false + +if [ $# -gt 0 ]; then + while true; do + case $1 in + -c|-cloud) + SOLR_MODE="solrcloud" + shift + ;; + -d|-dir) + # see if the arg value is relative to the tip vs full path + if [ -d "$SOLR_TIP/$2" ]; then + SOLR_SERVER_DIR="$SOLR_TIP/$2" + else + SOLR_SERVER_DIR="$2" + fi + shift 2 + ;; + -e|-example) + EXAMPLE="$2" + shift 2 + ;; + -f|-foreground) + FG="true" + shift + ;; + -h|-host) + SOLR_HOST="$2" + shift 2 + ;; + -m|-memory) + SOLR_HEAP="$2" + shift 2 + ;; + -p|-port) + SOLR_PORT="$2" + shift 2 + ;; + -z|-zkhost) + ZK_HOST="$2" + shift 2 + ;; + -help|-usage) + print_usage "$SCRIPT_CMD" "" + exit 0 + ;; + -noprompt) + noprompt=true + shift + ;; + -V|-verbose) + verbose=true + shift + ;; + --) + shift + break + ;; + *) + if [ "$1" != "" ]; then + echo "Error parsing argument $1!" >&2 + print_usage "$SCRIPT_CMD" + exit 1 + else + break # out-of-args, stop looping + fi + ;; + esac + done +fi + +if $verbose ; then + echo "Using Solr root directory: $SOLR_TIP" + echo "Using Java: $JAVA" + $JAVA -version +fi + +if [ "$SOLR_HOST" != "" ]; then + SOLR_HOST_ARG="-Dhost=$SOLR_HOST" +else + SOLR_HOST_ARG="" +fi + +if [ "$SOLR_SERVER_DIR" == "" ]; then + SOLR_SERVER_DIR=$DEFAULT_SERVER_DIR +fi + +if [ ! -e "$SOLR_SERVER_DIR" ]; then + echo -e "\nSolr server directory $SOLR_SERVER_DIR not found!\n" + exit 1 +fi + +CLOUD_NUM_NODES=2 +declare -a CLOUD_PORTS=('8983' '7574' '8984' '7575'); + +# select solr.solr.home based on the desired example +if [ "$EXAMPLE" != "" ]; then + case $EXAMPLE in + cloud) + # + # Engage in an interactive session with user to setup the SolrCloud example + # + echo -e "\nWelcome to the SolrCloud example!\n\n" + if $noprompt ; then + CLOUD_NUM_NODES=2 + echo -e "Starting up $CLOUD_NUM_NODES Solr nodes for your example SolrCloud cluster." + else + echo -e "This interactive session will help you launch a SolrCloud cluster on your local workstation.\n" + read -e -p "To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2] " USER_INPUT + while true + do + CLOUD_NUM_NODES=`echo $USER_INPUT | tr -d ' '` + if [ "$CLOUD_NUM_NODES" == "" ]; then + CLOUD_NUM_NODES=2 + fi + if [[ $CLOUD_NUM_NODES > 4 || $CLOUD_NUM_NODES < 1 ]]; then + read -e -p "Please provide a node count between 1 and 4 [2] " USER_INPUT + else + break; + fi + done + + echo -e "Ok, let's start up $CLOUD_NUM_NODES Solr nodes for your example SolrCloud cluster.\n" + for (( s=0; s<$CLOUD_NUM_NODES; s++ )) + do + read -e -p "Please enter the port for node$[$s+1] [${CLOUD_PORTS[$s]}] " USER_INPUT + while true + do + # trim whitespace out of the user input + CLOUD_PORT=`echo $USER_INPUT | tr -d ' '` + + # handle the default selection or empty input + if [ "$CLOUD_PORT" == "" ]; then + CLOUD_PORT=${CLOUD_PORTS[$s]} + fi + + # check to see if something is already bound to that port + PORT_IN_USE=`lsof -i:$CLOUD_PORT | grep $CLOUD_PORT` + if [ "$PORT_IN_USE" != "" ]; then + read -e -p "Oops! Looks like port $CLOUD_PORT is already being used by another process. Please choose a different port. " USER_INPUT + else + CLOUD_PORTS[$s]=$CLOUD_PORT + echo $CLOUD_PORT + break; + fi + done + done + fi + + for (( s=0; s<$CLOUD_NUM_NODES; s++ )) + do + ndx=$[$s+1] + if [ ! -d "$SOLR_TIP/node$ndx" ]; then + echo "Cloning $DEFAULT_SERVER_DIR into $SOLR_TIP/node$ndx" + cp -r $DEFAULT_SERVER_DIR $SOLR_TIP/node$ndx + rm -rf $SOLR_TIP/node$ndx/solr/zoo_data + fi + done + SOLR_MODE="solrcloud" + SOLR_SERVER_DIR="$SOLR_TIP/node1" + SOLR_HOME="$SOLR_SERVER_DIR/solr" + shift + ;; + default) + SOLR_HOME="$SOLR_TIP/example/solr" + shift + ;; + dih) + SOLR_HOME="$SOLR_TIP/example/example-DIH/solr" + shift + ;; + schemaless) + SOLR_HOME="$SOLR_TIP/example/example-schemaless/solr" + shift + ;; + multicore) + SOLR_HOME="$SOLR_TIP/example/multicore" + shift + ;; + *) + print_usage "start" "Unsupported example $EXAMPLE! Please choose one of: cloud, dih, schemaless, multicore, or default" + exit 1 + ;; + esac +fi + +if [ "$SOLR_HOME" == "" ]; then + SOLR_HOME="$SOLR_SERVER_DIR/solr" +fi + +if [ "$STOP_KEY" == "" ]; then + STOP_KEY="solrrocks" +fi + +# stop all if no port specified +if [[ "$SCRIPT_CMD" == "stop" && "$SOLR_PORT" == "" ]]; then + numSolrs=`ps waux | grep java | grep start.jar | wc -l | sed -e 's/^[ \t]*//'` + if [ "$numSolrs" != "0" ]; then + echo -e "\nFound $numSolrs Solr nodes to stop." + for ID in `ps waux | grep java | grep start.jar | awk '{print $2}' | sort -r` + do + port=`jetty_port "$ID"` + stop_solr "$SOLR_SERVER_DIR" "$port" "$STOP_KEY" + done + else + echo -e "\nNo Solr nodes found to stop.\n" + fi + exit +fi + +if [ "$SOLR_PORT" == "" ]; then + SOLR_PORT="8983" +fi + +if [ "$STOP_PORT" == "" ]; then + STOP_PORT="79${SOLR_PORT: -2}" +fi + +if [[ "$SCRIPT_CMD" == "start" ]]; then + # see if Solr is already running + SOLR_PID=`ps waux | grep start.jar | grep $SOLR_PORT | grep -v grep | awk '{print $2}' | sort -r` + if [ "$SOLR_PID" != "" ]; then + echo -e "\nSolr already running on port $SOLR_PORT (pid: $SOLR_PID)!" + echo -e "Please use the 'restart' command if you want to restart this node.\n" + exit + fi +else + # either stop or restart + stop_solr "$SOLR_SERVER_DIR" "$SOLR_PORT" "$STOP_KEY" +fi + +# backup the log files +if [ -f $SOLR_SERVER_DIR/logs/solr.log ]; then + if $verbose ; then + echo "Backing up $SOLR_SERVER_DIR/logs/solr.log" + fi + mv $SOLR_SERVER_DIR/logs/solr.log $SOLR_SERVER_DIR/logs/solr_log_`date +"%Y%m%d_%H%M"` +fi + +if [ -f $SOLR_SERVER_DIR/logs/solr_gc.log ]; then + if $verbose ; then + echo "Backing up $SOLR_SERVER_DIR/logs/solr_gc.log" + fi + mv $SOLR_SERVER_DIR/logs/solr_gc.log $SOLR_SERVER_DIR/logs/solr_gc_log_`date +"%Y%m%d_%H%M"` +fi + +if [ "$SCRIPT_CMD" == "stop" ]; then + # already stopped, script is done. + exit 0 +fi + +# if we get here, then we're starting a new node up ... + +# if verbose gc logging enabled, setup the location of the log file +if [ "$GC_LOG_OPTS" != "" ]; then + GC_LOG_OPTS="$GC_LOG_OPTS -Xloggc:$SOLR_SERVER_DIR/logs/solr_gc.log" +fi + +if [ "$SOLR_MODE" == "solrcloud" ]; then + if [ "$ZK_CLIENT_TIMEOUT" == "" ]; then + ZK_CLIENT_TIMEOUT="15000" + fi + + CLOUD_MODE_OPTS="-DzkClientTimeout=$ZK_CLIENT_TIMEOUT" + + if [ "$ZK_HOST" != "" ]; then + CLOUD_MODE_OPTS="$CLOUD_MODE_OPTS -DzkHost=$ZK_HOST" + else + if $verbose ; then + echo "Configuring SolrCloud to launch an embedded ZooKeeper using -DzkRun" + fi + + CLOUD_MODE_OPTS="$CLOUD_MODE_OPTS -DzkRun" + fi +fi + +# These are useful for attaching remove profilers like VisualVM/JConsole +if [ "$ENABLE_REMOTE_JMX_OPTS" == "true" ]; then + REMOTE_JMX_OPTS="-Dcom.sun.management.jmxremote \ +-Dcom.sun.management.jmxremote.local.only=false \ +-Dcom.sun.management.jmxremote.ssl=false \ +-Dcom.sun.management.jmxremote.authenticate=false \ +-Dcom.sun.management.jmxremote.port=10${SOLR_PORT: -2} \ +-Dcom.sun.management.jmxremote.rmi.port=10${SOLR_PORT: -2}" + + # if the host is set, then set that as the rmi server hostname + if [ "$SOLR_HOST" != "" ]; then + REMOTE_JMX_OPTS="$REMOTE_JMX_OPTS -Djava.rmi.server.hostname=$SOLR_HOST" + fi +else + REMOTE_JMX_OPTS="" +fi + +if [ "$SOLR_HEAP" != "" ]; then + SOLR_JAVA_MEM="-Xms$SOLR_HEAP -Xmx$SOLR_HEAP" +fi + +if [ "$SOLR_JAVA_MEM" == "" ]; then + SOLR_JAVA_MEM="-Xms512m -Xmx512m" +fi + +if [ "$SOLR_TIMEZONE" == "" ]; then + SOLR_TIMEZONE="UTC" +fi + +# Launches Solr in foreground/background depending on parameters +function launch_solr() { + + run_in_foreground="$1" + stop_port="79${SOLR_PORT: -2}" + + SOLR_ADDL_ARGS="$2" + + # commented out debugging info + if $verbose ; then + echo -e "\nStarting Solr using the following settings:" + echo -e " SOLR_SERVER_DIR = $SOLR_SERVER_DIR" + echo -e " SOLR_HOME = $SOLR_HOME" + echo -e " JAVA = $JAVA" + echo -e " SOLR_HOST = $SOLR_HOST" + echo -e " SOLR_PORT = $SOLR_PORT" + echo -e " GC_TUNE = $GC_TUNE" + echo -e " GC_LOG_OPTS = $GC_LOG_OPTS" + echo -e " SOLR_JAVA_MEM = $SOLR_JAVA_MEM" + echo -e " REMOTE_JMX_OPTS = $REMOTE_JMX_OPTS" + echo -e " CLOUD_MODE_OPTS = $CLOUD_MODE_OPTS" + echo -e " SOLR_TIMEZONE = $SOLR_TIMEZONE" + + if [ "$SOLR_ADDL_ARGS" != "" ]; then + echo -e " SOLR_ADDL_ARGS = $SOLR_ADDL_ARGS" + fi + fi + + # need to launch solr from the server dir + cd $SOLR_SERVER_DIR + + if [ ! -e "$SOLR_SERVER_DIR/start.jar" ]; then + echo -e "\nERROR: start.jar file not found in $SOLR_SERVER_DIR!\nPlease check your -d parameter to set the correct Solr server directory.\n" + exit 1 + fi + + SOLR_START_OPTS="-server -Xss256k $SOLR_JAVA_MEM $GC_TUNE $GC_LOG_OPTS $REMOTE_JMX_OPTS \ + $CLOUD_MODE_OPTS \ +-DSTOP.PORT=$stop_port -DSTOP.KEY=$STOP_KEY \ +$SOLR_HOST_ARG -Djetty.port=$SOLR_PORT \ +-Dsolr.solr.home=$SOLR_HOME \ +-Duser.timezone=$SOLR_TIMEZONE \ +-Djava.net.preferIPv4Stack=true -Dsolr.autoSoftCommit.maxTime=3000" + + if [ "$SOLR_MODE" == "solrcloud" ]; then + IN_CLOUD_MODE=" in SolrCloud mode" + fi + + if [ "$run_in_foreground" == "true" ]; then + echo -e "\nStarting Solr$IN_CLOUD_MODE on port $SOLR_PORT from $SOLR_SERVER_DIR\n" + $JAVA $SOLR_START_OPTS $SOLR_ADDL_ARGS -XX:OnOutOfMemoryError="$SOLR_TIP/bin/oom_solr.sh $SOLR_PORT" -jar start.jar + else + # run Solr in the background + nohup $JAVA $SOLR_START_OPTS $SOLR_ADDL_ARGS -XX:OnOutOfMemoryError="$SOLR_TIP/bin/oom_solr.sh $SOLR_PORT" -jar start.jar 1>$SOLR_TIP/bin/solr-$SOLR_PORT-console.log 2>&1 & + + echo -n "Waiting to see Solr listening on port $SOLR_PORT" + # Launch in a subshell to show the spinner + (loops=0 + while true + do + running=`lsof -i:$SOLR_PORT | grep $SOLR_PORT` + if [ "$running" == "" ]; then + if [ $loops -lt 6 ]; then + sleep 5 + loops=$[$loops+1] + else + echo -e "Still not seeing Solr listening on $SOLR_PORT after 30 seconds!" + tail -30 $SOLR_TIP/node1/logs/solr.log + exit; + fi + else + SOLR_PID=`ps waux | grep start.jar | grep $SOLR_PORT | grep -v grep | awk '{print $2}' | sort -r` + echo -e "\nStarted Solr server on port $SOLR_PORT (pid=$SOLR_PID). Happy searching!\n" + exit; + fi + done) & + spinner $! + + fi +} + +if [ "$EXAMPLE" != "cloud" ]; then + launch_solr "$FG" "" +else + # + # SolrCloud example is a bit involved so needs special handling here + # + SOLR_SERVER_DIR=$SOLR_TIP/node1 + SOLR_HOME=$SOLR_TIP/node1/solr + SOLR_PORT=${CLOUD_PORTS[0]} + echo -e "\nStarting up SolrCloud node1 on port ${CLOUD_PORTS[0]} using command:\n" + echo -e "solr start -cloud -d node1 -p $SOLR_PORT \n\n" + + if $isLegacyExampleDir ; then + # have to pass these when working with the legacy example directory + BOOTSTRAP_ARGS="-Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf" + fi + + # can't launch this node in the foreground else we can't run anymore commands + launch_solr "false" "$BOOTSTRAP_ARGS" + + zk_port=$[$SOLR_PORT+1000] + zk_host=localhost:$zk_port + + for (( s=1; s<$CLOUD_NUM_NODES; s++ )) + do + ndx=$[$s+1] + next_port=${CLOUD_PORTS[$s]} + echo -e "\n\nStarting node$ndx on port $next_port using command:\n" + echo -e "solr start -cloud -d node$ndx -p $next_port -z $zk_host \n\n" + # call this script again with correct args for next node + $SOLR_TIP/bin/solr start -cloud -d node$ndx -p $next_port -z $zk_host + done + + # TODO: better (shorter) name?? + CLOUD_COLLECTION=gettingstarted + + # if the new default config directory is available, then use it, + # otherwise, use the schema-less example + if [ -d "$SOLR_TIP/server/solr/default_conf" ]; then + CLOUD_CONFIG_DIR=$SOLR_TIP/server/solr/default_conf + else + CLOUD_CONFIG_DIR=$SOLR_TIP/example/example-schemaless/solr/collection1/conf + fi + + CLOUD_CONFIG=schemaless + + if $noprompt ; then + CLOUD_NUM_SHARDS=2 + CLOUD_REPFACT=2 + else + echo -e "\nNow let's create a new collection for indexing documents in your $CLOUD_NUM_NODES-node cluster.\n" + read -e -p "Please provide a name for your new collection: [gettingstarted] " USER_INPUT + # trim whitespace out of the user input + CLOUD_COLLECTION=`echo $USER_INPUT | tr -d ' '` + + # handle the default selection or empty input + if [ "$CLOUD_COLLECTION" == "" ]; then + CLOUD_COLLECTION=gettingstarted + fi + echo $CLOUD_COLLECTION + + read -e -p "How many shards would you like to split $CLOUD_COLLECTION into? [2] " USER_INPUT + # trim whitespace out of the user input + CLOUD_NUM_SHARDS=`echo $USER_INPUT | tr -d ' '` + + # handle the default selection or empty input + if [ "$CLOUD_NUM_SHARDS" == "" ]; then + CLOUD_NUM_SHARDS=2 + fi + echo $CLOUD_NUM_SHARDS + + read -e -p "How many replicas per shard would you like to create? [2] " USER_INPUT + # trim whitespace out of the user input + CLOUD_REPFACT=`echo $USER_INPUT | tr -d ' '` + + # handle the default selection or empty input + if [ "$CLOUD_REPFACT" == "" ]; then + CLOUD_REPFACT=2 + fi + echo $CLOUD_REPFACT + + fi + + echo -e "\nDeploying default Solr configuration files to embedded ZooKeeper using command:\n" + echo -e "$DEFAULT_SERVER_DIR/scripts/cloud-scripts/zkcli.sh -zkhost $zk_host -cmd upconfig -confdir $CLOUD_CONFIG_DIR -confname $CLOUD_CONFIG\n" + # upload the config directory to ZooKeeper + # Extract the solr.war if it hasn't been done already (so we can access the SolrCLI class) + if [ ! -d "$DEFAULT_SERVER_DIR/solr-webapp/webapp" ]; then + (mkdir -p $DEFAULT_SERVER_DIR/solr-webapp/webapp && cd $DEFAULT_SERVER_DIR/solr-webapp/webapp && jar xf $DEFAULT_SERVER_DIR/webapps/solr.war) + fi + $JAVA -Dlog4j.configuration=file:$DEFAULT_SERVER_DIR/scripts/cloud-scripts/log4j.properties \ + -classpath "$DEFAULT_SERVER_DIR/solr-webapp/webapp/WEB-INF/lib/*:$DEFAULT_SERVER_DIR/lib/ext/*" \ + org.apache.solr.cloud.ZkCLI -zkhost $zk_host -cmd upconfig -confdir $CLOUD_CONFIG_DIR -confname $CLOUD_CONFIG > /dev/null 2>&1 + echo -e "Successfully deployed $CLOUD_CONFIG to ZooKeeper\n" + + # note use of ceiling logic in case of remainder + MAX_SHARDS_PER_NODE=$((($CLOUD_NUM_SHARDS*$CLOUD_REPFACT+$CLOUD_NUM_NODES-1)/$CLOUD_NUM_NODES)) + + COLLECTIONS_API=http://localhost:$SOLR_PORT/solr/admin/collections + + CLOUD_CREATE_COLLECTION_CMD="$COLLECTIONS_API?action=CREATE&name=$CLOUD_COLLECTION&replicationFactor=$CLOUD_REPFACT&numShards=$CLOUD_NUM_SHARDS&collection.configName=$CLOUD_CONFIG&maxShardsPerNode=$MAX_SHARDS_PER_NODE&wt=json&indent=2" + echo -e "\n\nCreating new collection $CLOUD_COLLECTION with $CLOUD_NUM_SHARDS shards and replication factor $CLOUD_REPFACT using Collections API command:\n\n$CLOUD_CREATE_COLLECTION_CMD\n\nFor more information about the Collections API, please see: https://cwiki.apache.org/confluence/display/solr/Collections+API\n" + curl "$CLOUD_CREATE_COLLECTION_CMD" + + echo -e "\n\nSolrCloud example running, please visit http://localhost:$SOLR_PORT/solr \n\n" +fi + +exit $? diff --git a/solr/bin/solr.cmd b/solr/bin/solr.cmd new file mode 100644 index 00000000000..b7945c19ab9 --- /dev/null +++ b/solr/bin/solr.cmd @@ -0,0 +1,653 @@ +@REM +@REM Licensed to the Apache Software Foundation (ASF) under one or more +@REM contributor license agreements. See the NOTICE file distributed with +@REM this work for additional information regarding copyright ownership. +@REM The ASF licenses this file to You under the Apache License, Version 2.0 +@REM (the "License"); you may not use this file except in compliance with +@REM the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, software +@REM distributed under the License is distributed on an "AS IS" BASIS, +@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@REM See the License for the specific language governing permissions and +@REM limitations under the License. + +@echo off + +IF "%OS%"=="Windows_NT" setlocal enabledelayedexpansion enableextensions + +REM Determine top-level Solr directory +set SDIR=%~dp0 +IF "%SDIR:~-1%"=="\" set SDIR=%SDIR:~0,-1% +set SOLR_TIP=%SDIR%\.. +pushd %SOLR_TIP% +set SOLR_TIP=%CD% +popd + +REM Used to report errors before exiting the script +set SCRIPT_ERROR= +set NO_USER_PROMPT=0 + +REM Verify Java is available +if NOT DEFINED JAVA_HOME goto need_java_home +"%JAVA_HOME%"\bin\java -version:1.8 -version > nul 2>&1 +IF ERRORLEVEL 1 "%JAVA_HOME%"\bin\java -version:1.7 -version > nul 2>&1 +IF ERRORLEVEL 1 goto need_java_vers +set "JAVA=%JAVA_HOME%\bin\java" + +REM See SOLR-3619 +IF EXIST "%SOLR_TIP%\server\start.jar" ( + set "DEFAULT_SERVER_DIR=%SOLR_TIP%\server" +) ELSE ( + set "DEFAULT_SERVER_DIR=%SOLR_TIP%\example" +) + +set FIRST_ARG=%1 + +IF [%1]==[] goto usage + +IF "%1"=="-help" goto usage +IF "%1"=="-usage" goto usage +IF "%1"=="/?" goto usage +IF "%1"=="-i" goto get_info +IF "%1"=="-info" goto get_info + +REM Only allow the command to be the first argument, assume start if not supplied +IF "%1"=="start" goto set_script_cmd +IF "%1"=="stop" goto set_script_cmd +IF "%1"=="restart" goto set_script_cmd +IF "%1"=="healthcheck" ( +REM healthcheck uses different arg parsing strategy +SHIFT +goto parse_healthcheck_args +) +goto include_vars + +:usage +IF NOT "%SCRIPT_ERROR%"=="" ECHO %SCRIPT_ERROR% +IF [%FIRST_ARG%]==[] goto script_usage +IF "%FIRST_ARG%"=="-help" goto script_usage +IF "%FIRST_ARG%"=="-usage" goto script_usage +IF "%FIRST_ARG%"=="/?" goto script_usage +IF "%SCRIPT_CMD%"=="start" goto start_usage +IF "%SCRIPT_CMD%"=="restart" goto start_usage +IF "%SCRIPT_CMD%"=="stop" goto stop_usage +goto done + +:script_usage +@echo. +@echo Usage: solr COMMAND OPTIONS +@echo where COMMAND is one of: start, stop, restart, healthcheck +@echo. +@echo Example: Start Solr running in the background on port 8984: +@echo. +@echo ./solr start -p 8984 +@echo. +@echo Pass -help after any COMMAND to see command-specific usage information, +@echo such as: ./solr start -help +@echo. +goto done + +:start_usage +@echo. +@echo Usage: solr %SCRIPT_CMD% [-f] [-c] [-h hostname] [-p port] [-d directory] [-z zkHost] [-m memory] [-e example] [-V] +@echo. +@echo -f Start Solr in foreground; default starts Solr in the background +@echo and sends stdout / stderr to solr-PORT-console.log +@echo. +@echo -c or -cloud Start Solr in SolrCloud mode; if -z not supplied, an embedded ZooKeeper +@echo instance is started on Solr port+1000, such as 9983 if Solr is bound to 8983 +@echo. +@echo -h host Specify the hostname for this Solr instance +@echo. +@echo -p port Specify the port to start the Solr HTTP listener on; default is 8983 +@echo. +@echo -d dir Specify the Solr server directory; defaults to example +@echo. +@echo -z zkHost ZooKeeper connection string; only used when running in SolrCloud mode using -c +@echo To launch an embedded ZooKeeper instance, don't pass this parameter. +@echo. +@echo -m memory Sets the min (-Xms) and max (-Xmx) heap size for the JVM, such as: -m 4g +@echo results in: -Xms4g -Xmx4g; by default, this script sets the heap size to 512m +@echo. +@echo -e example Name of the example to run; available examples: +@echo cloud: SolrCloud example +@echo default: Solr default example +@echo dih: Data Import Handler +@echo schemaless: Schema-less example +@echo multicore: Multicore +@echo. +@echo -noprompt Don't prompt for input; accept all defaults when running examples that accept user input +@echo. +@echo -V Verbose messages from this script +@echo. +goto done + +:stop_usage +@echo. +@echo Usage: solr stop [-k key] [-p port] +@echo. +@echo -k key Stop key; default is solrrocks +@echo. +@echo -p port Specify the port to start the Solr HTTP listener on; default is 8983 +@echo. +@echo -V Verbose messages from this script +@echo. +@echo NOTE: If port is not specified, then all running Solr servers are stopped. +@echo. +goto done + +:healthcheck_usage +@echo. +@echo Usage: solr healthcheck [-c collection] [-z zkHost] +@echo. +@echo -c collection Collection to run healthcheck against. +@echo. +@echo -z zkHost ZooKeeper connection string; default is localhost:9983 +@echo. +goto done + +REM Allow user to import vars from an include file +REM vars set in the include file can be overridden with +REM command line args +:include_vars +IF "%SOLR_INCLUDE%"=="" set SOLR_INCLUDE=solr.in.cmd +IF EXIST "%SOLR_INCLUDE%" CALL "%SOLR_INCLUDE%" +goto parse_args + +REM Really basic command-line arg parsing +:parse_args +IF "%SCRIPT_CMD%"=="" set SCRIPT_CMD=start +IF [%1]==[] goto process_script_cmd +IF "%1"=="-help" goto usage +IF "%1"=="-usage" goto usage +IF "%1"=="/?" goto usage +IF "%1"=="-f" goto set_foreground_mode +IF "%1"=="-foreground" goto set_foreground_mode +IF "%1"=="-V" goto set_verbose +IF "%1"=="-verbose" goto set_verbose +IF "%1"=="-c" goto set_cloud_mode +IF "%1"=="-cloud" goto set_cloud_mode +IF "%1"=="-d" goto set_server_dir +IF "%1"=="-dir" goto set_server_dir +IF "%1"=="-e" goto set_example +IF "%1"=="-example" goto set_example +IF "%1"=="-h" goto set_host +IF "%1"=="-host" goto set_host +IF "%1"=="-m" goto set_memory +IF "%1"=="-memory" goto set_memory +IF "%1"=="-p" goto set_port +IF "%1"=="-port" goto set_port +IF "%1"=="-z" goto set_zookeeper +IF "%1"=="-zkhost" goto set_zookeeper +IF "%1"=="-noprompt" goto set_noprompt +IF NOT "%1"=="" goto invalid_cmd_line +process_script_cmd + +:set_script_cmd +set SCRIPT_CMD=%1 +SHIFT +goto include_vars + +:set_foreground_mode +set FG=1 +SHIFT +goto parse_args + +:set_verbose +set verbose=1 +SHIFT +goto parse_args + +:set_cloud_mode +set SOLR_MODE=solrcloud +SHIFT +goto parse_args + +:set_server_dir +REM See if they are using a short-hand name relative from the Solr tip directory +IF EXIST "%SOLR_TIP%\%2" ( + set "SOLR_SERVER_DIR=%SOLR_TIP%\%2" +) ELSE ( + set "SOLR_SERVER_DIR=%2" +) +SHIFT +SHIFT +goto parse_args + +:set_example +set EXAMPLE=%2 +SHIFT +SHIFT +goto parse_args + +:set_memory +set SOLR_HEAP=%2 +@echo SOLR_HEAP=%SOLR_HEAP% +SHIFT +SHIFT +goto parse_args + +:set_host +set SOLR_HOST=%2 +SHIFT +SHIFT +goto parse_args + +:set_port +set SOLR_PORT=%2 +SHIFT +SHIFT +goto parse_args + +:set_zookeeper +set "ZK_HOST=%2" +SHIFT +SHIFT +goto parse_args + +:set_noprompt +set NO_USER_PROMPT=1 +SHIFT +goto parse_args + +REM Perform the requested command after processing args +:process_script_cmd + +IF "%verbose%"=="1" ( + @echo Using Solr root directory: %SOLR_TIP% + @echo Using Java: %JAVA% + %JAVA% -version +) + +IF NOT "%SOLR_HOST%"=="" ( + set SOLR_HOST_ARG=-Dhost=%SOLR_HOST% +) ELSE ( + set SOLR_HOST_ARG= +) + +REM TODO: Change this to "server" when we resolve SOLR-3619 +IF "%SOLR_SERVER_DIR%"=="" set SOLR_SERVER_DIR=%DEFAULT_SERVER_DIR% + +IF NOT EXIST "%SOLR_SERVER_DIR%" ( + set SCRIPT_ERROR='Solr server directory %SOLR_SERVER_DIR% not found!' + goto err +) + +IF "%EXAMPLE%"=="" ( + REM SOLR_HOME just becomes serverDir/solr +) ELSE IF "%EXAMPLE%"=="default" ( + set "SOLR_HOME=%SOLR_TIP%\example\solr" +) ELSE IF "%EXAMPLE%"=="cloud" ( + set SOLR_MODE=solrcloud + goto cloud_example_start +) ELSE IF "%EXAMPLE%"=="dih" ( + set "SOLR_HOME=%SOLR_TIP%\example\example-DIH\solr" +) ELSE IF "%EXAMPLE%"=="schemaless" ( + set "SOLR_HOME=%SOLR_TIP%\example\example-schemaless\solr" +) ELSE IF "%EXAMPLE%"=="multicore" ( + set "SOLR_HOME=%SOLR_TIP%\example\multicore" +) ELSE ( + @echo. + @echo 'Unrecognized example %EXAMPLE%!' + @echo. + goto start_usage +) + +:start_solr +IF "%SOLR_HOME%"=="" set "SOLR_HOME=%SOLR_SERVER_DIR%\solr" + +IF "%STOP_KEY%"=="" set STOP_KEY=solrrocks + +REM TODO stop all if no port specified as Windows doesn't seem to have a +REM tool that does: ps waux | grep start.jar +IF "%SCRIPT_CMD%"=="stop" ( + IF "%SOLR_PORT%"=="" ( + set SCRIPT_ERROR=Must specify the port when trying to stop Solr! + goto err + ) +) + +IF "%SOLR_PORT%"=="" set SOLR_PORT=8983 +IF "%STOP_PORT%"=="" set STOP_PORT=79%SOLR_PORT:~-2,2% + +IF "%SCRIPT_CMD%"=="start" ( + REM see if Solr is already running using netstat + For /f "tokens=5" %%j in ('netstat -aon ^| find /i "listening" ^| find ":%SOLR_PORT%"') do ( + set "SCRIPT_ERROR=Process %%j is already listening on port %SOLR_PORT%. If this is Solr, please stop it first before starting (or use restart). If this is not Solr, then please choose a different port using -p PORT" + goto err + ) +) ELSE ( + @echo Stopping Solr running on port %SOLR_PORT% + "%JAVA%" -jar "%SOLR_SERVER_DIR%\start.jar" STOP.PORT=%STOP_PORT% STOP.KEY=%STOP_KEY% --stop + timeout /T 5 +) + +REM Kill it if it is still running after the graceful shutdown +For /f "tokens=5" %%j in ('netstat -nao ^| find /i "listening" ^| find ":%SOLR_PORT%"') do (taskkill /f /PID %%j) + +REM backup log files (use current timestamp for backup name) +For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) +For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) +set now_ts=%mydate%_%mytime% +IF EXIST "%SOLR_SERVER_DIR%\logs\solr.log" ( + echo Backing up %SOLR_SERVER_DIR%\logs\solr.log + move /Y "%SOLR_SERVER_DIR%\logs\solr.log" "%SOLR_SERVER_DIR%\logs\solr_log_!now_ts!" +) + +IF EXIST "%SOLR_SERVER_DIR%\logs\solr_gc.log" ( + echo Backing up %SOLR_SERVER_DIR%\logs\solr_gc.log + move /Y "%SOLR_SERVER_DIR%\logs\solr_gc.log" "%SOLR_SERVER_DIR%\logs\solr_gc_log_!now_ts!" +) + +IF "%SCRIPT_CMD%"=="stop" goto done + +REM if verbose gc logging enabled, setup the location of the log file +IF NOT "%GC_LOG_OPTS%"=="" set GC_LOG_OPTS=%GC_LOG_OPTS% -Xloggc:"%SOLR_SERVER_DIR%/logs/solr_gc.log" + +IF "%SOLR_MODE%"=="solrcloud" ( + IF "%ZK_CLIENT_TIMEOUT%"=="" set ZK_CLIENT_TIMEOUT=15000 + + set CLOUD_MODE_OPTS=-DzkClientTimeout=%ZK_CLIENT_TIMEOUT% + + IF NOT "%ZK_HOST%"=="" ( + set "CLOUD_MODE_OPTS=%CLOUD_MODE_OPTS% -DzkHost=%ZK_HOST%" + ) ELSE ( + IF "%verbose%"=="1" echo 'Configuring SolrCloud to launch an embedded ZooKeeper using -DzkRun' + set "CLOUD_MODE_OPTS=%CLOUD_MODE_OPTS% -DzkRun" + ) +) ELSE ( + set CLOUD_MODE_OPTS= +) + +REM These are useful for attaching remove profilers like VisualVM/JConsole +IF "%ENABLE_REMOTE_JMX_OPTS%"=="true" ( + set REMOTE_JMX_OPTS=-Dcom.sun.management.jmxremote ^ +-Dcom.sun.management.jmxremote.local.only=false ^ +-Dcom.sun.management.jmxremote.ssl=false ^ +-Dcom.sun.management.jmxremote.authenticate=false ^ +-Dcom.sun.management.jmxremote.port=10%SOLR_PORT:~-2,2% ^ +-Dcom.sun.management.jmxremote.rmi.port=10%SOLR_PORT:~-2,2% + +IF NOT "%SOLR_HOST%"=="" set REMOTE_JMX_OPTS=%REMOTE_JMX_OPTS% -Djava.rmi.server.hostname=%SOLR_HOST% +) ELSE ( + set REMOTE_JMX_OPTS= +) + +IF NOT "%SOLR_HEAP%"=="" set SOLR_JAVA_MEM=-Xms%SOLR_HEAP% -Xmx%SOLR_HEAP% +IF "%SOLR_JAVA_MEM%"=="" set SOLR_JAVA_MEM=-Xms512m -Xmx512m +IF "%SOLR_TIMEZONE%"=="" set SOLR_TIMEZONE=UTC + +IF "%verbose%"=="1" ( + @echo Starting Solr using the following settings: + @echo JAVA = %JAVA% + @echo SOLR_SERVER_DIR = %SOLR_SERVER_DIR% + @echo SOLR_HOME = %SOLR_HOME% + @echo SOLR_HOST = %SOLR_HOST% + @echo SOLR_PORT = %SOLR_PORT% + @echo GC_TUNE = %GC_TUNE% + @echo GC_LOG_OPTS = %GC_LOG_OPTS% + @echo SOLR_JAVA_MEM = %SOLR_JAVA_MEM% + @echo REMOTE_JMX_OPTS = %REMOTE_JMX_OPTS% + @echo CLOUD_MODE_OPTS = %CLOUD_MODE_OPTS% + @echo SOLR_TIMEZONE = %SOLR_TIMEZONE% +) + +set START_OPTS=-Duser.timezone=%SOLR_TIMEZONE% -Djava.net.preferIPv4Stack=true -Dsolr.autoSoftCommit.maxTime=3000 +set START_OPTS=%START_OPTS% %GC_TUNE% %GC_LOG_OPTS% +IF NOT "%CLOUD_MODE_OPTS%"=="" set START_OPTS=%START_OPTS% %CLOUD_MODE_OPTS% +IF NOT "%REMOTE_JMX_OPTS%"=="" set START_OPTS=%START_OPTS% %REMOTE_JMX_OPTS% +IF NOT "%SOLR_ADDL_ARGS%"=="" set START_OPTS=%START_OPTS% %SOLR_ADDL_ARGS% +IF NOT "%SOLR_HOST_ARG%"=="" set START_OPTS=%START_OPTS% %SOLR_HOST_ARG% + +cd %SOLR_SERVER_DIR% +@echo. +@echo Starting Solr on port %SOLR_PORT% from %SOLR_SERVER_DIR% +@echo. +IF "%FG%"=="1" ( + REM run solr in the foreground + "%JAVA%" -server -Xss256k %SOLR_JAVA_MEM% %START_OPTS% -DSTOP.PORT=%STOP_PORT% -DSTOP.KEY=%STOP_KEY% ^ + -Djetty.port=%SOLR_PORT% -Dsolr.solr.home="%SOLR_HOME%" -jar start.jar +) ELSE ( + START %JAVA% -server -Xss256k %SOLR_JAVA_MEM% %START_OPTS% -DSTOP.PORT=%STOP_PORT% -DSTOP.KEY=%STOP_KEY% ^ + -Djetty.port=%SOLR_PORT% -Dsolr.solr.home="%SOLR_HOME%" -jar start.jar > "%SOLR_TIP%\bin\solr-%SOLR_PORT%-console.log" +) + +goto done + +:cloud_example_start +REM Launch interactive session to guide the user through the SolrCloud example + +CLS +@echo. +@echo Welcome to the SolrCloud example +@echo. +@echo. + +IF "%NO_USER_PROMPT%"=="1" ( + set CLOUD_NUM_NODES=2 + @echo Starting up %CLOUD_NUM_NODES% Solr nodes for your example SolrCloud cluster. + goto start_cloud_nodes +) ELSE ( + @echo This interactive session will help you launch a SolrCloud cluster on your local workstation. + @echo. + SET /P "USER_INPUT=To begin, how many Solr nodes would you like to run in your local cluster (specify 1-4 nodes) [2]: " + goto while_num_nodes_not_valid +) + +:while_num_nodes_not_valid +IF "%USER_INPUT%"=="" set USER_INPUT=2 +SET /A INPUT_AS_NUM=!USER_INPUT!*1 +IF %INPUT_AS_NUM% GEQ 1 IF %INPUT_AS_NUM% LEQ 4 set CLOUD_NUM_NODES=%INPUT_AS_NUM% +IF NOT DEFINED CLOUD_NUM_NODES ( + SET USER_INPUT= + SET /P "USER_INPUT=Please enter a number between 1 and 4 [2]: " + goto while_num_nodes_not_valid +) +@echo Ok, let's start up %CLOUD_NUM_NODES% Solr nodes for your example SolrCloud cluster. + +:start_cloud_nodes +for /l %%x in (1, 1, !CLOUD_NUM_NODES!) do ( + set USER_INPUT= + set /A idx=%%x-1 + set DEF_PORT=8983 + IF %%x EQU 2 ( + set DEF_PORT=7574 + ) ELSE ( + IF %%x EQU 3 ( + set DEF_PORT=8984 + ) ELSE ( + IF %%x EQU 4 ( + set DEF_PORT=7575 + ) + ) + ) + + IF "%NO_USER_PROMPT%"=="1" ( + set NODE_PORT=!DEF_PORT! + ) ELSE ( + set /P "USER_INPUT=Please enter the port for node%%x [!DEF_PORT!]: " + IF "!USER_INPUT!"=="" set USER_INPUT=!DEF_PORT! + set NODE_PORT=!USER_INPUT! + echo node%%x port: !NODE_PORT! + @echo. + ) + + IF NOT EXIST "%SOLR_TIP%\node%%x" ( + @echo Cloning %DEFAULT_SERVER_DIR% into %SOLR_TIP%\node%%x + xcopy /Q /E /I "%DEFAULT_SERVER_DIR%" "%SOLR_TIP%\node%%x" + ) + + IF %%x EQU 1 ( + set EXAMPLE= + START %SDIR%\solr -f -c -p !NODE_PORT! -d node1 + set NODE1_PORT=!NODE_PORT! + ) ELSE ( + set /A ZK_PORT=!NODE1_PORT!+1000 + set "ZK_HOST=localhost:!ZK_PORT!" + START %SDIR%\solr -f -c -p !NODE_PORT! -d node%%x -z !ZK_HOST! + ) + + timeout /T 10 +) + +set USER_INPUT= +echo. +echo Now let's create a new collection for indexing documents in your %CLOUD_NUM_NODES%-node cluster. +IF "%NO_USER_PROMPT%"=="1" ( + set CLOUD_COLLECTION=gettingstarted + set CLOUD_NUM_SHARDS=2 + set CLOUD_REPFACT=2 + goto create_collection +) ELSE ( + goto get_create_collection_params +) + +:get_create_collection_params +set /P "USER_INPUT=Please provide a name for your new collection: [gettingstarted] " +IF "!USER_INPUT!"=="" set USER_INPUT=gettingstarted +set CLOUD_COLLECTION=!USER_INPUT! +echo !CLOUD_COLLECTION! +set USER_INPUT= +echo. +set /P "USER_INPUT=How many shards would you like to split !CLOUD_COLLECTION! into? [2] " +IF "!USER_INPUT!"=="" set USER_INPUT=2 +set CLOUD_NUM_SHARDS=!USER_INPUT! +echo !CLOUD_NUM_SHARDS! +set USER_INPUT= +echo. +set /P "USER_INPUT=How many replicas per shard would you like to create? [2] " +IF "!USER_INPUT!"=="" set USER_INPUT=2 +set CLOUD_REPFACT=!USER_INPUT! +echo !CLOUD_REPFACT! +goto create_collection + +:create_collection +set /A MAX_SHARDS_PER_NODE=((!CLOUD_NUM_SHARDS!*!CLOUD_REPFACT!)/!CLOUD_NUM_NODES!)+1 + +IF EXIST "%SOLR_TIP%\server\solr\default_conf" set "CLOUD_CONFIG_DIR=%SOLR_TIP%\server\solr\default_conf" +IF NOT EXIST "%SOLR_TIP%\server\solr\default_conf" set "CLOUD_CONFIG_DIR=%SOLR_TIP%\example\example-schemaless\solr\collection1\conf" +set CLOUD_CONFIG=schemaless + +echo. +echo Deploying default Solr configuration files to embedded ZooKeeper +echo. +"%JAVA%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^ + -classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^ + org.apache.solr.cloud.ZkCLI -zkhost %zk_host% -cmd upconfig -confdir "%CLOUD_CONFIG_DIR%" -confname %CLOUD_CONFIG% + +set COLLECTIONS_API=http://localhost:!NODE1_PORT!/solr/admin/collections + +set "CLOUD_CREATE_COLLECTION_CMD=%COLLECTIONS_API%?action=CREATE&name=%CLOUD_COLLECTION%&replicationFactor=%CLOUD_REPFACT%&numShards=%CLOUD_NUM_SHARDS%&collection.configName=%CLOUD_CONFIG%&maxShardsPerNode=%MAX_SHARDS_PER_NODE%&wt=json&indent=2" +echo Creating new collection %CLOUD_COLLECTION% with %CLOUD_NUM_SHARDS% shards and replication factor %CLOUD_REPFACT% using Collections API command: +echo. +@echo "%CLOUD_CREATE_COLLECTION_CMD%" +echo. +echo For more information about the Collections API, please see: https://cwiki.apache.org/confluence/display/solr/Collections+API +echo. + +"%JAVA%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^ + -classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^ + org.apache.solr.util.SolrCLI api -get "%CLOUD_CREATE_COLLECTION_CMD%" + +echo. +echo SolrCloud example is running, please visit http://localhost:%NODE1_PORT%/solr" +echo. + +REM End of interactive cloud example +goto done + + +:get_info +REM Find all Java processes, correlate with those listening on a port +REM and then try to contact via that port using the status tool +for /f "tokens=2" %%a in ('tasklist ^| find "java.exe"') do ( + for /f "tokens=2,5" %%j in ('netstat -aon ^| find /i "listening"') do ( + if "%%k" EQU "%%a" ( + for /f "delims=: tokens=1,2" %%x IN ("%%j") do ( + if "0.0.0.0" EQU "%%x" ( + @echo. + set has_info=1 + echo Found Solr process %%k running on port %%y + "%JAVA%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^ + -classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^ + org.apache.solr.util.SolrCLI status -solr http://localhost:%%y/solr + + @echo. + ) + ) + ) + ) +) +if NOT "!has_info!"=="1" echo No running Solr nodes found. +set has_info= +goto done + +:parse_healthcheck_args +IF [%1]==[] goto run_healthcheck +IF "%1"=="-c" goto set_healthcheck_collection +IF "%1"=="-collection" goto set_healthcheck_collection +IF "%1"=="-z" goto set_healthcheck_zk +IF "%1"=="-zkhost" goto set_healthcheck_zk +IF "%1"=="-help" goto usage +IF "%1"=="-usage" goto usage +IF "%1"=="/?" goto usage +goto run_healthcheck + +:set_healthcheck_collection +set HEALTHCHECK_COLLECTION=%2 +SHIFT +SHIFT +goto parse_healthcheck_args + +:set_healthcheck_zk +set HEALTHCHECK_ZK_HOST=%2 +SHIFT +SHIFT +goto parse_healthcheck_args + +:run_healthcheck +IF NOT DEFINED HEALTHCHECK_COLLECTION goto healthcheck_usage +IF NOT DEFINED HEALTHCHECK_ZK_HOST set "HEALTHCHECK_ZK_HOST=localhost:9983" +"%JAVA%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^ + -classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^ + org.apache.solr.util.SolrCLI healthcheck -collection !HEALTHCHECK_COLLECTION! -zkHost !HEALTHCHECK_ZK_HOST! +goto done + +:invalid_cmd_line +@echo. +@echo Invalid command-line option: %1 +@echo. +IF "%FIRST_ARG%"=="start" ( + goto start_usage +) ELSE IF "%FIRST_ARG:~0,1%" == "-" ( + goto start_usage +) ELSE IF "%FIRST_ARG%"=="restart" ( + goto start_usage +) ELSE IF "%FIRST_ARG%"=="stop" ( + goto stop_usage +) ELSE IF "%FIRST_ARG%"=="healthcheck" ( + goto healthcheck_usage +) ELSE ( + goto script_usage +) + +:need_java_home +@echo Please set the JAVA_HOME environment variable to the path where you installed Java 1.7+ +goto done + +:need_java_vers +@echo Java 1.7 or later is required to run Solr. +goto done + +:err +@echo. +@echo %SCRIPT_ERROR% +@echo. +exit /b 1 + +:done + +ENDLOCAL diff --git a/solr/bin/solr.in.cmd b/solr/bin/solr.in.cmd new file mode 100644 index 00000000000..76fef11703d --- /dev/null +++ b/solr/bin/solr.in.cmd @@ -0,0 +1,67 @@ +@REM +@REM Licensed to the Apache Software Foundation (ASF) under one or more +@REM contributor license agreements. See the NOTICE file distributed with +@REM this work for additional information regarding copyright ownership. +@REM The ASF licenses this file to You under the Apache License, Version 2.0 +@REM (the "License"); you may not use this file except in compliance with +@REM the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, software +@REM distributed under the License is distributed on an "AS IS" BASIS, +@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@REM See the License for the specific language governing permissions and +@REM limitations under the License. + +@echo off + +REM By default the script will use JAVA_HOME to determine which java +REM to use, but you can set a specific path for Solr to use without +REM affecting other Java applications on your server/workstation. +REM set SOLR_JAVA_HOME= + +REM Increase Java Min/Max Heap as needed to support your indexing / query needs +set SOLR_JAVA_MEM=-Xms512m -Xmx512m -XX:MaxPermSize=256m -XX:PermSize=256m + +REM Enable verbose GC logging +set GC_LOG_OPTS=-verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution + +REM These GC settings have shown to work well for a number of common Solr workloads +set GC_TUNE=-XX:-UseSuperWord ^ + -XX:NewRatio=3 ^ + -XX:SurvivorRatio=4 ^ + -XX:TargetSurvivorRatio=90 ^ + -XX:MaxTenuringThreshold=8 ^ + -XX:+UseConcMarkSweepGC ^ + -XX:+CMSScavengeBeforeRemark ^ + -XX:PretenureSizeThreshold=64m ^ + -XX:CMSFullGCsBeforeCompaction=1 ^ + -XX:+UseCMSInitiatingOccupancyOnly ^ + -XX:CMSInitiatingOccupancyFraction=70 ^ + -XX:CMSTriggerPermRatio=80 ^ + -XX:CMSMaxAbortablePrecleanTime=6000 ^ + -XX:+CMSParallelRemarkEnabled ^ + -XX:+ParallelRefProcEnabled ^ + -XX:+AggressiveOpts + +REM Set the ZooKeeper connection string if using an external ZooKeeper ensemble +REM e.g. host1:2181,host2:2181/chroot +REM Leave empty if not using SolrCloud +REM set ZK_HOST= + +REM Set the ZooKeeper client timeout (for SolrCloud mode) +REM set ZK_CLIENT_TIMEOUT=15000 + +REM By default the start script uses "localhost"; override the hostname here +REM for production SolrCloud environments to control the hostname exposed to cluster state +REM set SOLR_HOST=192.168.1.1 + +REM By default the start script uses UTC; override the timezone if needed +REM set SOLR_TIMEZONE=UTC + +REM By default the start script enables some RMI related parameters to allow attaching +REM JMX savvy tools like VisualVM remotely, set to "false" to disable that behavior +REM (recommended in production environments) +set ENABLE_REMOTE_JMX_OPTS=true + diff --git a/solr/bin/solr.in.sh b/solr/bin/solr.in.sh new file mode 100644 index 00000000000..1032c62c2ff --- /dev/null +++ b/solr/bin/solr.in.sh @@ -0,0 +1,70 @@ +# 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. + +# By default the script will use JAVA_HOME to determine which java +# to use, but you can set a specific path for Solr to use without +# affecting other Java applications on your server/workstation. +#SOLR_JAVA_HOME="" + +# Increase Java Min/Max Heap as needed to support your indexing / query needs +SOLR_JAVA_MEM="-Xms512m -Xmx512m -XX:MaxPermSize=256m -XX:PermSize=256m" + +# Enable verbose GC logging +GC_LOG_OPTS="-verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCDetails \ +-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution" + +# These GC settings have shown to work well for a number of common Solr workloads +GC_TUNE="-XX:-UseSuperWord \ +-XX:NewRatio=3 \ +-XX:SurvivorRatio=4 \ +-XX:TargetSurvivorRatio=90 \ +-XX:MaxTenuringThreshold=8 \ +-XX:+UseConcMarkSweepGC \ +-XX:+CMSScavengeBeforeRemark \ +-XX:PretenureSizeThreshold=64m \ +-XX:CMSFullGCsBeforeCompaction=1 \ +-XX:+UseCMSInitiatingOccupancyOnly \ +-XX:CMSInitiatingOccupancyFraction=70 \ +-XX:CMSTriggerPermRatio=80 \ +-XX:CMSMaxAbortablePrecleanTime=6000 \ +-XX:+CMSParallelRemarkEnabled \ +-XX:+ParallelRefProcEnabled \ +-XX:+AggressiveOpts" + +thisOs=`uname -s` +if [ "$thisOs" != "Darwin" ]; then + # UseLargePages flag causes JVM crash on Mac OSX + GC_TUNE="$GC_TUNE -XX:+UseLargePages" +fi + +# Set the ZooKeeper connection string if using an external ZooKeeper ensemble +# e.g. host1:2181,host2:2181/chroot +# Leave empty if not using SolrCloud +#ZK_HOST="" + +# Set the ZooKeeper client timeout (for SolrCloud mode) +#ZK_CLIENT_TIMEOUT="15000" + +# By default the start script uses "localhost"; override the hostname here +# for production SolrCloud environments to control the hostname exposed to cluster state +#SOLR_HOST="192.168.1.1" + +# By default the start script uses UTC; override the timezone if needed +#SOLR_TIMEZONE="UTC" + +# By default the start script enables some RMI related parameters to allow attaching +# JMX savvy tools like VisualVM remotely, set to "false" to disable that behavior +# (recommended in production environments) +ENABLE_REMOTE_JMX_OPTS="true" diff --git a/solr/build.xml b/solr/build.xml index cb32faef540..dd783e95a57 100644 --- a/solr/build.xml +++ b/solr/build.xml @@ -467,7 +467,7 @@ + includes="bin/* example/**/*.sh example/**/bin/" />