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);
        }
      }


Reply via email to