From a702db0ec146134aaf6435b41941fef08f9b652b Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Tue, 21 Jul 2026 12:49:52 -0500 Subject: [PATCH 01/11] Move required properties out of ServerConfigCheckRunner --- .../org/apache/accumulo/core/conf/Property.java | 17 +++++++++++++++++ .../checkCommand/ServerConfigCheckRunner.java | 14 +------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index b148c1a60e5..132679665b2 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -1564,6 +1564,23 @@ public Property replacedBy() { return replacedBy; } + /** + * Gets the defined required properties + * + * @return requiredProperties + */ + public static Set getRequiredProperties() { + return Set.of(Property.INSTANCE_ZK_HOST, Property.INSTANCE_ZK_TIMEOUT, + Property.INSTANCE_SECRET, Property.INSTANCE_VOLUMES, Property.GENERAL_THREADPOOL_SIZE, + Property.GENERAL_DELEGATION_TOKEN_LIFETIME, + Property.GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL, Property.GENERAL_IDLE_PROCESS_INTERVAL, + Property.GENERAL_LOW_MEM_DETECTOR_INTERVAL, Property.GENERAL_LOW_MEM_DETECTOR_THRESHOLD, + Property.GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL, Property.MANAGER_CLIENTPORT, + Property.TSERV_CLIENTPORT, Property.GC_CYCLE_START, Property.GC_CYCLE_DELAY, + Property.GC_PORT, Property.MONITOR_PORT, Property.TABLE_MAJC_RATIO, + Property.TABLE_SPLIT_THRESHOLD); + } + private void precomputeAnnotations() { isSensitive = hasAnnotation(Sensitive.class) || hasPrefixWithAnnotation(getKey(), Sensitive.class); diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java b/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java index a13de0e59dc..932895427cb 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java @@ -52,19 +52,7 @@ public boolean runCheck(ServerContext context, ServerOpts opts, boolean fixFiles } log.trace("Checking that all required config properties are present"); - // there are many properties that should be set (default value or user set), identifying them - // all and checking them here is unrealistic. Some property that is not set but is expected - // will likely result in some sort of failure eventually anyway. We will just check a few - // obvious required properties here. - Set requiredProps = Set.of(Property.INSTANCE_ZK_HOST, Property.INSTANCE_ZK_TIMEOUT, - Property.INSTANCE_SECRET, Property.INSTANCE_VOLUMES, Property.GENERAL_THREADPOOL_SIZE, - Property.GENERAL_DELEGATION_TOKEN_LIFETIME, - Property.GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL, Property.GENERAL_IDLE_PROCESS_INTERVAL, - Property.GENERAL_LOW_MEM_DETECTOR_INTERVAL, Property.GENERAL_LOW_MEM_DETECTOR_THRESHOLD, - Property.GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL, Property.MANAGER_CLIENTPORT, - Property.TSERV_CLIENTPORT, Property.GC_CYCLE_START, Property.GC_CYCLE_DELAY, - Property.GC_PORT, Property.MONITOR_PORT, Property.TABLE_MAJC_RATIO, - Property.TABLE_SPLIT_THRESHOLD); + Set requiredProps = Property.getRequiredProperties(); for (var reqProp : requiredProps) { var confPropVal = config.get(reqProp); // already checked that all set properties are valid, just check that it is set then we know From a44536bb8596fb83730fc16b08342e2596dc9cfa Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Tue, 21 Jul 2026 12:54:29 -0500 Subject: [PATCH 02/11] Fix incorrect return type in comment --- core/src/main/java/org/apache/accumulo/core/conf/Property.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index 132679665b2..ad505d515d5 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -1567,7 +1567,7 @@ public Property replacedBy() { /** * Gets the defined required properties * - * @return requiredProperties + * @return Set */ public static Set getRequiredProperties() { return Set.of(Property.INSTANCE_ZK_HOST, Property.INSTANCE_ZK_TIMEOUT, From f9d82befcb1c91b192e5e377c55ec96f119430c2 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Wed, 22 Jul 2026 13:28:35 -0500 Subject: [PATCH 03/11] Add validation for PropertyType.URI and PropertyType.PATH --- .../apache/accumulo/core/conf/Property.java | 18 +++--- .../accumulo/core/conf/PropertyType.java | 59 ++++++++++++++++++- 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index ad505d515d5..4749b3de081 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -1570,15 +1570,15 @@ public Property replacedBy() { * @return Set */ public static Set getRequiredProperties() { - return Set.of(Property.INSTANCE_ZK_HOST, Property.INSTANCE_ZK_TIMEOUT, - Property.INSTANCE_SECRET, Property.INSTANCE_VOLUMES, Property.GENERAL_THREADPOOL_SIZE, - Property.GENERAL_DELEGATION_TOKEN_LIFETIME, - Property.GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL, Property.GENERAL_IDLE_PROCESS_INTERVAL, - Property.GENERAL_LOW_MEM_DETECTOR_INTERVAL, Property.GENERAL_LOW_MEM_DETECTOR_THRESHOLD, - Property.GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL, Property.MANAGER_CLIENTPORT, - Property.TSERV_CLIENTPORT, Property.GC_CYCLE_START, Property.GC_CYCLE_DELAY, - Property.GC_PORT, Property.MONITOR_PORT, Property.TABLE_MAJC_RATIO, - Property.TABLE_SPLIT_THRESHOLD); + return Set.of(Property.INSTANCE_ZK_HOST, Property.INSTANCE_ZK_TIMEOUT, Property.INSTANCE_SECRET, + Property.INSTANCE_VOLUMES, Property.GENERAL_THREADPOOL_SIZE, + Property.GENERAL_DELEGATION_TOKEN_LIFETIME, + Property.GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL, Property.GENERAL_IDLE_PROCESS_INTERVAL, + Property.GENERAL_LOW_MEM_DETECTOR_INTERVAL, Property.GENERAL_LOW_MEM_DETECTOR_THRESHOLD, + Property.GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL, Property.MANAGER_CLIENTPORT, + Property.TSERV_CLIENTPORT, Property.GC_CYCLE_START, Property.GC_CYCLE_DELAY, + Property.GC_PORT, Property.MONITOR_PORT, Property.TABLE_MAJC_RATIO, + Property.TABLE_SPLIT_THRESHOLD); } private void precomputeAnnotations() { diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index 2f92a3d4c83..2711b964646 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -21,6 +21,8 @@ import static java.util.Objects.requireNonNull; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Arrays; import java.util.HashSet; import java.util.Objects; @@ -38,6 +40,8 @@ import org.apache.accumulo.core.file.rfile.bcfile.Compression; import org.apache.accumulo.core.file.rfile.bcfile.CompressionAlgorithm; import org.apache.commons.lang3.Range; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.compress.Compressor; import org.slf4j.Logger; @@ -114,7 +118,7 @@ public enum PropertyType { + " '5%', '0.2%', '0.0005'.\n" + "Examples of invalid fractions/percentages are '', '10 percent', 'Hulk Hogan'"), - PATH("path", x -> true, + PATH("path", new ValidPath(), "A string that represents a filesystem path, which can be either relative" + " or absolute to some directory. The filesystem depends on the property. " + "Substitutions of the ACCUMULO_HOME environment variable can be done in the system " @@ -155,7 +159,7 @@ public enum PropertyType { BOOLEAN("boolean", in(false, null, "true", "false"), "Has a value of either 'true' or 'false' (case-insensitive)"), - URI("uri", x -> true, "A valid URI"), + URI("uri", new ValidUri(), "A valid URI"), FILENAME_EXT("file name extension", in(true, RFile.EXTENSION), "One of the currently supported filename extensions for storing table data files. " @@ -211,6 +215,38 @@ public boolean isValidFormat(String value) { return predicate.test(value); } + /** + * Validate that the provided string is a valid hadoop path. Path must exist and be a valid + * file/directory + */ + private static class ValidPath implements Predicate { + private static final Logger log = LoggerFactory.getLogger(ValidPath.class); + + @Override + public boolean test(String path) { + Configuration conf = new Configuration(); + Path hadoopPath = new Path(path); + + try { + FileSystem fs = hadoopPath.getFileSystem(conf); + // Check if path exists + if (fs.exists(hadoopPath)) { + // Check if path is a valid directory + if (fs.getFileStatus(hadoopPath).isFile() || fs.getFileStatus(hadoopPath).isDirectory()) { + return true; + } + log.error("provided path is not a file or directory"); + return false; + } + log.error("provided path does not exist"); + return false; + } catch (IOException e) { + log.error("provided path is not valid"); + return false; + } + } + } + /** * Validate that the provided string can be parsed into a json object. This implementation uses * jackson databind because it is less permissive that GSON for what is considered valid. This @@ -247,6 +283,24 @@ public boolean test(String value) { } } + private static class ValidUri implements Predicate { + private static final Logger log = LoggerFactory.getLogger(ValidUri.class); + + @Override + public boolean test(String uri) { + if (uri == null) { + return false; + } + try { + new URI(uri); + return true; + } catch (URISyntaxException e) { + log.error("provided uri string is not valid"); + return false; + } + } + } + private static class ValidVolumes implements Predicate { private static final Logger log = LoggerFactory.getLogger(ValidVolumes.class); @@ -306,7 +360,6 @@ public boolean test(String type) { } } } - } private static final Pattern SUFFIX_REGEX = Pattern.compile("\\D*$"); // match non-digits at end From a77bedb7ae40255df5370240b3445801a185f28b Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Wed, 22 Jul 2026 15:10:51 -0500 Subject: [PATCH 04/11] Fix failing unit test for PropertyType.PATH --- .../accumulo/core/conf/PropertyType.java | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index 2711b964646..0ec545238f3 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -40,8 +40,6 @@ import org.apache.accumulo.core.file.rfile.bcfile.Compression; import org.apache.accumulo.core.file.rfile.bcfile.CompressionAlgorithm; import org.apache.commons.lang3.Range; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.compress.Compressor; import org.slf4j.Logger; @@ -216,37 +214,53 @@ public boolean isValidFormat(String value) { } /** - * Validate that the provided string is a valid hadoop path. Path must exist and be a valid - * file/directory + * Validate that the provided string is a valid path. */ private static class ValidPath implements Predicate { private static final Logger log = LoggerFactory.getLogger(ValidPath.class); @Override public boolean test(String path) { - Configuration conf = new Configuration(); - Path hadoopPath = new Path(path); - - try { - FileSystem fs = hadoopPath.getFileSystem(conf); - // Check if path exists - if (fs.exists(hadoopPath)) { - // Check if path is a valid directory - if (fs.getFileStatus(hadoopPath).isFile() || fs.getFileStatus(hadoopPath).isDirectory()) { - return true; - } - log.error("provided path is not a file or directory"); - return false; - } - log.error("provided path does not exist"); - return false; - } catch (IOException e) { - log.error("provided path is not valid"); - return false; + if (path == null || path.trim().isEmpty()) { + return true; } + // path is absolute + else if (new Path(path.trim()).isAbsolute()) { + return true; + } + // path with one .../... + else if (path.matches("[A-Za-z]+/?[A-Za-z]+")) { + return true; + } + // path with /.../.../ + else if (path.matches("/?[A-Za-z+/?]+")) { + return true; + } + log.error("provided path is not valid"); + return false; } } + // SECOND VERSION OF ValidPath, leaving while waiting for clarification on the expected validation + /** + * Validate that the provided string is a valid hadoop path. Path must exist and be a valid + * file/directory + */ + /* + * private static class ValidPath implements Predicate { private static final Logger log = + * LoggerFactory.getLogger(ValidPath.class); + * + * @Override public boolean test(String path) { Configuration conf = new Configuration(); Path + * hadoopPath = new Path(path); + * + * try { FileSystem fs = hadoopPath.getFileSystem(conf); // Check if path exists if + * (fs.exists(hadoopPath)) { // Check if path is a valid directory if + * (fs.getFileStatus(hadoopPath).isFile() || fs.getFileStatus(hadoopPath).isDirectory()) { return + * true; } log.error("provided path is not a file or directory"); return false; } + * log.error("provided path does not exist"); return false; } catch (IOException e) { + * log.error("provided path is not valid"); return false; } } } + */ + /** * Validate that the provided string can be parsed into a json object. This implementation uses * jackson databind because it is less permissive that GSON for what is considered valid. This @@ -289,7 +303,7 @@ private static class ValidUri implements Predicate { @Override public boolean test(String uri) { if (uri == null) { - return false; + return true; } try { new URI(uri); From b993313989c3aeffd27de652b94be6ec641a9a7f Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Thu, 23 Jul 2026 14:47:21 -0500 Subject: [PATCH 05/11] Fix checkstyle violdations --- .../org/apache/accumulo/core/conf/Property.java | 2 +- .../apache/accumulo/core/conf/PropertyType.java | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index 4749b3de081..7ad9face671 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -1567,7 +1567,7 @@ public Property replacedBy() { /** * Gets the defined required properties * - * @return Set + * @return Set{@literal } */ public static Set getRequiredProperties() { return Set.of(Property.INSTANCE_ZK_HOST, Property.INSTANCE_ZK_TIMEOUT, Property.INSTANCE_SECRET, diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index 0ec545238f3..c86edbff2d1 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -48,6 +48,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Preconditions; +import com.google.common.base.Predicates; import com.google.gson.JsonParser; /** @@ -223,17 +224,11 @@ private static class ValidPath implements Predicate { public boolean test(String path) { if (path == null || path.trim().isEmpty()) { return true; - } - // path is absolute - else if (new Path(path.trim()).isAbsolute()) { + } else if (new Path(path.trim()).isAbsolute()) { return true; - } - // path with one .../... - else if (path.matches("[A-Za-z]+/?[A-Za-z]+")) { + } else if (path.matches("[A-Za-z]+/?[A-Za-z]+")) { return true; - } - // path with /.../.../ - else if (path.matches("/?[A-Za-z+/?]+")) { + } else if (path.matches("/?[A-Za-z+/?]+")) { return true; } log.error("provided path is not valid"); @@ -485,9 +480,10 @@ public boolean test(final String input) { // Predicates.and(Predicates.notNull(), ...), // or we can stop assuming that null is always okay for a Matches predicate, and do that // explicitly with Predicates.or(Predicates.isNull(), ...) + + final Predicate notNullPredicate = Predicates.notNull(); return input == null || pattern.matcher(input).matches(); } - } public static class PortRange extends Matches { From c499e66808cc77743135da3b37b822719c7eaade Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Thu, 23 Jul 2026 15:57:58 -0500 Subject: [PATCH 06/11] Remove outdated TODO from PropertyType.java, apache#2699 --- .../java/org/apache/accumulo/core/conf/PropertyType.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index c86edbff2d1..2a74cc17aba 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -48,7 +48,6 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Preconditions; -import com.google.common.base.Predicates; import com.google.gson.JsonParser; /** @@ -475,13 +474,6 @@ public Matches(final Pattern pattern) { @Override public boolean test(final String input) { - // TODO when the input is null, it just means that the property wasn't set - // we can add checks for not null for required properties with - // Predicates.and(Predicates.notNull(), ...), - // or we can stop assuming that null is always okay for a Matches predicate, and do that - // explicitly with Predicates.or(Predicates.isNull(), ...) - - final Predicate notNullPredicate = Predicates.notNull(); return input == null || pattern.matcher(input).matches(); } } From 335922d884c4a99e08ad05ff9879e410759eb76d Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Thu, 23 Jul 2026 16:35:42 -0500 Subject: [PATCH 07/11] Simplify matches regex for PropertyType.PATH validation --- .../main/java/org/apache/accumulo/core/conf/PropertyType.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index 2a74cc17aba..aafe0edf207 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -225,8 +225,6 @@ public boolean test(String path) { return true; } else if (new Path(path.trim()).isAbsolute()) { return true; - } else if (path.matches("[A-Za-z]+/?[A-Za-z]+")) { - return true; } else if (path.matches("/?[A-Za-z+/?]+")) { return true; } From d472f4168094ea4d45701bda0dd0cf588147cfbd Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Fri, 31 Jul 2026 13:12:48 -0500 Subject: [PATCH 08/11] Update Javadoc for required properties and validUri(), removed the second version of validPath() --- .../apache/accumulo/core/conf/Property.java | 4 +++- .../accumulo/core/conf/PropertyType.java | 23 +++---------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index 7ad9face671..ca40829e8e0 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -1565,7 +1565,9 @@ public Property replacedBy() { } /** - * Gets the defined required properties + * Gets the set of required properties. Each property was arbitrarily/manually identified to be + * required, either by default or because they are required to run a system. If one of these + * properties is not configured, the required properties check will fail. * * @return Set{@literal } */ diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index aafe0edf207..f5a87338e47 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -233,26 +233,6 @@ public boolean test(String path) { } } - // SECOND VERSION OF ValidPath, leaving while waiting for clarification on the expected validation - /** - * Validate that the provided string is a valid hadoop path. Path must exist and be a valid - * file/directory - */ - /* - * private static class ValidPath implements Predicate { private static final Logger log = - * LoggerFactory.getLogger(ValidPath.class); - * - * @Override public boolean test(String path) { Configuration conf = new Configuration(); Path - * hadoopPath = new Path(path); - * - * try { FileSystem fs = hadoopPath.getFileSystem(conf); // Check if path exists if - * (fs.exists(hadoopPath)) { // Check if path is a valid directory if - * (fs.getFileStatus(hadoopPath).isFile() || fs.getFileStatus(hadoopPath).isDirectory()) { return - * true; } log.error("provided path is not a file or directory"); return false; } - * log.error("provided path does not exist"); return false; } catch (IOException e) { - * log.error("provided path is not valid"); return false; } } } - */ - /** * Validate that the provided string can be parsed into a json object. This implementation uses * jackson databind because it is less permissive that GSON for what is considered valid. This @@ -289,6 +269,9 @@ public boolean test(String value) { } } + /** + * Validate that the provided string can be used to create a valid URI. + */ private static class ValidUri implements Predicate { private static final Logger log = LoggerFactory.getLogger(ValidUri.class); From ec0c0ae9df13fedb2af96879c36a7c236ed0df61 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Tue, 4 Aug 2026 11:13:45 -0500 Subject: [PATCH 09/11] Remove unneccessary ValidPath method --- .../accumulo/core/conf/PropertyType.java | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index f5a87338e47..011c8ac4a0f 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -116,7 +116,7 @@ public enum PropertyType { + " '5%', '0.2%', '0.0005'.\n" + "Examples of invalid fractions/percentages are '', '10 percent', 'Hulk Hogan'"), - PATH("path", new ValidPath(), + PATH("path", x -> true, "A string that represents a filesystem path, which can be either relative" + " or absolute to some directory. The filesystem depends on the property. " + "Substitutions of the ACCUMULO_HOME environment variable can be done in the system " @@ -213,26 +213,6 @@ public boolean isValidFormat(String value) { return predicate.test(value); } - /** - * Validate that the provided string is a valid path. - */ - private static class ValidPath implements Predicate { - private static final Logger log = LoggerFactory.getLogger(ValidPath.class); - - @Override - public boolean test(String path) { - if (path == null || path.trim().isEmpty()) { - return true; - } else if (new Path(path.trim()).isAbsolute()) { - return true; - } else if (path.matches("/?[A-Za-z+/?]+")) { - return true; - } - log.error("provided path is not valid"); - return false; - } - } - /** * Validate that the provided string can be parsed into a json object. This implementation uses * jackson databind because it is less permissive that GSON for what is considered valid. This From 2ed6245eb1da95130aca73319d696d618e162830 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Tue, 4 Aug 2026 13:18:03 -0500 Subject: [PATCH 10/11] Switch out method to return required properties for a final enum set REQUIRED_PROPERTIES --- .../apache/accumulo/core/conf/Property.java | 33 ++++++++----------- .../accumulo/core/conf/PropertyType.java | 2 +- .../checkCommand/ServerConfigCheckRunner.java | 4 +-- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index ca40829e8e0..3fa30e13b07 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -1564,25 +1564,6 @@ public Property replacedBy() { return replacedBy; } - /** - * Gets the set of required properties. Each property was arbitrarily/manually identified to be - * required, either by default or because they are required to run a system. If one of these - * properties is not configured, the required properties check will fail. - * - * @return Set{@literal } - */ - public static Set getRequiredProperties() { - return Set.of(Property.INSTANCE_ZK_HOST, Property.INSTANCE_ZK_TIMEOUT, Property.INSTANCE_SECRET, - Property.INSTANCE_VOLUMES, Property.GENERAL_THREADPOOL_SIZE, - Property.GENERAL_DELEGATION_TOKEN_LIFETIME, - Property.GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL, Property.GENERAL_IDLE_PROCESS_INTERVAL, - Property.GENERAL_LOW_MEM_DETECTOR_INTERVAL, Property.GENERAL_LOW_MEM_DETECTOR_THRESHOLD, - Property.GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL, Property.MANAGER_CLIENTPORT, - Property.TSERV_CLIENTPORT, Property.GC_CYCLE_START, Property.GC_CYCLE_DELAY, - Property.GC_PORT, Property.MONITOR_PORT, Property.TABLE_MAJC_RATIO, - Property.TABLE_SPLIT_THRESHOLD); - } - private void precomputeAnnotations() { isSensitive = hasAnnotation(Sensitive.class) || hasPrefixWithAnnotation(getKey(), Sensitive.class); @@ -1772,6 +1753,20 @@ public static boolean isValidTablePropertyKey(String key) { COMPACTION_SERVICE_DEFAULT_PLANNER, COMPACTION_SERVICE_DEFAULT_MAX_OPEN, COMPACTION_SERVICE_DEFAULT_GROUPS)); + /** + * The set of required properties. Each property was arbitrarily/manually identified to be + * required, either by default or because they are required to run a system. If one of these + * properties is not configured, the required properties check will fail. + */ + public static final Set REQUIRED_PROPERTIES = + Collections.unmodifiableSet(EnumSet.of(INSTANCE_ZK_HOST, INSTANCE_ZK_TIMEOUT, INSTANCE_SECRET, + INSTANCE_VOLUMES, GENERAL_THREADPOOL_SIZE, GENERAL_DELEGATION_TOKEN_LIFETIME, + GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL, GENERAL_IDLE_PROCESS_INTERVAL, + GENERAL_LOW_MEM_DETECTOR_INTERVAL, GENERAL_LOW_MEM_DETECTOR_THRESHOLD, + GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL, MANAGER_CLIENTPORT, TSERV_CLIENTPORT, + GC_CYCLE_START, GC_CYCLE_DELAY, GC_PORT, MONITOR_PORT, TABLE_MAJC_RATIO, + TABLE_SPLIT_THRESHOLD)); + /** * Checks if the given property may be changed via Zookeeper, but not recognized until the restart * of some relevant daemon. diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index 011c8ac4a0f..0c21921ea2c 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -116,7 +116,7 @@ public enum PropertyType { + " '5%', '0.2%', '0.0005'.\n" + "Examples of invalid fractions/percentages are '', '10 percent', 'Hulk Hogan'"), - PATH("path", x -> true, + PATH("path", x -> true, "A string that represents a filesystem path, which can be either relative" + " or absolute to some directory. The filesystem depends on the property. " + "Substitutions of the ACCUMULO_HOME environment variable can be done in the system " diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java b/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java index 932895427cb..47ed2135582 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.Map; -import java.util.Set; import org.apache.accumulo.core.cli.ServerOpts; import org.apache.accumulo.core.conf.Property; @@ -52,8 +51,7 @@ public boolean runCheck(ServerContext context, ServerOpts opts, boolean fixFiles } log.trace("Checking that all required config properties are present"); - Set requiredProps = Property.getRequiredProperties(); - for (var reqProp : requiredProps) { + for (var reqProp : Property.REQUIRED_PROPERTIES) { var confPropVal = config.get(reqProp); // already checked that all set properties are valid, just check that it is set then we know // it's valid From cb9f7629540eb07f06bc1515e9c2d06176f7b776 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Fri, 7 Aug 2026 14:25:19 -0500 Subject: [PATCH 11/11] Add field isRequired to enum Property, remove set of required properties --- .../apache/accumulo/core/conf/Property.java | 659 +++++++++--------- .../checkCommand/ServerConfigCheckRunner.java | 14 +- 2 files changed, 338 insertions(+), 335 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index 3fa30e13b07..752a304700f 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -51,9 +51,9 @@ import com.google.common.base.Preconditions; public enum Property { - COMPACTION_PREFIX("compaction.", null, PropertyType.PREFIX, + COMPACTION_PREFIX("compaction.", null, PropertyType.PREFIX, false, "Both major and minor compaction properties can be included under this prefix.", "4.0.0"), - COMPACTION_SERVICE_PREFIX(COMPACTION_PREFIX + "service.", null, PropertyType.PREFIX, + COMPACTION_SERVICE_PREFIX(COMPACTION_PREFIX + "service.", null, PropertyType.PREFIX, false, """ This prefix should be used to define all properties for the compaction services. See {% jlink -f org.apache.accumulo.core.spi.compaction.RatioBasedCompactionPlanner %}. @@ -69,89 +69,90 @@ public enum Property { "4.0.0"), COMPACTION_SERVICE_DEFAULT_PLANNER( COMPACTION_SERVICE_PREFIX + DEFAULT_COMPACTION_SERVICE_NAME + ".planner", - RatioBasedCompactionPlanner.class.getName(), PropertyType.CLASSNAME, + RatioBasedCompactionPlanner.class.getName(), PropertyType.CLASSNAME, false, "Planner for default compaction service.", "4.0.0"), COMPACTION_SERVICE_DEFAULT_MAX_OPEN(COMPACTION_SERVICE_DEFAULT_PLANNER + ".opts.maxOpen", "10", - PropertyType.COUNT, "The maximum number of files a compaction will open.", "4.0.0"), + PropertyType.COUNT, false, "The maximum number of files a compaction will open.", "4.0.0"), COMPACTION_SERVICE_DEFAULT_GROUPS(COMPACTION_SERVICE_DEFAULT_PLANNER + ".opts.groups", """ - [{"group": "default"}]""", PropertyType.JSON, + [{"group": "default"}]""", PropertyType.JSON, false, "See {% jlink -f org.apache.accumulo.core.spi.compaction.RatioBasedCompactionPlanner %}.", "4.0.0"), - COMPACTION_WARN_TIME(COMPACTION_PREFIX + "warn.time", "10m", PropertyType.TIMEDURATION, + COMPACTION_WARN_TIME(COMPACTION_PREFIX + "warn.time", "10m", PropertyType.TIMEDURATION, false, "When a compaction has not made progress for this time period, a warning will be logged.", "4.0.0"), // SSL properties local to each node (see also instance.ssl.enabled which must be consistent // across all nodes in an instance) - RPC_PREFIX("rpc.", null, PropertyType.PREFIX, + RPC_PREFIX("rpc.", null, PropertyType.PREFIX, false, "Properties in this category related to the configuration of SSL keys for" + " RPC. See also `instance.ssl.enabled`.", "1.6.0"), - RPC_PROCESS_ADVERTISE_ADDRESS("rpc.advertise.addr", "", PropertyType.STRING, """ + RPC_PROCESS_ADVERTISE_ADDRESS("rpc.advertise.addr", "", PropertyType.STRING, false, """ The address to use when registering this server in ZooKeeper. This could be an \ IP address or hostname and defaults to rpc.bind.addr property value. Port \ numbers, if not specified, will default to the port property for the specific server type. """, "2.1.4"), - RPC_PROCESS_BIND_ADDRESS("rpc.bind.addr", "", PropertyType.STRING, """ + RPC_PROCESS_BIND_ADDRESS("rpc.bind.addr", "", PropertyType.STRING, false, """ The local IP address to which this server should bind for sending \ and receiving network traffic. If not set then the process binds to all addresses. """, "2.1.4"), RPC_MAX_MESSAGE_SIZE("rpc.message.size.max", Integer.toString(Integer.MAX_VALUE), - PropertyType.BYTES, "The maximum size of a message that can be received by a server.", + PropertyType.BYTES, false, "The maximum size of a message that can be received by a server.", "2.1.3"), - RPC_BACKLOG("rpc.backlog", "50", PropertyType.COUNT, """ + RPC_BACKLOG("rpc.backlog", "50", PropertyType.COUNT, false, """ Configures the TCP backlog for the server side sockets created by Thrift. \ This property is not used for SSL type server sockets. A value of zero \ will use the Thrift default value. """, "2.1.3"), - RPC_SSL_KEYSTORE_PATH("rpc.javax.net.ssl.keyStore", "", PropertyType.PATH, + RPC_SSL_KEYSTORE_PATH("rpc.javax.net.ssl.keyStore", "", PropertyType.PATH, false, "Path of the keystore file for the server's private SSL key.", "1.6.0"), @Sensitive - RPC_SSL_KEYSTORE_PASSWORD("rpc.javax.net.ssl.keyStorePassword", "", PropertyType.STRING, + RPC_SSL_KEYSTORE_PASSWORD("rpc.javax.net.ssl.keyStorePassword", "", PropertyType.STRING, false, "Password used to encrypt the SSL private keystore. " + "Leave blank to use the Accumulo instance secret.", "1.6.0"), - RPC_SSL_KEYSTORE_TYPE("rpc.javax.net.ssl.keyStoreType", "jks", PropertyType.STRING, + RPC_SSL_KEYSTORE_TYPE("rpc.javax.net.ssl.keyStoreType", "jks", PropertyType.STRING, false, "Type of SSL keystore.", "1.6.0"), - RPC_SSL_TRUSTSTORE_PATH("rpc.javax.net.ssl.trustStore", "", PropertyType.PATH, + RPC_SSL_TRUSTSTORE_PATH("rpc.javax.net.ssl.trustStore", "", PropertyType.PATH, false, "Path of the truststore file for the root cert.", "1.6.0"), @Sensitive RPC_SSL_TRUSTSTORE_PASSWORD("rpc.javax.net.ssl.trustStorePassword", "", PropertyType.STRING, - "Password used to encrypt the SSL truststore. Leave blank to use no password.", "1.6.0"), - RPC_SSL_TRUSTSTORE_TYPE("rpc.javax.net.ssl.trustStoreType", "jks", PropertyType.STRING, + false, "Password used to encrypt the SSL truststore. Leave blank to use no password.", + "1.6.0"), + RPC_SSL_TRUSTSTORE_TYPE("rpc.javax.net.ssl.trustStoreType", "jks", PropertyType.STRING, false, "Type of SSL truststore.", "1.6.0"), - RPC_USE_JSSE("rpc.useJsse", "false", PropertyType.BOOLEAN, + RPC_USE_JSSE("rpc.useJsse", "false", PropertyType.BOOLEAN, false, """ Use JSSE system properties to configure SSL rather than the %sjavax.net.ssl.* Accumulo properties. """ .formatted(RPC_PREFIX.getKey()), "1.6.0"), - RPC_SSL_CIPHER_SUITES("rpc.ssl.cipher.suites", "", PropertyType.STRING, + RPC_SSL_CIPHER_SUITES("rpc.ssl.cipher.suites", "", PropertyType.STRING, false, "Comma separated list of cipher suites that can be used by accepted connections.", "1.6.1"), RPC_SSL_ENABLED_PROTOCOLS("rpc.ssl.server.enabled.protocols", "TLSv1.3", PropertyType.STRING, - "Comma separated list of protocols that can be used to accept connections.", "1.6.2"), - RPC_SSL_CLIENT_PROTOCOL("rpc.ssl.client.protocol", "TLSv1.3", PropertyType.STRING, """ + false, "Comma separated list of protocols that can be used to accept connections.", "1.6.2"), + RPC_SSL_CLIENT_PROTOCOL("rpc.ssl.client.protocol", "TLSv1.3", PropertyType.STRING, false, """ The protocol used to connect to a secure server. Must be in the list of enabled protocols \ on the server side `rpc.ssl.server.enabled.protocols`. """, "1.6.2"), - RPC_SASL_QOP("rpc.sasl.qop", "auth", PropertyType.STRING, + RPC_SASL_QOP("rpc.sasl.qop", "auth", PropertyType.STRING, false, "The quality of protection to be used with SASL. Valid values are 'auth', 'auth-int'," + " and 'auth-conf'.", "1.7.0"), // instance properties (must be the same for every node in an instance) - INSTANCE_PREFIX("instance.", null, PropertyType.PREFIX, + INSTANCE_PREFIX("instance.", null, PropertyType.PREFIX, false, "Properties in this category must be consistent throughout an instance. " + "This is enforced and servers won't be able to communicate if these differ.", "1.3.5"), - INSTANCE_ZK_HOST("instance.zookeeper.host", "localhost:2181", PropertyType.HOSTLIST, + INSTANCE_ZK_HOST("instance.zookeeper.host", "localhost:2181", PropertyType.HOSTLIST, true, "Comma separated list of zookeeper servers.", "1.3.5"), - INSTANCE_ZK_TIMEOUT("instance.zookeeper.timeout", "30s", PropertyType.TIMEDURATION, + INSTANCE_ZK_TIMEOUT("instance.zookeeper.timeout", "30s", PropertyType.TIMEDURATION, true, "Zookeeper session timeout; " + "max value when represented as milliseconds should be no larger than " + Integer.MAX_VALUE + ".", "1.3.5"), @Sensitive - INSTANCE_SECRET("instance.secret", "DEFAULT", PropertyType.STRING, """ + INSTANCE_SECRET("instance.secret", "DEFAULT", PropertyType.STRING, true, """ A secret unique to a given instance that all servers must know in order \ to communicate with one another. It should be changed prior to the \ initialization of Accumulo. To change it after Accumulo has been \ @@ -161,7 +162,7 @@ public enum Property { HDFS. To use the ChangeSecret tool, run the command: `./bin/accumulo \ admin changeSecret`. """, "1.3.5"), - INSTANCE_VOLUMES("instance.volumes", "", PropertyType.VOLUMES, """ + INSTANCE_VOLUMES("instance.volumes", "", PropertyType.VOLUMES, true, """ A comma separated list of dfs uris to use. Files will be stored across \ these filesystems. In some situations, the first volume in this list \ may be treated differently, such as being preferred for writing out \ @@ -174,7 +175,7 @@ temporary files (for example, when creating a pre-split table). \ a comma or other reserved characters in a URI use standard URI hex \ encoding. For example replace commas with %2C. """, "1.6.0"), - INSTANCE_VOLUME_CONFIG_PREFIX("instance.volume.config.", null, PropertyType.PREFIX, + INSTANCE_VOLUME_CONFIG_PREFIX("instance.volume.config.", null, PropertyType.PREFIX, false, """ Properties in this category are used to provide volume specific overrides to \ the general filesystem client configuration. Properties using this prefix \ @@ -186,7 +187,7 @@ temporary files (for example, when creating a pre-split table). \ files that the colons need to be escaped with a backslash. """, "2.1.1"), - INSTANCE_VOLUMES_REPLACEMENTS("instance.volumes.replacements", "", PropertyType.STRING, """ + INSTANCE_VOLUMES_REPLACEMENTS("instance.volumes.replacements", "", PropertyType.STRING, false, """ Since accumulo stores absolute URIs changing the location of a namenode \ could prevent Accumulo from starting. The property helps deal with \ that situation. Provide a comma separated list of uri replacement \ @@ -201,180 +202,184 @@ temporary files (for example, when creating a pre-split table). \ """, "1.6.0"), @Experimental // interface uses unstable internal types, use with caution INSTANCE_SECURITY_AUTHENTICATOR("instance.security.authenticator", - "org.apache.accumulo.server.security.handler.ZKAuthenticator", PropertyType.CLASSNAME, + "org.apache.accumulo.server.security.handler.ZKAuthenticator", PropertyType.CLASSNAME, false, "The authenticator class that accumulo will use to determine if a user " + "has privilege to perform an action.", "1.5.0"), @Experimental // interface uses unstable internal types, use with caution INSTANCE_SECURITY_AUTHORIZOR("instance.security.authorizor", - "org.apache.accumulo.server.security.handler.ZKAuthorizor", PropertyType.CLASSNAME, + "org.apache.accumulo.server.security.handler.ZKAuthorizor", PropertyType.CLASSNAME, false, "The authorizor class that accumulo will use to determine what labels a " + "user has privilege to see.", "1.5.0"), @Experimental // interface uses unstable internal types, use with caution INSTANCE_SECURITY_PERMISSION_HANDLER("instance.security.permissionHandler", - "org.apache.accumulo.server.security.handler.ZKPermHandler", PropertyType.CLASSNAME, + "org.apache.accumulo.server.security.handler.ZKPermHandler", PropertyType.CLASSNAME, false, "The permission handler class that accumulo will use to determine if a " + "user has privilege to perform an action.", "1.5.0"), - INSTANCE_RPC_SSL_ENABLED("instance.rpc.ssl.enabled", "false", PropertyType.BOOLEAN, + INSTANCE_RPC_SSL_ENABLED("instance.rpc.ssl.enabled", "false", PropertyType.BOOLEAN, false, "Use SSL for socket connections from clients and among accumulo services. " + "Mutually exclusive with SASL RPC configuration.", "1.6.0"), - INSTANCE_RPC_SSL_CLIENT_AUTH("instance.rpc.ssl.clientAuth", "false", PropertyType.BOOLEAN, + INSTANCE_RPC_SSL_CLIENT_AUTH("instance.rpc.ssl.clientAuth", "false", PropertyType.BOOLEAN, false, "Require clients to present certs signed by a trusted root.", "1.6.0"), - INSTANCE_RPC_SASL_ENABLED("instance.rpc.sasl.enabled", "false", PropertyType.BOOLEAN, + INSTANCE_RPC_SASL_ENABLED("instance.rpc.sasl.enabled", "false", PropertyType.BOOLEAN, false, "Configures Thrift RPCs to require SASL with GSSAPI which supports " + "Kerberos authentication. Mutually exclusive with SSL RPC configuration.", "1.7.0"), INSTANCE_RPC_SASL_ALLOWED_USER_IMPERSONATION("instance.rpc.sasl.allowed.user.impersonation", "", - PropertyType.STRING, + PropertyType.STRING, false, "One-line configuration property controlling what users are allowed to " + "impersonate other users.", "1.7.1"), INSTANCE_RPC_SASL_ALLOWED_HOST_IMPERSONATION("instance.rpc.sasl.allowed.host.impersonation", "", - PropertyType.STRING, + PropertyType.STRING, false, "One-line configuration property controlling the network locations " + "(hostnames) that are allowed to impersonate other users.", "1.7.1"), // Crypto-related properties @Experimental - INSTANCE_CRYPTO_PREFIX("instance.crypto.opts.", null, PropertyType.PREFIX, + INSTANCE_CRYPTO_PREFIX("instance.crypto.opts.", null, PropertyType.PREFIX, false, "Properties related to on-disk file encryption.", "2.0.0"), @Experimental @Sensitive INSTANCE_CRYPTO_SENSITIVE_PREFIX("instance.crypto.opts.sensitive.", null, PropertyType.PREFIX, - "Sensitive properties related to on-disk file encryption.", "2.0.0"), + false, "Sensitive properties related to on-disk file encryption.", "2.0.0"), @Experimental INSTANCE_CRYPTO_FACTORY("instance.crypto.opts.factory", - "org.apache.accumulo.core.spi.crypto.NoCryptoServiceFactory", PropertyType.CLASSNAME, + "org.apache.accumulo.core.spi.crypto.NoCryptoServiceFactory", PropertyType.CLASSNAME, false, "The class which provides crypto services for on-disk file encryption. The default does nothing. To enable " + "encryption, replace this classname with an implementation of the" + "org.apache.accumulo.core.spi.crypto.CryptoFactory interface.", "2.1.0"), // general properties - GENERAL_PREFIX("general.", null, PropertyType.PREFIX, + GENERAL_PREFIX("general.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of accumulo overall, but" + " do not have to be consistent throughout a cloud.", "1.3.5"), GENERAL_CONTEXT_CLASSLOADER_FACTORY("general.context.class.loader.factory", "", - PropertyType.CLASSNAME, + PropertyType.CLASSNAME, false, "Name of classloader factory to be used to create classloaders for named contexts," + " such as per-table contexts set by `table.class.loader.context`.", "2.1.0"), GENERAL_FILE_NAME_ALLOCATION_BATCH_SIZE_MIN("general.file.name.allocation.batch.size.min", "100", - PropertyType.COUNT, + PropertyType.COUNT, false, "The minimum number of filenames that will be allocated from ZooKeeper at a time.", "2.1.3"), GENERAL_FILE_NAME_ALLOCATION_BATCH_SIZE_MAX("general.file.name.allocation.batch.size.max", "200", - PropertyType.COUNT, + PropertyType.COUNT, false, "The maximum number of filenames that will be allocated from ZooKeeper at a time.", "2.1.3"), - GENERAL_RPC_TIMEOUT("general.rpc.timeout", "120s", PropertyType.TIMEDURATION, + GENERAL_RPC_TIMEOUT("general.rpc.timeout", "120s", PropertyType.TIMEDURATION, false, "Time to wait on I/O for simple, short RPC calls.", "1.3.5"), @Experimental - GENERAL_RPC_SERVER_TYPE("general.rpc.server.type", "", PropertyType.STRING, + GENERAL_RPC_SERVER_TYPE("general.rpc.server.type", "", PropertyType.STRING, false, "Type of Thrift server to instantiate, see " + "org.apache.accumulo.server.rpc.ThriftServerType for more information. " + "Only useful for benchmarking thrift servers.", "1.7.0"), - GENERAL_KERBEROS_KEYTAB("general.kerberos.keytab", "", PropertyType.PATH, + GENERAL_KERBEROS_KEYTAB("general.kerberos.keytab", "", PropertyType.PATH, false, "Path to the kerberos keytab to use. Leave blank if not using kerberoized hdfs.", "1.4.1"), - GENERAL_KERBEROS_PRINCIPAL("general.kerberos.principal", "", PropertyType.STRING, + GENERAL_KERBEROS_PRINCIPAL("general.kerberos.principal", "", PropertyType.STRING, false, "Name of the kerberos principal to use. _HOST will automatically be " + "replaced by the machines hostname in the hostname portion of the " + "principal. Leave blank if not using kerberoized hdfs.", "1.4.1"), GENERAL_KERBEROS_RENEWAL_PERIOD("general.kerberos.renewal.period", "30s", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The amount of time between attempts to perform Kerberos ticket renewals." + " This does not equate to how often tickets are actually renewed (which is" + " performed at 80% of the ticket lifetime).", "1.6.5"), GENERAL_OPENTELEMETRY_ENABLED("general.opentelemetry.enabled", "false", PropertyType.BOOLEAN, + false, "Enables OpenTelemetry traces for new spans in the server process that are not already part " + "of an existing trace. Spans that are part of an existing trace, such as one " + "originating in client code and propagated to the server over an RPC request, are " + "always traced, regardless of this value. (Note: no tracing will occur if " + "OpenTelemetry is not first configured for the JVM).", "2.1.0"), - GENERAL_THREADPOOL_SIZE("general.server.threadpool.size", "3", PropertyType.COUNT, + GENERAL_THREADPOOL_SIZE("general.server.threadpool.size", "3", PropertyType.COUNT, true, "The number of threads to use for server-internal scheduled tasks.", "2.1.0"), // If you update the default type, be sure to update the default used for initialization failures // in VolumeManagerImpl GENERAL_VOLUME_CHOOSER("general.volume.chooser", RandomVolumeChooser.class.getName(), - PropertyType.CLASSNAME, + PropertyType.CLASSNAME, false, "The class that will be used to select which volume will be used to create new files.", "1.6.0"), GENERAL_SECURITY_CREDENTIAL_PROVIDER_PATHS("general.security.credential.provider.paths", "", - PropertyType.STRING, "Comma-separated list of paths to CredentialProviders.", "1.6.1"), - GENERAL_ARBITRARY_PROP_PREFIX("general.custom.", null, PropertyType.PREFIX, + PropertyType.STRING, false, "Comma-separated list of paths to CredentialProviders.", "1.6.1"), + GENERAL_ARBITRARY_PROP_PREFIX("general.custom.", null, PropertyType.PREFIX, false, "Prefix to be used for user defined system-wide properties. This may be" + " particularly useful for system-wide configuration for various" + " user-implementations of pluggable Accumulo features, such as the balancer" + " or volume chooser.", "2.0.0"), GENERAL_CACHE_MANAGER_IMPL("general.block.cache.manager.class", - TinyLfuBlockCacheManager.class.getName(), PropertyType.STRING, + TinyLfuBlockCacheManager.class.getName(), PropertyType.STRING, false, "Specifies the class name of the block cache factory implementation.", "2.1.4"), GENERAL_DELEGATION_TOKEN_LIFETIME("general.delegation.token.lifetime", "7d", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, true, "The length of time that delegation tokens and secret keys are valid.", "1.7.0"), GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL("general.delegation.token.update.interval", "1d", - PropertyType.TIMEDURATION, "The length of time between generation of new secret keys.", + PropertyType.TIMEDURATION, true, "The length of time between generation of new secret keys.", "1.7.0"), GENERAL_IDLE_PROCESS_INTERVAL("general.metrics.process.idle", "5m", PropertyType.TIMEDURATION, + true, "Amount of time a process must be idle before it is considered to be idle by the metrics system.", "2.1.3"), GENERAL_LOW_MEM_DETECTOR_INTERVAL("general.low.mem.detector.interval", "5s", - PropertyType.TIMEDURATION, "The time interval between low memory checks.", "3.0.0"), + PropertyType.TIMEDURATION, true, "The time interval between low memory checks.", "3.0.0"), GENERAL_LOW_MEM_DETECTOR_THRESHOLD("general.low.mem.detector.threshold", "0.05", - PropertyType.FRACTION, + PropertyType.FRACTION, true, "The LowMemoryDetector will report when free memory drops below this percentage of total memory.", "3.0.0"), GENERAL_LOW_MEM_SCAN_PROTECTION("general.low.mem.protection.scan", "false", PropertyType.BOOLEAN, + false, "Scans may be paused or return results early when the server " + "is low on memory and this property is set to true. Enabling this property will incur a slight " + "scan performance penalty when the server is not low on memory.", "3.0.0"), GENERAL_LOW_MEM_MINC_PROTECTION("general.low.mem.protection.compaction.minc", "false", - PropertyType.BOOLEAN, + PropertyType.BOOLEAN, false, "Minor compactions may be paused when the server " + "is low on memory and this property is set to true. Enabling this property will incur a slight " + "compaction performance penalty when the server is not low on memory.", "3.0.0"), GENERAL_LOW_MEM_MAJC_PROTECTION("general.low.mem.protection.compaction.majc", "false", - PropertyType.BOOLEAN, + PropertyType.BOOLEAN, false, "Major compactions may be paused when the server " + "is low on memory and this property is set to true. Enabling this property will incur a slight " + "compaction performance penalty when the server is not low on memory.", "3.0.0"), GENERAL_MAX_SCANNER_RETRY_PERIOD("general.max.scanner.retry.period", "5s", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The maximum amount of time that a Scanner should wait before retrying a failed RPC.", "1.7.3"), GENERAL_MICROMETER_CACHE_METRICS_ENABLED("general.micrometer.cache.metrics.enabled", "false", - PropertyType.BOOLEAN, + PropertyType.BOOLEAN, false, "Enables Caffeine Cache metrics functionality using Micrometer. Requires " + " property 'general.micrometer.enabled' to be set to 'true' to take effect.", "4.0.0"), - GENERAL_MICROMETER_ENABLED("general.micrometer.enabled", "true", PropertyType.BOOLEAN, + GENERAL_MICROMETER_ENABLED("general.micrometer.enabled", "true", PropertyType.BOOLEAN, false, "Enables metrics collection and reporting functionality using Micrometer. The Monitor" + " is dependent on metrics being enabled to function correctly.", "2.1.0"), GENERAL_MICROMETER_JVM_METRICS_ENABLED("general.micrometer.jvm.metrics.enabled", "false", - PropertyType.BOOLEAN, + PropertyType.BOOLEAN, false, "Enables additional JVM metrics collection and reporting using Micrometer. Requires " + "property 'general.micrometer.enabled' to be set to 'true' to take effect.", "2.1.0"), - GENERAL_MICROMETER_LOG_METRICS("general.micrometer.log.metrics", "none", PropertyType.STRING, """ - Enables additional log metrics collection and reporting using Micrometer. Requires \ - property 'general.micrometer.enabled' to be set to 'true' to take effect. Micrometer \ - natively instruments Log4j2 and Logback. Valid values for this property are 'none', \ - 'log4j2' or 'logback'. - """, "2.1.4"), + GENERAL_MICROMETER_LOG_METRICS("general.micrometer.log.metrics", "none", PropertyType.STRING, + false, """ + Enables additional log metrics collection and reporting using Micrometer. Requires \ + property 'general.micrometer.enabled' to be set to 'true' to take effect. Micrometer \ + natively instruments Log4j2 and Logback. Valid values for this property are 'none', \ + 'log4j2' or 'logback'. + """, "2.1.4"), GENERAL_MICROMETER_FACTORY("general.micrometer.factory", "org.apache.accumulo.core.spi.metrics.AccumuloMonitorMeterRegistryFactory", - PropertyType.CLASSNAMELIST, + PropertyType.CLASSNAMELIST, false, """ A comma separated list of one or more class names that implements \ org.apache.accumulo.core.spi.metrics.MeterRegistryFactory. Prior to \ @@ -383,53 +388,53 @@ was changed and it now can accept multiple class names. The metrics spi was intr the deprecated factory is org.apache.accumulo.core.metrics.MeterRegistryFactory. """, "2.1.0"), - GENERAL_MICROMETER_USER_TAGS("general.micrometer.user.tags", "", PropertyType.STRING, """ + GENERAL_MICROMETER_USER_TAGS("general.micrometer.user.tags", "", PropertyType.STRING, false, """ A comma separated list of tags to emit with all metrics from the process. Example: \ "tag1=value1,tag2=value2". """, "4.0.0"), @Deprecated(since = "4.0.0") @ReplacedBy(property = RPC_PROCESS_BIND_ADDRESS) - GENERAL_PROCESS_BIND_ADDRESS("general.process.bind.addr", "0.0.0.0", PropertyType.STRING, + GENERAL_PROCESS_BIND_ADDRESS("general.process.bind.addr", "0.0.0.0", PropertyType.STRING, false, "The local IP address to which this server should bind for sending and receiving network traffic.", "3.0.0"), GENERAL_SERVER_ITERATOR_OPTIONS_COMPRESSION_ALGO("general.server.iter.opts.compression", "none", - PropertyType.COMPRESSION_TYPE, + PropertyType.COMPRESSION_TYPE, false, "Compression algorithm name to use for server-side iterator options compression.", "2.1.4"), GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL("general.server.lock.verification.interval", "2m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, true, "Interval at which the Manager and TabletServer should verify their server locks. A value of zero" + " disables this check. The default value changed from 0 to 2m in 4.0.0.", "2.1.4"), GENERAL_SERVER_WAL_SORT_BUFFER_SIZE("general.server.wal.sort.buffer.size", "10%", - PropertyType.MEMORY, "The amount of memory to use when sorting logs during recovery.", + PropertyType.MEMORY, false, "The amount of memory to use when sorting logs during recovery.", "4.0.0"), // properties that are specific to manager server behavior - MANAGER_PREFIX("manager.", null, PropertyType.PREFIX, + MANAGER_PREFIX("manager.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of the manager server.", "2.1.0"), - MANAGER_CLIENTPORT("manager.port.client", "9999-10009", PropertyType.PORT, + MANAGER_CLIENTPORT("manager.port.client", "9999-10009", PropertyType.PORT, true, "The port used for handling client connections on the manager.", "1.3.5"), MANAGER_TABLET_BALANCER("manager.tablet.balancer", - "org.apache.accumulo.core.spi.balancer.TableLoadBalancer", PropertyType.CLASSNAME, + "org.apache.accumulo.core.spi.balancer.TableLoadBalancer", PropertyType.CLASSNAME, false, "The balancer class that accumulo will use to make tablet assignment and " + "migration decisions.", "1.3.5"), MANAGER_TABLET_BALANCER_TSERVER_THRESHOLD("manager.tablet.balancer.tserver.threshold", "0", - PropertyType.COUNT, + PropertyType.COUNT, false, "Indicates the minimum number of tservers for assignment and balancing operations for user tables. A" + " value of zero (default) disables this threshold allowing assignment and balancing to always occur.", "2.1.4"), MANAGER_TABLET_GROUP_WATCHER_INTERVAL("manager.tablet.watcher.interval", "60s", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "Time to wait between scanning tablet states to identify tablets that need to be assigned, un-assigned, migrated, etc.", "2.1.2"), MANAGER_TABLET_GROUP_WATCHER_SCAN_THREADS("manager.tablet.watcher.scan.threads.max", "8", - PropertyType.COUNT, + PropertyType.COUNT, false, "Maximum number of threads the TabletGroupWatcher will use in its BatchScanner to" + " look for tablets that need maintenance.", "2.1.4"), MANAGER_TABLET_REFRESH_MINTHREADS("manager.tablet.refresh.threads.minimum", "10", - PropertyType.COUNT, + PropertyType.COUNT, false, """ The Manager will notify TabletServers that a Tablet needs to be refreshed after certain operations \ are performed (e.g. Bulk Import). This property specifies the number of core threads in a \ @@ -437,7 +442,7 @@ are performed (e.g. Bulk Import). This property specifies the number of core thr """, "4.0.0"), MANAGER_TABLET_REFRESH_MAXTHREADS("manager.tablet.refresh.threads.maximum", "10", - PropertyType.COUNT, + PropertyType.COUNT, false, """ The Manager will notify TabletServers that a Tablet needs to be refreshed after certain operations \ are performed (e.g. Bulk Import). This property specifies the maximum number of threads in a \ @@ -445,50 +450,51 @@ are performed (e.g. Bulk Import). This property specifies the maximum number of """, "4.0.0"), MANAGER_TABLET_MERGEABILITY_INTERVAL("manager.tablet.mergeability.interval", "24h", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "Time to wait between scanning tables to identify ranges of tablets that can be " + " auto-merged. Valid ranges will be have merge fate ops submitted.", "4.0.0"), MANAGER_TABLE_DELETE_OPTIMIZATION("manager.table.delete.optimization", "true", - PropertyType.BOOLEAN, + PropertyType.BOOLEAN, false, "When deleting a table the Manager will remove related table directories from " + " the storage volumes if there are no other references to the files in the " + " metadata table. When deleting a lot of tables this optimization can be costly. " + " Setting this value to false will skip this optimization and the table directory " + " cleanup will occur in the Garbage Collector instead.", "2.1.5"), - MANAGER_BULK_TIMEOUT("manager.bulk.timeout", "5m", PropertyType.TIMEDURATION, + MANAGER_BULK_TIMEOUT("manager.bulk.timeout", "5m", PropertyType.TIMEDURATION, false, "The time to wait for a tablet server to process a bulk import request.", "1.4.3"), - MANAGER_RENAME_THREADS("manager.rename.threadpool.size", "20", PropertyType.COUNT, + MANAGER_RENAME_THREADS("manager.rename.threadpool.size", "20", PropertyType.COUNT, false, "The number of threads to use when renaming user files during table import or bulk ingest.", "2.1.0"), - MANAGER_MINTHREADS("manager.server.threads.minimum", "20", PropertyType.COUNT, + MANAGER_MINTHREADS("manager.server.threads.minimum", "20", PropertyType.COUNT, false, "The minimum number of threads to use to handle incoming requests.", "1.4.0"), MANAGER_MINTHREADS_TIMEOUT("manager.server.threads.timeout", "0s", PropertyType.TIMEDURATION, + false, "The time after which incoming request threads terminate with no work available. Zero (0) will keep the threads alive indefinitely.", "2.1.0"), - MANAGER_THREADCHECK("manager.server.threadcheck.time", "1s", PropertyType.TIMEDURATION, + MANAGER_THREADCHECK("manager.server.threadcheck.time", "1s", PropertyType.TIMEDURATION, false, "The time between adjustments of the server thread pool.", "1.4.0"), - MANAGER_RECOVERY_DELAY("manager.recovery.delay", "10s", PropertyType.TIMEDURATION, + MANAGER_RECOVERY_DELAY("manager.recovery.delay", "10s", PropertyType.TIMEDURATION, false, "When a tablet server's lock is deleted, it takes time for it to " + "completely quit. This delay gives it time before log recoveries begin.", "1.5.0"), MANAGER_RECOVERY_WAL_EXISTENCE_CACHE_TIME("manager.recovery.wal.cache.time", "15s", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "Amount of time that the existence of recovery write-ahead logs is cached.", "2.1.2"), MANAGER_LEASE_RECOVERY_WAITING_PERIOD("manager.lease.recovery.interval", "5s", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The amount of time to wait after requesting a write-ahead log to be recovered.", "1.5.0"), MANAGER_WAL_CLOSER_IMPLEMENTATION("manager.wal.closer.implementation", - "org.apache.accumulo.server.manager.recovery.HadoopLogCloser", PropertyType.CLASSNAME, + "org.apache.accumulo.server.manager.recovery.HadoopLogCloser", PropertyType.CLASSNAME, false, "A class that implements a mechanism to steal write access to a write-ahead log.", "2.1.0"), MANAGER_FATE_CONDITIONAL_WRITER_THREADS_MAX("manager.fate.conditional.writer.threads.max", "3", - PropertyType.COUNT, + PropertyType.COUNT, false, "Maximum number of threads to use for writing data to tablet servers of the FATE system table.", "4.0.0"), MANAGER_FATE_METRICS_MIN_UPDATE_INTERVAL("manager.fate.metrics.min.update.interval", "60s", - PropertyType.TIMEDURATION, "Limit calls from metric sinks to zookeeper to update interval.", - "1.9.3"), + PropertyType.TIMEDURATION, false, + "Limit calls from metric sinks to zookeeper to update interval.", "1.9.3"), MANAGER_FATE_USER_CONFIG("manager.fate.user.config", """ {\ @@ -499,7 +505,7 @@ are performed (e.g. Bulk Import). This property specifies the maximum number of 'commit': {'COMMIT_COMPACTION': 4},\ 'split': {'SYSTEM_SPLIT': 4}\ }""", - PropertyType.FATE_USER_CONFIG, """ + PropertyType.FATE_USER_CONFIG, false, """ The number of threads used to run fault-tolerant executions (FATE) on user \ tables. These are primarily table operations like merge. The property value is JSON. \ Each key is the name of the pool (can be assigned any string). Each value is a JSON \ @@ -516,7 +522,7 @@ Each key is the name of the pool (can be assigned any string). Each value is a J 'commit': {'COMMIT_COMPACTION': 4},\ 'split': {'SYSTEM_SPLIT': 4}\ }""", - PropertyType.FATE_META_CONFIG, """ + PropertyType.FATE_META_CONFIG, false, """ The number of threads used to run fault-tolerant executions (FATE) on Accumulo system \ tables. These are primarily table operations like merge. The property value is JSON. \ Each key is the name of the pool (can be assigned any string). Each value is a JSON \ @@ -525,107 +531,107 @@ Each key is the name of the pool (can be assigned any string). Each value is a J """, "4.0.0"), @Deprecated(since = "4.0.0") MANAGER_FATE_THREADPOOL_SIZE("manager.fate.threadpool.size", "", - PropertyType.FATE_THREADPOOL_SIZE, """ + PropertyType.FATE_THREADPOOL_SIZE, false, """ Previously, the number of threads used to run fault-tolerant executions (FATE). \ This is no longer used in 4.0+. %s and %s are the replacement and must be \ set instead. """.formatted(MANAGER_FATE_USER_CONFIG.getKey(), MANAGER_FATE_META_CONFIG.getKey()), "1.4.3"), MANAGER_FATE_IDLE_CHECK_INTERVAL("manager.fate.idle.check.interval", "60m", - PropertyType.TIMEDURATION, """ + PropertyType.TIMEDURATION, false, """ The interval at which to check if the number of idle Fate threads has consistently been \ zero. The way this is checked is an approximation. Logs a warning in the Manager \ log to change %s or %s. A value less than a minute disables this check and has a \ maximum value of 60m. """.formatted(MANAGER_FATE_USER_CONFIG.getKey(), MANAGER_FATE_META_CONFIG.getKey()), "4.0.0"), - MANAGER_STATUS_THREAD_POOL_SIZE("manager.status.threadpool.size", "0", PropertyType.COUNT, + MANAGER_STATUS_THREAD_POOL_SIZE("manager.status.threadpool.size", "0", PropertyType.COUNT, false, "The number of threads to use when fetching the tablet server status for balancing. Zero " + "indicates an unlimited number of threads will be used.", "1.8.0"), - MANAGER_METADATA_SUSPENDABLE("manager.metadata.suspendable", "false", PropertyType.BOOLEAN, + MANAGER_METADATA_SUSPENDABLE("manager.metadata.suspendable", "false", PropertyType.BOOLEAN, false, "Allow tablets for the " + SystemTables.METADATA.tableName() + " table to be suspended via table.suspend.duration.", "1.8.0"), MANAGER_STARTUP_MANAGER_AVAIL_MIN_COUNT("manager.startup.manager.avail.min.count", "0", - PropertyType.COUNT, + PropertyType.COUNT, false, "Minimum number of managers that need to be registered before the primary manager will start. A value " + "greater than 0 is useful when multiple managers are supposed to be running on startup. " + "When set to 0 or less, no blocking occurs. Default is 0 (disabled).", "4.0.0"), MANAGER_STARTUP_MANAGER_AVAIL_MAX_WAIT("manager.startup.manager.avail.max.wait", "0", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "Maximum time manager will wait for manager available threshold " + "to be reached before continuing. When set to 0 or less, will block " + "indefinitely. Default is 0 to block indefinitely. Only valid when manager available " + "threshold is set greater than 1.", "4.0.0"), MANAGER_STARTUP_TSERVER_AVAIL_MIN_COUNT("manager.startup.tserver.avail.min.count", "0", - PropertyType.COUNT, """ + PropertyType.COUNT, false, """ Minimum number of tservers that need to be registered before manager will \ start tablet assignment - checked at manager initialization, when manager gets lock. \ When set to 0 or less, no blocking occurs. Default is 0 (disabled) to keep original \ behaviour. """, "1.10.0"), MANAGER_STARTUP_TSERVER_AVAIL_MAX_WAIT("manager.startup.tserver.avail.max.wait", "0", - PropertyType.TIMEDURATION, """ + PropertyType.TIMEDURATION, false, """ Maximum time manager will wait for tserver available threshold \ to be reached before continuing. When set to 0 or less, will block \ indefinitely. Default is 0 to block indefinitely. Only valid when tserver available \ threshold is set greater than 0. """, "1.10.0"), MANAGER_COMPACTION_SERVICE_PRIORITY_QUEUE_SIZE("manager.compaction.major.service.queue.size", - "1M", PropertyType.MEMORY, """ + "1M", PropertyType.MEMORY, false, """ The data size of each resource groups compaction job priority queue. The memory size of \ each compaction job is estimated and the sum of these sizes per resource group will not \ exceed this setting. When the size is exceeded the lowest priority jobs are dropped as \ needed. """, "4.0.0"), - SPLIT_PREFIX("split.", null, PropertyType.PREFIX, + SPLIT_PREFIX("split.", null, PropertyType.PREFIX, false, "System wide properties related to splitting tablets.", "4.0.0"), - SPLIT_MAXOPEN("split.files.max", "300", PropertyType.COUNT, """ + SPLIT_MAXOPEN("split.files.max", "300", PropertyType.COUNT, false, """ To find a tablets split points, all RFiles are opened and their indexes \ are read. This setting determines how many RFiles can be opened at once. \ When there are more RFiles than this setting the tablet will be marked \ as un-splittable. """, "4.0.0"), // properties that are specific to scan server behavior - SSERV_PREFIX("sserver.", null, PropertyType.PREFIX, + SSERV_PREFIX("sserver.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of the scan servers.", "2.1.0"), - SSERV_DATACACHE_SIZE("sserver.cache.data.size", "10%", PropertyType.MEMORY, + SSERV_DATACACHE_SIZE("sserver.cache.data.size", "10%", PropertyType.MEMORY, false, "Specifies the size of the cache for RFile data blocks on each scan server.", "2.1.0"), - SSERV_INDEXCACHE_SIZE("sserver.cache.index.size", "25%", PropertyType.MEMORY, + SSERV_INDEXCACHE_SIZE("sserver.cache.index.size", "25%", PropertyType.MEMORY, false, "Specifies the size of the cache for RFile index blocks on each scan server.", "2.1.0"), - SSERV_SUMMARYCACHE_SIZE("sserver.cache.summary.size", "10%", PropertyType.MEMORY, + SSERV_SUMMARYCACHE_SIZE("sserver.cache.summary.size", "10%", PropertyType.MEMORY, false, "Specifies the size of the cache for summary data on each scan server.", "2.1.0"), - SSERV_DEFAULT_BLOCKSIZE("sserver.default.blocksize", "1M", PropertyType.BYTES, + SSERV_DEFAULT_BLOCKSIZE("sserver.default.blocksize", "1M", PropertyType.BYTES, false, "Specifies a default blocksize for the scan server caches.", "2.1.0"), SSERV_GROUP_NAME("sserver.group", ScanServerSelector.DEFAULT_SCAN_SERVER_GROUP_NAME, - PropertyType.STRING, """ + PropertyType.STRING, false, """ Resource group name for this ScanServer. Resource groups support at least two use cases: \ dedicating resources to scans and/or using different hardware for scans. Clients can \ configure the ConfigurableScanServerSelector to specify the resource group to use for \ eventual consistency scans. """, "3.0.0"), SSERV_CACHED_TABLET_METADATA_EXPIRATION("sserver.cache.metadata.expiration", "5m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The time after which cached tablet metadata will be expired if not previously refreshed.", "2.1.0"), SSERV_CACHED_TABLET_METADATA_REFRESH_PERCENT("sserver.cache.metadata.refresh.percent", ".75", - PropertyType.FRACTION, """ + PropertyType.FRACTION, false, """ The time after which cached tablet metadata will be refreshed, expressed as a \ percentage of the expiration time. Cache hits after this time, but before the \ expiration time, will trigger a background refresh for future hits. \ Value must be less than 100%. Set to 0 will disable refresh. """, "2.1.3"), - SSERV_CLIENTPORT("sserver.port.client", "9700-9799", PropertyType.PORT, + SSERV_CLIENTPORT("sserver.port.client", "9700-9799", PropertyType.PORT, false, "The port used for handling client connections on the tablet servers.", "2.1.0"), - SSERV_MINTHREADS("sserver.server.threads.minimum", "20", PropertyType.COUNT, + SSERV_MINTHREADS("sserver.server.threads.minimum", "20", PropertyType.COUNT, false, "The minimum number of threads to use to handle incoming requests.", "2.1.0"), - SSERV_MINTHREADS_TIMEOUT("sserver.server.threads.timeout", "0s", PropertyType.TIMEDURATION, + SSERV_MINTHREADS_TIMEOUT("sserver.server.threads.timeout", "0s", PropertyType.TIMEDURATION, false, "The time after which incoming request threads terminate with no work available. Zero (0) will keep the threads alive indefinitely.", "2.1.0"), - SSERV_SCAN_EXECUTORS_PREFIX("sserver.scan.executors.", null, PropertyType.PREFIX, """ + SSERV_SCAN_EXECUTORS_PREFIX("sserver.scan.executors.", null, PropertyType.PREFIX, false, """ Prefix for defining executors to service scans. See \ [scan executors]({% durl administration/scan-executors %}) for an overview of why and \ how to use this property. For each executor the number of threads, thread priority, \ @@ -636,22 +642,22 @@ Each key is the name of the pool (can be assigned any string). Each value is a J `sserver.scan.executors..prioritizer.opts.=`. """, "2.1.0"), SSERV_SCAN_EXECUTORS_DEFAULT_THREADS("sserver.scan.executors.default.threads", "16", - PropertyType.COUNT, "The number of threads for the scan executor that tables use by default.", - "2.1.0"), + PropertyType.COUNT, false, + "The number of threads for the scan executor that tables use by default.", "2.1.0"), SSERV_SCAN_EXECUTORS_DEFAULT_PRIORITIZER("sserver.scan.executors.default.prioritizer", "", - PropertyType.STRING, """ + PropertyType.STRING, false, """ Prioritizer for the default scan executor. Defaults to none which \ results in FIFO priority. Set to a class that implements \ %s + " to configure one. """.formatted(ScanPrioritizer.class.getName()), "2.1.0"), SSERV_SCAN_EXECUTORS_META_THREADS("sserver.scan.executors.meta.threads", "8", PropertyType.COUNT, - "The number of threads for the metadata table scan executor.", "2.1.0"), + false, "The number of threads for the metadata table scan executor.", "2.1.0"), SSERV_SCAN_REFERENCE_EXPIRATION_TIME("sserver.scan.reference.expiration", "5m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The amount of time a scan reference is unused before its deleted from metadata table.", "2.1.0"), SSERV_SCAN_ALLOWED_TABLES("sserver.scan.allowed.tables", "^(?!accumulo\\.).*$", - PropertyType.STRING, + PropertyType.STRING, false, "A regular expression that determines which tables are allowed to be scanned for" + " servers in the specified group. The property name should end with the scan server" + " group and the property value should take into account the table namespace and name." @@ -660,72 +666,72 @@ Each key is the name of the pool (can be assigned any string). Each value is a J @Deprecated(since = "4.0.0") @ReplacedBy(property = SSERV_SCAN_ALLOWED_TABLES) SSERV_SCAN_ALLOWED_TABLES_DEPRECATED("sserver.scan.allowed.tables.group.", null, - PropertyType.PREFIX, + PropertyType.PREFIX, false, "A regular expression that determines which tables are allowed to be scanned for" + " servers in the specified group. The property name should end with the scan server" + " group and the property value should take into account the table namespace and name." + " The default value disallows scans on tables in the accumulo namespace.", "2.1.5"), - SSERV_THREADCHECK("sserver.server.threadcheck.time", "1s", PropertyType.TIMEDURATION, + SSERV_THREADCHECK("sserver.server.threadcheck.time", "1s", PropertyType.TIMEDURATION, false, "The time between adjustments of the thrift server thread pool.", "2.1.0"), - SSERV_WAL_SORT_MAX_CONCURRENT("sserver.wal.sort.concurrent.max", "2", PropertyType.COUNT, + SSERV_WAL_SORT_MAX_CONCURRENT("sserver.wal.sort.concurrent.max", "2", PropertyType.COUNT, false, "The maximum number of threads to use to sort logs during recovery.", "4.0.0"), // properties that are specific to tablet server behavior - TSERV_PREFIX("tserver.", null, PropertyType.PREFIX, + TSERV_PREFIX("tserver.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of the tablet servers.", "1.3.5"), - TSERV_CLIENT_TIMEOUT("tserver.client.timeout", "3s", PropertyType.TIMEDURATION, + TSERV_CLIENT_TIMEOUT("tserver.client.timeout", "3s", PropertyType.TIMEDURATION, false, "Time to wait for clients to continue scans before closing a session.", "1.3.5"), - TSERV_DEFAULT_BLOCKSIZE("tserver.default.blocksize", "1M", PropertyType.BYTES, + TSERV_DEFAULT_BLOCKSIZE("tserver.default.blocksize", "1M", PropertyType.BYTES, false, "Specifies a default blocksize for the tserver caches.", "1.3.5"), - TSERV_DATACACHE_SIZE("tserver.cache.data.size", "10%", PropertyType.MEMORY, + TSERV_DATACACHE_SIZE("tserver.cache.data.size", "10%", PropertyType.MEMORY, false, "Specifies the size of the cache for RFile data blocks.", "1.3.5"), - TSERV_INDEXCACHE_SIZE("tserver.cache.index.size", "25%", PropertyType.MEMORY, + TSERV_INDEXCACHE_SIZE("tserver.cache.index.size", "25%", PropertyType.MEMORY, false, "Specifies the size of the cache for RFile index blocks.", "1.3.5"), - TSERV_SUMMARYCACHE_SIZE("tserver.cache.summary.size", "10%", PropertyType.MEMORY, + TSERV_SUMMARYCACHE_SIZE("tserver.cache.summary.size", "10%", PropertyType.MEMORY, false, "Specifies the size of the cache for summary data on each tablet server.", "2.0.0"), - TSERV_CLIENTPORT("tserver.port.client", "9800-9899", PropertyType.PORT, + TSERV_CLIENTPORT("tserver.port.client", "9800-9899", PropertyType.PORT, true, "The port used for handling client connections on the tablet servers.", "1.3.5"), TSERV_TOTAL_MUTATION_QUEUE_MAX("tserver.total.mutation.queue.max", "5%", PropertyType.MEMORY, - "The amount of memory used to store write-ahead-log mutations before flushing them.", + false, "The amount of memory used to store write-ahead-log mutations before flushing them.", "1.7.0"), - TSERV_WAL_MAX_REFERENCED("tserver.wal.max.referenced", "3", PropertyType.COUNT, + TSERV_WAL_MAX_REFERENCED("tserver.wal.max.referenced", "3", PropertyType.COUNT, false, "When a tablet server has more than this many write ahead logs, any tablet referencing older " + "logs over this threshold is minor compacted. Also any tablet referencing this many " + "logs or more will be compacted.", "2.1.0"), - TSERV_WAL_MAX_SIZE("tserver.wal.max.size", "1G", PropertyType.BYTES, + TSERV_WAL_MAX_SIZE("tserver.wal.max.size", "1G", PropertyType.BYTES, false, "The maximum size for each write-ahead log. See comment for property" + " `tserver.memory.maps.max`.", "2.1.0"), - TSERV_WAL_MAX_AGE("tserver.wal.max.age", "24h", PropertyType.TIMEDURATION, + TSERV_WAL_MAX_AGE("tserver.wal.max.age", "24h", PropertyType.TIMEDURATION, false, "The maximum age for each write-ahead log.", "2.1.0"), TSERV_WAL_TOLERATED_CREATION_FAILURES("tserver.wal.tolerated.creation.failures", "50", - PropertyType.COUNT, """ + PropertyType.COUNT, false, """ The maximum number of failures tolerated when creating a new write-ahead \ log. Negative values will allow unlimited creation failures. Exceeding this \ number of failures consecutively trying to create a new write-ahead log \ causes the TabletServer to exit. """, "2.1.0"), TSERV_WAL_TOLERATED_WAIT_INCREMENT("tserver.wal.tolerated.wait.increment", "1000ms", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The amount of time to wait between failures to create or write a write-ahead log.", "2.1.0"), // Never wait longer than 5 mins for a retry TSERV_WAL_TOLERATED_MAXIMUM_WAIT_DURATION("tserver.wal.maximum.wait.duration", "5m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The maximum amount of time to wait after a failure to create or write a write-ahead log.", "2.1.0"), - TSERV_SCAN_MAX_OPENFILES("tserver.scan.files.open.max", "100", PropertyType.COUNT, + TSERV_SCAN_MAX_OPENFILES("tserver.scan.files.open.max", "100", PropertyType.COUNT, false, "Maximum total RFiles that all tablets in a tablet server can open for scans.", "1.4.0"), - TSERV_MAX_IDLE("tserver.files.open.idle", "1m", PropertyType.TIMEDURATION, + TSERV_MAX_IDLE("tserver.files.open.idle", "1m", PropertyType.TIMEDURATION, false, "Tablet servers leave previously used RFiles open for future queries." + " This setting determines how much time an unused RFile should be kept open" + " until it is closed.", "1.3.5"), - TSERV_NATIVEMAP_ENABLED("tserver.memory.maps.native.enabled", "true", PropertyType.BOOLEAN, + TSERV_NATIVEMAP_ENABLED("tserver.memory.maps.native.enabled", "true", PropertyType.BOOLEAN, false, "An off-heap in-memory data store for accumulo implemented in c++ that increases" + " the amount of data accumulo can hold in memory and avoids Java GC pauses.", "1.3.5"), - TSERV_MAXMEM("tserver.memory.maps.max", "33%", PropertyType.MEMORY, """ + TSERV_MAXMEM("tserver.memory.maps.max", "33%", PropertyType.MEMORY, false, """ Maximum amount of memory that can be used to buffer data written to a \ tablet server. There are two other properties that can effectively limit \ memory usage `table.compaction.minor.logs.threshold` and \ @@ -733,17 +739,18 @@ Each key is the name of the pool (can be assigned any string). Each value is a J * `tserver.wal.max.size` >= this property. This map is created in off-heap \ memory when %s is enabled. """.formatted(TSERV_NATIVEMAP_ENABLED.name()), "1.3.5"), - TSERV_SESSION_MAXIDLE("tserver.session.idle.max", "1m", PropertyType.TIMEDURATION, + TSERV_SESSION_MAXIDLE("tserver.session.idle.max", "1m", PropertyType.TIMEDURATION, false, "When a tablet server's SimpleTimer thread triggers to check idle" + " sessions, this configurable option will be used to evaluate scan sessions" + " to determine if they can be closed due to inactivity.", "1.3.5"), TSERV_UPDATE_SESSION_MAXIDLE("tserver.session.update.idle.max", "1m", PropertyType.TIMEDURATION, + false, "When a tablet server's SimpleTimer thread triggers to check idle" + " sessions, this configurable option will be used to evaluate update" + " sessions to determine if they can be closed due to inactivity.", "1.6.5"), - TSERV_SCAN_EXECUTORS_PREFIX("tserver.scan.executors.", null, PropertyType.PREFIX, """ + TSERV_SCAN_EXECUTORS_PREFIX("tserver.scan.executors.", null, PropertyType.PREFIX, false, """ Prefix for defining executors to service scans. See \ [scan executors]({% durl administration/scan-executors %}) for an overview of why and \ how to use this property. For each executor the number of threads, thread priority, \ @@ -754,152 +761,159 @@ Each key is the name of the pool (can be assigned any string). Each value is a J `tserver.scan.executors..prioritizer.opts.=`. """, "2.0.0"), TSERV_SCAN_EXECUTORS_DEFAULT_THREADS("tserver.scan.executors.default.threads", "16", - PropertyType.COUNT, "The number of threads for the scan executor that tables use by default.", - "2.0.0"), + PropertyType.COUNT, false, + "The number of threads for the scan executor that tables use by default.", "2.0.0"), TSERV_SCAN_EXECUTORS_DEFAULT_PRIORITIZER("tserver.scan.executors.default.prioritizer", "", - PropertyType.STRING, """ + PropertyType.STRING, false, """ Prioritizer for the default scan executor. Defaults to none which \ results in FIFO priority. Set to a class that implements \ %s to configure one. """.formatted(ScanPrioritizer.class.getName()), "2.0.0"), TSERV_SCAN_EXECUTORS_META_THREADS("tserver.scan.executors.meta.threads", "8", PropertyType.COUNT, - "The number of threads for the metadata table scan executor.", "2.0.0"), + false, "The number of threads for the metadata table scan executor.", "2.0.0"), TSERV_SCAN_RESULTS_MAX_TIMEOUT("tserver.scan.results.max.timeout", "1s", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "Max time for the thrift client handler to wait for scan results before timing out.", "2.1.0"), - TSERV_MIGRATE_MAXCONCURRENT("tserver.migrations.concurrent.max", "1", PropertyType.COUNT, + TSERV_MIGRATE_MAXCONCURRENT("tserver.migrations.concurrent.max", "1", PropertyType.COUNT, false, "The maximum number of concurrent tablet migrations for a tablet server.", "1.3.5"), TSERV_MINC_MAXCONCURRENT("tserver.compaction.minor.concurrent.max", "4", PropertyType.COUNT, - "The maximum number of concurrent minor compactions for a tablet server.", "1.3.5"), + false, "The maximum number of concurrent minor compactions for a tablet server.", "1.3.5"), TSERV_BLOOM_LOAD_MAXCONCURRENT("tserver.bloom.load.concurrent.max", "4", PropertyType.COUNT, + false, "The number of concurrent threads that will load bloom filters in the background. " + "Setting this to zero will make bloom filters load in the foreground.", "1.3.5"), - TSERV_MEMDUMP_DIR("tserver.dir.memdump", "/tmp", PropertyType.PATH, """ + TSERV_MEMDUMP_DIR("tserver.dir.memdump", "/tmp", PropertyType.PATH, false, """ A long running scan could possibly hold memory that has been minor \ compacted. To prevent this, the in memory map is dumped to a local file \ and the scan is switched to that local file. We can not switch to the \ minor compacted file because it may have been modified by iterators. The \ file dumped to the local dir is an exact copy of what was in memory. """, "1.3.5"), - TSERV_MINTHREADS("tserver.server.threads.minimum", "20", PropertyType.COUNT, + TSERV_MINTHREADS("tserver.server.threads.minimum", "20", PropertyType.COUNT, false, "The minimum number of threads to use to handle incoming requests.", "1.4.0"), - TSERV_MINTHREADS_TIMEOUT("tserver.server.threads.timeout", "0s", PropertyType.TIMEDURATION, + TSERV_MINTHREADS_TIMEOUT("tserver.server.threads.timeout", "0s", PropertyType.TIMEDURATION, false, "The time after which incoming request threads terminate with no work available. Zero (0) will keep the threads alive indefinitely.", "2.1.0"), - TSERV_THREADCHECK("tserver.server.threadcheck.time", "1s", PropertyType.TIMEDURATION, + TSERV_THREADCHECK("tserver.server.threadcheck.time", "1s", PropertyType.TIMEDURATION, false, "The time between adjustments of the server thread pool.", "1.4.0"), - TSERV_LOG_BUSY_TABLETS_COUNT("tserver.log.busy.tablets.count", "0", PropertyType.COUNT, + TSERV_LOG_BUSY_TABLETS_COUNT("tserver.log.busy.tablets.count", "0", PropertyType.COUNT, false, "Number of busiest tablets to log. Logged at interval controlled by " + "tserver.log.busy.tablets.interval. If <= 0, logging of busy tablets is disabled.", "1.10.0"), TSERV_LOG_BUSY_TABLETS_INTERVAL("tserver.log.busy.tablets.interval", "1h", - PropertyType.TIMEDURATION, "Time interval between logging out busy tablets information.", - "1.10.0"), - TSERV_HOLD_TIME_SUICIDE("tserver.hold.time.max", "5m", PropertyType.TIMEDURATION, """ + PropertyType.TIMEDURATION, false, + "Time interval between logging out busy tablets information.", "1.10.0"), + TSERV_HOLD_TIME_SUICIDE("tserver.hold.time.max", "5m", PropertyType.TIMEDURATION, false, """ The maximum time for a tablet server to be in the "memory full" state. \ If the tablet server cannot write out memory in this much time, it will \ assume there is some failure local to its node, and quit. A value of zero \ is equivalent to forever. """, "1.4.0"), - TSERV_WAL_BLOCKSIZE("tserver.wal.blocksize", "0", PropertyType.BYTES, + TSERV_WAL_BLOCKSIZE("tserver.wal.blocksize", "0", PropertyType.BYTES, false, "The size of the HDFS blocks used to write to the Write-Ahead log. If" + " zero, it will be 110% of `tserver.wal.max.size` (that is, try to use just" + " one block).", "1.5.0"), - TSERV_WAL_REPLICATION("tserver.wal.replication", "0", PropertyType.COUNT, + TSERV_WAL_REPLICATION("tserver.wal.replication", "0", PropertyType.COUNT, false, "The replication to use when writing the Write-Ahead log to HDFS. If" + " zero, it will use the HDFS default replication setting.", "1.5.0"), - TSERV_WAL_SORT_MAX_CONCURRENT("tserver.wal.sort.concurrent.max", "2", PropertyType.COUNT, + TSERV_WAL_SORT_MAX_CONCURRENT("tserver.wal.sort.concurrent.max", "2", PropertyType.COUNT, false, "The maximum number of threads to use to sort logs during recovery.", "2.1.0"), @Deprecated(since = "4.0.0") @ReplacedBy(property = GENERAL_SERVER_WAL_SORT_BUFFER_SIZE) - TSERV_WAL_SORT_BUFFER_SIZE("tserver.wal.sort.buffer.size", "10%", PropertyType.MEMORY, + TSERV_WAL_SORT_BUFFER_SIZE("tserver.wal.sort.buffer.size", "10%", PropertyType.MEMORY, false, "The amount of memory to use when sorting logs during recovery.", "2.1.0"), - TSERV_WAL_SORT_FILE_PREFIX("tserver.wal.sort.file.", null, PropertyType.PREFIX, + TSERV_WAL_SORT_FILE_PREFIX("tserver.wal.sort.file.", null, PropertyType.PREFIX, false, "The rfile properties to use when sorting logs during recovery. Most of the properties" + " that begin with 'table.file' can be used here. For example, to set the compression" + " of the sorted recovery files to snappy use 'tserver.wal.sort.file.compress.type=snappy'.", "2.1.0"), - TSERV_WAL_SYNC("tserver.wal.sync", "true", PropertyType.BOOLEAN, + TSERV_WAL_SYNC("tserver.wal.sync", "true", PropertyType.BOOLEAN, false, "Use the SYNC_BLOCK create flag to sync WAL writes to disk. Prevents" + " problems recovering from sudden system resets.", "1.5.0"), TSERV_ASSIGNMENT_DURATION_WARNING("tserver.assignment.duration.warning", "10m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The amount of time an assignment can run before the server will print a" + " warning along with the current stack trace. Meant to help debug stuck" + " assignments.", "1.6.2"), TSERV_ASSIGNMENT_MAXCONCURRENT("tserver.assignment.concurrent.max", "2", PropertyType.COUNT, + false, "The number of threads available to load tablets. Recoveries are still performed serially.", "1.7.0"), - TSERV_SLOW_FLUSH_MILLIS("tserver.slow.flush.time", "100ms", PropertyType.TIMEDURATION, + TSERV_SLOW_FLUSH_MILLIS("tserver.slow.flush.time", "100ms", PropertyType.TIMEDURATION, false, "If a flush to the write-ahead log takes longer than this period of time," + " debugging information will written, and may result in a log rollover.", "1.8.0"), TSERV_SLOW_FILEPERMIT_MILLIS("tserver.slow.filepermit.time", "100ms", PropertyType.TIMEDURATION, + false, "If a thread blocks more than this period of time waiting to get file permits," + " debugging information will be written.", "1.9.3"), - TSERV_SUMMARY_PARTITION_THREADS("tserver.summary.partition.threads", "10", PropertyType.COUNT, """ - Summary data must be retrieved from RFiles. For a large number of \ - RFiles, the files are broken into partitions of 100k files. This setting \ - determines how many of these groups of 100k RFiles will be processed \ - concurrently. - """, "2.0.0"), - TSERV_SUMMARY_REMOTE_THREADS("tserver.summary.remote.threads", "128", PropertyType.COUNT, """ - For a partitioned group of 100k RFiles, those files are grouped by \ - tablet server. Then a remote tablet server is asked to gather summary \ - data. This setting determines how many concurrent request are made per \ - partition. - """, "2.0.0"), + TSERV_SUMMARY_PARTITION_THREADS("tserver.summary.partition.threads", "10", PropertyType.COUNT, + false, """ + Summary data must be retrieved from RFiles. For a large number of \ + RFiles, the files are broken into partitions of 100k files. This setting \ + determines how many of these groups of 100k RFiles will be processed \ + concurrently. + """, "2.0.0"), + TSERV_SUMMARY_REMOTE_THREADS("tserver.summary.remote.threads", "128", PropertyType.COUNT, false, + """ + For a partitioned group of 100k RFiles, those files are grouped by \ + tablet server. Then a remote tablet server is asked to gather summary \ + data. This setting determines how many concurrent request are made per \ + partition. + """, "2.0.0"), TSERV_SUMMARY_RETRIEVAL_THREADS("tserver.summary.retrieval.threads", "10", PropertyType.COUNT, + false, "The number of threads on each tablet server available to retrieve" + " summary data, that is not currently in cache, from RFiles.", "2.0.0"), TSERV_ONDEMAND_UNLOADER_INTERVAL("tserver.ondemand.tablet.unloader.interval", "10m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The interval at which the TabletServer will check if on-demand tablets can be unloaded.", "4.0.0"), TSERV_GROUP_NAME("tserver.group", Constants.DEFAULT_RESOURCE_GROUP_NAME, PropertyType.STRING, + false, "Resource group name for this TabletServer. Resource groups can be defined to dedicate resources " + " to specific tables (e.g. balancing tablets for table(s) within a group, see TableLoadBalancer).", "4.0.0"), TSERV_CONDITIONAL_UPDATE_THREADS_ROOT("tserver.conditionalupdate.threads.root", "16", - PropertyType.COUNT, "Numbers of threads for executing conditional updates on the root table.", - "4.0.0"), + PropertyType.COUNT, false, + "Numbers of threads for executing conditional updates on the root table.", "4.0.0"), TSERV_CONDITIONAL_UPDATE_THREADS_META("tserver.conditionalupdate.threads.meta", "64", - PropertyType.COUNT, + PropertyType.COUNT, false, "Numbers of threads for executing conditional updates on the metadata table.", "4.0.0"), TSERV_CONDITIONAL_UPDATE_THREADS_USER("tserver.conditionalupdate.threads.user", "64", - PropertyType.COUNT, "Numbers of threads for executing conditional updates on user tables.", - "4.0.0"), + PropertyType.COUNT, false, + "Numbers of threads for executing conditional updates on user tables.", "4.0.0"), // accumulo garbage collector properties - GC_PREFIX("gc.", null, PropertyType.PREFIX, + GC_PREFIX("gc.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of the accumulo garbage collector.", "1.3.5"), - GC_CANDIDATE_BATCH_SIZE("gc.candidate.batch.size", "50%", PropertyType.MEMORY, + GC_CANDIDATE_BATCH_SIZE("gc.candidate.batch.size", "50%", PropertyType.MEMORY, false, "The amount of memory used as the batch size for garbage collection.", "2.1.0"), - GC_CYCLE_START("gc.cycle.start", "30s", PropertyType.TIMEDURATION, + GC_CYCLE_START("gc.cycle.start", "30s", PropertyType.TIMEDURATION, true, "Time to wait before attempting to garbage collect any old RFiles or write-ahead logs.", "1.3.5"), - GC_CYCLE_DELAY("gc.cycle.delay", "5m", PropertyType.TIMEDURATION, + GC_CYCLE_DELAY("gc.cycle.delay", "5m", PropertyType.TIMEDURATION, true, "Time between garbage collection cycles. In each cycle, old RFiles or write-ahead logs " + "no longer in use are removed from the filesystem.", "1.3.5"), - GC_PORT("gc.port.client", "9998", PropertyType.PORT, + GC_PORT("gc.port.client", "9998", PropertyType.PORT, true, "The listening port for the garbage collector's monitor service.", "1.3.5"), - GC_DELETE_WAL_THREADS("gc.threads.delete.wal", "4", PropertyType.COUNT, + GC_DELETE_WAL_THREADS("gc.threads.delete.wal", "4", PropertyType.COUNT, false, "The number of threads used to delete write-ahead logs and recovery files.", "2.1.4"), - GC_DELETE_THREADS("gc.threads.delete", "16", PropertyType.COUNT, + GC_DELETE_THREADS("gc.threads.delete", "16", PropertyType.COUNT, false, "The number of threads used to delete RFiles.", "1.3.5"), - GC_SAFEMODE("gc.safemode", "false", PropertyType.BOOLEAN, + GC_SAFEMODE("gc.safemode", "false", PropertyType.BOOLEAN, false, "Provides listing of files to be deleted but does not delete any files.", "2.1.0"), - GC_USE_FULL_COMPACTION("gc.post.metadata.action", "flush", PropertyType.GC_POST_ACTION, """ + GC_USE_FULL_COMPACTION("gc.post.metadata.action", "flush", PropertyType.GC_POST_ACTION, false, """ When the gc runs it can make a lot of changes to the metadata, on completion, \ to force the changes to be written to disk, the metadata and root tables can be flushed \ and possibly compacted. Legal values are: compact - which both flushes and compacts the \ @@ -907,42 +921,42 @@ Each key is the name of the pool (can be assigned any string). Each value is a J """, "1.10.0"), // properties that are specific to the monitor server behavior - MONITOR_PREFIX("monitor.", null, PropertyType.PREFIX, + MONITOR_PREFIX("monitor.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of the monitor web server.", "1.3.5"), - MONITOR_PORT("monitor.port.client", "9995", PropertyType.PORT, + MONITOR_PORT("monitor.port.client", "9995", PropertyType.PORT, true, "The listening port for the monitor's http service.", "1.3.5"), - MONITOR_SSL_KEYSTORE("monitor.ssl.keyStore", "", PropertyType.PATH, + MONITOR_SSL_KEYSTORE("monitor.ssl.keyStore", "", PropertyType.PATH, false, "The keystore for enabling monitor SSL.", "1.5.0"), @Sensitive - MONITOR_SSL_KEYSTOREPASS("monitor.ssl.keyStorePassword", "", PropertyType.STRING, + MONITOR_SSL_KEYSTOREPASS("monitor.ssl.keyStorePassword", "", PropertyType.STRING, false, "The keystore password for enabling monitor SSL.", "1.5.0"), - MONITOR_SSL_KEYSTORETYPE("monitor.ssl.keyStoreType", "jks", PropertyType.STRING, + MONITOR_SSL_KEYSTORETYPE("monitor.ssl.keyStoreType", "jks", PropertyType.STRING, false, "Type of SSL keystore.", "1.7.0"), @Sensitive - MONITOR_SSL_KEYPASS("monitor.ssl.keyPassword", "", PropertyType.STRING, + MONITOR_SSL_KEYPASS("monitor.ssl.keyPassword", "", PropertyType.STRING, false, "Optional: the password for the private key in the keyStore. When not provided, this " + "defaults to the keystore password.", "1.9.3"), - MONITOR_SSL_TRUSTSTORE("monitor.ssl.trustStore", "", PropertyType.PATH, + MONITOR_SSL_TRUSTSTORE("monitor.ssl.trustStore", "", PropertyType.PATH, false, "The truststore for enabling monitor SSL.", "1.5.0"), @Sensitive - MONITOR_SSL_TRUSTSTOREPASS("monitor.ssl.trustStorePassword", "", PropertyType.STRING, + MONITOR_SSL_TRUSTSTOREPASS("monitor.ssl.trustStorePassword", "", PropertyType.STRING, false, "The truststore password for enabling monitor SSL.", "1.5.0"), - MONITOR_SSL_TRUSTSTORETYPE("monitor.ssl.trustStoreType", "jks", PropertyType.STRING, + MONITOR_SSL_TRUSTSTORETYPE("monitor.ssl.trustStoreType", "jks", PropertyType.STRING, false, "Type of SSL truststore.", "1.7.0"), - MONITOR_SSL_INCLUDE_CIPHERS("monitor.ssl.include.ciphers", "", PropertyType.STRING, + MONITOR_SSL_INCLUDE_CIPHERS("monitor.ssl.include.ciphers", "", PropertyType.STRING, false, "A comma-separated list of allows SSL Ciphers, see" + " monitor.ssl.exclude.ciphers to disallow ciphers.", "1.6.1"), - MONITOR_SSL_EXCLUDE_CIPHERS("monitor.ssl.exclude.ciphers", "", PropertyType.STRING, + MONITOR_SSL_EXCLUDE_CIPHERS("monitor.ssl.exclude.ciphers", "", PropertyType.STRING, false, "A comma-separated list of disallowed SSL Ciphers, see" + " monitor.ssl.include.ciphers to allow ciphers.", "1.6.1"), MONITOR_SSL_INCLUDE_PROTOCOLS("monitor.ssl.include.protocols", "TLSv1.3", PropertyType.STRING, - "A comma-separate list of allowed SSL protocols.", "1.5.3"), - MONITOR_LOCK_CHECK_INTERVAL("monitor.lock.check.interval", "5s", PropertyType.TIMEDURATION, + false, "A comma-separate list of allowed SSL protocols.", "1.5.3"), + MONITOR_LOCK_CHECK_INTERVAL("monitor.lock.check.interval", "5s", PropertyType.TIMEDURATION, false, "The amount of time to sleep between checking for the Monitor ZooKeeper lock.", "1.5.1"), - MONITOR_RESOURCES_EXTERNAL("monitor.resources.external", "", PropertyType.JSON, """ + MONITOR_RESOURCES_EXTERNAL("monitor.resources.external", "", PropertyType.JSON, false, """ A JSON Map of Strings. Each String should be an HTML tag of an external \ resource (JS or CSS) to be imported by the Monitor. Be sure to wrap \ with CDATA tags. If this value is set, all of the external resources \ @@ -952,6 +966,7 @@ Each key is the name of the pool (can be assigned any string). Each value is a J `accumulo/server/monitor/src/main/resources/templates/default.ftl`. """, "2.0.0"), MONITOR_PURGE_STATE_THRESHOLD("monitor.purge.state.threshold", "10m", PropertyType.TIMEDURATION, + false, """ The Monitor contains an internal data structure that contains all of the data used in the UI. \ This property controls how long the Monitor should retain that data structure after the last \ @@ -960,19 +975,20 @@ Each key is the name of the pool (can be assigned any string). Each value is a J to wait for new data to be fetched to compute the known state. """, "4.0.0"), - MONITOR_FETCH_TIMEOUT("monitor.fetch.timeout", "5m", PropertyType.TIMEDURATION, """ + MONITOR_FETCH_TIMEOUT("monitor.fetch.timeout", "5m", PropertyType.TIMEDURATION, false, """ The Monitor fetches information for display in a set of background threads. This property \ controls the amount of time that process should wait before cancelling any remaining \ tasks to fetch information. These background threads could end up waiting on servers \ to respond or for scans to complete. """, "4.0.0"), - MONITOR_DEAD_LIST_RG_EXCLUSIONS("monitor.dead.server.rg.exclusions", "", PropertyType.STRING, """ - The Monitor displays information about servers that it believes have died recently. \ - This property accepts a comma separated list of resource group names. If \ - the dead servers resource group matches a resource group in this list, \ - then it will be suppressed from the dead servers list in the monitor. - """, "4.0.0"), - MONITOR_ROOT_CONTEXT("monitor.root.context", "/", PropertyType.STRING, + MONITOR_DEAD_LIST_RG_EXCLUSIONS("monitor.dead.server.rg.exclusions", "", PropertyType.STRING, + false, """ + The Monitor displays information about servers that it believes have died recently. \ + This property accepts a comma separated list of resource group names. If \ + the dead servers resource group matches a resource group in this list, \ + then it will be suppressed from the dead servers list in the monitor. + """, "4.0.0"), + MONITOR_ROOT_CONTEXT("monitor.root.context", "/", PropertyType.STRING, false, """ The root context path of the monitor application. If this value is set, all paths for the \ monitor application will be hosted using this context. As an example, setting this to `/accumulo` \ @@ -980,12 +996,12 @@ Each key is the name of the pool (can be assigned any string). Each value is a J """, "2.1.4"), MONITOR_LONG_RUNNING_COMPACTION_LIMIT("monitor.compactions.long.running.limit", "50", - PropertyType.COUNT, + PropertyType.COUNT, false, "The number of long running compactions to display per resource group. The Monitor server will" + " keep twice this number in memory as it builds the next list while serving up the current list.", "4.0.0"), // per table properties - TABLE_PREFIX("table.", null, PropertyType.PREFIX, """ + TABLE_PREFIX("table.", null, PropertyType.PREFIX, false, """ Properties in this category affect tablet server treatment of tablets, \ but can be configured on a per-table basis. Setting these properties in \ accumulo.properties will override the default globally for all tables and not \ @@ -996,10 +1012,10 @@ Each key is the name of the pool (can be assigned any string). Each value is a J global setting to take effect. However, you must use the API or the shell \ to change properties in zookeeper that are set on a table. """, "1.3.5"), - TABLE_ARBITRARY_PROP_PREFIX("table.custom.", null, PropertyType.PREFIX, + TABLE_ARBITRARY_PROP_PREFIX("table.custom.", null, PropertyType.PREFIX, false, "Prefix to be used for user defined arbitrary properties.", "1.7.0"), TABLE_COMPACTION_INPUT_DROP_CACHE_BEHIND("table.compaction.input.drop.cache", "ALL", - PropertyType.DROP_CACHE_SELECTION, """ + PropertyType.DROP_CACHE_SELECTION, false, """ FSDataInputStream.setDropBehind(true) is set on compaction input streams \ for the specified type of files. This tells the DataNode to advise the OS \ that it does not need to keep blocks for the associated file in the page cache. \ @@ -1010,24 +1026,24 @@ Each key is the name of the pool (can be assigned any string). Each value is a J and will be compacted at different times. """, "2.1.4"), TABLE_MINC_OUTPUT_DROP_CACHE("table.compaction.minor.output.drop.cache", "false", - PropertyType.BOOLEAN, + PropertyType.BOOLEAN, false, "Setting this property to true will call" + "FSDataOutputStream.setDropBehind(true) on the minor compaction output stream.", "2.1.1"), TABLE_MAJC_OUTPUT_DROP_CACHE("table.compaction.major.output.drop.cache", "false", - PropertyType.BOOLEAN, + PropertyType.BOOLEAN, false, "Setting this property to true will call" + "FSDataOutputStream.setDropBehind(true) on the major compaction output stream.", "2.1.1"), - TABLE_MAJC_RATIO("table.compaction.major.ratio", "3", PropertyType.FRACTION, + TABLE_MAJC_RATIO("table.compaction.major.ratio", "3", PropertyType.FRACTION, true, "Minimum ratio of total input size to maximum input RFile size for" + " running a major compaction.", "1.3.5"), - TABLE_SPLIT_THRESHOLD("table.split.threshold", "1G", PropertyType.BYTES, + TABLE_SPLIT_THRESHOLD("table.split.threshold", "1G", PropertyType.BYTES, true, "A tablet is split when the combined size of RFiles exceeds this amount.", "1.3.5"), - TABLE_MAX_END_ROW_SIZE("table.split.endrow.size.max", "10k", PropertyType.BYTES, + TABLE_MAX_END_ROW_SIZE("table.split.endrow.size.max", "10k", PropertyType.BYTES, false, "Maximum size of end row.", "1.7.0"), - TABLE_MINC_COMPACT_MAXAGE("table.compaction.minor.age", "10m", PropertyType.TIMEDURATION, + TABLE_MINC_COMPACT_MAXAGE("table.compaction.minor.age", "10m", PropertyType.TIMEDURATION, false, """ Key values written to a tablet are temporarily stored in a per tablet in memory map. When \ the age of the oldest key value in a tablets in memory map exceeds this configuration, then \ @@ -1041,13 +1057,13 @@ Each key is the name of the pool (can be assigned any string). Each value is a J .formatted(SSERV_CACHED_TABLET_METADATA_EXPIRATION.getKey()), "4.0.0"), TABLE_COMPACTION_DISPATCHER("table.compaction.dispatcher", - SimpleCompactionDispatcher.class.getName(), PropertyType.CLASSNAME, + SimpleCompactionDispatcher.class.getName(), PropertyType.CLASSNAME, false, "A configurable dispatcher that decides what compaction service a table should use.", "2.1.0"), TABLE_COMPACTION_DISPATCHER_OPTS("table.compaction.dispatcher.opts.", null, PropertyType.PREFIX, - "Options for the table compaction dispatcher.", "2.1.0"), + false, "Options for the table compaction dispatcher.", "2.1.0"), TABLE_COMPACTION_SELECTION_EXPIRATION("table.compaction.selection.expiration.ms", "2m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, """ User compactions select files and are then queued for compaction, preventing these files \ from being used in system compactions. This timeout allows system compactions to cancel \ @@ -1056,29 +1072,30 @@ Each key is the name of the pool (can be assigned any string). Each value is a J can reselect and hold files after the system compaction runs. """, "2.1.0"), - TABLE_COMPACTION_CONFIGURER("table.compaction.configurer", "", PropertyType.CLASSNAME, + TABLE_COMPACTION_CONFIGURER("table.compaction.configurer", "", PropertyType.CLASSNAME, false, "A plugin that can dynamically configure compaction output files based on input files.", "2.1.0"), TABLE_COMPACTION_CONFIGURER_OPTS("table.compaction.configurer.opts.", null, PropertyType.PREFIX, - "Options for the table compaction configuror.", "2.1.0"), + false, "Options for the table compaction configuror.", "2.1.0"), TABLE_ONDEMAND_UNLOADER("tserver.ondemand.tablet.unloader", "org.apache.accumulo.core.spi.ondemand.LastAccessTimeOnDemandTabletUnloader", - PropertyType.CLASSNAME, + PropertyType.CLASSNAME, false, "The class that will be used to determine which on-demand Tablets to unload.", "4.0.0"), TABLE_MAX_MERGEABILITY_THRESHOLD("table.mergeability.threshold", ".25", PropertyType.FRACTION, + false, "A range of tablets are eligible for automatic merging until the combined size of RFiles reaches this percentage of the split threshold.", "4.0.0"), // Crypto-related properties @Experimental - TABLE_CRYPTO_PREFIX("table.crypto.opts.", null, PropertyType.PREFIX, + TABLE_CRYPTO_PREFIX("table.crypto.opts.", null, PropertyType.PREFIX, false, "Properties related to on-disk file encryption.", "2.1.0"), @Experimental @Sensitive - TABLE_CRYPTO_SENSITIVE_PREFIX("table.crypto.opts.sensitive.", null, PropertyType.PREFIX, + TABLE_CRYPTO_SENSITIVE_PREFIX("table.crypto.opts.sensitive.", null, PropertyType.PREFIX, false, "Sensitive properties related to on-disk file encryption.", "2.1.0"), TABLE_SCAN_DISPATCHER("table.scan.dispatcher", SimpleScanDispatcher.class.getName(), - PropertyType.CLASSNAME, + PropertyType.CLASSNAME, false, """ This class is used to dynamically dispatch scans to configured scan executors. Configured \ classes must implement %s. See \ @@ -1089,49 +1106,50 @@ Each key is the name of the pool (can be assigned any string). Each value is a J .formatted("{% jlink " + ScanDispatcher.class.getName() + " %}", "{% durl administration/scan-executors %}"), "2.0.0"), - TABLE_SCAN_DISPATCHER_OPTS("table.scan.dispatcher.opts.", null, PropertyType.PREFIX, + TABLE_SCAN_DISPATCHER_OPTS("table.scan.dispatcher.opts.", null, PropertyType.PREFIX, false, "Options for the table scan dispatcher.", "2.0.0"), - TABLE_SCAN_MAXMEM("table.scan.max.memory", "512k", PropertyType.BYTES, + TABLE_SCAN_MAXMEM("table.scan.max.memory", "512k", PropertyType.BYTES, false, "The maximum amount of memory that will be used to cache results of a client query/scan. " + "Once this limit is reached, the buffered data is sent to the client.", "1.3.5"), - TABLE_BULK_MAX_TABLETS("table.bulk.max.tablets", "100", PropertyType.COUNT, + TABLE_BULK_MAX_TABLETS("table.bulk.max.tablets", "100", PropertyType.COUNT, false, "The maximum number of tablets allowed for one bulk import file. Value of 0 is Unlimited.", "2.1.0"), - TABLE_BULK_MAX_TABLET_FILES("table.bulk.max.tablet.files", "100", PropertyType.COUNT, + TABLE_BULK_MAX_TABLET_FILES("table.bulk.max.tablet.files", "100", PropertyType.COUNT, false, "The maximum number of files a bulk import can add to a single tablet. When this property " + "is exceeded for any tablet the entire bulk import operation will fail before making any " + "changes. Value of 0 is unlimited.", "4.0.0"), - TABLE_SHUFFLE_SOURCES("table.shuffle.sources", "false", PropertyType.BOOLEAN, + TABLE_SHUFFLE_SOURCES("table.shuffle.sources", "false", PropertyType.BOOLEAN, false, "Shuffle the opening order for Rfiles to reduce thread contention on file open operations.", "2.1.5"), - TABLE_FILE_TYPE("table.file.type", RFile.EXTENSION, PropertyType.FILENAME_EXT, + TABLE_FILE_TYPE("table.file.type", RFile.EXTENSION, PropertyType.FILENAME_EXT, false, "Change the type of file a table writes.", "1.3.5"), TABLE_LOAD_BALANCER("table.balancer", "org.apache.accumulo.core.spi.balancer.SimpleLoadBalancer", - PropertyType.STRING, + PropertyType.STRING, false, "This property can be set to allow the LoadBalanceByTable load balancer" + " to change the called Load Balancer for this table.", "1.3.5"), - TABLE_FILE_COMPRESSION_TYPE("table.file.compress.type", "gz", PropertyType.STRING, + TABLE_FILE_COMPRESSION_TYPE("table.file.compress.type", "gz", PropertyType.STRING, false, "Compression algorithm used on index and data blocks before they are" + " written. Possible values: zstd, gz, snappy, bzip2, lzo, lz4, none.", "1.3.5"), TABLE_FILE_COMPRESSED_BLOCK_SIZE("table.file.compress.blocksize", "100k", PropertyType.BYTES, - "The maximum size of data blocks in RFiles before they are compressed and written.", "1.3.5"), + false, "The maximum size of data blocks in RFiles before they are compressed and written.", + "1.3.5"), TABLE_FILE_COMPRESSED_BLOCK_SIZE_INDEX("table.file.compress.blocksize.index", "128k", - PropertyType.BYTES, + PropertyType.BYTES, false, "The maximum size of index blocks in RFiles before they are compressed and written.", "1.4.0"), - TABLE_FILE_BLOCK_SIZE("table.file.blocksize", "0B", PropertyType.BYTES, + TABLE_FILE_BLOCK_SIZE("table.file.blocksize", "0B", PropertyType.BYTES, false, "The HDFS block size used when writing RFiles. When set to 0B, the" + " value/defaults of HDFS property 'dfs.block.size' will be used.", "1.3.5"), - TABLE_FILE_REPLICATION("table.file.replication", "0", PropertyType.COUNT, + TABLE_FILE_REPLICATION("table.file.replication", "0", PropertyType.COUNT, false, "The number of replicas for a table's RFiles in HDFS. When set to 0, HDFS" + " defaults are used.", "1.3.5"), - TABLE_FILE_MAX("table.file.max", "15", PropertyType.COUNT, """ + TABLE_FILE_MAX("table.file.max", "15", PropertyType.COUNT, false, """ This property is used to signal to the compaction planner that it should be more \ aggressive for compacting tablets that exceed this limit. The \ RatioBasedCompactionPlanner will lower the compaction ratio and increase the \ @@ -1140,7 +1158,7 @@ Each key is the name of the pool (can be assigned any string). Each value is a J to 0 will make it default to tserver.scan.files.open.max-1, this will prevent a tablet \ from having more RFiles than can be opened by a scan. """, "1.4.0"), - TABLE_FILE_PAUSE("table.file.pause", "100", PropertyType.COUNT, """ + TABLE_FILE_PAUSE("table.file.pause", "100", PropertyType.COUNT, false, """ When a tablet has more than this number of files, bulk imports and minor compactions \ will wait until the tablet has less files before proceeding. This will cause back \ pressure on bulk imports and writes to tables when compactions are not keeping up. \ @@ -1152,33 +1170,33 @@ Each key is the name of the pool (can be assigned any string). Each value is a J this property would be set higher than %s so that compactions are more aggressive \ prior to reaching the pause point. Value of 0 is unlimited. """.formatted(TABLE_BULK_MAX_TABLET_FILES.getKey(), TABLE_FILE_MAX.getKey()), "4.0.0"), - TABLE_MERGE_FILE_MAX("table.merge.file.max", "10000", PropertyType.COUNT, """ + TABLE_MERGE_FILE_MAX("table.merge.file.max", "10000", PropertyType.COUNT, false, """ The maximum number of files that a merge operation will process. Before \ merging a sum of the number of files in the merge range is computed and if it \ exceeds this configuration then the merge will error and fail. For example if \ there are 100 tablets each having 10 files in the merge range, then the sum would \ be 1000 and the merge will only proceed if this property is greater than 1000. """, "4.0.0"), - TABLE_FILE_SUMMARY_MAX_SIZE("table.file.summary.maxSize", "256k", PropertyType.BYTES, """ + TABLE_FILE_SUMMARY_MAX_SIZE("table.file.summary.maxSize", "256k", PropertyType.BYTES, false, """ The maximum size summary that will be stored. The number of RFiles that \ had summary data exceeding this threshold is reported by \ Summary.getFileStatistics().getLarge(). When adjusting this consider the \ expected number RFiles with summaries on each tablet server and the \ summary cache size. """, "2.0.0"), - TABLE_BLOOM_ENABLED("table.bloom.enabled", "false", PropertyType.BOOLEAN, + TABLE_BLOOM_ENABLED("table.bloom.enabled", "false", PropertyType.BOOLEAN, false, "Use bloom filters on this table.", "1.3.5"), - TABLE_BLOOM_LOAD_THRESHOLD("table.bloom.load.threshold", "1", PropertyType.COUNT, + TABLE_BLOOM_LOAD_THRESHOLD("table.bloom.load.threshold", "1", PropertyType.COUNT, false, "This number of seeks that would actually use a bloom filter must occur" + " before a RFile's bloom filter is loaded. Set this to zero to initiate" + " loading of bloom filters when a RFile is opened.", "1.3.5"), - TABLE_BLOOM_SIZE("table.bloom.size", "1048576", PropertyType.COUNT, + TABLE_BLOOM_SIZE("table.bloom.size", "1048576", PropertyType.COUNT, false, "Bloom filter size, as number of keys.", "1.3.5"), - TABLE_BLOOM_ERRORRATE("table.bloom.error.rate", "0.5%", PropertyType.FRACTION, + TABLE_BLOOM_ERRORRATE("table.bloom.error.rate", "0.5%", PropertyType.FRACTION, false, "Bloom filter error rate.", "1.3.5"), TABLE_BLOOM_KEY_FUNCTOR("table.bloom.key.functor", - "org.apache.accumulo.core.file.keyfunctor.RowFunctor", PropertyType.CLASSNAME, """ + "org.apache.accumulo.core.file.keyfunctor.RowFunctor", PropertyType.CLASSNAME, false, """ A function that can transform the key prior to insertion and check of \ bloom filter. org.apache.accumulo.core.file.keyfunctor.RowFunctor, \ org.apache.accumulo.core.file.keyfunctor.ColumnFamilyFunctor, and \ @@ -1186,9 +1204,9 @@ Each key is the name of the pool (can be assigned any string). Each value is a J allowable values. One can extend any of the above mentioned classes to \ perform specialized parsing of the key. """, "1.3.5"), - TABLE_BLOOM_HASHTYPE("table.bloom.hash.type", "murmur", PropertyType.STRING, + TABLE_BLOOM_HASHTYPE("table.bloom.hash.type", "murmur", PropertyType.STRING, false, "The bloom filter hash type.", "1.3.5"), - TABLE_BULK_SKIP_THRESHOLD("table.bulk.metadata.skip.distance", "0", PropertyType.COUNT, + TABLE_BULK_SKIP_THRESHOLD("table.bulk.metadata.skip.distance", "0", PropertyType.COUNT, false, """ When performing bulk v2 imports to a table, the Manager iterates over the tables metadata \ tablets sequentially. When importing files into a small table or into all or a majority \ @@ -1202,7 +1220,7 @@ a new scanner is analogous to performing a seek in an iterator, but it has a cos when the tablet metadata distance is above the supplied value. """, "2.1.4"), - TABLE_DURABILITY("table.durability", "sync", PropertyType.DURABILITY, """ + TABLE_DURABILITY("table.durability", "sync", PropertyType.DURABILITY, false, """ The durability of writes to tables includes ensuring that mutations written \ by clients are persisted in the write-ahead log and that files written \ during a compaction are persisted to disk successfully. This property only \ @@ -1218,14 +1236,14 @@ the compaction output files are written (Note that this may only apply \ to replicated files in HDFS). \ """, "1.7.0"), - TABLE_FAILURES_IGNORE("table.failures.ignore", "false", PropertyType.BOOLEAN, """ + TABLE_FAILURES_IGNORE("table.failures.ignore", "false", PropertyType.BOOLEAN, false, """ If you want queries for your table to hang or fail when data is missing \ from the system, then set this to false. When this set to true missing \ data will be reported but queries will still run possibly returning a \ subset of the data. \ """, "1.3.5"), TABLE_DEFAULT_SCANTIME_VISIBILITY("table.security.scan.visibility.default", "", - PropertyType.STRING, """ + PropertyType.STRING, false, """ The security label that will be assumed at scan time if an entry does \ not have a visibility expression. Note: An empty security label is displayed as []. The scan results \ @@ -1237,9 +1255,9 @@ the compaction output files are written (Note that this may only apply \ field is changed, all existing data with an empty visibility label \ will be interpreted with the new label on the next scan. \ """, "1.3.5"), - TABLE_LOCALITY_GROUPS("table.groups.enabled", "", PropertyType.STRING, + TABLE_LOCALITY_GROUPS("table.groups.enabled", "", PropertyType.STRING, false, "A comma separated list of locality group names to enable for this table.", "1.3.5"), - TABLE_CONSTRAINT_PREFIX("table.constraint.", null, PropertyType.PREFIX, """ + TABLE_CONSTRAINT_PREFIX("table.constraint.", null, PropertyType.PREFIX, false, """ Properties in this category are per-table properties that add \ constraints to a table. These properties start with the category \ prefix, followed by a number, and their values correspond to a fully \ @@ -1250,11 +1268,11 @@ the compaction output files are written (Note that this may only apply \ table.constraint.3 = my.package.constraints.MySecondConstraint. Note that table.constraint.1 is a reserved, default table constraint. """, "1.3.5"), - TABLE_INDEXCACHE_ENABLED("table.cache.index.enable", "true", PropertyType.BOOLEAN, + TABLE_INDEXCACHE_ENABLED("table.cache.index.enable", "true", PropertyType.BOOLEAN, false, "Determines whether index block cache is enabled for a table.", "1.3.5"), - TABLE_BLOCKCACHE_ENABLED("table.cache.block.enable", "false", PropertyType.BOOLEAN, + TABLE_BLOCKCACHE_ENABLED("table.cache.block.enable", "false", PropertyType.BOOLEAN, false, "Determines whether data block cache is enabled for a table.", "1.3.5"), - TABLE_ITERATOR_PREFIX("table.iterator.", null, PropertyType.PREFIX, """ + TABLE_ITERATOR_PREFIX("table.iterator.", null, PropertyType.PREFIX, false, """ Properties in this category specify iterators that are applied at \ various stages (scopes) of interaction with a table. These properties \ start with the category prefix, followed by a scope (minc, majc, scan, \ @@ -1270,15 +1288,15 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ table.iterator.minc.vers.opt.maxVersions = 3. """, "1.3.5"), TABLE_ITERATOR_SCAN_PREFIX(TABLE_ITERATOR_PREFIX.getKey() + IteratorScope.scan.name() + ".", null, - PropertyType.PREFIX, "Convenience prefix to find options for the scan iterator scope.", + PropertyType.PREFIX, false, "Convenience prefix to find options for the scan iterator scope.", "1.5.2"), TABLE_ITERATOR_MINC_PREFIX(TABLE_ITERATOR_PREFIX.getKey() + IteratorScope.minc.name() + ".", null, - PropertyType.PREFIX, "Convenience prefix to find options for the minc iterator scope.", + PropertyType.PREFIX, false, "Convenience prefix to find options for the minc iterator scope.", "1.5.2"), TABLE_ITERATOR_MAJC_PREFIX(TABLE_ITERATOR_PREFIX.getKey() + IteratorScope.majc.name() + ".", null, - PropertyType.PREFIX, "Convenience prefix to find options for the majc iterator scope.", + PropertyType.PREFIX, false, "Convenience prefix to find options for the majc iterator scope.", "1.5.2"), - TABLE_LOCALITY_GROUP_PREFIX("table.group.", null, PropertyType.PREFIX, """ + TABLE_LOCALITY_GROUP_PREFIX("table.group.", null, PropertyType.PREFIX, false, """ Properties in this category are per-table properties that define \ locality groups in a table. These properties start with the category \ prefix, followed by a name, followed by a period, and followed by a \ @@ -1290,12 +1308,12 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ `table.group..opt.=`. """.formatted(TABLE_LOCALITY_GROUPS.getKey()), "1.3.5"), TABLE_FORMATTER_CLASS("table.formatter", DefaultFormatter.class.getName(), PropertyType.STRING, - "The Formatter class to apply on results in the shell.", "1.4.0"), - TABLE_CLASSLOADER_CONTEXT("table.class.loader.context", "", PropertyType.STRING, + false, "The Formatter class to apply on results in the shell.", "1.4.0"), + TABLE_CLASSLOADER_CONTEXT("table.class.loader.context", "", PropertyType.STRING, false, "The context to use for loading per-table resources, such as iterators" + " from the configured factory in `general.context.class.loader.factory`.", "2.1.0"), - TABLE_SAMPLER("table.sampler", "", PropertyType.CLASSNAME, """ + TABLE_SAMPLER("table.sampler", "", PropertyType.CLASSNAME, false, """ The name of a class that implements org.apache.accumulo.core.Sampler. \ Setting this option enables storing a sample of data which can be \ scanned. Always having a current sample can useful for query optimization \ @@ -1304,18 +1322,18 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ compact command in the shell has an option to only compact RFiles without \ sample data. """, "1.8.0"), - TABLE_SAMPLER_OPTS("table.sampler.opt.", null, PropertyType.PREFIX, + TABLE_SAMPLER_OPTS("table.sampler.opt.", null, PropertyType.PREFIX, false, "The property is used to set options for a sampler. If a sample had two" + " options like hasher and modulous, then the two properties" + " table.sampler.opt.hasher=${hash algorithm} and" + " table.sampler.opt.modulous=${mod} would be set.", "1.8.0"), - TABLE_SUSPEND_DURATION("table.suspend.duration", "0s", PropertyType.TIMEDURATION, + TABLE_SUSPEND_DURATION("table.suspend.duration", "0s", PropertyType.TIMEDURATION, false, "For tablets belonging to this table: When a tablet server dies, allow" + " the tablet server this duration to revive before reassigning its tablets" + " to other tablet servers.", "1.8.0"), - TABLE_SUMMARIZER_PREFIX("table.summarizer.", null, PropertyType.PREFIX, + TABLE_SUMMARIZER_PREFIX("table.summarizer.", null, PropertyType.PREFIX, false, """ Prefix for configuring summarizers for a table. Using this prefix \ multiple summarizers can be configured with options for each one. Each \ @@ -1326,7 +1344,7 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ "2.0.0"), @Experimental TABLE_DELETE_BEHAVIOR("table.delete.behavior", - DeletingIterator.Behavior.PROCESS.name().toLowerCase(), PropertyType.STRING, """ + DeletingIterator.Behavior.PROCESS.name().toLowerCase(), PropertyType.STRING, false, """ This determines what action to take when a delete marker is seen. \ Valid values are `process` and `fail` with `process` being the default. When set to \ `process`, deletes will suppress data. When set to `fail`, any deletes seen will cause \ @@ -1334,7 +1352,7 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ need fast seeks within the timestamp range of a column. When setting this to fail, \ also consider configuring the `%s` constraint. """.formatted(NoDeleteConstraint.class.getName()), "2.0.0"), - TABLE_ENABLE_ERASURE_CODES("table.file.ec", "inherit", PropertyType.EC, """ + TABLE_ENABLE_ERASURE_CODES("table.file.ec", "inherit", PropertyType.EC, false, """ This determines if Accumulo will manage erasure codes on a table. \ When setting this to 'enable' must also set erasure.code.policy and that policy will \ always be used regardless of DFS directory settings. When set to 'disable', replication \ @@ -1343,37 +1361,37 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ "that does not support it is a noop. """, "2.1.4"), - TABLE_ERASURE_CODE_POLICY("table.file.ec.policy", "", PropertyType.STRING, + TABLE_ERASURE_CODE_POLICY("table.file.ec.policy", "", PropertyType.STRING, false, "The name of the erasure code policy to be used. Policy must be available and enabled in hdfs. " + "To view if policy is enabled check hdfs ec -listPolicies. This setting is only used when " + "table.file.ec is set to enable.", "2.1.4"), // Compactor properties - COMPACTOR_PREFIX("compactor.", null, PropertyType.PREFIX, + COMPACTOR_PREFIX("compactor.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of the accumulo compactor server.", "2.1.0"), COMPACTOR_CANCEL_CHECK_INTERVAL("compactor.cancel.check.interval", "5m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "Interval at which Compactors will check to see if the currently executing compaction" + " should be cancelled. This checks for situations like was the tablet deleted (split " + " and merge do this), was the table deleted, was a user compaction canceled, etc.", "2.1.4"), - COMPACTOR_CLIENTPORT("compactor.port.client", "9600-9699", PropertyType.PORT, + COMPACTOR_CLIENTPORT("compactor.port.client", "9600-9699", PropertyType.PORT, false, "The port used for handling client connections on the compactor servers.", "2.1.0"), - COMPACTOR_MIN_JOB_WAIT_TIME("compactor.wait.time.job.min", "1s", PropertyType.TIMEDURATION, + COMPACTOR_MIN_JOB_WAIT_TIME("compactor.wait.time.job.min", "1s", PropertyType.TIMEDURATION, false, "The minimum amount of time to wait between checks for the next compaction job, backing off" + "exponentially until COMPACTOR_MAX_JOB_WAIT_TIME is reached.", "2.1.3"), - COMPACTOR_MAX_JOB_WAIT_TIME("compactor.wait.time.job.max", "5m", PropertyType.TIMEDURATION, + COMPACTOR_MAX_JOB_WAIT_TIME("compactor.wait.time.job.max", "5m", PropertyType.TIMEDURATION, false, "Compactors do exponential backoff when their request for work repeatedly come back empty. " + "This is the maximum amount of time to wait between checks for the next compaction job.", "2.1.3"), COMPACTOR_FAILURE_BACKOFF_THRESHOLD("compactor.failure.backoff.threshold", "3", - PropertyType.COUNT, + PropertyType.COUNT, false, "The number of consecutive failures that must occur before the Compactor starts to back off" + " processing compactions.", "2.1.4"), COMPACTOR_FAILURE_BACKOFF_INTERVAL("compactor.failure.backoff.interval", "0", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, """ The time basis for computing the wait time for compaction failure backoff. A value of zero disables \ the backoff feature. When a non-zero value is supplied, then after compactor.failure.backoff.threshold \ @@ -1384,45 +1402,45 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ """, "2.1.4"), COMPACTOR_FAILURE_BACKOFF_RESET("compactor.failure.backoff.reset", "10m", - PropertyType.TIMEDURATION, + PropertyType.TIMEDURATION, false, "The maximum amount of time that the compactor will wait before executing the next compaction. When this" + " time limit has been reached, the failures are cleared.", "2.1.4"), COMPACTOR_FAILURE_TERMINATION_THRESHOLD("compactor.failure.termination.threshold", "0", - PropertyType.COUNT, + PropertyType.COUNT, false, "The number of consecutive failures at which the Compactor exits and the process terminates. A zero" + " value disables this feature.", "2.1.4"), - COMPACTOR_MINTHREADS("compactor.threads.minimum", "4", PropertyType.COUNT, + COMPACTOR_MINTHREADS("compactor.threads.minimum", "4", PropertyType.COUNT, false, "The minimum number of threads to use to handle incoming requests.", "2.1.0"), - COMPACTOR_MINTHREADS_TIMEOUT("compactor.threads.timeout", "0s", PropertyType.TIMEDURATION, + COMPACTOR_MINTHREADS_TIMEOUT("compactor.threads.timeout", "0s", PropertyType.TIMEDURATION, false, "The time after which incoming request threads terminate with no work available. Zero (0) will keep the threads alive indefinitely.", "2.1.0"), - COMPACTOR_THREADCHECK("compactor.threadcheck.time", "1s", PropertyType.TIMEDURATION, + COMPACTOR_THREADCHECK("compactor.threadcheck.time", "1s", PropertyType.TIMEDURATION, false, "The time between adjustments of the server thread pool.", "2.1.0"), COMPACTOR_GROUP_NAME("compactor.group", Constants.DEFAULT_RESOURCE_GROUP_NAME, - PropertyType.STRING, "Resource group name for this Compactor.", "3.0.0"), + PropertyType.STRING, false, "Resource group name for this Compactor.", "3.0.0"), // CompactionCoordinator properties - COMPACTION_COORDINATOR_PREFIX("compaction.coordinator.", null, PropertyType.PREFIX, + COMPACTION_COORDINATOR_PREFIX("compaction.coordinator.", null, PropertyType.PREFIX, false, "Properties in this category affect the behavior of the accumulo compaction coordinator server.", "2.1.0"), COMPACTION_COORDINATOR_RESERVATION_THREADS_ROOT("compaction.coordinator.reservation.threads.root", - "1", PropertyType.COUNT, + "1", PropertyType.COUNT, false, "The number of threads used to reserve files for compaction in a tablet for the root tablet.", "4.0.0"), COMPACTION_COORDINATOR_RESERVATION_THREADS_META("compaction.coordinator.reservation.threads.meta", - "1", PropertyType.COUNT, + "1", PropertyType.COUNT, false, "The number of threads used to reserve files for compaction in a tablet for accumulo.metadata tablets.", "4.0.0"), COMPACTION_COORDINATOR_RESERVATION_THREADS_USER("compaction.coordinator.reservation.threads.user", - "64", PropertyType.COUNT, + "64", PropertyType.COUNT, false, "The number of threads used to reserve files for compaction in a tablet for user tables.", "4.0.0"), COMPACTION_COORDINATOR_DEAD_COMPACTOR_CHECK_INTERVAL( "compaction.coordinator.compactor.dead.check.interval", "5m", PropertyType.TIMEDURATION, - "The interval at which to check for dead compactors.", "2.1.0"), + false, "The interval at which to check for dead compactors.", "2.1.0"), GENERAL_AMPLE_CONDITIONAL_WRITER_THREADS_MAX("general.ample.conditional.writer.threads.max", "8", - PropertyType.COUNT, + PropertyType.COUNT, false, "The maximum number of threads for the shared ConditionalWriter used by Ample.", "4.0.0"); private final String key; @@ -1437,14 +1455,16 @@ start with the category prefix, followed by a scope (minc, majc, scan, \ private boolean isReplaced; private Property replacedBy = null; private final PropertyType type; + private final boolean isRequired; - Property(String name, String defaultValue, PropertyType type, String description, - String availableSince) { + Property(String name, String defaultValue, PropertyType type, boolean isRequired, + String description, String availableSince) { this.key = name; this.defaultValue = defaultValue; + this.type = type; + this.isRequired = isRequired; this.description = description; this.availableSince = availableSince; - this.type = type; } @Override @@ -1480,6 +1500,15 @@ public PropertyType getType() { return this.type; } + /** + * Gets isRequired of this property. + * + * @return isRequired + */ + public boolean getIsRequired() { + return this.isRequired; + } + /** * Gets the description of this property. * @@ -1753,20 +1782,6 @@ public static boolean isValidTablePropertyKey(String key) { COMPACTION_SERVICE_DEFAULT_PLANNER, COMPACTION_SERVICE_DEFAULT_MAX_OPEN, COMPACTION_SERVICE_DEFAULT_GROUPS)); - /** - * The set of required properties. Each property was arbitrarily/manually identified to be - * required, either by default or because they are required to run a system. If one of these - * properties is not configured, the required properties check will fail. - */ - public static final Set REQUIRED_PROPERTIES = - Collections.unmodifiableSet(EnumSet.of(INSTANCE_ZK_HOST, INSTANCE_ZK_TIMEOUT, INSTANCE_SECRET, - INSTANCE_VOLUMES, GENERAL_THREADPOOL_SIZE, GENERAL_DELEGATION_TOKEN_LIFETIME, - GENERAL_DELEGATION_TOKEN_UPDATE_INTERVAL, GENERAL_IDLE_PROCESS_INTERVAL, - GENERAL_LOW_MEM_DETECTOR_INTERVAL, GENERAL_LOW_MEM_DETECTOR_THRESHOLD, - GENERAL_SERVER_LOCK_VERIFICATION_INTERVAL, MANAGER_CLIENTPORT, TSERV_CLIENTPORT, - GC_CYCLE_START, GC_CYCLE_DELAY, GC_PORT, MONITOR_PORT, TABLE_MAJC_RATIO, - TABLE_SPLIT_THRESHOLD)); - /** * Checks if the given property may be changed via Zookeeper, but not recognized until the restart * of some relevant daemon. diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java b/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java index 47ed2135582..ae34cad3757 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/checkCommand/ServerConfigCheckRunner.java @@ -46,21 +46,9 @@ public boolean runCheck(ServerContext context, ServerOpts opts, boolean fixFiles var val = entry.getValue(); if (!Property.isValidProperty(key, val)) { log.warn("Invalid property (key={} val={}) found in the config", key, val); - status &= false; + status = false; } } - - log.trace("Checking that all required config properties are present"); - for (var reqProp : Property.REQUIRED_PROPERTIES) { - var confPropVal = config.get(reqProp); - // already checked that all set properties are valid, just check that it is set then we know - // it's valid - if (confPropVal == null || confPropVal.isEmpty()) { - log.warn("Required property {} is not set!", reqProp); - status &= false; - } - } - printCompleted(status); return status; }