This is an automated email from the ASF dual-hosted git repository. ddanielr pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/accumulo.git
commit c4c8c572c8be14d882899f8f9370700227e87423 Merge: c14a97fe8c e6cbdb4418 Author: Daniel Roberts <ddani...@gmail.com> AuthorDate: Tue Oct 24 17:21:21 2023 +0000 Merge branch '2.1' .../org/apache/accumulo/core/conf/Property.java | 243 ++++++++++----------- .../org/apache/accumulo/core/gc/Reference.java | 7 + .../accumulo/core/gc/ReferenceDirectory.java | 2 +- .../org/apache/accumulo/core/gc/ReferenceFile.java | 32 ++- .../apache/accumulo/core/conf/PropertyTest.java | 4 + .../accumulo/server/gc/AllVolumesDirectory.java | 2 +- .../accumulo/server/metadata/ServerAmpleImpl.java | 4 +- .../accumulo/server/util/ManagerMetadataUtil.java | 4 + .../accumulo/server/util/MetadataTableUtil.java | 2 +- .../main/java/org/apache/accumulo/gc/GCRun.java | 31 +-- .../accumulo/gc/GarbageCollectionAlgorithm.java | 16 +- .../apache/accumulo/gc/GarbageCollectionTest.java | 164 ++++++++------ .../accumulo/manager/TabletGroupWatcher.java | 2 +- .../tableOps/bulkVer2/CleanUpBulkImport.java | 2 +- .../test/functional/GarbageCollectorIT.java | 2 +- 15 files changed, 296 insertions(+), 221 deletions(-) diff --cc core/src/main/java/org/apache/accumulo/core/conf/Property.java index 903c5d7443,bafc826c5a..58be89df05 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@@ -60,28 -61,28 +60,28 @@@ public enum Property @Sensitive RPC_SSL_KEYSTORE_PASSWORD("rpc.javax.net.ssl.keyStorePassword", "", PropertyType.STRING, "Password used to encrypt the SSL private keystore. " - + "Leave blank to use the Accumulo instance secret", + + "Leave blank to use the Accumulo instance secret.", "1.6.0"), RPC_SSL_KEYSTORE_TYPE("rpc.javax.net.ssl.keyStoreType", "jks", PropertyType.STRING, - "Type of SSL keystore", "1.6.0"), + "Type of SSL keystore.", "1.6.0"), RPC_SSL_TRUSTSTORE_PATH("rpc.javax.net.ssl.trustStore", "", PropertyType.PATH, - "Path of the truststore file for the root cert", "1.6.0"), + "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"), + "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, - "Type of SSL truststore", "1.6.0"), + "Type of SSL truststore.", "1.6.0"), RPC_USE_JSSE("rpc.useJsse", "false", PropertyType.BOOLEAN, "Use JSSE system properties to configure SSL rather than the " + RPC_PREFIX.getKey() - + "javax.net.ssl.* Accumulo properties", + + "javax.net.ssl.* Accumulo properties.", "1.6.0"), RPC_SSL_CIPHER_SUITES("rpc.ssl.cipher.suites", "", PropertyType.STRING, - "Comma separated list of cipher suites that can be used by accepted connections", "1.6.1"), + "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.2", PropertyType.STRING, + 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"), + "Comma separated list of protocols that can be used to accept connections.", "1.6.2"), - RPC_SSL_CLIENT_PROTOCOL("rpc.ssl.client.protocol", "TLSv1.2", PropertyType.STRING, + RPC_SSL_CLIENT_PROTOCOL("rpc.ssl.client.protocol", "TLSv1.3", PropertyType.STRING, - "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)", + "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, "The quality of protection to be used with SASL. Valid values are 'auth', 'auth-int'," @@@ -250,7 -265,12 +250,7 @@@ "Enables tracing functionality using OpenTelemetry (assuming OpenTelemetry is configured).", "2.1.0"), GENERAL_THREADPOOL_SIZE("general.server.threadpool.size", "1", PropertyType.COUNT, - "The number of threads to use for server-internal scheduled tasks", "2.1.0"), + "The number of threads to use for server-internal scheduled tasks.", "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = GENERAL_THREADPOOL_SIZE) - GENERAL_SIMPLETIMER_THREADPOOL_SIZE("general.server.simpletimer.threadpool.size", "1", - PropertyType.COUNT, "The number of threads to use for server-internal scheduled tasks.", - "1.7.0"), // If you update the default type, be sure to update the default used for initialization failures // in VolumeManagerImpl @Experimental @@@ -268,51 -288,35 +268,51 @@@ "2.0.0"), GENERAL_DELEGATION_TOKEN_LIFETIME("general.delegation.token.lifetime", "7d", PropertyType.TIMEDURATION, - "The length of time that delegation tokens and secret keys are valid", "1.7.0"), + "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, "The length of time between generation of new secret keys.", "1.7.0"), + 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, "The time interval between low memory checks.", "3.0.0"), + GENERAL_LOW_MEM_DETECTOR_THRESHOLD("general.low.mem.detector.threshold", "0.05", + PropertyType.FRACTION, - "The LowMemoryDetector will report when free memory drops below this percentage of total memory", ++ "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, + "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", ++ + "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, + "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", ++ + "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, + "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", ++ + "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, - "The maximum amount of time that a Scanner should wait before retrying a failed RPC", + "The maximum amount of time that a Scanner should wait before retrying a failed RPC.", "1.7.3"), GENERAL_MICROMETER_ENABLED("general.micrometer.enabled", "false", PropertyType.BOOLEAN, - "Enables metrics functionality using Micrometer", "2.1.0"), + "Enables metrics functionality using Micrometer.", "2.1.0"), GENERAL_MICROMETER_JVM_METRICS_ENABLED("general.micrometer.jvm.metrics.enabled", "false", - PropertyType.BOOLEAN, "Enables JVM metrics functionality using Micrometer", "2.1.0"), + PropertyType.BOOLEAN, "Enables JVM metrics functionality using Micrometer.", "2.1.0"), GENERAL_MICROMETER_FACTORY("general.micrometer.factory", "", PropertyType.CLASSNAME, - "Name of class that implements MeterRegistryFactory", "2.1.0"), + "Name of class that implements MeterRegistryFactory.", "2.1.0"), + GENERAL_PROCESS_BIND_ADDRESS("general.process.bind.addr", "0.0.0.0", PropertyType.STRING, - "The local IP address to which this server should bind for sending and receiving network traffic", ++ "The local IP address to which this server should bind for sending and receiving network traffic.", + "3.0.0"), // properties that are specific to manager server behavior MANAGER_PREFIX("manager.", null, PropertyType.PREFIX, - "Properties in this category affect the behavior of the manager server. " - + "Since 2.1.0, all properties in this category replace the old `master.*` names.", - "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.MANAGER_PREFIX) - MASTER_PREFIX("master.", null, PropertyType.PREFIX, - "Properties in this category affect the behavior of the manager (formerly named master) server. " - + "Since 2.1.0, all properties in this category are deprecated and replaced with corresponding " - + "`manager.*` properties. The old `master.*` names can still be used until at release 3.0, but a warning " - + "will be emitted. Configuration files should be updated to use the new property names.", - "1.3.5"), + "Properties in this category affect the behavior of the manager server.", "2.1.0"), MANAGER_CLIENTPORT("manager.port.client", "9999", PropertyType.PORT, - "The port used for handling client connections on the manager", "1.3.5"), + "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, "The balancer class that accumulo will use to make tablet assignment and " @@@ -322,8 -326,16 +322,8 @@@ PropertyType.TIMEDURATION, "Time to wait between scanning tablet states to identify tablets that need to be assigned, un-assigned, migrated, etc.", "2.1.2"), - MANAGER_BULK_RETRIES("manager.bulk.retries", "3", PropertyType.COUNT, - "The number of attempts to bulk import a RFile before giving up.", "1.4.0"), - MANAGER_BULK_THREADPOOL_SIZE("manager.bulk.threadpool.size", "5", PropertyType.COUNT, - "The number of threads to use when coordinating a bulk import.", "1.4.0"), - MANAGER_BULK_THREADPOOL_TIMEOUT("manager.bulk.threadpool.timeout", "0s", - PropertyType.TIMEDURATION, - "The time after which bulk import threads terminate with no work available. Zero (0) will keep the threads alive indefinitely.", - "2.1.0"), MANAGER_BULK_TIMEOUT("manager.bulk.timeout", "5m", PropertyType.TIMEDURATION, - "The time to wait for a tablet server to process a bulk import request", "1.4.3"), + "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, "The number of threads to use when renaming user files during table import or bulk ingest.", "2.1.0"), @@@ -343,12 -364,20 +343,12 @@@ "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, - "The amount of time to wait after requesting a write-ahead log to be recovered", "1.5.0"), + "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, - "A class that implements a mechanism to steal write access to a write-ahead log", "2.1.0"), + "A class that implements a mechanism to steal write access to a write-ahead log.", "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.MANAGER_WAL_CLOSER_IMPLEMENTATION) - MANAGER_WALOG_CLOSER_IMPLEMETATION("manager.walog.closer.implementation", - "org.apache.accumulo.server.manager.recovery.HadoopLogCloser", PropertyType.CLASSNAME, - "A class that implements a mechanism to steal write access to a write-ahead log.", "1.5.0"), - @Deprecated - MANAGER_FATE_METRICS_ENABLED("manager.fate.metrics.enabled", "true", PropertyType.BOOLEAN, - "Enable reporting of FATE metrics in JMX (and logging with Hadoop Metrics2).", "1.9.3"), 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", + PropertyType.TIMEDURATION, "Limit calls from metric sinks to zookeeper to update interval.", "1.9.3"), MANAGER_FATE_THREADPOOL_SIZE("manager.fate.threadpool.size", "4", PropertyType.COUNT, "The number of threads used to run fault-tolerant executions (FATE)." @@@ -391,15 -437,8 +391,15 @@@ "Specifies the size of the cache for summary data on each scan server.", "2.1.0"), @Experimental SSERV_DEFAULT_BLOCKSIZE("sserver.default.blocksize", "1M", PropertyType.BYTES, - "Specifies a default blocksize for the scan server caches", "2.1.0"), + "Specifies a default blocksize for the scan server caches.", "2.1.0"), @Experimental + SSERV_GROUP_NAME("sserver.group", ScanServerSelector.DEFAULT_SCAN_SERVER_GROUP_NAME, + PropertyType.STRING, + "Optional group name that will be made available to the " + + "ScanServerSelector client plugin. Groups support at least two use cases:" + + " dedicating resources to scans and/or using different hardware for scans.", + "3.0.0"), + @Experimental SSERV_CACHED_TABLET_METADATA_EXPIRATION("sserver.cache.metadata.expiration", "5m", PropertyType.TIMEDURATION, "The time after which cached tablet metadata will be refreshed.", "2.1.0"), @@@ -490,12 -529,29 +490,12 @@@ + "logs over this threshold is minor compacted. Also any tablet referencing this many " + "logs or more will be compacted.", "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.TSERV_WAL_MAX_REFERENCED) - TSERV_WALOG_MAX_REFERENCED("tserver.walog.max.referenced", "3", PropertyType.COUNT, - "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.0.0"), TSERV_WAL_MAX_SIZE("tserver.wal.max.size", "1G", PropertyType.BYTES, "The maximum size for each write-ahead log. See comment for property" - + " tserver.memory.maps.max", + + " `tserver.memory.maps.max`.", "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.TSERV_WAL_MAX_SIZE) - TSERV_WALOG_MAX_SIZE("tserver.walog.max.size", "1G", PropertyType.BYTES, - "The maximum size for each write-ahead log. See comment for property" - + " `tserver.memory.maps.max`.", - "1.3.5"), TSERV_WAL_MAX_AGE("tserver.wal.max.age", "24h", PropertyType.TIMEDURATION, "The maximum age for each write-ahead log.", "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.TSERV_WAL_MAX_AGE) - TSERV_WALOG_MAX_AGE("tserver.walog.max.age", "24h", PropertyType.TIMEDURATION, - "The maximum age for each write-ahead log.", "1.6.6"), TSERV_WAL_TOLERATED_CREATION_FAILURES("tserver.wal.tolerated.creation.failures", "50", PropertyType.COUNT, "The maximum number of failures tolerated when creating a new write-ahead" @@@ -511,8 -581,15 +511,8 @@@ PropertyType.TIMEDURATION, "The maximum amount of time to wait after a failure to create or write a write-ahead log.", "2.1.0"), - // Never wait longer than 5 mins for a retry - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.TSERV_WAL_TOLERATED_MAXIMUM_WAIT_DURATION) - TSERV_WALOG_TOLERATED_MAXIMUM_WAIT_DURATION("tserver.walog.maximum.wait.duration", "5m", - PropertyType.TIMEDURATION, - "The maximum amount of time to wait after a failure to create or write a write-ahead log.", - "1.7.1"), TSERV_SCAN_MAX_OPENFILES("tserver.scan.files.open.max", "100", PropertyType.COUNT, - "Maximum total RFiles that all tablets in a tablet server can open for scans. ", "1.4.0"), + "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, "Tablet servers leave previously used RFiles open for future queries." + " This setting determines how much time an unused RFile should be kept open" @@@ -572,8 -649,7 +572,8 @@@ "Prefix for compaction services.", "2.1.0"), TSERV_COMPACTION_SERVICE_ROOT_PLANNER("tserver.compaction.major.service.root.planner", DefaultCompactionPlanner.class.getName(), PropertyType.CLASSNAME, - "Compaction planner for root tablet service", "2.1.0"), + "Compaction planner for root tablet service.", "2.1.0"), + @Deprecated(since = "3.1", forRemoval = true) TSERV_COMPACTION_SERVICE_ROOT_RATE_LIMIT("tserver.compaction.major.service.root.rate.limit", "0B", PropertyType.BYTES, "Maximum number of bytes to read or write per second over all major" @@@ -591,8 -667,7 +591,8 @@@ "2.1.0"), TSERV_COMPACTION_SERVICE_META_PLANNER("tserver.compaction.major.service.meta.planner", DefaultCompactionPlanner.class.getName(), PropertyType.CLASSNAME, - "Compaction planner for metadata table", "2.1.0"), + "Compaction planner for metadata table.", "2.1.0"), + @Deprecated(since = "3.1", forRemoval = true) TSERV_COMPACTION_SERVICE_META_RATE_LIMIT("tserver.compaction.major.service.meta.rate.limit", "0B", PropertyType.BYTES, "Maximum number of bytes to read or write per second over all major" @@@ -625,12 -699,33 +625,12 @@@ "[{'name':'small','type':'internal','maxSize':'32M','numThreads':2},{'name':'medium','type':'internal','maxSize':'128M','numThreads':2},{'name':'large','type':'internal','numThreads':2}]" .replaceAll("'", "\""), PropertyType.STRING, - "See {% jlink -f org.apache.accumulo.core.spi.compaction.DefaultCompactionPlanner %} ", + "See {% jlink -f org.apache.accumulo.core.spi.compaction.DefaultCompactionPlanner %}.", "2.1.0"), - @Deprecated(since = "2.1.0", forRemoval = true) - @ReplacedBy(property = Property.TSERV_COMPACTION_SERVICE_DEFAULT_MAX_OPEN) - TSERV_MAJC_THREAD_MAXOPEN("tserver.compaction.major.thread.files.open.max", "10", - PropertyType.COUNT, "Max number of RFiles a major compaction thread can open at once.", - "1.4.0"), - @Deprecated(since = "2.1.0", forRemoval = true) - @ReplacedBy(property = Property.TSERV_COMPACTION_SERVICE_DEFAULT_EXECUTORS) - TSERV_MAJC_MAXCONCURRENT("tserver.compaction.major.concurrent.max", "3", PropertyType.COUNT, - "The maximum number of concurrent major compactions for a tablet server.", "1.3.5"), - @Deprecated(since = "2.1.0", forRemoval = true) - @ReplacedBy(property = Property.TSERV_COMPACTION_SERVICE_DEFAULT_RATE_LIMIT) - TSERV_MAJC_THROUGHPUT("tserver.compaction.major.throughput", "0B", PropertyType.BYTES, - "Maximum number of bytes to read or write per second over all major" - + " compactions within each compaction service, or 0B for unlimited.", - "1.8.0"), 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"), + "The maximum number of concurrent minor compactions for a tablet server.", "1.3.5"), - @Deprecated(since = "2.1.0", forRemoval = true) - TSERV_MAJC_TRACE_PERCENT("tserver.compaction.major.trace.percent", "0.1", PropertyType.FRACTION, - "The percent of major compactions to trace.", "1.7.0"), - @Deprecated(since = "2.1.0", forRemoval = true) - TSERV_MINC_TRACE_PERCENT("tserver.compaction.minor.trace.percent", "0.1", PropertyType.FRACTION, - "The percent of minor compactions to trace.", "1.7.0"), TSERV_COMPACTION_WARN_TIME("tserver.compaction.warn.time", "10m", PropertyType.TIMEDURATION, - "When a compaction has not made progress for this time period, a warning will be logged", + "When a compaction has not made progress for this time period, a warning will be logged.", "1.6.0"), TSERV_BLOOM_LOAD_MAXCONCURRENT("tserver.bloom.load.concurrent.max", "4", PropertyType.COUNT, "The number of concurrent threads that will load bloom filters in the background. " @@@ -677,9 -795,17 +677,9 @@@ + " 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, - "The maximum number of threads to use to sort logs during recovery", "2.1.0"), + "The maximum number of threads to use to sort logs during recovery.", "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.TSERV_WAL_SORT_MAX_CONCURRENT) - TSERV_RECOVERY_MAX_CONCURRENT("tserver.recovery.concurrent.max", "2", PropertyType.COUNT, - "The maximum number of threads to use to sort logs during recovery.", "1.5.0"), TSERV_WAL_SORT_BUFFER_SIZE("tserver.wal.sort.buffer.size", "10%", PropertyType.MEMORY, "The amount of memory to use when sorting logs during recovery.", "2.1.0"), - @Deprecated(since = "2.1.0") - @ReplacedBy(property = Property.TSERV_WAL_SORT_BUFFER_SIZE) - TSERV_SORT_BUFFER_SIZE("tserver.sort.buffer.size", "10%", PropertyType.MEMORY, - "The amount of memory to use when sorting logs during recovery.", "1.5.0"), TSERV_WAL_SORT_FILE_PREFIX("tserver.wal.sort.file.", null, PropertyType.PREFIX, "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" @@@ -697,8 -823,19 +697,8 @@@ PropertyType.TIMEDURATION, "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", + + " assignments.", "1.6.2"), - @Deprecated(since = "2.1.0") - TSERV_REPLICATION_REPLAYERS("tserver.replication.replayer.", null, PropertyType.PREFIX, - "Allows configuration of implementation used to apply replicated data.", "1.7.0"), - @Deprecated(since = "2.1.0") - TSERV_REPLICATION_DEFAULT_HANDLER("tserver.replication.default.replayer", - "org.apache.accumulo.tserver.replication.BatchWriterReplicationReplayer", - PropertyType.CLASSNAME, "Default AccumuloReplicationReplayer implementation.", "1.7.0"), - @Deprecated(since = "2.1.0") - TSERV_REPLICATION_BW_REPLAYER_MEMORY("tserver.replication.batchwriter.replayer.memory", "50M", - PropertyType.BYTES, "Memory to provide to batchwriter to replay mutations for replication.", - "1.7.0"), TSERV_ASSIGNMENT_MAXCONCURRENT("tserver.assignment.concurrent.max", "2", PropertyType.COUNT, "The number of threads available to load tablets. Recoveries are still performed serially.", "1.7.0"), @@@ -757,16 -894,25 +757,16 @@@ @Experimental GC_REMOVE_IN_USE_CANDIDATES("gc.remove.in.use.candidates", "false", PropertyType.BOOLEAN, "GC will remove deletion candidates that are in-use from the metadata location. " - + "This is expected to increase the speed of subsequent GC runs", + + "This is expected to increase the speed of subsequent GC runs.", "2.1.3"), - @Deprecated(since = "2.1.1", forRemoval = true) - GC_TRASH_IGNORE("gc.trash.ignore", "false", PropertyType.BOOLEAN, - "Do not use the Trash, even if it is configured.", "1.5.0"), - @Deprecated(since = "2.1.0", forRemoval = true) - GC_TRACE_PERCENT("gc.trace.percent", "0.01", PropertyType.FRACTION, - "Percent of gc cycles to trace.", "1.7.0"), GC_SAFEMODE("gc.safemode", "false", PropertyType.BOOLEAN, - "Provides listing of files to be deleted but does not delete any files", "2.1.0"), + "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, "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" - + " metadata; flush - which flushes only (compactions may be triggered if required); or none", + + " metadata; flush - which flushes only (compactions may be triggered if required); or none.", "1.10.0"), - @Deprecated - GC_METRICS_ENABLED("gc.metrics.enabled", "true", PropertyType.BOOLEAN, - "Enable detailed gc metrics reporting with hadoop metrics.", "1.10.0"), // properties that are specific to the monitor server behavior MONITOR_PREFIX("monitor.", null, PropertyType.PREFIX, @@@ -798,12 -944,12 +798,12 @@@ "1.6.1"), MONITOR_SSL_EXCLUDE_CIPHERS("monitor.ssl.exclude.ciphers", "", PropertyType.STRING, "A comma-separated list of disallowed SSL Ciphers, see" - + " monitor.ssl.include.ciphers to allow ciphers", + + " monitor.ssl.include.ciphers to allow ciphers.", "1.6.1"), - MONITOR_SSL_INCLUDE_PROTOCOLS("monitor.ssl.include.protocols", "TLSv1.2", PropertyType.STRING, + MONITOR_SSL_INCLUDE_PROTOCOLS("monitor.ssl.include.protocols", "TLSv1.3", PropertyType.STRING, - "A comma-separate list of allowed SSL protocols", "1.5.3"), + "A comma-separate list of allowed SSL protocols.", "1.5.3"), MONITOR_LOCK_CHECK_INTERVAL("monitor.lock.check.interval", "5s", PropertyType.TIMEDURATION, - "The amount of time to sleep between checking for the Monitor ZooKeeper lock", "1.5.1"), + "The amount of time to sleep between checking for the Monitor ZooKeeper lock.", "1.5.1"), MONITOR_RESOURCES_EXTERNAL("monitor.resources.external", "", PropertyType.STRING, "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" @@@ -811,8 -957,43 +811,8 @@@ + " in the `<head>` tag of the Monitor will be replaced with the tags set here." + " Be sure the jquery tag is first since other scripts will depend on it." + " The resources that are used by default can be seen in" - + " accumulo/server/monitor/src/main/resources/templates/default.ftl", + + " `accumulo/server/monitor/src/main/resources/templates/default.ftl`.", "2.0.0"), - @Deprecated(since = "2.1.0") - TRACE_PREFIX("trace.", null, PropertyType.PREFIX, - "Properties in this category affect the behavior of distributed tracing.", "1.3.5"), - @Deprecated(since = "2.1.0") - TRACE_SPAN_RECEIVERS("trace.span.receivers", "org.apache.accumulo.tracer.ZooTraceClient", - PropertyType.CLASSNAMELIST, "A list of span receiver classes to send trace spans.", "1.7.0"), - @Deprecated(since = "2.1.0") - TRACE_SPAN_RECEIVER_PREFIX("trace.span.receiver.", null, PropertyType.PREFIX, - "Prefix for span receiver configuration properties.", "1.7.0"), - @Deprecated(since = "2.1.0") - TRACE_ZK_PATH("trace.zookeeper.path", Constants.ZTRACERS, PropertyType.STRING, - "The zookeeper node where tracers are registered.", "1.7.0"), - @Deprecated(since = "2.1.0") - TRACE_PORT("trace.port.client", "12234", PropertyType.PORT, - "The listening port for the trace server.", "1.3.5"), - @Deprecated(since = "2.1.0") - TRACE_TABLE("trace.table", "trace", PropertyType.STRING, - "The name of the table to store distributed traces.", "1.3.5"), - @Deprecated(since = "2.1.0") - TRACE_USER("trace.user", "root", PropertyType.STRING, - "The name of the user to store distributed traces.", "1.3.5"), - @Sensitive - @Deprecated(since = "2.1.0") - TRACE_PASSWORD("trace.password", "secret", PropertyType.STRING, - "The password for the user used to store distributed traces.", "1.3.5"), - @Sensitive - @Deprecated(since = "2.1.0") - TRACE_TOKEN_PROPERTY_PREFIX("trace.token.property.", null, PropertyType.PREFIX, - "The prefix used to create a token for storing distributed traces. For" - + " each property required by trace.token.type, place this prefix in front of it.", - "1.5.0"), - @Deprecated(since = "2.1.0") - TRACE_TOKEN_TYPE("trace.token.type", PasswordToken.class.getName(), PropertyType.CLASSNAME, - "An AuthenticationToken type supported by the authorizer.", "1.5.0"), - // per table properties TABLE_PREFIX("table.", null, PropertyType.PREFIX, "Properties in this category affect tablet server treatment of tablets," @@@ -839,12 -1020,25 +839,12 @@@ "2.1.1"), TABLE_MAJC_RATIO("table.compaction.major.ratio", "3", PropertyType.FRACTION, "Minimum ratio of total input size to maximum input RFile size for" - + " running a major compaction. ", + + " running a major compaction.", "1.3.5"), - @Deprecated(since = "2.1.0", forRemoval = true) - TABLE_MAJC_COMPACTALL_IDLETIME("table.compaction.major.everything.idle", "1h", - PropertyType.TIMEDURATION, - "After a tablet has been idle (no mutations) for this time period it may" - + " have all of its RFiles compacted into one. There is no guarantee an idle" - + " tablet will be compacted. Compactions of idle tablets are only started" - + " when regular compactions are not running. Idle compactions only take" - + " place for tablets that have one or more RFiles.", - "1.3.5"), TABLE_SPLIT_THRESHOLD("table.split.threshold", "1G", PropertyType.BYTES, "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, - "Maximum size of end row", "1.7.0"), + "Maximum size of end row.", "1.7.0"), - @Deprecated(since = "2.0.0") - @ReplacedBy(property = Property.TSERV_WAL_MAX_REFERENCED) - TABLE_MINC_LOGS_MAX("table.compaction.minor.logs.threshold", "3", PropertyType.COUNT, - "This property is deprecated and replaced.", "1.3.5"), TABLE_MINC_COMPACT_IDLETIME("table.compaction.minor.idle", "5m", PropertyType.TIMEDURATION, "After a tablet has been idle (no mutations) for this time period it may have its " + "in-memory map flushed to disk in a minor compaction. There is no guarantee an idle " @@@ -874,8 -1068,17 +874,7 @@@ "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"), - + "Options for the table compaction configuror.", "2.1.0"), - @Deprecated(since = "2.1.0", forRemoval = true) - @ReplacedBy(property = TABLE_COMPACTION_SELECTOR) - TABLE_COMPACTION_STRATEGY("table.majc.compaction.strategy", - "org.apache.accumulo.tserver.compaction.DefaultCompactionStrategy", PropertyType.CLASSNAME, - "See {% jlink -f org.apache.accumulo.core.spi.compaction %}.", "1.6.0"), - @Deprecated(since = "2.1.0", forRemoval = true) - @ReplacedBy(property = TABLE_COMPACTION_SELECTOR_OPTS) - TABLE_COMPACTION_STRATEGY_PREFIX("table.majc.compaction.strategy.opts.", null, - PropertyType.PREFIX, - "Properties in this category are used to configure the compaction strategy.", "1.6.0"), // Crypto-related properties @Experimental TABLE_CRYPTO_PREFIX("table.crypto.opts.", null, PropertyType.PREFIX, @@@ -1039,7 -1242,14 +1038,7 @@@ + " `table.group.<name>.opt.<key>=<value>`.", "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"), + "The Formatter class to apply on results in the shell.", "1.4.0"), - @Deprecated(since = "2.1.0") - TABLE_INTERPRETER_CLASS("table.interepreter", - org.apache.accumulo.core.util.interpret.DefaultScanInterpreter.class.getName(), - PropertyType.STRING, - "The ScanInterpreter class to apply on scan arguments in the shell. " - + "Note that this property is deprecated and will be removed in a future version.", - "1.5.0"), TABLE_CLASSLOADER_CONTEXT("table.class.loader.context", "", PropertyType.STRING, "The context to use for loading per-table resources, such as iterators" + " from the configured factory in `general.context.class.loader.factory`.", @@@ -1108,9 -1448,6 +1107,9 @@@ @Experimental COMPACTOR_MAX_MESSAGE_SIZE("compactor.message.size.max", "10M", PropertyType.BYTES, "The maximum size of a message that can be sent to a tablet server.", "2.1.0"), + @Experimental + COMPACTOR_QUEUE_NAME("compactor.queue", "", PropertyType.STRING, - "The queue for which this Compactor will perform compactions", "3.0.0"), ++ "The queue for which this Compactor will perform compactions.", "3.0.0"), // CompactionCoordinator properties @Experimental COMPACTION_COORDINATOR_PREFIX("compaction.coordinator.", null, PropertyType.PREFIX, diff --cc core/src/main/java/org/apache/accumulo/core/gc/Reference.java index fa37becab8,4c67bfd31d..a6ee689ea6 --- a/core/src/main/java/org/apache/accumulo/core/gc/Reference.java +++ b/core/src/main/java/org/apache/accumulo/core/gc/Reference.java @@@ -42,7 -47,8 +47,9 @@@ public interface Reference * {@link org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.DataFileColumnFamily} * A directory will be read from the "srv:dir" column family: * {@link org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ServerColumnFamily} + * A scan will be read from the Tablet "scan" column family: + * {@link org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ScanFileColumnFamily} */ - String getMetadataEntry(); + String getMetadataPath(); + } diff --cc core/src/main/java/org/apache/accumulo/core/gc/ReferenceFile.java index c8a98f745a,b9eece90d5..3044ec2f67 --- a/core/src/main/java/org/apache/accumulo/core/gc/ReferenceFile.java +++ b/core/src/main/java/org/apache/accumulo/core/gc/ReferenceFile.java @@@ -32,28 -29,23 +32,35 @@@ import org.apache.hadoop.fs.Path public class ReferenceFile implements Reference, Comparable<ReferenceFile> { // parts of an absolute URI, like "hdfs://1.2.3.4/accumulo/tables/2a/t-0003" public final TableId tableId; // 2a + public final boolean isScan; - // the exact string that is stored in the metadata - protected final String metadataEntry; + // the exact path from the file reference string that is stored in the metadata + protected final String metadataPath; - protected ReferenceFile(TableId tableId, String metadataPath) { - protected ReferenceFile(TableId tableId, String metadataEntry, boolean isScan) { ++ protected ReferenceFile(TableId tableId, String metadataPath, boolean isScan) { this.tableId = Objects.requireNonNull(tableId); - this.metadataEntry = Objects.requireNonNull(metadataEntry); + this.metadataPath = Objects.requireNonNull(metadataPath); + this.isScan = isScan; } - public ReferenceFile(TableId tableId, Path metadataPathPath) { - this.tableId = Objects.requireNonNull(tableId); - this.metadataPath = Objects.requireNonNull(metadataPathPath.toString()); - public static ReferenceFile forFile(TableId tableId, String metadataEntry) { - return new ReferenceFile(tableId, metadataEntry, false); ++ public static ReferenceFile forFile(TableId tableId, StoredTabletFile tabletFile) { ++ return new ReferenceFile(tableId, tabletFile.getMetadataPath(), false); } - public ReferenceFile(TableId tableId, ScanServerRefTabletFile tabletFile) { - this.tableId = Objects.requireNonNull(tableId); - this.metadataPath = Objects.requireNonNull(tabletFile.getNormalizedPathStr()); - public static ReferenceFile forScan(TableId tableId, String metadataEntry) { - return new ReferenceFile(tableId, metadataEntry, true); ++ public static ReferenceFile forFile(TableId tableId, Path metadataPathPath) { ++ return new ReferenceFile(tableId, metadataPathPath.toString(), false); + } + - public ReferenceFile(TableId tableId, StoredTabletFile tabletFile) { - this.tableId = Objects.requireNonNull(tableId); - this.metadataPath = Objects.requireNonNull(tabletFile.getMetadataPath()); ++ public static ReferenceFile forScan(TableId tableId, ScanServerRefTabletFile tabletFile) { ++ return new ReferenceFile(tableId, tabletFile.getNormalizedPathStr(), true); ++ } ++ ++ public static ReferenceFile forScan(TableId tableId, StoredTabletFile tabletFile) { ++ return new ReferenceFile(tableId, tabletFile.getMetadataPath(), true); ++ } ++ ++ public static ReferenceFile forScan(TableId tableId, Path metadataPathPath) { ++ return new ReferenceFile(tableId, metadataPathPath.toString(), true); } @Override diff --cc server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java index 1ac0012a53,60b16e5573..35c95472a1 --- a/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java @@@ -330,7 -332,8 +330,7 @@@ public class MetadataTableUtil if (key.getColumnFamily().equals(DataFileColumnFamily.NAME)) { StoredTabletFile stf = new StoredTabletFile(key.getColumnQualifierData().toString()); - bw.addMutation(ample.createDeleteMutation(new ReferenceFile(tableId, stf))); - bw.addMutation(ample - .createDeleteMutation(ReferenceFile.forFile(tableId, stf.getMetaUpdateDelete()))); ++ bw.addMutation(ample.createDeleteMutation(ReferenceFile.forFile(tableId, stf))); } if (ServerColumnFamily.DIRECTORY_COLUMN.hasColumns(key)) { diff --cc server/gc/src/main/java/org/apache/accumulo/gc/GCRun.java index 9f5d4bbf92,c03d4496ca..36047c5377 --- a/server/gc/src/main/java/org/apache/accumulo/gc/GCRun.java +++ b/server/gc/src/main/java/org/apache/accumulo/gc/GCRun.java @@@ -194,25 -201,28 +195,27 @@@ public class GCRun implements GarbageCo } // combine all the entries read from file and scan columns in the metadata table - Stream<StoredTabletFile> fileStream = tm.getFiles().stream(); + Stream<StoredTabletFile> stfStream = tm.getFiles().stream(); + // map the files to Reference objects - var fileStream = stfStream.map(f -> ReferenceFile.forFile(tableId, f.getMetaUpdateDelete())); ++ var fileStream = stfStream.map(f -> ReferenceFile.forFile(tableId, f)); + // scans are normally empty, so only introduce a layer of indirection when needed final var tmScans = tm.getScans(); if (!tmScans.isEmpty()) { - fileStream = Stream.concat(fileStream, tmScans.stream()); - var scanStream = - tmScans.stream().map(s -> ReferenceFile.forScan(tableId, s.getMetaUpdateDelete())); ++ var scanStream = tmScans.stream().map(s -> ReferenceFile.forScan(tableId, s)); + fileStream = Stream.concat(fileStream, scanStream); } - // map the files to Reference objects - var stream = fileStream.map(f -> new ReferenceFile(tm.getTableId(), f)); - // if dirName is populated then we have a tablet directory aka srv:dir + // if dirName is populated, then we have a tablet directory aka srv:dir if (tm.getDirName() != null) { // add the tablet directory to the stream - var tabletDir = new ReferenceDirectory(tm.getTableId(), tm.getDirName()); - stream = Stream.concat(stream, Stream.of(tabletDir)); + var tabletDir = new ReferenceDirectory(tableId, tm.getDirName()); + fileStream = Stream.concat(fileStream, Stream.of(tabletDir)); } - return stream; + return fileStream; }); var scanServerRefs = context.getAmple().getScanServerFileReferences() - .map(sfr -> new ReferenceFile(sfr.getTableId(), sfr)); - .map(sfr -> ReferenceFile.forScan(sfr.getTableId(), sfr.getPathStr())); ++ .map(sfr -> ReferenceFile.forScan(sfr.getTableId(), sfr)); return Stream.concat(tabletReferences, scanServerRefs); } diff --cc server/gc/src/main/java/org/apache/accumulo/gc/GarbageCollectionAlgorithm.java index b04c71b827,6800b9a84d..48360b3ef3 --- a/server/gc/src/main/java/org/apache/accumulo/gc/GarbageCollectionAlgorithm.java +++ b/server/gc/src/main/java/org/apache/accumulo/gc/GarbageCollectionAlgorithm.java @@@ -159,11 -163,10 +159,10 @@@ public class GarbageCollectionAlgorith GcCandidate gcTemp = candidateMap.remove(dir); if (gcTemp != null) { log.debug("Directory Candidate was still in use by dir ref: {}", dir); - // Intentionally not adding dir candidates to inUseCandidates as they are only added once. - // If dir candidates are deleted, due to being in use, nothing will add them again. + // Do not add dir candidates to candidateEntriesToBeDeleted as they are only created once. } } else { - String reference = ref.getMetadataEntry(); + String reference = ref.getMetadataPath(); if (reference.startsWith("/")) { log.debug("Candidate {} has a relative path, prepend tableId {}", reference, ref.getTableId()); diff --cc server/gc/src/test/java/org/apache/accumulo/gc/GarbageCollectionTest.java index d21d60e189,8e9a2d1e07..735b071d79 --- a/server/gc/src/test/java/org/apache/accumulo/gc/GarbageCollectionTest.java +++ b/server/gc/src/test/java/org/apache/accumulo/gc/GarbageCollectionTest.java @@@ -59,8 -60,9 +59,8 @@@ public class GarbageCollectionTest Map<String,Reference> references = new TreeMap<>(); HashSet<TableId> tableIds = new HashSet<>(); - ArrayList<GcCandidate> deletes = new ArrayList<>(); + ArrayList<GcCandidate> fileDeletions = new ArrayList<>(); ArrayList<TableId> tablesDirsToDelete = new ArrayList<>(); - TreeMap<String,Status> filesToReplicate = new TreeMap<>(); boolean deleteInUseRefs = false; private long timestamp = 0L; @@@ -145,7 -150,7 +148,8 @@@ public void addFileReference(String tableId, String endRow, String file) { TableId tid = TableId.of(tableId); - references.put(tableId + ":" + endRow + ":" + file, new ReferenceFile(tid, new Path(file))); - references.put(tableId + ":" + endRow + ":" + file, ReferenceFile.forFile(tid, file)); ++ references.put(tableId + ":" + endRow + ":" + file, ++ ReferenceFile.forFile(tid, new Path(file))); tableIds.add(tid); } @@@ -165,6 -170,17 +169,18 @@@ removeLastTableIdRef(TableId.of(tableId)); } + public void addScanReference(String tableId, String endRow, String scan) { + TableId tid = TableId.of(tableId); - references.put(tableId + ":" + endRow + ":scan:" + scan, ReferenceFile.forScan(tid, scan)); ++ references.put(tableId + ":" + endRow + ":scan:" + scan, ++ ReferenceFile.forScan(tid, new Path(scan))); + tableIds.add(tid); + } + + public void removeScanReference(String tableId, String endRow, String scan) { + references.remove(tableId + ":" + endRow + ":scan:" + scan); + removeLastTableIdRef(TableId.of(tableId)); + } + /* * this is to be called from removeDirReference or removeFileReference. * diff --cc server/manager/src/main/java/org/apache/accumulo/manager/TabletGroupWatcher.java index 21ae3ae796,b9914bef1f..bbee9aea48 --- a/server/manager/src/main/java/org/apache/accumulo/manager/TabletGroupWatcher.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/TabletGroupWatcher.java @@@ -744,7 -703,7 +744,7 @@@ abstract class TabletGroupWatcher exten Key key = entry.getKey(); if (key.compareColumnFamily(DataFileColumnFamily.NAME) == 0) { var stf = new StoredTabletFile(key.getColumnQualifierData().toString()); - datafilesAndDirs.add(new ReferenceFile(stf.getTableId(), stf)); - datafilesAndDirs.add(ReferenceFile.forFile(stf.getTableId(), stf.getMetaUpdateDelete())); ++ datafilesAndDirs.add(ReferenceFile.forFile(stf.getTableId(), stf)); if (datafilesAndDirs.size() > 1000) { ample.putGcFileAndDirCandidates(extent.tableId(), datafilesAndDirs); datafilesAndDirs.clear(); diff --cc server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/CleanUpBulkImport.java index e613d53f93,12bbacff61..562423750b --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/CleanUpBulkImport.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/CleanUpBulkImport.java @@@ -59,7 -59,7 +59,7 @@@ public class CleanUpBulkImport extends ample.removeBulkLoadInProgressFlag( "/" + bulkDir.getParent().getName() + "/" + bulkDir.getName()); ample.putGcFileAndDirCandidates(info.tableId, - Collections.singleton(new ReferenceFile(info.tableId, bulkDir))); - Collections.singleton(ReferenceFile.forFile(info.tableId, bulkDir.toString()))); ++ Collections.singleton(ReferenceFile.forFile(info.tableId, bulkDir))); if (info.tableState == TableState.ONLINE) { Text firstSplit = info.firstSplit == null ? null : new Text(info.firstSplit); diff --cc test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java index c7cb622927,c35238dd41..73fb6d5665 --- a/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java @@@ -446,9 -451,8 +446,9 @@@ public class GarbageCollectorIT extend for (int i = 0; i < 100000; ++i) { String longpath = "aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee" + "ffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj"; - var path = String.format("file:/%020d/%s", i, longpath); - Mutation delFlag = ample.createDeleteMutation(ReferenceFile.forFile(TableId.of("1"), path)); + var path = URI.create(String.format("file:/%020d/%s", i, longpath)); + Mutation delFlag = - ample.createDeleteMutation(new ReferenceFile(TableId.of("1"), new Path(path))); ++ ample.createDeleteMutation(ReferenceFile.forFile(TableId.of("1"), new Path(path))); bw.addMutation(delFlag); } }