This is an automated email from the ASF dual-hosted git repository. dlmarion pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/accumulo.git
commit c19fe486a6b90ef067b2bfb6358325623aa203ed Merge: 7da7ac89cc 51633db8df Author: Dave Marion <dlmar...@apache.org> AuthorDate: Thu Nov 7 21:47:49 2024 +0000 Merge branch '3.1' .../core/conf/cluster/ClusterConfigParser.java | 34 +++++++++++++++++----- .../core/conf/cluster/ClusterConfigParserTest.java | 17 +++++++++++ 2 files changed, 44 insertions(+), 7 deletions(-) diff --cc core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java index 967d58c146,ff71848d2f..016d5daa80 --- 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 @@@ -38,25 -39,25 +39,36 @@@ import edu.umd.cs.findbugs.annotations. public class ClusterConfigParser { + private static final Pattern GROUP_NAME_PATTERN = + Pattern.compile("^[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}$"); + - public static void validateGroupNames(Set<String> names) { ++ public static void validateGroupNames(List<String> names) { + for (String name : names) { + if (!GROUP_NAME_PATTERN.matcher(name).matches()) { + throw new RuntimeException("Group name: " + name + " contains invalid characters"); + } + } + } + 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_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_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", "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("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,42 -124,39 +136,45 @@@ } } - 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()); - validateGroupNames(compactorQueues); - - 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()); ++ validateGroupNames(compactorGroups); + + 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); } } - String sserverPrefix = "sserver."; - Set<String> sserverGroups = config.keySet().stream().filter(k -> k.startsWith(sserverPrefix)) - .map(k -> k.substring(sserverPrefix.length())).collect(Collectors.toSet()); + List<String> sserverGroups = config.keySet().stream().filter(k -> k.startsWith(SSERVER_PREFIX)) + .map(k -> k.substring(SSERVER_PREFIX.length())).sorted().collect(Collectors.toList()); + validateGroupNames(sserverGroups); if (!sserverGroups.isEmpty()) { 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()); ++ validateGroupNames(tserverGroups); + + 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 a50578914c,9777abc9b9..4793201355 --- 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 @@@ -34,7 -34,8 +34,8 @@@ import java.net.URL import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashMap; ++import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Function; import org.junit.jupiter.api.Test; @@@ -276,4 -272,20 +277,20 @@@ public class ClusterConfigParserTest assertTrue(exception.getMessage().contains("vserver")); } } + + @Test + public void testGroupNamePattern() { - ClusterConfigParser.validateGroupNames(Set.of("a")); - ClusterConfigParser.validateGroupNames(Set.of("a", "b")); - ClusterConfigParser.validateGroupNames(Set.of("default", "reg_ular")); - ClusterConfigParser.validateGroupNames(Set.of("a1b2c3d4__")); ++ ClusterConfigParser.validateGroupNames(List.of("a")); ++ ClusterConfigParser.validateGroupNames(List.of("a", "b")); ++ ClusterConfigParser.validateGroupNames(List.of("default", "reg_ular")); ++ ClusterConfigParser.validateGroupNames(List.of("a1b2c3d4__")); + assertThrows(RuntimeException.class, - () -> ClusterConfigParser.validateGroupNames(Set.of("0abcde"))); ++ () -> ClusterConfigParser.validateGroupNames(List.of("0abcde"))); + assertThrows(RuntimeException.class, - () -> ClusterConfigParser.validateGroupNames(Set.of("a-b"))); ++ () -> ClusterConfigParser.validateGroupNames(List.of("a-b"))); + assertThrows(RuntimeException.class, - () -> ClusterConfigParser.validateGroupNames(Set.of("a*b"))); ++ () -> ClusterConfigParser.validateGroupNames(List.of("a*b"))); + assertThrows(RuntimeException.class, - () -> ClusterConfigParser.validateGroupNames(Set.of("a?b"))); ++ () -> ClusterConfigParser.validateGroupNames(List.of("a?b"))); + } }