This is an automated email from the ASF dual-hosted git repository.

ddanielr pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/2.1 by this push:
     new ec2f1bd881 Improves accumulo-cluster for start and stop commands 
(#4763)
ec2f1bd881 is described below

commit ec2f1bd88139b217650727ff11094ce6d70e0dab
Author: Daniel Roberts <ddani...@gmail.com>
AuthorDate: Sun Jul 28 16:13:12 2024 -0400

    Improves accumulo-cluster for start and stop commands (#4763)
    
    Add start/stop per server type
    Add per host options on queue and group basis
    Use local variable for per-file for loop
    switched accumulo-service to mostly using local variables
    start/stop/kill commands now print the name of the process to stdout
    
    ---------
    
    Co-authored-by: Christopher Tubbs <ctubb...@apache.org>
---
 assemble/bin/accumulo-cluster                      | 209 ++++++++++++++++++---
 assemble/bin/accumulo-service                      | 144 ++++++++++----
 .../core/conf/cluster/ClusterConfigParser.java     |  16 +-
 .../core/conf/cluster/ClusterConfigParserTest.java |  25 ++-
 .../cluster/cluster-with-optional-services.yaml    |   9 +-
 5 files changed, 325 insertions(+), 78 deletions(-)

diff --git a/assemble/bin/accumulo-cluster b/assemble/bin/accumulo-cluster
index d31d65989c..bcab27ac66 100755
--- a/assemble/bin/accumulo-cluster
+++ b/assemble/bin/accumulo-cluster
@@ -23,16 +23,20 @@ function print_usage {
 Usage: accumulo-cluster <command> (<argument> ...)
 
 Commands:
-  create-config       Creates cluster config
-  restart             Restarts the Accumulo cluster
-  start               Starts Accumulo cluster
-  stop                Stops Accumulo cluster
-  kill                Kills Accumulo cluster
-  start-non-tservers  Starts all services except tservers
-  start-tservers      Starts all tservers on cluster
-  stop-tservers       Stops all tservers on cluster
-  start-here          Starts all services on this node
-  stop-here           Stops all services on this node
+  create-config              Creates cluster config
+  restart                    Restarts the Accumulo cluster
+  start                      Starts Accumulo cluster
+  stop                       Stops Accumulo cluster
+  kill                       Kills Accumulo cluster
+  start-non-tservers         Deprecated. Starts all services except tservers
+  start-servers [--all|--tservers|--no-tservers|--sservers 
[group]|--compactors [queue]]
+                             Starts various server types, can optionally 
specify a queue or group
+  stop-servers [--all|--tservers| --no-tservers|--sservers 
[group]|--compactors [queue]]
+                             Starts various server types, can optionally 
specify a queue or group
+  start-tservers             Deprecated. Starts all tservers on cluster
+  stop-tservers              Deprecated. Stops all tservers on cluster
+  start-here                 Starts all services on this node
+  stop-here                  Stops all services on this node
 EOF
 }
 
@@ -115,15 +119,19 @@ function parse_config {
     echo "INFO: ${NUM_TSERVERS} tservers will be started per host"
   fi
 
-  # shellcheck disable=SC2153
-  if [[ -z $NUM_SSERVERS ]]; then
-    echo "INFO: ${NUM_SSERVERS} sservers will be started per host"
-  fi
-
-  if [[ -z $NUM_COMPACTORS ]]; then
-    echo "INFO: ${NUM_COMPACTORS} compactors will be started per host"
-  fi
+  for group in $SSERVER_GROUPS; do
+    var_name="NUM_SSERVERS_${group}"
+    if [[ -n ${!var_name} ]]; then
+      echo "INFO: ${!var_name} scan servers will be started per host for group 
${group}"
+    fi
+  done
 
+  for queue in $COMPACTION_QUEUES; do
+    var_name="NUM_COMPACTORS_${queue}"
+    if [[ -n ${!var_name} ]]; then
+      echo "INFO: ${!var_name} compactors will be started per host for queue 
${queue}"
+    fi
+  done
 }
 
 function control_service() {
@@ -138,10 +146,10 @@ function control_service() {
   [[ $service == "compactor" ]] && last_instance_id=${NUM_COMPACTORS:-1}
 
   for ((inst_id = 1; inst_id <= last_instance_id; inst_id++)); do
+    # Only increment the service name when more than one service is desired.
     ACCUMULO_SERVICE_INSTANCE=""
-    [[ $service == "tserver" && ${NUM_TSERVERS:-1} -gt 1 ]] && 
ACCUMULO_SERVICE_INSTANCE=${inst_id}
-    [[ $service == "compactor" ]] && 
ACCUMULO_SERVICE_INSTANCE="${inst_id}_${5}"
-    [[ $service == "sserver" ]] && ACCUMULO_SERVICE_INSTANCE="${inst_id}_${5}"
+    [[ last_instance_id -gt 1 ]] && ACCUMULO_SERVICE_INSTANCE="${inst_id}"
+    [[ $service =~ ^compactor|sserver$ ]] && 
ACCUMULO_SERVICE_INSTANCE="${ACCUMULO_SERVICE_INSTANCE}_${5}"
 
     if [[ $host == localhost || $host == "$(hostname -s)" || $host == 
"$(hostname -f)" || "$(hostname -I)" =~ $host ]]; then
       #
@@ -168,6 +176,90 @@ function start_service() {
   control_service start "$@"
 }
 
+function start_compactors() {
+  echo -n "Starting compactor servers ..."
+  queues=$COMPACTION_QUEUES
+  if [[ -n $1 ]]; then
+    queues="$1"
+    echo "Only starting servers for group: ${queues}"
+  fi
+  for queue in $queues; do
+    var_name="NUM_COMPACTORS_${queue}"
+    [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name}
+    Q="COMPACTOR_HOSTS_${queue}"
+    if [[ -n ${!Q} ]]; then
+      for compactor in ${!Q}; do
+        start_service "$compactor" compactor "-q" "$queue"
+      done
+    else
+      echo "${queue} is not a valid queue ...exiting"
+    fi
+  done
+}
+
+function stop_compactors() {
+  echo "Stopping compactor servers ..."
+  queues=$COMPACTION_QUEUES
+  if [[ -n $1 ]]; then
+    queues="$1"
+    echo "Only stopping servers for group: ${queues}"
+  fi
+  for queue in $queues; do
+    var_name="NUM_COMPACTORS_${queue}"
+    [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name}
+    Q="COMPACTOR_HOSTS_${queue}"
+    if [[ -n ${!Q} ]]; then
+      for compactor in ${!Q}; do
+        stop_service "$compactor" compactor "-q" "$queue"
+      done
+    else
+      echo "${queue} is not a valid compaction queue ...exiting"
+    fi
+  done
+}
+
+function start_sservers() {
+  echo "Starting scan servers ..."
+  groups=$SSERVER_GROUPS
+  if [[ -n $1 ]]; then
+    groups="$1"
+    echo "Only starting servers for group: ${groups}"
+  fi
+  for group in $groups; do
+    var_name="NUM_SSERVERS_${group}"
+    [[ -n ${!var_name} ]] && NUM_SSERVERS=${!var_name}
+    G="SSERVER_HOSTS_${group}"
+    if [[ -n ${!G} ]]; then
+      for sserver in ${!G}; do
+        start_service "$sserver" sserver "-g" "$group"
+      done
+    else
+      echo "${group} is not a valid resource group ...exiting"
+    fi
+  done
+}
+
+function stop_sservers() {
+  echo "Stopping scan servers ..."
+  groups=$SSERVER_GROUPS
+  if [[ -n $1 ]]; then
+    groups="$1"
+    echo "Only stopping servers for group: ${groups}"
+  fi
+  for group in $groups; do
+    var_name="NUM_SSERVERS_${group}"
+    [[ -n ${!var_name} ]] && NUM_SSERVERS=${!var_name}
+    G="SSERVER_HOSTS_${group}"
+    if [[ -n ${!G} ]]; then
+      for sserver in ${!G}; do
+        stop_service "$sserver" sserver "-g" "$group"
+      done
+    else
+      echo "${queue} is not a valid resource group ...exiting"
+    fi
+  done
+}
+
 function start_tservers() {
   echo -n "Starting tablet servers ..."
   count=1
@@ -202,6 +294,8 @@ function start_all() {
   done
 
   for group in $SSERVER_GROUPS; do
+    var_name="NUM_SSERVERS_${group}"
+    [[ -n ${!var_name} ]] && NUM_SSERVERS=${!var_name}
     G="SSERVER_HOSTS_${group}"
     for sserver in ${!G}; do
       start_service "$sserver" sserver "-g" "$group"
@@ -213,6 +307,8 @@ function start_all() {
   done
 
   for queue in $COMPACTION_QUEUES; do
+    var_name="NUM_COMPACTORS_${queue}"
+    [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name}
     Q="COMPACTOR_HOSTS_${queue}"
     for compactor in ${!Q}; do
       start_service "$compactor" compactor "-q" "$queue"
@@ -262,6 +358,8 @@ function start_here() {
   done
 
   for group in $SSERVER_GROUPS; do
+    var_name="NUM_SSERVERS_${group}"
+    [[ -n ${!var_name} ]] && NUM_SSERVERS=${!var_name}
     for host in $local_hosts; do
       G="SSERVER_HOSTS_${group}"
       for sserver in ${!G}; do
@@ -282,6 +380,8 @@ function start_here() {
 
   for queue in $COMPACTION_QUEUES; do
     for host in $local_hosts; do
+      var_name="NUM_COMPACTORS_${queue}"
+      [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name}
       Q="COMPACTOR_HOSTS_${queue}"
       for compactor in ${!Q}; do
         if echo "$compactor" | grep -q "^${host}\$"; then
@@ -339,6 +439,8 @@ function kill_all() {
   done
 
   for group in $SSERVER_GROUPS; do
+    var_name="NUM_SSERVERS_${group}"
+    [[ -n ${!var_name} ]] && NUM_SSERVERS=${!var_name}
     G="SSERVER_HOSTS_${group}"
     for sserver in ${!G}; do
       kill_service "$sserver" sserver "-g" "$group"
@@ -354,6 +456,8 @@ function kill_all() {
   done
 
   for queue in $COMPACTION_QUEUES; do
+    var_name="NUM_COMPACTORS_${queue}"
+    [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name}
     Q="COMPACTOR_HOSTS_${queue}"
     for compactor in ${!Q}; do
       kill_service "$compactor" compactor "-q" "$queue"
@@ -395,6 +499,8 @@ function stop_all() {
     done
 
     for group in $SSERVER_GROUPS; do
+      var_name="NUM_SSERVERS_${group}"
+      [[ -n ${!var_name} ]] && NUM_SSERVERS=${!var_name}
       G="SSERVER_HOSTS_${group}"
       for sserver in ${!G}; do
         end_service $end_cmd "$sserver" sserver "-g" "$group"
@@ -406,6 +512,8 @@ function stop_all() {
     done
 
     for queue in $COMPACTION_QUEUES; do
+      var_name="NUM_COMPACTORS_${queue}"
+      [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name}
       Q="COMPACTOR_HOSTS_${queue}"
       for compactor in ${!Q}; do
         end_service $end_cmd "$compactor" compactor "-q" "$queue"
@@ -443,12 +551,16 @@ function stop_here() {
         end_service $end_cmd "$host" $svc
       done
       for group in $SSERVER_GROUPS; do
+        var_name="NUM_SSERVERS_${group}"
+        [[ -n ${!var_name} ]] && NUM_SSERVERS=${!var_name}
         G="SSERVER_HOSTS_${group}"
         for sserver in ${!G}; do
           end_service $end_cmd "$sserver" sserver "-g" "$group"
         done
       done
       for queue in $COMPACTION_QUEUES; do
+        var_name="NUM_COMPACTORS_${queue}"
+        [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name}
         Q="COMPACTOR_HOSTS_${queue}"
         for compactor in ${!Q}; do
           end_service $end_cmd "$host" compactor "-q" "$queue"
@@ -481,7 +593,7 @@ function main() {
   case "$1" in
     create-config)
       if [[ -f "$conf"/cluster.yaml ]]; then
-        echo "ERROR : $conf/cluster.yaml already exists, not overwriting"
+        echo "ERROR : ${conf}/cluster.yaml already exists, not overwriting"
         exit 1
       fi
       cat <<EOF >"$conf"/cluster.yaml
@@ -520,8 +632,11 @@ tserver:
 # compactors_per_host.
 #
 tservers_per_host: 1
-sservers_per_host: 1
-compactors_per_host: 1
+#sservers_per_host: 
+# - default: 1
+#compactors_per_host:
+# - q1: 1
+# - q2: 1 
 
 EOF
       ;;
@@ -545,10 +660,12 @@ EOF
       kill_all
       ;;
     start-non-tservers)
+      echo "$1 is deprecated. Please use \`start-servers --no-tservers\` 
instead"
       parse_config
       start_all --no-tservers
       ;;
     start-tservers)
+      echo "$1 is deprecated. Please use \`start-servers --tservers\` instead"
       parse_config
       start_tservers
       ;;
@@ -557,6 +674,7 @@ EOF
       start_here
       ;;
     stop-tservers)
+      echo "$1 is deprecated. Please use \`stop-servers --tservers\` instead"
       parse_config
       stop_tservers
       ;;
@@ -564,6 +682,49 @@ EOF
       parse_config
       stop_here
       ;;
+    start-servers)
+      parse_config
+      case "$2" in
+        "--all" | "")
+          start_all
+          ;;
+        "--tservers")
+          start_tservers
+          ;;
+        "--no-tservers")
+          start_all --no-tservers
+          ;;
+        "--sservers")
+          start_sservers "${@:3}"
+          ;;
+        "--compactors")
+          start_compactors "${@:3}"
+          ;;
+        *)
+          invalid_args "'$2' is an invalid <command>"
+          ;;
+      esac
+      ;;
+    stop-servers)
+      parse_config
+      case "$2" in
+        "--all" | "")
+          stop_all
+          ;;
+        "--tservers")
+          stop_tservers
+          ;;
+        "--sservers")
+          stop_sservers "${@:3}"
+          ;;
+        "--compactors")
+          stop_compactors "${@:3}"
+          ;;
+        *)
+          invalid_args "'$2' is an invalid <command>"
+          ;;
+      esac
+      ;;
     *)
       invalid_args "'$1' is an invalid <command>"
       ;;
