This is an automated email from the ASF dual-hosted git repository.

domgarguilo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/main by this push:
     new ff07df3a5a Fix ConstructorThrow SpotBugs warnings in core module 
(#5785)
ff07df3a5a is described below

commit ff07df3a5aefb506fa76983cb49e1e8ba7fe5e84
Author: Dom G. <[email protected]>
AuthorDate: Tue Dec 30 13:46:55 2025 -0500

    Fix ConstructorThrow SpotBugs warnings in core module (#5785)
    
    * Fix ConstructorThrow SpotBugs warningins in core module
    
    ---------
    
    Co-authored-by: Christopher Tubbs <[email protected]>
---
 core/pom.xml                                       |  3 ++
 .../classloader/URLContextClassLoaderFactory.java  |  9 ----
 .../accumulo/core/client/IteratorSetting.java      |  2 +-
 .../accumulo/core/client/rfile/RFileScanner.java   |  2 +-
 .../security/tokens/CredentialProviderToken.java   |  4 ++
 .../core/client/security/tokens/KerberosToken.java |  4 ++
 .../core/client/summary/CounterSummary.java        |  2 +-
 .../accumulo/core/clientImpl/ActiveScanImpl.java   |  2 +-
 .../core/clientImpl/DelegationTokenImpl.java       |  2 +-
 .../accumulo/core/clientImpl/OfflineIterator.java  |  2 +-
 .../core/clientImpl/TableOperationsImpl.java       |  2 +-
 .../TabletServerBatchReaderIterator.java           |  2 +-
 .../accumulo/core/clientImpl/ThriftScanner.java    |  2 +-
 .../core/clientImpl/ThriftTransportKey.java        |  2 +-
 .../core/clientImpl/bulk/LoadMappingIterator.java  |  2 +-
 .../compaction/ShellCompactCommandSelector.java    |  8 ++--
 .../accumulo/core/conf/SiteConfiguration.java      |  2 +
 .../core/crypto/streams/BlockedInputStream.java    |  4 ++
 .../core/crypto/streams/BlockedOutputStream.java   |  4 ++
 .../java/org/apache/accumulo/core/data/Key.java    |  4 ++
 .../org/apache/accumulo/core/data/LoadPlan.java    |  2 +-
 .../org/apache/accumulo/core/data/Mutation.java    |  4 ++
 .../java/org/apache/accumulo/core/data/Range.java  |  4 ++
 .../apache/accumulo/core/data/ResourceGroupId.java |  2 +-
 .../org/apache/accumulo/core/data/RowRange.java    |  4 ++
 .../java/org/apache/accumulo/core/data/Value.java  |  4 ++
 .../apache/accumulo/core/dataImpl/KeyExtent.java   |  2 +-
 .../java/org/apache/accumulo/core/fate/Fate.java   |  4 ++
 .../org/apache/accumulo/core/fate/FateCleaner.java |  2 +-
 .../org/apache/accumulo/core/fate/FateKey.java     |  4 ++
 .../org/apache/accumulo/core/fate/FateStore.java   |  2 +-
 .../accumulo/core/fate/zookeeper/FateLock.java     |  4 +-
 .../core/fate/zookeeper/MetaFateStore.java         |  4 ++
 .../accumulo/core/file/BloomFilterLayer.java       |  2 +-
 .../file/blockfile/cache/lru/LruBlockCache.java    |  3 +-
 .../file/blockfile/impl/ScanCacheProvider.java     |  2 +-
 .../org/apache/accumulo/core/file/rfile/RFile.java |  2 +-
 .../accumulo/core/file/rfile/bcfile/BCFile.java    |  8 ++--
 .../core/file/rfile/bcfile/PrintBCInfo.java        |  4 +-
 .../file/streams/BoundedRangeFileInputStream.java  |  2 +-
 .../core/iterators/user/ColumnAgeOffFilter.java    |  2 +-
 .../core/iteratorsImpl/conf/ColumnSet.java         |  2 +-
 .../iteratorsImpl/conf/ColumnToClassMapping.java   |  4 ++
 .../core/iteratorsImpl/system/HeapIterator.java    |  4 ++
 .../system/LocalityGroupIterator.java              |  2 +-
 .../core/iteratorsImpl/system/MultiIterator.java   |  2 +-
 .../iteratorsImpl/system/SequenceFileIterator.java |  2 +-
 .../org/apache/accumulo/core/lock/ServiceLock.java |  2 +
 .../core/manager/state/TabletManagement.java       |  4 ++
 .../core/metadata/ReferencedTabletFile.java        |  4 ++
 .../accumulo/core/metadata/StoredTabletFile.java   |  4 ++
 .../accumulo/core/metadata/TServerInstance.java    |  2 +-
 .../core/metadata/schema/DataFileValue.java        |  4 ++
 .../accumulo/core/rpc/SaslConnectionParams.java    |  4 ++
 .../core/sample/impl/SamplerConfigurationImpl.java |  2 +-
 .../accumulo/core/security/Authorizations.java     |  4 ++
 .../accumulo/core/security/ColumnVisibility.java   |  4 ++
 .../spi/balancer/HostRegexTableLoadBalancer.java   |  2 +-
 .../accumulo/core/spi/crypto/AESCryptoService.java |  4 +-
 .../core/spi/fs/SpaceAwareVolumeChooser.java       |  2 +-
 .../org/apache/accumulo/core/util/ColumnFQ.java    |  4 ++
 .../accumulo/core/util/ThriftMessageUtil.java      |  2 +-
 .../util/compaction/CompactionServicesConfig.java  |  4 ++
 .../apache/accumulo/core/volume/VolumeImpl.java    |  2 +-
 .../org/apache/accumulo/core/zookeeper/ZcNode.java |  2 +-
 .../apache/accumulo/core/zookeeper/ZooCache.java   |  4 ++
 .../org/apache/accumulo/core/data/OldMutation.java |  4 ++
 .../accumulo/core/file/rfile/RollingStatsTest.java |  2 +-
 hadoop-mapreduce/pom.xml                           |  3 ++
 iterator-test-harness/pom.xml                      |  3 ++
 minicluster/pom.xml                                |  3 ++
 pom.xml                                            |  1 -
 server/base/pom.xml                                |  3 ++
 server/compactor/pom.xml                           |  3 ++
 server/gc/pom.xml                                  |  3 ++
 server/manager/pom.xml                             |  3 ++
 server/monitor/pom.xml                             |  3 ++
 server/native/pom.xml                              |  1 +
 server/tserver/pom.xml                             |  3 ++
 .../apache/accumulo/tserver/ScanServerTest.java    | 49 +++++++++++-----------
 .../tserver/TabletResourceManagerTest.java         |  4 +-
 shell/pom.xml                                      |  3 ++
 start/pom.xml                                      |  3 ++
 test/pom.xml                                       |  1 +
 84 files changed, 219 insertions(+), 83 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index 24b2ffc371..481ace610f 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -29,6 +29,9 @@
   <artifactId>accumulo-core</artifactId>
   <name>Apache Accumulo Core</name>
   <description>Apache Accumulo core libraries.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.beust</groupId>
diff --git 
a/core/src/main/java/org/apache/accumulo/core/classloader/URLContextClassLoaderFactory.java
 
b/core/src/main/java/org/apache/accumulo/core/classloader/URLContextClassLoaderFactory.java
index c61b25106e..9e88945756 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/classloader/URLContextClassLoaderFactory.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/classloader/URLContextClassLoaderFactory.java
@@ -22,7 +22,6 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.accumulo.core.spi.common.ContextClassLoaderFactory;
 import org.apache.accumulo.core.util.cache.Caches;
@@ -39,9 +38,7 @@ import com.github.benmanes.caffeine.cache.Cache;
  */
 public class URLContextClassLoaderFactory implements ContextClassLoaderFactory 
{
 
-  private static final AtomicBoolean isInstantiated = new AtomicBoolean(false);
   private static final Logger LOG = 
LoggerFactory.getLogger(URLContextClassLoaderFactory.class);
-  private static final String className = 
URLContextClassLoaderFactory.class.getName();
 
   // Cache the class loaders for re-use
   // WeakReferences are used so that the class loaders can be cleaned up when 
no longer needed
@@ -50,12 +47,6 @@ public class URLContextClassLoaderFactory implements 
ContextClassLoaderFactory {
   private final Cache<String,URLClassLoader> classloaders =
       Caches.getInstance().createNewBuilder(CacheName.CLASSLOADERS, 
true).weakValues().build();
 
-  public URLContextClassLoaderFactory() {
-    if (!isInstantiated.compareAndSet(false, true)) {
-      throw new IllegalStateException("Can only instantiate " + className + " 
once");
-    }
-  }
-
   @Override
   public ClassLoader getClassLoader(String context) {
     if (context == null) {
diff --git 
a/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java 
b/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
index 29be3f84cd..41f9878d12 100644
--- a/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
@@ -51,7 +51,7 @@ import org.apache.hadoop.io.WritableUtils;
  * scanner.addScanIterator(cfg);
  * </pre>
  */
-public class IteratorSetting implements Writable {
+public final class IteratorSetting implements Writable {
   private int priority;
   private String name;
   private String iteratorClass;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java 
b/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java
index b3ba59e13c..38bcef285a 100644
--- a/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java
@@ -77,7 +77,7 @@ import org.apache.hadoop.io.Text;
 
 import com.google.common.base.Preconditions;
 
-class RFileScanner extends ScannerOptions implements Scanner {
+final class RFileScanner extends ScannerOptions implements Scanner {
 
   private static class RFileScannerEnvironmentImpl extends 
ClientServiceEnvironmentImpl {
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/client/security/tokens/CredentialProviderToken.java
 
b/core/src/main/java/org/apache/accumulo/core/client/security/tokens/CredentialProviderToken.java
index ed42f18f8c..8504780895 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/client/security/tokens/CredentialProviderToken.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/client/security/tokens/CredentialProviderToken.java
@@ -30,9 +30,13 @@ import java.util.Set;
 import org.apache.accumulo.core.conf.HadoopCredentialProvider;
 import org.apache.hadoop.conf.Configuration;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * An {@link AuthenticationToken} backed by a Hadoop CredentialProvider.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class CredentialProviderToken extends PasswordToken {
   public static final String NAME_PROPERTY = "name";
   public static final String CREDENTIAL_PROVIDERS_PROPERTY = 
"credentialProviders";
diff --git 
a/core/src/main/java/org/apache/accumulo/core/client/security/tokens/KerberosToken.java
 
b/core/src/main/java/org/apache/accumulo/core/client/security/tokens/KerberosToken.java
index b21d2cfa04..a9221032f5 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/client/security/tokens/KerberosToken.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/client/security/tokens/KerberosToken.java
@@ -34,11 +34,15 @@ import javax.security.auth.DestroyFailedException;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Authentication token for Kerberos authenticated clients
  *
  * @since 1.7.0
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class KerberosToken implements AuthenticationToken {
 
   public static final String CLASS_NAME = KerberosToken.class.getName();
diff --git 
a/core/src/main/java/org/apache/accumulo/core/client/summary/CounterSummary.java
 
b/core/src/main/java/org/apache/accumulo/core/client/summary/CounterSummary.java
index 3f1e195511..82669a2982 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/client/summary/CounterSummary.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/client/summary/CounterSummary.java
@@ -33,7 +33,7 @@ import com.google.common.annotations.VisibleForTesting;
  *
  * @since 2.0.0
  */
-public class CounterSummary {
+public final class CounterSummary {
   private Map<String,Long> stats;
 
   private static final Logger log = 
LoggerFactory.getLogger(CounterSummary.class);
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveScanImpl.java 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveScanImpl.java
index cbc0f3cabd..5ecb62cf9d 100644
--- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveScanImpl.java
+++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveScanImpl.java
@@ -42,7 +42,7 @@ import org.apache.accumulo.core.security.Authorizations;
  *
  * @since 1.6.0
  */
-public class ActiveScanImpl extends ActiveScan {
+public final class ActiveScanImpl extends ActiveScan {
 
   private final long scanId;
   private final String client;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/DelegationTokenImpl.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/DelegationTokenImpl.java
index ce1b22feef..e99dc33f44 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/DelegationTokenImpl.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/DelegationTokenImpl.java
@@ -32,7 +32,7 @@ import 
org.apache.accumulo.core.securityImpl.thrift.TAuthenticationTokenIdentifi
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.security.token.Token;
 
-public class DelegationTokenImpl extends PasswordToken implements 
DelegationToken {
+public final class DelegationTokenImpl extends PasswordToken implements 
DelegationToken {
 
   public static final String SERVICE_NAME = "AccumuloDelegationToken";
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java
index 854bd4973b..87d4294cf3 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java
@@ -72,7 +72,7 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.io.Text;
 
-class OfflineIterator implements Iterator<Entry<Key,Value>> {
+final class OfflineIterator implements Iterator<Entry<Key,Value>> {
 
   private SortedKeyValueIterator<Key,Value> iter;
   private Range range;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java
index e59736a70c..cdfd1f67e4 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java
@@ -1872,7 +1872,7 @@ public class TableOperationsImpl extends 
TableOperationsHelper {
     return sci.toSamplerConfiguration();
   }
 
-  private static class LocationsImpl implements Locations {
+  private static final class LocationsImpl implements Locations {
 
     private Map<Range,List<TabletId>> groupedByRanges;
     private Map<TabletId,List<Range>> groupedByTablets;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java
index 932c0df4c6..33181c1ec4 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java
@@ -91,7 +91,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.net.HostAndPort;
 
-public class TabletServerBatchReaderIterator implements 
Iterator<Entry<Key,Value>> {
+public final class TabletServerBatchReaderIterator implements 
Iterator<Entry<Key,Value>> {
 
   private static final Logger log = 
LoggerFactory.getLogger(TabletServerBatchReaderIterator.class);
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftScanner.java 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftScanner.java
index 4d6c792c0d..c45b9322dd 100644
--- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftScanner.java
+++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftScanner.java
@@ -93,7 +93,7 @@ import com.google.common.net.HostAndPort;
 import io.opentelemetry.api.trace.Span;
 import io.opentelemetry.context.Scope;
 
-public class ThriftScanner {
+public final class ThriftScanner {
   private static final Logger log = 
LoggerFactory.getLogger(ThriftScanner.class);
 
   // This set is initially empty when the client starts. The first time this
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportKey.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportKey.java
index ee93871ecf..ab93f37f00 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportKey.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportKey.java
@@ -30,7 +30,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.net.HostAndPort;
 
 @VisibleForTesting
-public class ThriftTransportKey {
+public final class ThriftTransportKey {
   private final ThriftClientTypes<?> type;
   private final HostAndPort server;
   private final long timeout;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/LoadMappingIterator.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/LoadMappingIterator.java
index 15a58ec10e..223288591c 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/LoadMappingIterator.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/LoadMappingIterator.java
@@ -40,7 +40,7 @@ import com.google.gson.stream.JsonReader;
 /**
  * Iterator for reading the Bulk Load Mapping JSON.
  */
-public class LoadMappingIterator
+public final class LoadMappingIterator
     implements Iterator<Map.Entry<KeyExtent,Bulk.Files>>, AutoCloseable {
   private final TableId tableId;
   private final JsonReader reader;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/compaction/ShellCompactCommandSelector.java
 
b/core/src/main/java/org/apache/accumulo/core/compaction/ShellCompactCommandSelector.java
index 90d5413637..2faefbb86b 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/compaction/ShellCompactCommandSelector.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/compaction/ShellCompactCommandSelector.java
@@ -132,8 +132,8 @@ public class ShellCompactCommandSelector implements 
CompactionSelector {
   private abstract static class FileSizeTest extends Test {
     private final long esize;
 
-    private FileSizeTest(String s) {
-      this.esize = Long.parseLong(s);
+    private FileSizeTest(long esize) {
+      this.esize = esize;
     }
 
     @Override
@@ -186,7 +186,7 @@ public class ShellCompactCommandSelector implements 
CompactionSelector {
           tests.add(new NoSampleTest());
           break;
         case SF_LT_ESIZE_OPT:
-          tests.add(new FileSizeTest(entry.getValue()) {
+          tests.add(new FileSizeTest(Long.parseLong(entry.getValue())) {
             @Override
             public boolean shouldCompact(long fsize, long esize) {
               return fsize < esize;
@@ -194,7 +194,7 @@ public class ShellCompactCommandSelector implements 
CompactionSelector {
           });
           break;
         case SF_GT_ESIZE_OPT:
-          tests.add(new FileSizeTest(entry.getValue()) {
+          tests.add(new FileSizeTest(Long.parseLong(entry.getValue())) {
             @Override
             public boolean shouldCompact(long fsize, long esize) {
               return fsize > esize;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/conf/SiteConfiguration.java 
b/core/src/main/java/org/apache/accumulo/core/conf/SiteConfiguration.java
index 4096316ea4..9ca8e24c2a 100644
--- a/core/src/main/java/org/apache/accumulo/core/conf/SiteConfiguration.java
+++ b/core/src/main/java/org/apache/accumulo/core/conf/SiteConfiguration.java
@@ -59,6 +59,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
  * <p>
  * <b>Note</b>: Client code should not use this class, and it may be 
deprecated in the future.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class SiteConfiguration extends AccumuloConfiguration {
 
   private static final Logger log = 
LoggerFactory.getLogger(SiteConfiguration.class);
diff --git 
a/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedInputStream.java
 
b/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedInputStream.java
index bd5095320e..b5206e9f91 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedInputStream.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedInputStream.java
@@ -23,10 +23,14 @@ import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Reader corresponding to BlockedOutputStream. Expects all data to be in the 
form of size (int)
  * data (size bytes) junk (however many bytes it takes to complete a block)
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class BlockedInputStream extends InputStream {
   byte[] array;
   // ReadPos is where to start reading
diff --git 
a/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedOutputStream.java
 
b/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedOutputStream.java
index 9adb74d9a2..60df9ad016 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedOutputStream.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/crypto/streams/BlockedOutputStream.java
@@ -24,11 +24,15 @@ import java.io.OutputStream;
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Buffers all input in a growing buffer until flush() is called. Then entire 
buffer is written,
  * with size information, and padding to force the underlying crypto output 
stream to also fully
  * flush
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class BlockedOutputStream extends OutputStream {
   int blockSize;
   DataOutputStream out;
diff --git a/core/src/main/java/org/apache/accumulo/core/data/Key.java 
b/core/src/main/java/org/apache/accumulo/core/data/Key.java
index ff6ac7baa3..3e69b9598b 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/Key.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/Key.java
@@ -36,12 +36,16 @@ import org.apache.hadoop.io.WritableComparable;
 import org.apache.hadoop.io.WritableComparator;
 import org.apache.hadoop.io.WritableUtils;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This is the Key used to store and access individual values in Accumulo. A 
Key is a tuple composed
  * of a row, column family, column qualifier, column visibility, timestamp, 
and delete marker.
  * <p>
  * Keys are comparable and therefore have a sorted order defined by {@link 
#compareTo(Key)}.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class Key implements WritableComparable<Key>, Cloneable {
 
   protected byte[] row;
diff --git a/core/src/main/java/org/apache/accumulo/core/data/LoadPlan.java 
b/core/src/main/java/org/apache/accumulo/core/data/LoadPlan.java
index 1f21a919f4..a2dabffd95 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/LoadPlan.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/LoadPlan.java
@@ -105,7 +105,7 @@ public class LoadPlan {
    *
    * @since 2.0.0
    */
-  public static class Destination {
+  public static final class Destination {
 
     private final String fileName;
     private final byte[] startRow;
diff --git a/core/src/main/java/org/apache/accumulo/core/data/Mutation.java 
b/core/src/main/java/org/apache/accumulo/core/data/Mutation.java
index 9be3143480..e64194e4f1 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/Mutation.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/Mutation.java
@@ -41,6 +41,8 @@ import org.apache.hadoop.io.WritableUtils;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Mutation represents an action that manipulates a row in a table. A mutation 
holds a list of
  * column/value pairs that represent an atomic set of modifications to make to 
a row.
@@ -69,6 +71,8 @@ import com.google.common.base.Preconditions;
  * support different subset of fields and types. The functionality of all of 
these {@code put}
  * methods and more is provided by the new fluent {@link #at()} method added 
in 2.0.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class Mutation implements Writable {
 
   /**
diff --git a/core/src/main/java/org/apache/accumulo/core/data/Range.java 
b/core/src/main/java/org/apache/accumulo/core/data/Range.java
index f4f00e3cec..7cc0dd694e 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/Range.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/Range.java
@@ -32,11 +32,15 @@ import org.apache.accumulo.core.dataImpl.thrift.TRange;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.WritableComparable;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This class is used to specify a range of Accumulo keys.
  *
  * @see Key
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class Range implements WritableComparable<Range> {
 
   private Key start;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/data/ResourceGroupId.java 
b/core/src/main/java/org/apache/accumulo/core/data/ResourceGroupId.java
index e2954514fa..6cb8e0ac1a 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/ResourceGroupId.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/ResourceGroupId.java
@@ -26,7 +26,7 @@ import org.apache.accumulo.core.util.cache.Caches.CacheName;
 
 import com.github.benmanes.caffeine.cache.Cache;
 
-public class ResourceGroupId extends AbstractId<ResourceGroupId> {
+public final class ResourceGroupId extends AbstractId<ResourceGroupId> {
 
   private static final Pattern GROUP_NAME_PATTERN = 
Pattern.compile("^[a-zA-Z]+(_?[a-zA-Z0-9])*$");
 
diff --git a/core/src/main/java/org/apache/accumulo/core/data/RowRange.java 
b/core/src/main/java/org/apache/accumulo/core/data/RowRange.java
index 5895f9f124..dbb381b4a3 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/RowRange.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/RowRange.java
@@ -29,11 +29,15 @@ import java.util.List;
 import org.apache.hadoop.io.BinaryComparable;
 import org.apache.hadoop.io.Text;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This class is used to specify a range of rows.
  *
  * @since 4.0.0
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class RowRange implements Comparable<RowRange> {
 
   private static final Comparator<Text> LOWER_BOUND_COMPARATOR =
diff --git a/core/src/main/java/org/apache/accumulo/core/data/Value.java 
b/core/src/main/java/org/apache/accumulo/core/data/Value.java
index 6c62a3ed53..8c63967126 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/Value.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/Value.java
@@ -32,12 +32,16 @@ import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.WritableComparable;
 import org.apache.hadoop.io.WritableComparator;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * A byte sequence that is usable as a key or value. Based on
  * {@link org.apache.hadoop.io.BytesWritable} only this class is NOT resizable 
and DOES NOT
  * distinguish between the size of the sequence and the current capacity as
  * {@link org.apache.hadoop.io.BytesWritable} does. Hence it is comparatively 
'immutable'.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class Value implements WritableComparable<Object> {
   private static final byte[] EMPTY = new byte[0];
   protected byte[] value;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/dataImpl/KeyExtent.java 
b/core/src/main/java/org/apache/accumulo/core/dataImpl/KeyExtent.java
index f032cd3944..5a3ed07f90 100644
--- a/core/src/main/java/org/apache/accumulo/core/dataImpl/KeyExtent.java
+++ b/core/src/main/java/org/apache/accumulo/core/dataImpl/KeyExtent.java
@@ -64,7 +64,7 @@ import org.apache.hadoop.io.Text;
 /**
  * keeps track of information needed to identify a tablet
  */
-public class KeyExtent implements Comparable<KeyExtent> {
+public final class KeyExtent implements Comparable<KeyExtent> {
 
   private static final String OBSCURING_HASH_ALGORITHM = "SHA-256";
 
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/Fate.java 
b/core/src/main/java/org/apache/accumulo/core/fate/Fate.java
index 651e1ca838..eebe114785 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/Fate.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/Fate.java
@@ -66,9 +66,13 @@ import org.slf4j.LoggerFactory;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.gson.JsonParser;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Fault tolerant executor
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class Fate<T> {
 
   private static final Logger log = LoggerFactory.getLogger(Fate.class);
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/FateCleaner.java 
b/core/src/main/java/org/apache/accumulo/core/fate/FateCleaner.java
index 20e6ef691d..903d5d8e23 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/FateCleaner.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/FateCleaner.java
@@ -58,7 +58,7 @@ public class FateCleaner<T> {
   private final Duration ageOffTime;
   private final TimeSource timeSource;
 
-  private static class AgeOffInfo {
+  private static final class AgeOffInfo {
     final SteadyTime setTime;
     final TStatus status;
 
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/FateKey.java 
b/core/src/main/java/org/apache/accumulo/core/fate/FateKey.java
index 7f0658eae9..650dca01af 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/FateKey.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/FateKey.java
@@ -32,6 +32,10 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.hadoop.io.DataInputBuffer;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class FateKey {
 
   private final FateKeyType type;
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/FateStore.java 
b/core/src/main/java/org/apache/accumulo/core/fate/FateStore.java
index ed5ec62be1..e28e793642 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/FateStore.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/FateStore.java
@@ -160,7 +160,7 @@ public interface FateStore<T> extends ReadOnlyFateStore<T>, 
AutoCloseable {
   /**
    * The value stored to indicate a FATE transaction ID ({@link FateId}) has 
been reserved
    */
-  class FateReservation {
+  final class FateReservation {
 
     // The LockID (provided by the Manager running the FATE which uses this 
store) which is used for
     // identifying dead Managers, so their reservations can be deleted and 
picked up again since
diff --git 
a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/FateLock.java 
b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/FateLock.java
index 3bd9358707..5e8c541818 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/FateLock.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/FateLock.java
@@ -72,7 +72,7 @@ public class FateLock implements QueueLock {
     }
   }
 
-  public static class FateLockEntry {
+  public final static class FateLockEntry {
 
     private static final String DELIMITER = "_";
 
@@ -163,7 +163,7 @@ public class FateLock implements QueueLock {
     this.path = requireNonNull(path);
   }
 
-  public static class NodeName {
+  public final static class NodeName {
     public final long sequence;
     public final Supplier<FateLockEntry> fateLockEntry;
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/MetaFateStore.java 
b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/MetaFateStore.java
index 72ce79e1cc..f6f67dfef2 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/MetaFateStore.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/MetaFateStore.java
@@ -72,8 +72,12 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Suppliers;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 //TODO use zoocache? - ACCUMULO-1297
 //TODO handle zookeeper being down gracefully - ACCUMULO-1297
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class MetaFateStore<T> extends AbstractFateStore<T> {
 
   private static final Logger log = 
LoggerFactory.getLogger(MetaFateStore.class);
diff --git 
a/core/src/main/java/org/apache/accumulo/core/file/BloomFilterLayer.java 
b/core/src/main/java/org/apache/accumulo/core/file/BloomFilterLayer.java
index 06d9087181..682dc1d809 100644
--- a/core/src/main/java/org/apache/accumulo/core/file/BloomFilterLayer.java
+++ b/core/src/main/java/org/apache/accumulo/core/file/BloomFilterLayer.java
@@ -88,7 +88,7 @@ public class BloomFilterLayer {
     return loadThreadPool;
   }
 
-  public static class Writer implements FileSKVWriter {
+  public static final class Writer implements FileSKVWriter {
     private DynamicBloomFilter bloomFilter;
     private int numKeys;
     private int vectorSize;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/file/blockfile/cache/lru/LruBlockCache.java
 
b/core/src/main/java/org/apache/accumulo/core/file/blockfile/cache/lru/LruBlockCache.java
index eff9b834d2..1b2c1d84b9 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/file/blockfile/cache/lru/LruBlockCache.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/file/blockfile/cache/lru/LruBlockCache.java
@@ -82,7 +82,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
  * bytes to free). It then uses the priority chunk sizes to evict fairly 
according to the relative
  * sizes and usage.
  */
-public class LruBlockCache extends SynchronousLoadingBlockCache implements 
BlockCache, HeapSize {
+public final class LruBlockCache extends SynchronousLoadingBlockCache
+    implements BlockCache, HeapSize {
 
   private static final Logger log = 
LoggerFactory.getLogger(LruBlockCache.class);
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/file/blockfile/impl/ScanCacheProvider.java
 
b/core/src/main/java/org/apache/accumulo/core/file/blockfile/impl/ScanCacheProvider.java
index 155b874326..45a375aae1 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/file/blockfile/impl/ScanCacheProvider.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/file/blockfile/impl/ScanCacheProvider.java
@@ -25,7 +25,7 @@ import org.apache.accumulo.core.spi.cache.BlockCache;
 import org.apache.accumulo.core.spi.cache.CacheType;
 import org.apache.accumulo.core.spi.scan.ScanDispatch;
 
-public class ScanCacheProvider implements CacheProvider {
+public final class ScanCacheProvider implements CacheProvider {
 
   private final BlockCache indexCache;
   private final BlockCache dataCache;
diff --git a/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java 
b/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java
index 79fd398377..26b761d542 100644
--- a/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java
+++ b/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java
@@ -1171,7 +1171,7 @@ public class RFile {
     }
   }
 
-  public static class Reader extends HeapIterator implements RFileSKVIterator {
+  public static final class Reader extends HeapIterator implements 
RFileSKVIterator {
 
     private final CachableBlockFile.Reader reader;
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/BCFile.java 
b/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/BCFile.java
index 29242ef594..693c956b85 100644
--- a/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/BCFile.java
+++ b/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/BCFile.java
@@ -103,7 +103,7 @@ public final class BCFile {
   /**
    * BCFile writer, the entry point for creating a new BCFile.
    */
-  public static class Writer implements Closeable {
+  public static final class Writer implements Closeable {
     private final FSDataOutputStream out;
     private final Configuration conf;
     private FileEncrypter encrypter;
@@ -451,7 +451,7 @@ public final class BCFile {
   /**
    * BCFile Reader, interface to read the file's data and meta blocks.
    */
-  public static class Reader implements Closeable {
+  public static final class Reader implements Closeable {
     private final SeekableDataInputStream in;
     private final Configuration conf;
     final DataIndex dataIndex;
@@ -768,7 +768,7 @@ public final class BCFile {
   /**
    * Index for all Meta blocks.
    */
-  static class MetaIndex {
+  static final class MetaIndex {
     // use a tree map, for getting a meta block entry by name
     final Map<String,MetaIndexEntry> index;
 
@@ -857,7 +857,7 @@ public final class BCFile {
   /**
    * Index of all compressed data blocks.
    */
-  static class DataIndex {
+  static final class DataIndex {
     static final String BLOCK_NAME = "BCFile.index";
 
     private final CompressionAlgorithm defaultCompressionAlgorithm;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/PrintBCInfo.java
 
b/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/PrintBCInfo.java
index 542aac37f2..c7dea2a3ab 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/PrintBCInfo.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/file/rfile/bcfile/PrintBCInfo.java
@@ -36,8 +36,8 @@ import com.beust.jcommander.Parameter;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
-@SuppressFBWarnings(value = "DM_EXIT",
-    justification = "System.exit is fine here because it's a utility class 
executed by a main()")
+@SuppressFBWarnings(value = {"DM_EXIT", "CT_CONSTRUCTOR_THROW"},
+    justification = "System.exit is acceptable here as it's a utility class, 
and constructor validation ensures proper initialization")
 public class PrintBCInfo {
   Configuration conf;
   FileSystem fs;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/file/streams/BoundedRangeFileInputStream.java
 
b/core/src/main/java/org/apache/accumulo/core/file/streams/BoundedRangeFileInputStream.java
index d9f41862ae..0602d70972 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/file/streams/BoundedRangeFileInputStream.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/file/streams/BoundedRangeFileInputStream.java
@@ -28,7 +28,7 @@ import org.apache.hadoop.fs.Seekable;
  * regular input stream. One can create multiple BoundedRangeFileInputStream 
on top of the same
  * FSDataInputStream and they would not interfere with each other.
  */
-public class BoundedRangeFileInputStream extends InputStream {
+public final class BoundedRangeFileInputStream extends InputStream {
 
   private volatile boolean closed = false;
   private final InputStream in;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
 
b/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
index b4a4319c24..ee1bbdc5aa 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
@@ -39,7 +39,7 @@ import org.apache.hadoop.io.Text;
  * each column.
  */
 public class ColumnAgeOffFilter extends Filter {
-  public static class TTLSet extends ColumnToClassMapping<Long> {
+  private static final class TTLSet extends ColumnToClassMapping<Long> {
     public TTLSet(Map<String,String> objectStrings) {
 
       for (Entry<String,String> entry : objectStrings.entrySet()) {
diff --git 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnSet.java 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnSet.java
index 37f9d1cd0d..ff8cc9d4e1 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnSet.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnSet.java
@@ -30,7 +30,7 @@ import 
org.apache.accumulo.core.iteratorsImpl.conf.ColumnUtil.ColHashKey;
 import org.apache.accumulo.core.util.Pair;
 import org.apache.hadoop.io.Text;
 
-public class ColumnSet {
+public final class ColumnSet {
   private final Set<ColFamHashKey> objectsCF;
   private final Set<ColHashKey> objectsCol;
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnToClassMapping.java
 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnToClassMapping.java
index 4862055f41..8fea310b2d 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnToClassMapping.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/conf/ColumnToClassMapping.java
@@ -29,6 +29,10 @@ import 
org.apache.accumulo.core.iteratorsImpl.conf.ColumnUtil.ColHashKey;
 import org.apache.accumulo.core.util.Pair;
 import org.apache.hadoop.io.Text;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class ColumnToClassMapping<K> {
 
   private final HashMap<ColFamHashKey,K> objectsCF;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/HeapIterator.java
 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/HeapIterator.java
index 074e8bedbe..ba84e6d021 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/HeapIterator.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/HeapIterator.java
@@ -25,10 +25,14 @@ import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Constructs a {@link PriorityQueue} of multiple SortedKeyValueIterators. 
Provides a simple way to
  * interact with multiple SortedKeyValueIterators in sorted order.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public abstract class HeapIterator implements 
SortedKeyValueIterator<Key,Value> {
   private PriorityQueue<SortedKeyValueIterator<Key,Value>> heap;
   private SortedKeyValueIterator<Key,Value> topIdx = null;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/LocalityGroupIterator.java
 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/LocalityGroupIterator.java
index 7ada6fa496..10d263b991 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/LocalityGroupIterator.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/LocalityGroupIterator.java
@@ -70,7 +70,7 @@ public class LocalityGroupIterator extends HeapIterator 
implements Interruptible
     private InterruptibleIterator iterator;
   }
 
-  public static class LocalityGroupContext {
+  public static final class LocalityGroupContext {
     final List<LocalityGroup> groups;
     final LocalityGroup defaultGroup;
     final Map<ByteSequence,LocalityGroup> groupByCf;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/MultiIterator.java
 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/MultiIterator.java
index 34c3b88762..77cd69cf01 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/MultiIterator.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/MultiIterator.java
@@ -35,7 +35,7 @@ import 
org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 /**
  * An iterator capable of iterating over other iterators in sorted order.
  */
-public class MultiIterator extends HeapIterator {
+public final class MultiIterator extends HeapIterator {
 
   private List<SortedKeyValueIterator<Key,Value>> iters;
   private Range fence;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SequenceFileIterator.java
 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SequenceFileIterator.java
index 8881e0de23..ce7086afac 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SequenceFileIterator.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SequenceFileIterator.java
@@ -37,7 +37,7 @@ import 
org.apache.accumulo.core.sample.impl.SamplerConfigurationImpl;
 import org.apache.hadoop.io.SequenceFile;
 import org.apache.hadoop.io.SequenceFile.Reader;
 
-public class SequenceFileIterator implements FileSKVIterator {
+public final class SequenceFileIterator implements FileSKVIterator {
 
   private final Reader reader;
   private Value top_value;
diff --git a/core/src/main/java/org/apache/accumulo/core/lock/ServiceLock.java 
b/core/src/main/java/org/apache/accumulo/core/lock/ServiceLock.java
index 23e2b25ccf..ccd2224dbe 100644
--- a/core/src/main/java/org/apache/accumulo/core/lock/ServiceLock.java
+++ b/core/src/main/java/org/apache/accumulo/core/lock/ServiceLock.java
@@ -49,6 +49,8 @@ import org.slf4j.LoggerFactory;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class ServiceLock implements Watcher {
   private static final Logger LOG = LoggerFactory.getLogger(ServiceLock.class);
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/manager/state/TabletManagement.java
 
b/core/src/main/java/org/apache/accumulo/core/manager/state/TabletManagement.java
index c804de9338..832e79b94a 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/manager/state/TabletManagement.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/manager/state/TabletManagement.java
@@ -35,12 +35,16 @@ import org.apache.hadoop.io.Text;
 import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Object that represents a Tablets metadata and any actions that the Manager 
might need to take on
  * the object. This object is created by the TabletManagementIterator iterator 
used by the
  * TabletGroupWatcher threads in the Manager.
  *
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class TabletManagement {
 
   public static final EnumSet<ColumnType> CONFIGURED_COLUMNS = 
EnumSet.allOf(ColumnType.class);
diff --git 
a/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java
 
b/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java
index be99fb983d..2bcae4be9d 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java
@@ -33,6 +33,8 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Object representing a tablet file that may exist in the metadata table. 
This class is used for
  * reading and opening tablet files. It is also used when inserting new tablet 
files. When a new
@@ -43,6 +45,8 @@ import com.google.common.base.Preconditions;
  * As of 2.1, Tablet file paths should now be only absolute URIs with the 
removal of relative paths
  * in Upgrader9to10.upgradeRelativePaths()
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class ReferencedTabletFile extends 
AbstractTabletFile<ReferencedTabletFile> {
 
   public static class FileParts {
diff --git 
a/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java 
b/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java
index 52487b56e1..b1f80ccd75 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java
@@ -40,6 +40,8 @@ import org.checkerframework.checker.nullness.qual.NonNull;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.gson.Gson;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Object representing a tablet file entry stored in the metadata table. Keeps 
a string of the exact
  * entry of what is in the metadata table, which is important for updating and 
deleting metadata
@@ -51,6 +53,8 @@ import com.google.gson.Gson;
  * As of 2.1, Tablet file paths should now be only absolute URIs with the 
removal of relative paths
  * in Upgrader9to10.upgradeRelativePaths()
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class StoredTabletFile extends AbstractTabletFile<StoredTabletFile> {
   private final String metadataEntry;
   private final ReferencedTabletFile referencedTabletFile;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/metadata/TServerInstance.java 
b/core/src/main/java/org/apache/accumulo/core/metadata/TServerInstance.java
index 9e26102525..2bc96773a7 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/TServerInstance.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/TServerInstance.java
@@ -32,7 +32,7 @@ import com.google.common.net.HostAndPort;
  * Therefore tablet assignments can be considered out-of-date if the tablet 
server instance
  * information has been changed.
  */
-public class TServerInstance implements Comparable<TServerInstance> {
+public final class TServerInstance implements Comparable<TServerInstance> {
 
   private final HostAndPort hostAndPort;
   private final String hostPort;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/metadata/schema/DataFileValue.java
 
b/core/src/main/java/org/apache/accumulo/core/metadata/schema/DataFileValue.java
index 1402cb8311..78bbb8d8ef 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/metadata/schema/DataFileValue.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/metadata/schema/DataFileValue.java
@@ -24,6 +24,10 @@ import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iteratorsImpl.system.InterruptibleIterator;
 import org.apache.accumulo.core.iteratorsImpl.system.TimeSettingIterator;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class DataFileValue {
   private final long size;
   private final long numEntries;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/rpc/SaslConnectionParams.java 
b/core/src/main/java/org/apache/accumulo/core/rpc/SaslConnectionParams.java
index 6d9487a2a9..c6295ed00e 100644
--- a/core/src/main/java/org/apache/accumulo/core/rpc/SaslConnectionParams.java
+++ b/core/src/main/java/org/apache/accumulo/core/rpc/SaslConnectionParams.java
@@ -44,9 +44,13 @@ import 
org.apache.hadoop.security.authentication.util.KerberosUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Connection parameters for setting up a TSaslTransportFactory
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class SaslConnectionParams {
   private static final Logger log = 
LoggerFactory.getLogger(SaslConnectionParams.class);
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/sample/impl/SamplerConfigurationImpl.java
 
b/core/src/main/java/org/apache/accumulo/core/sample/impl/SamplerConfigurationImpl.java
index f0eeb0d01d..20d8d3e2d8 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/sample/impl/SamplerConfigurationImpl.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/sample/impl/SamplerConfigurationImpl.java
@@ -36,7 +36,7 @@ import 
org.apache.accumulo.core.tabletscan.thrift.TSamplerConfiguration;
 import org.apache.accumulo.core.util.Pair;
 import org.apache.hadoop.io.Writable;
 
-public class SamplerConfigurationImpl implements Writable {
+public final class SamplerConfigurationImpl implements Writable {
   private String className;
   private Map<String,String> options;
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/security/Authorizations.java 
b/core/src/main/java/org/apache/accumulo/core/security/Authorizations.java
index 5964b4fc7d..c9231ace39 100644
--- a/core/src/main/java/org/apache/accumulo/core/security/Authorizations.java
+++ b/core/src/main/java/org/apache/accumulo/core/security/Authorizations.java
@@ -37,9 +37,13 @@ import org.apache.accumulo.core.data.ArrayByteSequence;
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.util.ByteBufferUtil;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * A collection of authorization strings.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class Authorizations implements Iterable<byte[]>, Serializable, 
AuthorizationContainer {
 
   private static final long serialVersionUID = 1L;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/security/ColumnVisibility.java 
b/core/src/main/java/org/apache/accumulo/core/security/ColumnVisibility.java
index 71a38ff43c..33a377008c 100644
--- a/core/src/main/java/org/apache/accumulo/core/security/ColumnVisibility.java
+++ b/core/src/main/java/org/apache/accumulo/core/security/ColumnVisibility.java
@@ -40,6 +40,8 @@ import org.apache.hadoop.io.WritableComparator;
 
 import com.google.common.base.Suppliers;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Validate the column visibility is a valid expression and set the visibility 
for a Mutation. See
  * {@link ColumnVisibility#ColumnVisibility(byte[])} for the definition of an 
expression.
@@ -79,6 +81,8 @@ import com.google.common.base.Suppliers;
  * &quot;A#C&quot; &amp; B
  * </pre>
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class ColumnVisibility {
 
   // This functionality is deprecated so its setup as a supplier so it is only 
computed if the
diff --git 
a/core/src/main/java/org/apache/accumulo/core/spi/balancer/HostRegexTableLoadBalancer.java
 
b/core/src/main/java/org/apache/accumulo/core/spi/balancer/HostRegexTableLoadBalancer.java
index 3afd93886f..e391817452 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/spi/balancer/HostRegexTableLoadBalancer.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/spi/balancer/HostRegexTableLoadBalancer.java
@@ -148,7 +148,7 @@ public class HostRegexTableLoadBalancer extends 
TableLoadBalancer {
   /**
    * Host Regex Table Load Balance Config
    */
-  static class HrtlbConf {
+  static final class HrtlbConf {
 
     protected long oobCheckMillis =
         ConfigurationTypeHelper.getTimeInMillis(HOST_BALANCER_OOB_DEFAULT);
diff --git 
a/core/src/main/java/org/apache/accumulo/core/spi/crypto/AESCryptoService.java 
b/core/src/main/java/org/apache/accumulo/core/spi/crypto/AESCryptoService.java
index 14bc5fc38b..afbee828ac 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/spi/crypto/AESCryptoService.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/spi/crypto/AESCryptoService.java
@@ -343,7 +343,7 @@ public class AESCryptoService implements CryptoService {
       return new AESGCMFileDecrypter(fek);
     }
 
-    public class AESGCMFileEncrypter implements FileEncrypter {
+    private final class AESGCMFileEncrypter implements FileEncrypter {
 
       private final byte[] firstInitVector;
       private final Key fek;
@@ -492,7 +492,7 @@ public class AESCryptoService implements CryptoService {
     }
 
     @SuppressFBWarnings(value = "CIPHER_INTEGRITY", justification = "CBC is 
provided for WALs")
-    public class AESCBCFileEncrypter implements FileEncrypter {
+    public final class AESCBCFileEncrypter implements FileEncrypter {
       private final Cipher cipher;
       private final Key fek;
       private final byte[] initVector = new byte[IV_LENGTH_IN_BYTES];
diff --git 
a/core/src/main/java/org/apache/accumulo/core/spi/fs/SpaceAwareVolumeChooser.java
 
b/core/src/main/java/org/apache/accumulo/core/spi/fs/SpaceAwareVolumeChooser.java
index d1d96e8f73..0fc6c6f8de 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/spi/fs/SpaceAwareVolumeChooser.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/spi/fs/SpaceAwareVolumeChooser.java
@@ -85,7 +85,7 @@ public class SpaceAwareVolumeChooser extends 
PreferredVolumeChooser {
     return choiceCache;
   }
 
-  private class WeightedRandomCollection {
+  private final class WeightedRandomCollection {
     private final NavigableMap<Double,String> map = new TreeMap<>();
     private double total = 0;
 
diff --git a/core/src/main/java/org/apache/accumulo/core/util/ColumnFQ.java 
b/core/src/main/java/org/apache/accumulo/core/util/ColumnFQ.java
index 3636fd8981..6a938f4570 100644
--- a/core/src/main/java/org/apache/accumulo/core/util/ColumnFQ.java
+++ b/core/src/main/java/org/apache/accumulo/core/util/ColumnFQ.java
@@ -25,6 +25,10 @@ import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.data.Value;
 import org.apache.hadoop.io.Text;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class ColumnFQ implements Comparable<ColumnFQ> {
   private Text colf;
   private Text colq;
diff --git 
a/core/src/main/java/org/apache/accumulo/core/util/ThriftMessageUtil.java 
b/core/src/main/java/org/apache/accumulo/core/util/ThriftMessageUtil.java
index bd624a63e8..8dd55ce4e2 100644
--- a/core/src/main/java/org/apache/accumulo/core/util/ThriftMessageUtil.java
+++ b/core/src/main/java/org/apache/accumulo/core/util/ThriftMessageUtil.java
@@ -35,7 +35,7 @@ import org.apache.thrift.transport.TTransportException;
  * Serializes and deserializes Thrift messages to and from byte arrays. This 
class is not
  * thread-safe, external synchronization is necessary if it is used 
concurrently.
  */
-public class ThriftMessageUtil {
+public final class ThriftMessageUtil {
 
   private final int initialCapacity;
 
diff --git 
a/core/src/main/java/org/apache/accumulo/core/util/compaction/CompactionServicesConfig.java
 
b/core/src/main/java/org/apache/accumulo/core/util/compaction/CompactionServicesConfig.java
index d4c89c132e..f0263b9c62 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/util/compaction/CompactionServicesConfig.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/util/compaction/CompactionServicesConfig.java
@@ -28,10 +28,14 @@ import org.apache.accumulo.core.conf.Property;
 
 import com.google.common.collect.Sets;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This class serves to configure compaction services from an {@link 
AccumuloConfiguration} object.
  * Specifically, compaction service properties (those prefixed by 
"compaction.service") are used.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class CompactionServicesConfig {
 
   private final Map<String,String> planners = new HashMap<>();
diff --git a/core/src/main/java/org/apache/accumulo/core/volume/VolumeImpl.java 
b/core/src/main/java/org/apache/accumulo/core/volume/VolumeImpl.java
index 70fc1cebd2..ba19e95139 100644
--- a/core/src/main/java/org/apache/accumulo/core/volume/VolumeImpl.java
+++ b/core/src/main/java/org/apache/accumulo/core/volume/VolumeImpl.java
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
  * Basic Volume implementation that contains a FileSystem and a base path that 
should be used within
  * that filesystem.
  */
-public class VolumeImpl implements Volume {
+public final class VolumeImpl implements Volume {
 
   private static final Logger log = LoggerFactory.getLogger(VolumeImpl.class);
 
diff --git a/core/src/main/java/org/apache/accumulo/core/zookeeper/ZcNode.java 
b/core/src/main/java/org/apache/accumulo/core/zookeeper/ZcNode.java
index c555ccf99b..539608a346 100644
--- a/core/src/main/java/org/apache/accumulo/core/zookeeper/ZcNode.java
+++ b/core/src/main/java/org/apache/accumulo/core/zookeeper/ZcNode.java
@@ -29,7 +29,7 @@ import com.google.common.base.Preconditions;
  * data can be obtained first and then children added later or visa veras.
  *
  */
-class ZcNode {
+final class ZcNode {
 
   /**
    * This enum represents what ZooCache has discovered about a given node in 
zookeeper so far.
diff --git 
a/core/src/main/java/org/apache/accumulo/core/zookeeper/ZooCache.java 
b/core/src/main/java/org/apache/accumulo/core/zookeeper/ZooCache.java
index afb0b2cf90..bc7e12c854 100644
--- a/core/src/main/java/org/apache/accumulo/core/zookeeper/ZooCache.java
+++ b/core/src/main/java/org/apache/accumulo/core/zookeeper/ZooCache.java
@@ -52,9 +52,13 @@ import com.github.benmanes.caffeine.cache.Ticker;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * A cache for values stored in ZooKeeper. Values are kept up to date as they 
change.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class ZooCache {
 
   public interface ZooCacheWatcher extends Consumer<WatchedEvent> {}
diff --git a/core/src/test/java/org/apache/accumulo/core/data/OldMutation.java 
b/core/src/test/java/org/apache/accumulo/core/data/OldMutation.java
index facb349514..862051a3e3 100644
--- a/core/src/test/java/org/apache/accumulo/core/data/OldMutation.java
+++ b/core/src/test/java/org/apache/accumulo/core/data/OldMutation.java
@@ -33,9 +33,13 @@ import org.apache.accumulo.core.util.TextUtil;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.Writable;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Will read/write old mutations.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW",
+    justification = "Constructor validation is required for proper 
initialization")
 public class OldMutation implements Writable {
 
   static final int VALUE_SIZE_COPY_CUTOFF = 1 << 15;
diff --git 
a/core/src/test/java/org/apache/accumulo/core/file/rfile/RollingStatsTest.java 
b/core/src/test/java/org/apache/accumulo/core/file/rfile/RollingStatsTest.java
index 6f91e56016..62e2417a5e 100644
--- 
a/core/src/test/java/org/apache/accumulo/core/file/rfile/RollingStatsTest.java
+++ 
b/core/src/test/java/org/apache/accumulo/core/file/rfile/RollingStatsTest.java
@@ -59,7 +59,7 @@ public class RollingStatsTest {
     assertTrue(rs.getStandardDeviation() >= 0);
   }
 
-  private static class StatTester {
+  private static final class StatTester {
 
     private DescriptiveStatistics ds;
     private RollingStats rs;
diff --git a/hadoop-mapreduce/pom.xml b/hadoop-mapreduce/pom.xml
index 90e8dccdc5..51898ea748 100644
--- a/hadoop-mapreduce/pom.xml
+++ b/hadoop-mapreduce/pom.xml
@@ -29,6 +29,9 @@
   <artifactId>accumulo-hadoop-mapreduce</artifactId>
   <name>Apache Accumulo Hadoop MapReduce</name>
   <description>Apache Accumulo MapReduce bindings.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.google.guava</groupId>
diff --git a/iterator-test-harness/pom.xml b/iterator-test-harness/pom.xml
index a2a9515d59..0265dfeb8c 100644
--- a/iterator-test-harness/pom.xml
+++ b/iterator-test-harness/pom.xml
@@ -29,6 +29,9 @@
   <artifactId>accumulo-iterator-test-harness</artifactId>
   <name>Apache Accumulo Iterator Test Harness</name>
   <description>A library for testing Apache Accumulo Iterators.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.google.guava</groupId>
diff --git a/minicluster/pom.xml b/minicluster/pom.xml
index 109796cc9b..d244a93123 100644
--- a/minicluster/pom.xml
+++ b/minicluster/pom.xml
@@ -29,6 +29,9 @@
   <artifactId>accumulo-minicluster</artifactId>
   <name>Apache Accumulo MiniCluster</name>
   <description>A library for launching and running a standalone instance of 
Apache Accumulo for testing.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.beust</groupId>
diff --git a/pom.xml b/pom.xml
index 0f877f7d60..8e96ed45b2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -747,7 +747,6 @@ under the License.
             <includeTests>true</includeTests>
             <maxHeap>1024</maxHeap>
             <maxRank>16</maxRank>
-            
<omitVisitors>ConstructorThrow,SharedVariableAtomicityDetector</omitVisitors>
             
<jvmArgs>-Dcom.overstock.findbugs.ignore=com.google.common.util.concurrent.RateLimiter,com.google.common.hash.Hasher,com.google.common.hash.HashCode,com.google.common.hash.HashFunction,com.google.common.hash.Hashing,com.google.common.cache.Cache,com.google.common.io.CountingOutputStream,com.google.common.io.ByteStreams,com.google.common.cache.LoadingCache,com.google.common.base.Stopwatch,com.google.common.cache.RemovalNotification,com.google.common.util.concurrent.Uninterrupt
 [...]
             <plugins combine.children="append">
               <plugin>
diff --git a/server/base/pom.xml b/server/base/pom.xml
index e308e44a3b..9b3d391e07 100644
--- a/server/base/pom.xml
+++ b/server/base/pom.xml
@@ -30,6 +30,9 @@
   <artifactId>accumulo-server-base</artifactId>
   <name>Apache Accumulo Server Base</name>
   <description>A common base library for Apache Accumulo servers.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.beust</groupId>
diff --git a/server/compactor/pom.xml b/server/compactor/pom.xml
index 7779271cef..dea08a053e 100644
--- a/server/compactor/pom.xml
+++ b/server/compactor/pom.xml
@@ -29,6 +29,9 @@
   </parent>
   <artifactId>accumulo-compactor</artifactId>
   <name>Apache Accumulo Compactor</name>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.google.auto.service</groupId>
diff --git a/server/gc/pom.xml b/server/gc/pom.xml
index 9cff9668c9..d8eeae5e58 100644
--- a/server/gc/pom.xml
+++ b/server/gc/pom.xml
@@ -30,6 +30,9 @@
   <artifactId>accumulo-gc</artifactId>
   <name>Apache Accumulo GC Server</name>
   <description>The garbage collecting server for Apache Accumulo to clean up 
unused files.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.google.auto.service</groupId>
diff --git a/server/manager/pom.xml b/server/manager/pom.xml
index 0c7e154321..ff4ae267ba 100644
--- a/server/manager/pom.xml
+++ b/server/manager/pom.xml
@@ -30,6 +30,9 @@
   <artifactId>accumulo-manager</artifactId>
   <name>Apache Accumulo Manager Server</name>
   <description>The manager server for Apache Accumulo for load balancing and 
other system-wide operations.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.github.ben-manes.caffeine</groupId>
diff --git a/server/monitor/pom.xml b/server/monitor/pom.xml
index 1f6e23b7a7..72a2c764cf 100644
--- a/server/monitor/pom.xml
+++ b/server/monitor/pom.xml
@@ -30,6 +30,9 @@
   <artifactId>accumulo-monitor</artifactId>
   <name>Apache Accumulo Monitor Server</name>
   <description>A web server for monitoring Apache Accumulo.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
diff --git a/server/native/pom.xml b/server/native/pom.xml
index 2e2a7304e8..3674c3a223 100644
--- a/server/native/pom.xml
+++ b/server/native/pom.xml
@@ -33,6 +33,7 @@
   <description>C++ native libraries for improved performance in Apache 
Accumulo.</description>
   <properties>
     <CXX>g++</CXX>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
   </properties>
   <dependencies>
     <dependency>
diff --git a/server/tserver/pom.xml b/server/tserver/pom.xml
index ec347bad46..8a847e4df5 100644
--- a/server/tserver/pom.xml
+++ b/server/tserver/pom.xml
@@ -30,6 +30,9 @@
   <artifactId>accumulo-tserver</artifactId>
   <name>Apache Accumulo Tablet Server</name>
   <description>The tablet server for Apache Accumulo to host tablets of data 
tables.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.beust</groupId>
diff --git 
a/server/tserver/src/test/java/org/apache/accumulo/tserver/ScanServerTest.java 
b/server/tserver/src/test/java/org/apache/accumulo/tserver/ScanServerTest.java
index f50e6da3d6..7c39cf8b66 100644
--- 
a/server/tserver/src/test/java/org/apache/accumulo/tserver/ScanServerTest.java
+++ 
b/server/tserver/src/test/java/org/apache/accumulo/tserver/ScanServerTest.java
@@ -36,6 +36,7 @@ import java.util.Set;
 import org.apache.accumulo.core.cli.ConfigOpts;
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.clientImpl.thrift.TInfo;
+import org.apache.accumulo.core.data.TableId;
 import org.apache.accumulo.core.dataImpl.KeyExtent;
 import org.apache.accumulo.core.dataImpl.thrift.InitialMultiScan;
 import org.apache.accumulo.core.dataImpl.thrift.InitialScan;
@@ -45,6 +46,7 @@ import org.apache.accumulo.core.dataImpl.thrift.ScanResult;
 import org.apache.accumulo.core.dataImpl.thrift.TColumn;
 import org.apache.accumulo.core.dataImpl.thrift.TKeyExtent;
 import org.apache.accumulo.core.dataImpl.thrift.TRange;
+import org.apache.accumulo.core.metadata.SystemTables;
 import org.apache.accumulo.core.securityImpl.thrift.TCredentials;
 import org.apache.accumulo.core.tabletscan.thrift.TSamplerConfiguration;
 import org.apache.accumulo.core.tabletserver.thrift.NoSuchScanIDException;
@@ -54,6 +56,7 @@ import 
org.apache.accumulo.tserver.session.ScanSession.TabletResolver;
 import org.apache.accumulo.tserver.tablet.SnapshotTablet;
 import org.apache.accumulo.tserver.tablet.Tablet;
 import org.apache.accumulo.tserver.tablet.TabletBase;
+import org.apache.hadoop.io.Text;
 import org.apache.thrift.TException;
 import org.junit.jupiter.api.Test;
 
@@ -126,13 +129,17 @@ public class ScanServerTest {
 
   private ThriftScanClientHandler handler;
 
+  private static KeyExtent newExtent(TableId tableId) {
+    return new KeyExtent(tableId, new Text("m"), new Text("a"));
+  }
+
   @Test
   public void testScan() throws Exception {
     handler = createMock(ThriftScanClientHandler.class);
 
     TInfo tinfo = createMock(TInfo.class);
     TCredentials tcreds = createMock(TCredentials.class);
-    KeyExtent sextent = createMock(KeyExtent.class);
+    KeyExtent sextent = newExtent(TableId.of("1"));
     ScanReservation reservation = createMock(ScanReservation.class);
     SnapshotTablet tablet = createMock(SnapshotTablet.class);
     TRange trange = createMock(TRange.class);
@@ -179,8 +186,8 @@ public class ScanServerTest {
 
     TInfo tinfo = createMock(TInfo.class);
     TCredentials tcreds = createMock(TCredentials.class);
-    KeyExtent extent = createMock(KeyExtent.class);
-    TKeyExtent textent = createMock(TKeyExtent.class);
+    KeyExtent extent = newExtent(TableId.of("1"));
+    TKeyExtent textent = extent.toThrift();
     TRange trange = createMock(TRange.class);
     List<TRange> ranges = new ArrayList<>();
     List<TColumn> tcols = new ArrayList<>();
@@ -192,12 +199,10 @@ public class ScanServerTest {
     Map<String,String> execHints = new HashMap<>();
     ScanReservation reservation = createMock(ScanReservation.class);
 
-    expect(extent.isSystemTable()).andReturn(false).anyTimes();
-    expect(extent.toThrift()).andReturn(textent).anyTimes();
     expect(reservation.getFailures()).andReturn(Map.of(textent, ranges));
     reservation.close();
 
-    replay(extent, reservation);
+    replay(reservation);
 
     TestScanServer ss = partialMockBuilder(TestScanServer.class).createMock();
     ss.extent = extent;
@@ -210,7 +215,7 @@ public class ScanServerTest {
           tsc, 30L, classLoaderContext, execHints, 0L);
     });
 
-    verify(extent, reservation);
+    verify(reservation);
   }
 
   @Test
@@ -220,7 +225,7 @@ public class ScanServerTest {
     TInfo tinfo = createMock(TInfo.class);
     TCredentials tcreds = createMock(TCredentials.class);
     List<TRange> ranges = new ArrayList<>();
-    KeyExtent extent = createMock(KeyExtent.class);
+    KeyExtent extent = newExtent(TableId.of("1"));
     ScanReservation reservation = createMock(ScanReservation.class);
     SnapshotTablet tablet = createMock(SnapshotTablet.class);
     Map<KeyExtent,List<TRange>> batch = new HashMap<>();
@@ -244,7 +249,6 @@ public class ScanServerTest {
     };
 
     TestScanServer ss = partialMockBuilder(TestScanServer.class).createMock();
-    expect(extent.isSystemTable()).andReturn(false).anyTimes();
     expect(reservation.newTablet(ss, extent)).andReturn(tablet);
     expect(reservation.getTabletMetadataExtents()).andReturn(Set.of(extent));
     expect(reservation.getFailures()).andReturn(Map.of());
@@ -255,7 +259,7 @@ public class ScanServerTest {
     expect(handler.continueMultiScan(tinfo, 15, 0L)).andReturn(new 
MultiScanResult());
     handler.closeMultiScan(tinfo, 15);
 
-    replay(extent, reservation, handler);
+    replay(reservation, handler);
 
     ss.delegate = handler;
     ss.extent = extent;
@@ -271,7 +275,7 @@ public class ScanServerTest {
     ss.continueMultiScan(tinfo, is.getScanID(), 0L);
     assertEquals(15, is.getScanID());
     ss.closeMultiScan(tinfo, is.getScanID());
-    verify(extent, reservation, handler);
+    verify(reservation, handler);
   }
 
   @Test
@@ -281,8 +285,8 @@ public class ScanServerTest {
     TInfo tinfo = createMock(TInfo.class);
     TCredentials tcreds = createMock(TCredentials.class);
     List<TRange> ranges = new ArrayList<>();
-    KeyExtent extent = createMock(KeyExtent.class);
-    TKeyExtent textent = createMock(TKeyExtent.class);
+    KeyExtent extent = newExtent(TableId.of("1"));
+    TKeyExtent textent = extent.toThrift();
     ScanReservation reservation = createMock(ScanReservation.class);
     SnapshotTablet tablet = createMock(SnapshotTablet.class);
     Map<KeyExtent,List<TRange>> batch = new HashMap<>();
@@ -306,7 +310,6 @@ public class ScanServerTest {
     };
 
     TestScanServer ss = partialMockBuilder(TestScanServer.class).createMock();
-    expect(extent.isSystemTable()).andReturn(false).anyTimes();
     expect(reservation.newTablet(ss, extent)).andReturn(tablet).anyTimes();
     expect(reservation.getTabletMetadataExtents()).andReturn(Set.of());
     expect(reservation.getFailures()).andReturn(Map.of(textent, 
ranges)).anyTimes();
@@ -316,7 +319,7 @@ public class ScanServerTest {
     expect(handler.startMultiScan(tinfo, tcreds, tcols, titer, batch, ssio, 
auths, false, tsc, 30L,
         classLoaderContext, execHints, resolver, 0L)).andReturn(ims);
 
-    replay(extent, reservation, handler);
+    replay(reservation, handler);
 
     ss.delegate = handler;
     ss.extent = extent;
@@ -331,7 +334,7 @@ public class ScanServerTest {
     assertEquals(15, is.getScanID());
     assertEquals(0, is.getResult().getFailuresSize());
 
-    verify(extent, reservation, handler);
+    verify(reservation, handler);
 
   }
 
@@ -380,7 +383,7 @@ public class ScanServerTest {
 
     TInfo tinfo = createMock(TInfo.class);
     TCredentials tcreds = createMock(TCredentials.class);
-    KeyExtent sextent = createMock(KeyExtent.class);
+    KeyExtent sextent = newExtent(SystemTables.METADATA.tableId());
     ScanReservation reservation = createMock(ScanReservation.class);
     SnapshotTablet tablet = createMock(SnapshotTablet.class);
     TRange trange = createMock(TRange.class);
@@ -394,7 +397,6 @@ public class ScanServerTest {
     TabletResolver resolver = createMock(TabletResolver.class);
 
     TestScanServer ss = partialMockBuilder(TestScanServer.class).createMock();
-    expect(sextent.isSystemTable()).andReturn(true).anyTimes();
     expect(reservation.newTablet(ss, sextent)).andReturn(tablet);
     expect(reservation.getFailures()).andReturn(Map.of()).anyTimes();
     reservation.close();
@@ -405,7 +407,7 @@ public class ScanServerTest {
     expect(handler.continueScan(tinfo, 15, 0L)).andReturn(new ScanResult());
     handler.closeScan(tinfo, 15);
 
-    replay(sextent, reservation, handler);
+    replay(reservation, handler);
 
     ss.delegate = handler;
     ss.extent = sextent;
@@ -419,7 +421,7 @@ public class ScanServerTest {
     assertEquals(15, is.getScanID());
     ss.continueScan(tinfo, is.getScanID(), 0L);
     ss.closeScan(tinfo, is.getScanID());
-    verify(sextent, reservation, handler);
+    verify(reservation, handler);
 
   }
 
@@ -429,7 +431,7 @@ public class ScanServerTest {
 
     TInfo tinfo = createMock(TInfo.class);
     TCredentials tcreds = createMock(TCredentials.class);
-    KeyExtent sextent = createMock(KeyExtent.class);
+    KeyExtent sextent = newExtent(SystemTables.METADATA.tableId());
     ScanReservation reservation = createMock(ScanReservation.class);
     TRange trange = createMock(TRange.class);
     List<TColumn> tcols = new ArrayList<>();
@@ -442,10 +444,9 @@ public class ScanServerTest {
     TabletResolver resolver = createMock(TabletResolver.class);
 
     TestScanServer ss = partialMockBuilder(TestScanServer.class).createMock();
-    expect(sextent.isSystemTable()).andReturn(true).anyTimes();
     expect(reservation.getFailures()).andReturn(Map.of()).anyTimes();
 
-    replay(sextent, reservation, handler);
+    replay(reservation, handler);
 
     ss.delegate = handler;
     ss.extent = sextent;
@@ -458,7 +459,7 @@ public class ScanServerTest {
       ss.startScan(tinfo, tcreds, textent, trange, tcols, 10, titer, ssio, 
auths, false, false, 10,
           tsc, 30L, classLoaderContext, execHints, 0L);
     });
-    verify(sextent, reservation, handler);
+    verify(reservation, handler);
 
   }
 
diff --git 
a/server/tserver/src/test/java/org/apache/accumulo/tserver/TabletResourceManagerTest.java
 
b/server/tserver/src/test/java/org/apache/accumulo/tserver/TabletResourceManagerTest.java
index a9f3633a82..84ca071e49 100644
--- 
a/server/tserver/src/test/java/org/apache/accumulo/tserver/TabletResourceManagerTest.java
+++ 
b/server/tserver/src/test/java/org/apache/accumulo/tserver/TabletResourceManagerTest.java
@@ -21,9 +21,11 @@ package org.apache.accumulo.tserver;
 import static org.easymock.EasyMock.createMock;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import org.apache.accumulo.core.data.TableId;
 import org.apache.accumulo.core.dataImpl.KeyExtent;
 import org.apache.accumulo.server.conf.TableConfiguration;
 import 
org.apache.accumulo.tserver.TabletServerResourceManager.TabletResourceManager;
+import org.apache.hadoop.io.Text;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -36,7 +38,7 @@ public class TabletResourceManagerTest {
   @BeforeEach
   public void setUp() {
     tsrm = createMock(TabletServerResourceManager.class);
-    extent = createMock(KeyExtent.class);
+    extent = new KeyExtent(TableId.of("1"), new Text("m"), new Text("a"));
     conf = createMock(TableConfiguration.class);
     trm = tsrm.new TabletResourceManager(extent, conf);
   }
diff --git a/shell/pom.xml b/shell/pom.xml
index d49ec12ea7..656d9bfb39 100644
--- a/shell/pom.xml
+++ b/shell/pom.xml
@@ -29,6 +29,9 @@
   <artifactId>accumulo-shell</artifactId>
   <name>Apache Accumulo Shell</name>
   <description>An interactive shell for accessing Apache Accumulo via a 
command line interface.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>com.beust</groupId>
diff --git a/start/pom.xml b/start/pom.xml
index 4a23df4c6c..0766d612a9 100644
--- a/start/pom.xml
+++ b/start/pom.xml
@@ -29,6 +29,9 @@
   <artifactId>accumulo-start</artifactId>
   <name>Apache Accumulo Start</name>
   <description>A library for launching Apache Accumulo services.</description>
+  <properties>
+    
<spotbugs.omitVisitors>SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>org.slf4j</groupId>
diff --git a/test/pom.xml b/test/pom.xml
index eef43c05b6..f986690c22 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -30,6 +30,7 @@
   <name>Apache Accumulo Testing</name>
   <description>Tests for Apache Accumulo.</description>
   <properties>
+    
<spotbugs.omitVisitors>FindDeadLocalStores,SharedVariableAtomicityDetector,ConstructorThrow</spotbugs.omitVisitors>
     <timeout.factor>1</timeout.factor>
   </properties>
   <dependencies>

Reply via email to