This is an automated email from the ASF dual-hosted git repository. ddanielr pushed a commit to branch elasticity in repository https://gitbox.apache.org/repos/asf/accumulo.git
commit 102a9744bb8ed411d2828b974df93d178634be4e Merge: d4249cfb18 11b1f48f03 Author: Daniel Roberts <ddani...@gmail.com> AuthorDate: Sun Jul 28 21:21:40 2024 +0000 Merge branch 'main' into elasticity assemble/bin/accumulo-cluster | 209 ++++++++++++++++++--- assemble/bin/accumulo-service | 140 +++++++++++--- .../core/conf/cluster/ClusterConfigParser.java | 23 ++- .../core/conf/cluster/ClusterConfigParserTest.java | 26 ++- .../cluster/cluster-with-optional-services.yaml | 9 +- 5 files changed, 329 insertions(+), 78 deletions(-) diff --cc assemble/bin/accumulo-cluster index b157f04c1e,5c4c50af52..e72eb52f04 --- a/assemble/bin/accumulo-cluster +++ b/assemble/bin/accumulo-cluster @@@ -23,16 -23,20 +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-servers [--all|--tservers|--no-tservers|--sservers [group]|--compactors [group]] ++ Starts various server types, can optionally specify a group ++ stop-servers [--all|--tservers| --no-tservers|--sservers [group]|--compactors [group]] ++ Starts various server types, can optionally specify a 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 } @@@ -123,15 -111,19 +127,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}" ++ for group in $COMPACTOR_GROUPS; do ++ var_name="NUM_COMPACTORS_${group}" + if [[ -n ${!var_name} ]]; then - echo "INFO: ${!var_name} compactors will be started per host for queue ${queue}" ++ echo "INFO: ${!var_name} compactors will be started per host for group ${group}" + fi + done } function control_service() { @@@ -155,10 -138,10 +163,10 @@@ [[ $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="_${group}_${inst_id}" - [[ $service == "compactor" ]] && ACCUMULO_SERVICE_INSTANCE="_${group}_${inst_id}" - [[ $service == "sserver" ]] && ACCUMULO_SERVICE_INSTANCE="_${group}_${inst_id}" - [[ last_instance_id -gt 1 ]] && ACCUMULO_SERVICE_INSTANCE="${inst_id}" - [[ $service =~ ^compactor|sserver$ ]] && ACCUMULO_SERVICE_INSTANCE="${ACCUMULO_SERVICE_INSTANCE}_${5}" ++ [[ last_instance_id -gt 1 ]] && ACCUMULO_SERVICE_INSTANCE="_${group}_${inst_id}" ++ [[ $service =~ ^compactor|sserver$ ]] && ACCUMULO_SERVICE_INSTANCE="${ACCUMULO_SERVICE_INSTANCE}_${inst_id}" if [[ $host == localhost || $host == "$(hostname -s)" || $host == "$(hostname -f)" || "$(hostname -I)" =~ $host ]]; then # @@@ -185,20 -168,100 +193,104 @@@ function start_service() control_service start "$@" } + function start_compactors() { + echo -n "Starting compactor servers ..." - queues=$COMPACTION_QUEUES ++ groups=$COMPACTOR_GROUPS + if [[ -n $1 ]]; then - queues="$1" - echo "Only starting servers for group: ${queues}" ++ groups="$1" ++ echo "Only starting servers for group: ${groups}" + fi - for queue in $queues; do - var_name="NUM_COMPACTORS_${queue}" ++ for group in $groups; do ++ var_name="NUM_COMPACTORS_${group}" + [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name} - Q="COMPACTOR_HOSTS_${queue}" ++ Q="COMPACTOR_HOSTS_${group}" + if [[ -n ${!Q} ]]; then + for compactor in ${!Q}; do - start_service "$compactor" compactor "-o" "compactor.queue=$queue" ++ start_service "$compactor" compactor "-o" "compactor.group=$group" + done + else - echo "${queue} is not a valid queue ...exiting" ++ echo "${group} is not a valid compactor group ...exiting" + fi + done + } + + function stop_compactors() { + echo "Stopping compactor servers ..." - queues=$COMPACTION_QUEUES ++ groups=$COMPACTOR_GROUPS + if [[ -n $1 ]]; then - queues="$1" - echo "Only stopping servers for group: ${queues}" ++ groups="$1" ++ echo "Only stopping servers for group: ${groups}" + fi - for queue in $queues; do - var_name="NUM_COMPACTORS_${queue}" ++ for group in $groups; do ++ var_name="NUM_COMPACTORS_${group}" + [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name} - Q="COMPACTOR_HOSTS_${queue}" ++ Q="COMPACTOR_HOSTS_${group}" + if [[ -n ${!Q} ]]; then + for compactor in ${!Q}; do - stop_service "$compactor" compactor "-o" "compactor.queue=$queue" ++ stop_service "$compactor" compactor "-o" "compactor.group=$group" + done + else - echo "${queue} is not a valid compaction queue ...exiting" ++ echo "${group} is not a valid compaction group ...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 "-o" "sserver.group=$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 "-o" "sserver.group=$group" + done + else - echo "${queue} is not a valid resource group ...exiting" ++ echo "${group} is not a valid resource group ...exiting" + fi + done + } + function start_tservers() { - echo -n "Starting tablet servers ..." - count=1 - for server in $TSERVER_HOSTS; do - echo -n "." - start_service "$server" tserver & - if ((++count % 72 == 0)); then - echo - wait - fi + echo "Starting tablet servers ..." + for group in $TSERVER_GROUPS; do + echo "Starting tablet servers for group $group" + count=1 + G="TSERVER_HOSTS_${group}" + for tserver in ${!G}; do + echo -n "." + start_service "$tserver" tserver "-o" "tserver.group=$group" + if ((++count % 72 == 0)); then + echo + wait + fi + done done echo " done" } @@@ -223,18 -286,24 +315,22 @@@ function start_all() done for group in $SSERVER_GROUPS; do + echo "Starting scan servers for group $group" + 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 "-o" "sserver.group=$group" done done - for coordinator in $COORDINATOR_HOSTS; do - start_service "$coordinator" compaction-coordinator - done - - for queue in $COMPACTION_QUEUES; do - var_name="NUM_COMPACTORS_${queue}" + for group in $COMPACTOR_GROUPS; do ++ var_name="NUM_COMPACTORS_${group}" + [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name} - Q="COMPACTOR_HOSTS_${queue}" + echo "Starting compactors for group $group" + Q="COMPACTOR_HOSTS_${group}" for compactor in ${!Q}; do - start_service "$compactor" compactor "-o" "compactor.queue=$queue" + start_service "$compactor" compactor "-o" "compactor.group=$group" done done @@@ -284,7 -350,8 +380,9 @@@ function start_here() done for group in $SSERVER_GROUPS; do + echo "Starting scan servers for group $group" + 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 @@@ -295,13 -362,22 +393,15 @@@ done done - for host in $local_hosts; do - for coordinator in $COORDINATOR_HOSTS; do - if echo "$coordinator" | grep -q "^${host}\$"; then - start_service "$coordinator" compaction-coordinator - fi - done - done - - for queue in $COMPACTION_QUEUES; do + for group in $COMPACTOR_GROUPS; do + echo "Starting compactors for group $group" for host in $local_hosts; do - var_name="NUM_COMPACTORS_${queue}" ++ var_name="NUM_COMPACTORS_${group}" + [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name} - Q="COMPACTOR_HOSTS_${queue}" + Q="COMPACTOR_HOSTS_${group}" for compactor in ${!Q}; do if echo "$compactor" | grep -q "^${host}\$"; then - start_service "$compactor" compactor "-q" "$queue" + start_service "$compactor" compactor "-o" "compactor.group=$group" fi done done @@@ -363,26 -431,28 +463,30 @@@ function kill_all() done for group in $SSERVER_GROUPS; do + echo "Killing scan servers for group $group" + 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 "-o" "sserver.group=$group" + kill_service "$sserver" sserver done done - for host in $TSERVER_HOSTS; do - kill_service "$host" tserver - done - - for coordinator in $COORDINATOR_HOSTS; do - kill_service "$coordinator" compaction-coordinator + for group in $TSERVER_GROUPS; do + echo "Killing tablet servers for group $group" + G="TSERVER_HOSTS_${group}" + for tserver in ${!G}; do + kill_service "$tserver" tserver + done done - for queue in $COMPACTION_QUEUES; do - var_name="NUM_COMPACTORS_${queue}" + for group in $COMPACTOR_GROUPS; do + echo "Killing compactors for group $group" ++ var_name="NUM_COMPACTORS_${group}" + [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name} - Q="COMPACTOR_HOSTS_${queue}" + Q="COMPACTOR_HOSTS_${group}" for compactor in ${!Q}; do - kill_service "$compactor" compactor "-o" "compactor.queue=$queue" + kill_service "$compactor" compactor done done @@@ -421,18 -491,24 +525,22 @@@ function stop_all() done for group in $SSERVER_GROUPS; do + echo "Stopping scan servers for group $group" + 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 "-o" "sserver.group=$group" + end_service $end_cmd "$sserver" sserver done done - for coordinator in $COORDINATOR_HOSTS; do - end_service $end_cmd "$coordinator" compaction-coordinator - done - - for queue in $COMPACTION_QUEUES; do - var_name="NUM_COMPACTORS_${queue}" + for group in $COMPACTOR_GROUPS; do + echo "Stopping compactors for group $group" ++ var_name="NUM_COMPACTORS_${group}" + [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name} - Q="COMPACTOR_HOSTS_${queue}" + Q="COMPACTOR_HOSTS_${group}" for compactor in ${!Q}; do - end_service $end_cmd "$compactor" compactor "-o" "compactor.queue=$queue" + end_service $end_cmd "$compactor" compactor done done @@@ -466,25 -539,23 +574,29 @@@ function stop_here() for host in "${hosts_to_check[@]}"; do for end_cmd in "stop" "kill"; do - for svc in tserver gc manager monitor compaction-coordinator; do + for svc in gc manager monitor; do end_service $end_cmd "$host" $svc done + for group in $TSERVER_GROUPS; do + G="TSERVER_HOSTS_${group}" + for tserver in ${!G}; do + end_service $end_cmd "$tserver" tserver + done + 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 "-o" "sserver.group=$group" + end_service $end_cmd "$sserver" sserver done done - for queue in $COMPACTION_QUEUES; do - var_name="NUM_COMPACTORS_${queue}" + for group in $COMPACTOR_GROUPS; do ++ var_name="NUM_COMPACTORS_${group}" + [[ -n ${!var_name} ]] && NUM_COMPACTORS=${!var_name} - Q="COMPACTOR_HOSTS_${queue}" + Q="COMPACTOR_HOSTS_${group}" for compactor in ${!Q}; do - end_service $end_cmd "$host" compactor "-o" "compactor.queue=$queue" + end_service $end_cmd "$host" compactor done done done diff --cc assemble/bin/accumulo-service index 52787a7e23,9da187135d..0ff2813d78 --- a/assemble/bin/accumulo-service +++ b/assemble/bin/accumulo-service @@@ -97,11 -106,46 +105,46 @@@ function control_process() 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" ++ local pid_file="${ACCUMULO_PID_DIR}/accumulo-${service_name}-${group}.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" ++ local pid_file="${ACCUMULO_PID_DIR}/accumulo-${service_name}-${group}.pid" + control_process "KILL" "$service_name" "$pid_file" fi } @@@ -135,39 -191,51 +190,62 @@@ 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" + # Find the group parameter if any + GROUP_PATTERN="^(compactor.group|sserver.group|tserver.group)=(.*)$" + group="default" + for param in "$@"; do + if [[ $param =~ $GROUP_PATTERN ]]; then + group="${BASH_REMATCH[2]}" + fi + done + - pid_file="${ACCUMULO_PID_DIR}/accumulo-${service}${ACCUMULO_SERVICE_INSTANCE}-${group}.pid" - case "$service" in + local service_type="$1" + local command_name="$2" + shift 2 - local service_name="unknown" ++ local service_name=$service_type + local all_flag=false + + # 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" ++ if [[ $1 != "-o" ]]; then ++ service_name="$1" ++ fi + fi + # Use the special bash env var from accumulo-cluster + else - service_name=${service_type}${ACCUMULO_SERVICE_INSTANCE} ++ service_name=${service_type}${ACCUMULO_SERVICE_INSTANCE}-${group} + fi + + case "$service_type" in - gc | manager | monitor | tserver | compaction-coordinator | compactor | sserver) + gc | manager | monitor | tserver | 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 ;; diff --cc core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java index c4ebf8c7ec,a16b6186c5..967d58c146 --- 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 @@@ -39,24 -39,13 +39,24 @@@ import edu.umd.cs.findbugs.annotations. 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 String COMPACTOR_PREFIX = "compactor."; - private static final String COMPACTORS_PER_HOST_KEY = "compactors_per_host"; ++ private static final String COMPACTORS_PER_HOST_PREFIX = "compactors_per_host."; + private static final String GC_KEY = "gc"; + private static final String MANAGER_KEY = "manager"; + private static final String MONITOR_KEY = "monitor"; + private static final String SSERVER_PREFIX = "sserver."; - private static final String SSERVERS_PER_HOST_KEY = "sservers_per_host"; ++ private static final String SSERVERS_PER_HOST_PREFIX = "sservers_per_host."; + private static final String TSERVER_PREFIX = "tserver."; + private static final String TSERVERS_PER_HOST_KEY = "tservers_per_host"; + + private static final String[] UNGROUPED_SECTIONS = + new String[] {MANAGER_KEY, MONITOR_KEY, GC_KEY}; - private static final Set<String> VALID_CONFIG_KEYS = Set.of(MANAGER_KEY, MONITOR_KEY, GC_KEY, - SSERVERS_PER_HOST_KEY, TSERVERS_PER_HOST_KEY, COMPACTORS_PER_HOST_KEY); + private static final Set<String> VALID_CONFIG_KEYS = - Set.of("manager", "monitor", "gc", "tserver", "tservers_per_host", "compaction.coordinator"); ++ Set.of(MANAGER_KEY, MONITOR_KEY, GC_KEY, TSERVERS_PER_HOST_KEY); -- private static final Set<String> VALID_CONFIG_PREFIXES = - Set.of(COMPACTOR_PREFIX, SSERVER_PREFIX, TSERVER_PREFIX); - Set.of("compaction.compactor.", "sserver.", "compactors_per_host.", "sservers_per_host."); ++ private static final Set<String> VALID_CONFIG_PREFIXES = Set.of(COMPACTOR_PREFIX, SSERVER_PREFIX, ++ TSERVER_PREFIX, SSERVERS_PER_HOST_PREFIX, COMPACTORS_PER_HOST_PREFIX); private static final Predicate<String> VALID_CONFIG_SECTIONS = section -> VALID_CONFIG_KEYS.contains(section) @@@ -124,16 -112,23 +124,18 @@@ } } - if (config.containsKey("compaction.coordinator")) { - out.printf(PROPERTY_FORMAT, "COORDINATOR_HOSTS", config.get("compaction.coordinator")); - } - - String compactorPrefix = "compaction.compactor."; - Set<String> compactorQueues = - config.keySet().stream().filter(k -> k.startsWith(compactorPrefix)) - .map(k -> k.substring(compactorPrefix.length())).collect(Collectors.toSet()); - - if (!compactorQueues.isEmpty()) { - out.printf(PROPERTY_FORMAT, "COMPACTION_QUEUES", - compactorQueues.stream().collect(Collectors.joining(" "))); - 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); + List<String> compactorGroups = + config.keySet().stream().filter(k -> k.startsWith(COMPACTOR_PREFIX)) + .map(k -> k.substring(COMPACTOR_PREFIX.length())).sorted().collect(Collectors.toList()); + + if (!compactorGroups.isEmpty()) { + out.printf(PROPERTY_FORMAT, "COMPACTOR_GROUPS", + compactorGroups.stream().collect(Collectors.joining(" "))); + for (String group : compactorGroups) { + out.printf(PROPERTY_FORMAT, "COMPACTOR_HOSTS_" + group, + config.get(COMPACTOR_PREFIX + group)); ++ String numCompactors = config.getOrDefault("compactors_per_host." + group, "1"); ++ out.printf(PROPERTY_FORMAT, "NUM_COMPACTORS_" + group, numCompactors); } } @@@ -144,17 -140,9 +146,20 @@@ out.printf(PROPERTY_FORMAT, "SSERVER_GROUPS", sserverGroups.stream().collect(Collectors.joining(" "))); sserverGroups.forEach(ssg -> out.printf(PROPERTY_FORMAT, "SSERVER_HOSTS_" + ssg, - config.get(sserverPrefix + ssg))); + config.get(SSERVER_PREFIX + ssg))); + sserverGroups.forEach(ssg -> out.printf(PROPERTY_FORMAT, "NUM_SSERVERS_" + ssg, + config.getOrDefault("sservers_per_host." + ssg, "1"))); ++ + } + + List<String> tserverGroups = config.keySet().stream().filter(k -> k.startsWith(TSERVER_PREFIX)) + .map(k -> k.substring(TSERVER_PREFIX.length())).sorted().collect(Collectors.toList()); + + if (!tserverGroups.isEmpty()) { + out.printf(PROPERTY_FORMAT, "TSERVER_GROUPS", + tserverGroups.stream().collect(Collectors.joining(" "))); + tserverGroups.forEach(tsg -> out.printf(PROPERTY_FORMAT, "TSERVER_HOSTS_" + tsg, + config.get(TSERVER_PREFIX + tsg))); } String numTservers = config.getOrDefault("tservers_per_host", "1"); diff --cc core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java index 189e48afc3,f0f27e629f..a50578914c --- 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 @@@ -84,7 -85,7 +84,8 @@@ public class ClusterConfigParserTest Map<String,String> contents = ClusterConfigParser.parseConfiguration(new File(configFile.toURI()).getAbsolutePath()); - assertEquals(14, contents.size()); - assertEquals(16, contents.size()); ++ assertEquals(17, contents.size()); ++ assertTrue(contents.containsKey("manager")); assertEquals("localhost1 localhost2", contents.get("manager")); assertTrue(contents.containsKey("monitor")); @@@ -103,19 -109,18 +104,25 @@@ assertEquals("hmvm1 hmvm2 hmvm3", contents.get("sserver.highmem")); assertTrue(contents.containsKey("sserver.cheap")); assertEquals("burstyvm1 burstyvm2", contents.get("sserver.cheap")); + assertFalse(contents.containsKey("tserver")); + assertTrue(contents.containsKey("tserver.default")); + assertEquals("localhost1 localhost2", contents.get("tserver.default")); + assertTrue(contents.containsKey("tserver.highmem")); + assertEquals("localhost3 localhost4", contents.get("tserver.highmem")); + assertTrue(contents.containsKey("tserver.cheap")); + assertEquals("localhost5 localhost6", contents.get("tserver.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 @@@ -171,11 -176,8 +178,9 @@@ expected.put("MANAGER_HOSTS", "localhost1 localhost2"); expected.put("MONITOR_HOSTS", "localhost1 localhost2"); expected.put("GC_HOSTS", "localhost"); - expected.put("TSERVER_HOSTS", "localhost1 localhost2 localhost3 localhost4"); + expected.put("TSERVER_GROUPS", "default"); + expected.put("TSERVER_HOSTS_default", "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 + '"'); @@@ -223,20 -225,21 +228,23 @@@ expected.put("MANAGER_HOSTS", "localhost1 localhost2"); expected.put("MONITOR_HOSTS", "localhost1 localhost2"); expected.put("GC_HOSTS", "localhost"); - expected.put("TSERVER_HOSTS", "localhost1 localhost2 localhost3 localhost4"); - expected.put("COORDINATOR_HOSTS", "localhost1 localhost2"); - expected.put("COMPACTION_QUEUES", "q1 q2"); + expected.put("COMPACTOR_GROUPS", "q1 q2"); expected.put("COMPACTOR_HOSTS_q1", "localhost1 localhost2"); expected.put("COMPACTOR_HOSTS_q2", "localhost3 localhost4"); - expected.put("SSERVER_GROUPS", "default highmem cheap"); + expected.put("SSERVER_GROUPS", "cheap default highmem"); + expected.put("SSERVER_HOSTS_cheap", "burstyvm1 burstyvm2"); expected.put("SSERVER_HOSTS_default", "localhost1 localhost2"); expected.put("SSERVER_HOSTS_highmem", "hmvm1 hmvm2 hmvm3"); - expected.put("SSERVER_HOSTS_cheap", "burstyvm1 burstyvm2"); + expected.put("TSERVER_GROUPS", "cheap default highmem"); + expected.put("TSERVER_HOSTS_cheap", "localhost5 localhost6"); + expected.put("TSERVER_HOSTS_default", "localhost1 localhost2"); + expected.put("TSERVER_HOSTS_highmem", "localhost3 localhost4"); 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 --cc core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-with-optional-services.yaml index deb7bba0b4,a0f3c0850c..06b8e6f81c --- 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 @@@ -51,14 -46,23 +51,19 @@@ sserver - burstyvm1 - burstyvm2 -compaction: - coordinator: +compactor: + q1: - localhost1 - localhost2 - compactor: - - q1: - - localhost1 - - localhost2 - - q2: - - localhost3 - - localhost4 + q2: + - localhost3 + - 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