diff --git a/assemble/bin/accumulo-service b/assemble/bin/accumulo-service
index 552c2b2251..6d7edb5283 100755
--- a/assemble/bin/accumulo-service
+++ b/assemble/bin/accumulo-service
@@ -26,16 +26,17 @@ Services:
   gc                     Accumulo garbage collector
   monitor                Accumulo monitor
   manager                Accumulo manager
-  master                 Accumulo master (Deprecated)
+  master                 Deprecated. Accumulo master
   tserver                Accumulo tserver
   compaction-coordinator Accumulo compaction coordinator (experimental)
   compactor              Accumulo compactor (experimental)
   sserver                Accumulo scan server (experimental)
 
 Commands:
-  start       Starts service
-  stop        Stops service
-  kill        Kills service
+  start                   Starts service(s)
+  stop [--all | [<name>]] Stops service(s)
+  kill [--all | [<name>]] Kills service(s)
+  list                    List running service(s)
 
 EOF
 }
@@ -60,25 +61,29 @@ function rotate_log() {
 }
 
 function start_service() {
+  local service_type=$1
+  local service_name=$2
+  shift 2
+
+  local pid_file="${ACCUMULO_PID_DIR}/accumulo-${service_name}.pid"
   if [[ -f $pid_file ]]; then
     pid=$(cat "$pid_file")
     if kill -0 "$pid" 2>/dev/null; then
-      echo "$host : $service already running (${pid})"
+      echo "$HOST : ${service_name} already running (${pid})"
       exit 0
     fi
   fi
-  echo "Starting $service on $host"
+  echo "Starting $service_name on $HOST"
 
-  if [[ $service == "manager" ]]; then
+  if [[ ${service_type} == "manager" ]]; then
     "${bin}/accumulo" org.apache.accumulo.manager.state.SetGoalState NORMAL
   fi
-
-  
outfile="${ACCUMULO_LOG_DIR}/${service}${ACCUMULO_SERVICE_INSTANCE}_${host}.out"
-  
errfile="${ACCUMULO_LOG_DIR}/${service}${ACCUMULO_SERVICE_INSTANCE}_${host}.err"
+  outfile="${ACCUMULO_LOG_DIR}/${service_name}_${HOST}.out"
+  errfile="${ACCUMULO_LOG_DIR}/${service_name}_${HOST}.err"
   rotate_log "$outfile"
   rotate_log "$errfile"
 
-  nohup "${bin}/accumulo" "$service" "$@" >"$outfile" 2>"$errfile" </dev/null &
+  nohup "${bin}/accumulo" "$service_type" "$@" >"$outfile" 2>"$errfile" 
</dev/null &
   echo "$!" >"${pid_file}"
 
   # Check the max open files limit and selectively warn
@@ -86,32 +91,82 @@ function start_service() {
   if [[ -n $max_files_open ]]; then
     max_files_recommended=32768
     if ((max_files_open < max_files_recommended)); then
-      echo "WARN : Max open files on $host is $max_files_open, recommend 
$max_files_recommended" >&2
+      echo "WARN : Max open files on $HOST is $max_files_open, recommend 
$max_files_recommended" >&2
     fi
   fi
 }
 
-function stop_service() {
+function control_process() {
+  local kill_code=$1
+  local service_name=$2
+  local pid_file=$3
   if [[ -f $pid_file ]]; then
-    echo "Stopping $service on $host"
-    kill -s TERM "$(cat "$pid_file")" 2>/dev/null
+    echo "Stopping $service_name on $HOST"
+    kill -s "$kill_code" "$(cat "$pid_file")" 2>/dev/null
     rm -f "${pid_file}" 2>/dev/null
   fi
 }
 
+function find_processes() {
+  local service_type=$1
+  local file
+  for file in "$ACCUMULO_PID_DIR"/*; do
+    if file=$(expr "$file" : '^.*/accumulo-\('"$service_type"'.*\)[.]pid$'); 
then
+      RUNNING_PROCESSES+=("$file")
+    fi
+  done
+}
+
+function stop_service() {
+  local service_type=$1
+  local service_name=$2
+  local all_flag=$3
+  if $all_flag; then
+    find_processes "$service_type"
+    for process in "${RUNNING_PROCESSES[@]}"; do
+      local pid_file="${ACCUMULO_PID_DIR}/accumulo-${process}.pid"
+      control_process "TERM" "$process" "$pid_file"
+    done
+  else
+    echo "Stopping service process: $service_name"
+    local pid_file="${ACCUMULO_PID_DIR}/accumulo-${service_name}.pid"
+    control_process "TERM" "$service_name" "$pid_file"
+  fi
+}
+
 function kill_service() {
-  if [[ -f $pid_file ]]; then
-    echo "Killing $service on $host"
-    kill -s KILL "$(cat "$pid_file")" 2>/dev/null
-    rm -f "${pid_file}" 2>/dev/null
+  local service_type=$1
+  local service_name=$2
+  local all_flag=$3
+  if $all_flag; then
+    find_processes "$service_type"
+    for process in "${RUNNING_PROCESSES[@]}"; do
+      local pid_file="${ACCUMULO_PID_DIR}/accumulo-${process}.pid"
+      control_process "KILL" "$process" "$pid_file"
+    done
+  else
+    local pid_file="${ACCUMULO_PID_DIR}/accumulo-${service_name}.pid"
+    control_process "KILL" "$service_name" "$pid_file"
   fi
 }
 
+function list_processes() {
+  local service_type=$1
+  find_processes "$service_type"
+  echo "Currently running ${service_type} processes:"
+  for process in "${RUNNING_PROCESSES[@]}"; do
+    echo "$process"
+  done
+}
+
 function main() {
   if [[ -z $1 ]]; then
     invalid_args "<service> cannot be empty"
   fi
 
+  # Create a global array for process tracking
+  declare -a RUNNING_PROCESSES
+
   # Resolve base directory
   SOURCE="${BASH_SOURCE[0]}"
   while [ -h "${SOURCE}" ]; do
@@ -137,40 +192,61 @@ function main() {
   mkdir -p "$ACCUMULO_LOG_DIR" 2>/dev/null
   mkdir -p "$ACCUMULO_PID_DIR" 2>/dev/null
 
-  host="$(hostname)"
-  if [[ -z $host ]]; then
-    host=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut 
-f1 -d'/')
+  HOST="$(hostname)"
+  if [[ -z $HOST ]]; then
+    HOST=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut 
-f1 -d'/')
   fi
-  service="$1"
 
-  if [[ $service == "master" ]]; then
+  local service_type="$1"
+  local command_name="$2"
+  shift 2
+  local service_name="unknown"
+  local all_flag=false
+
+  if [[ $service_type == "master" ]]; then
     echo "WARN : Use of 'master' service name is deprecated; use 'manager' 
instead."
-    service="manager"
+    service_type="manager"
+  fi
+
+  # Check and see if accumulo-cluster is calling this script
+  if [[ -z $ACCUMULO_SERVICE_INSTANCE ]]; then
+    # The rest of the arguments are from a user
+    if [[ $1 == "--all" ]]; then
+      all_flag=true
+    else
+      # A named service has been specified
+      service_name="$1"
+    fi
+  # Use the special bash env var from accumulo-cluster
+  else
+    service_name=${service_type}${ACCUMULO_SERVICE_INSTANCE}
   fi
 
-  
pid_file="${ACCUMULO_PID_DIR}/accumulo-${service}${ACCUMULO_SERVICE_INSTANCE}.pid"
-  case "$service" in
+  case "$service_type" in
     gc | manager | monitor | tserver | compaction-coordinator | compactor | 
sserver)
-      if [[ -z $2 ]]; then
+      if [[ -z $command_name ]]; then
         invalid_args "<command> cannot be empty"
       fi
-      case "$2" in
+      case "$command_name" in
         start)
-          start_service "${@:3}"
+          start_service "$service_type" "$service_name" "$@"
           ;;
         stop)
-          stop_service
+          stop_service "$service_type" "$service_name" $all_flag
           ;;
         kill)
-          kill_service
+          kill_service "$service_type" "$service_name" $all_flag
+          ;;
+        list)
+          list_processes "$service_type"
           ;;
         *)
-          invalid_args "'$2' is an invalid <command>"
+          invalid_args "'$command_name' is an invalid <command>"
           ;;
       esac
       ;;
     *)
-      invalid_args "'$service' is an invalid <service>"
+      invalid_args "'$service_type' is an invalid <service>"
       ;;
   esac
 }
diff --git 
a/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
 
b/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
index 5790fa7fd3..9f904d5b1c 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
@@ -41,11 +41,11 @@ public class ClusterConfigParser {
   private static final String PROPERTY_FORMAT = "%s=\"%s\"%n";
   private static final String[] SECTIONS = new String[] {"manager", "monitor", 
"gc", "tserver"};
 
-  private static final Set<String> VALID_CONFIG_KEYS = Set.of("manager", 
"monitor", "gc", "tserver",
-      "tservers_per_host", "sservers_per_host", "compaction.coordinator", 
"compactors_per_host");
+  private static final Set<String> VALID_CONFIG_KEYS =
+      Set.of("manager", "monitor", "gc", "tserver", "tservers_per_host", 
"compaction.coordinator");
 
   private static final Set<String> VALID_CONFIG_PREFIXES =
-      Set.of("compaction.compactor.", "sserver.");
+      Set.of("compaction.compactor.", "sserver.", "compactors_per_host.", 
"sservers_per_host.");
 
   private static final Predicate<String> VALID_CONFIG_SECTIONS =
       section -> VALID_CONFIG_KEYS.contains(section)
@@ -130,6 +130,8 @@ public class ClusterConfigParser {
       for (String queue : compactorQueues) {
         out.printf(PROPERTY_FORMAT, "COMPACTOR_HOSTS_" + queue,
             config.get("compaction.compactor." + queue));
+        String numCompactors = config.getOrDefault("compactors_per_host." + 
queue, "1");
+        out.printf(PROPERTY_FORMAT, "NUM_COMPACTORS_" + queue, numCompactors);
       }
     }
 
@@ -142,17 +144,13 @@ public class ClusterConfigParser {
           sserverGroups.stream().collect(Collectors.joining(" ")));
       sserverGroups.forEach(ssg -> out.printf(PROPERTY_FORMAT, 
"SSERVER_HOSTS_" + ssg,
           config.get(sserverPrefix + ssg)));
+      sserverGroups.forEach(ssg -> out.printf(PROPERTY_FORMAT, "NUM_SSERVERS_" 
+ ssg,
+          config.getOrDefault("sservers_per_host." + ssg, "1")));
     }
 
     String numTservers = config.getOrDefault("tservers_per_host", "1");
     out.print("NUM_TSERVERS=\"${NUM_TSERVERS:=" + numTservers + "}\"\n");
 
-    String numSservers = config.getOrDefault("sservers_per_host", "1");
-    out.print("NUM_SSERVERS=\"${NUM_SSERVERS:=" + numSservers + "}\"\n");
-
-    String numCompactors = config.getOrDefault("compactors_per_host", "1");
-    out.print("NUM_COMPACTORS=\"${NUM_COMPACTORS:=" + numCompactors + "}\"\n");
-
     out.flush();
   }
 
diff --git 
a/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
 
b/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
index 1410dc569a..f0f27e629f 100644
--- 
a/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
+++ 
b/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
@@ -85,7 +85,7 @@ public class ClusterConfigParserTest {
     Map<String,String> contents =
         ClusterConfigParser.parseConfiguration(new 
File(configFile.toURI()).getAbsolutePath());
 
-    assertEquals(13, contents.size());
+    assertEquals(16, contents.size());
     assertTrue(contents.containsKey("manager"));
     assertEquals("localhost1 localhost2", contents.get("manager"));
     assertTrue(contents.containsKey("monitor"));
@@ -111,10 +111,16 @@ public class ClusterConfigParserTest {
     assertEquals("burstyvm1 burstyvm2", contents.get("sserver.cheap"));
     assertTrue(contents.containsKey("tservers_per_host"));
     assertEquals("2", contents.get("tservers_per_host"));
-    assertTrue(contents.containsKey("sservers_per_host"));
-    assertEquals("2", contents.get("sservers_per_host"));
-    assertTrue(contents.containsKey("compactors_per_host"));
-    assertEquals("3", contents.get("compactors_per_host"));
+    assertTrue(contents.containsKey("sservers_per_host.default"));
+    assertEquals("1", contents.get("sservers_per_host.default"));
+    assertTrue(contents.containsKey("sservers_per_host.highmem"));
+    assertEquals("2", contents.get("sservers_per_host.highmem"));
+    assertTrue(contents.containsKey("sservers_per_host.cheap"));
+    assertEquals("3", contents.get("sservers_per_host.cheap"));
+    assertTrue(contents.containsKey("compactors_per_host.q1"));
+    assertEquals("3", contents.get("compactors_per_host.q1"));
+    assertTrue(contents.containsKey("compactors_per_host.q2"));
+    assertEquals("1", contents.get("compactors_per_host.q2"));
   }
 
   @Test
@@ -172,8 +178,6 @@ public class ClusterConfigParserTest {
     expected.put("GC_HOSTS", "localhost");
     expected.put("TSERVER_HOSTS", "localhost1 localhost2 localhost3 
localhost4");
     expected.put("NUM_TSERVERS", "${NUM_TSERVERS:=1}");
-    expected.put("NUM_SSERVERS", "${NUM_SSERVERS:=1}");
-    expected.put("NUM_COMPACTORS", "${NUM_COMPACTORS:=1}");
 
     expected.replaceAll((k, v) -> '"' + v + '"');
 
@@ -231,8 +235,11 @@ public class ClusterConfigParserTest {
     expected.put("SSERVER_HOSTS_highmem", "hmvm1 hmvm2 hmvm3");
     expected.put("SSERVER_HOSTS_cheap", "burstyvm1 burstyvm2");
     expected.put("NUM_TSERVERS", "${NUM_TSERVERS:=2}");
-    expected.put("NUM_SSERVERS", "${NUM_SSERVERS:=2}");
-    expected.put("NUM_COMPACTORS", "${NUM_COMPACTORS:=3}");
+    expected.put("NUM_COMPACTORS_q1", "3");
+    expected.put("NUM_COMPACTORS_q2", "1");
+    expected.put("NUM_SSERVERS_default", "1");
+    expected.put("NUM_SSERVERS_highmem", "2");
+    expected.put("NUM_SSERVERS_cheap", "3");
 
     expected.replaceAll((k, v) -> {
       return '"' + v + '"';
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-with-optional-services.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-with-optional-services.yaml
index 104857951b..a0f3c0850c 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-with-optional-services.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-with-optional-services.yaml
@@ -59,5 +59,10 @@ compaction:
         - localhost4
 
 tservers_per_host: 2
-sservers_per_host: 2
-compactors_per_host: 3
+sservers_per_host:
+  - default : 1
+  - highmem : 2
+  - cheap : 3
+compactors_per_host:
+  - q1 : 3
+  - q2 : 1

Reply via email to