diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieException.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieException.java index 2f86052f00d..2b85961cf4b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieException.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieException.java @@ -167,6 +167,10 @@ public static class BookieUnauthorizedAccessException extends BookieException { public BookieUnauthorizedAccessException() { super(Code.UnauthorizedAccessException); } + + public BookieUnauthorizedAccessException(String reason) { + super(Code.UnauthorizedAccessException, reason); + } } /** diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java index 2c1eb3a7d42..1054c172450 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java @@ -27,7 +27,6 @@ import java.io.IOException; import java.lang.Thread.UncaughtExceptionHandler; import java.net.UnknownHostException; -import java.security.AccessControlException; import java.util.Arrays; import java.util.concurrent.TimeUnit; import org.apache.bookkeeper.bookie.Bookie; @@ -201,7 +200,7 @@ public synchronized void shutdown() { /** * Ensure the current user can start-up the process if it's restricted. */ - private void validateUser(ServerConfiguration conf) throws AccessControlException { + private void validateUser(ServerConfiguration conf) throws BookieException { if (conf.containsKey(PERMITTED_STARTUP_USERS)) { String currentUser = System.getProperty("user.name"); String[] propertyValue = conf.getPermittedStartupUsers(); @@ -215,7 +214,7 @@ private void validateUser(ServerConfiguration conf) throws AccessControlExceptio + " Current user: " + currentUser + " permittedStartupUsers: " + Arrays.toString(propertyValue); LOG.error(errorMsg); - throw new AccessControlException(errorMsg); + throw new BookieException.BookieUnauthorizedAccessException(errorMsg); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/verifier/BookkeeperVerifier.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/verifier/BookkeeperVerifier.java index 63c24578d98..5715bbf4043 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/verifier/BookkeeperVerifier.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/verifier/BookkeeperVerifier.java @@ -18,7 +18,7 @@ package org.apache.bookkeeper.verifier; import static com.google.common.base.Preconditions.checkState; - +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -32,7 +32,6 @@ import java.util.TreeSet; import java.util.function.BiConsumer; import java.util.function.Consumer; - import org.apache.bookkeeper.client.BKException; /** @@ -180,6 +179,7 @@ private long getNextLedgerID() { /** * State required to regenerate an entry. */ + @SuppressFBWarnings("DMI_RANDOM_USED_ONLY_ONCE") class EntryInfo { private final long entryID; private final long seed; diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieInitializationTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieInitializationTest.java index d919bc8d8b6..a3f20a85e25 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieInitializationTest.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieInitializationTest.java @@ -55,7 +55,6 @@ import java.net.InetAddress; import java.net.URL; import java.net.URLConnection; -import java.security.AccessControlException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -579,7 +578,7 @@ conf, new TestBookieImpl(conf), new MockUncleanShutdownDetection()); fail("Bookkeeper should not have started since current user isn't in permittedStartupUsers"); - } catch (AccessControlException buae) { + } catch (BookieException.BookieUnauthorizedAccessException buae) { sawException = true; } finally { if (bs1 != null && bs1.isRunning()) { @@ -615,7 +614,7 @@ conf, new TestBookieImpl(conf), NullStatsLogger.INSTANCE, UnpooledByteBufAllocator.DEFAULT, new MockUncleanShutdownDetection()); bs1.start(); - } catch (AccessControlException buae) { + } catch (BookieException.BookieUnauthorizedAccessException buae) { fail("Bookkeeper should have started since current user is in permittedStartupUsers"); } finally { if (bs1 != null && bs1.isRunning()) { @@ -632,7 +631,7 @@ conf, new TestBookieImpl(conf), NullStatsLogger.INSTANCE, UnpooledByteBufAllocator.DEFAULT, new MockUncleanShutdownDetection()); bs1.start(); - } catch (AccessControlException buae) { + } catch (BookieException.BookieUnauthorizedAccessException buae) { fail("Bookkeeper should have started since current user is in permittedStartupUsers"); } finally { if (bs1 != null && bs1.isRunning()) { @@ -664,7 +663,7 @@ conf, new TestBookieImpl(conf), NullStatsLogger.INSTANCE, UnpooledByteBufAllocator.DEFAULT, new MockUncleanShutdownDetection()); bs1.start(); - } catch (AccessControlException buae) { + } catch (BookieException.BookieUnauthorizedAccessException buae) { fail("Bookkeeper should have started since permittedStartupUser is not specified"); } finally { if (bs1 != null && bs1.isRunning()) { diff --git a/bookkeeper-stats/build.gradle b/bookkeeper-stats/build.gradle index 98784c9718b..dcdd59a76a1 100644 --- a/bookkeeper-stats/build.gradle +++ b/bookkeeper-stats/build.gradle @@ -23,6 +23,7 @@ plugins { dependencies { implementation depLibs.commonsConfiguration implementation depLibs.slf4j + compileOnly depLibs.spotbugsAnnotations } jar { diff --git a/bookkeeper-stats/pom.xml b/bookkeeper-stats/pom.xml index 76a6cf21ceb..d5718f1c88e 100644 --- a/bookkeeper-stats/pom.xml +++ b/bookkeeper-stats/pom.xml @@ -26,6 +26,9 @@ bookkeeper-stats-api Apache BookKeeper :: Stats API http://maven.apache.org + + 4.6.0 + @@ -55,5 +58,11 @@ + + com.github.spotbugs + spotbugs-annotations + ${spotbugs-annotations.version} + provided + diff --git a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/CachingStatsLogger.java b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/CachingStatsLogger.java index d86e19a176f..15725eb1574 100644 --- a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/CachingStatsLogger.java +++ b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/CachingStatsLogger.java @@ -16,6 +16,8 @@ */ package org.apache.bookkeeper.stats; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -29,6 +31,7 @@ public class CachingStatsLogger implements StatsLogger { protected final ConcurrentMap opStatsLoggers; protected final ConcurrentMap scopeStatsLoggers; + @SuppressFBWarnings("EI_EXPOSE_REP2") public CachingStatsLogger(StatsLogger statsLogger) { this.underlying = statsLogger; this.counters = new ConcurrentHashMap(); diff --git a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsLogger.java b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsLogger.java index 3e10b20c204..f527df0b2ad 100644 --- a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsLogger.java +++ b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsLogger.java @@ -16,6 +16,8 @@ */ package org.apache.bookkeeper.stats; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import java.util.concurrent.TimeUnit; /** @@ -24,6 +26,7 @@ *

Metrics are not recorded, making this receiver useful in unit tests and as defaults in * situations where metrics are not strictly required. */ +@SuppressFBWarnings("EI_EXPOSE_REP2") public class NullStatsLogger implements StatsLogger { public static final NullStatsLogger INSTANCE = new NullStatsLogger(); diff --git a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsProvider.java b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsProvider.java index 21703f725f2..e9c40ca1f06 100644 --- a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsProvider.java +++ b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/NullStatsProvider.java @@ -16,11 +16,13 @@ */ package org.apache.bookkeeper.stats; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.configuration.Configuration; /** * A no-op stats provider implementation. */ +@SuppressFBWarnings("EI_EXPOSE_REP2") public class NullStatsProvider implements StatsProvider { final StatsLogger nullStatsLogger = new NullStatsLogger(); diff --git a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/Stats.java b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/Stats.java index a3799b08e5f..3f9b98d43e9 100644 --- a/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/Stats.java +++ b/bookkeeper-stats/src/main/java/org/apache/bookkeeper/stats/Stats.java @@ -20,6 +20,7 @@ */ package org.apache.bookkeeper.stats; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import org.apache.commons.configuration.Configuration; @@ -63,6 +64,7 @@ public static void loadStatsProvider(String className) { } } + @SuppressFBWarnings("EI_EXPOSE_REP2") public static StatsProvider get() { return prov; } diff --git a/build.gradle b/build.gradle index e30c984281e..9ef807ad978 100644 --- a/build.gradle +++ b/build.gradle @@ -143,7 +143,6 @@ allprojects { } spotbugs { - toolVersion = '3.1.8' excludeFilter = file("$rootDir/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml") reportLevel = 'high' spotbugsTest.enabled = false diff --git a/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml b/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml index da6867c132d..09daf196569 100644 --- a/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml +++ b/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml @@ -16,6 +16,16 @@ limitations under the License. //--> + + + + + + + + + + diff --git a/buildtools/src/main/resources/distributedlog/findbugsExclude.xml b/buildtools/src/main/resources/distributedlog/findbugsExclude.xml index f85686fcb75..c4ba2cd1273 100644 --- a/buildtools/src/main/resources/distributedlog/findbugsExclude.xml +++ b/buildtools/src/main/resources/distributedlog/findbugsExclude.xml @@ -16,6 +16,16 @@ limitations under the License. //--> + + + + + + + + + + diff --git a/gradle.properties b/gradle.properties index 58ef9bbd17f..c230c3fcc95 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,10 +21,10 @@ protobufPluginVersion=0.8.18 apcheRatPluginVersion=0.7.0 -shadowPluginVersion=6.1.0 +shadowPluginVersion=7.1.2 licenseGradlePluginVersion=0.15.0 checkStyleVersion=6.19 -spotbugsPlugin=4.7.0 +spotbugsPlugin=5.0.5 testLogger=3.1.0 testRetry=1.0.0 owaspPlugin=6.5.3 diff --git a/microbenchmarks/build.gradle b/microbenchmarks/build.gradle index a58eea03b75..6acc6ef0700 100644 --- a/microbenchmarks/build.gradle +++ b/microbenchmarks/build.gradle @@ -34,6 +34,7 @@ dependencies { compileOnly depLibs.jmhCore compileOnly depLibs.guava compileOnly depLibs.slf4j + compileOnly depLibs.spotbugsAnnotations annotationProcessor depLibs.jmhGeneratorAnnprocess } diff --git a/microbenchmarks/src/main/java/org/apache/bookkeeper/stats/codahale/TimerBenchmark.java b/microbenchmarks/src/main/java/org/apache/bookkeeper/stats/codahale/TimerBenchmark.java index 886cd6937f4..c6d568fbdc3 100644 --- a/microbenchmarks/src/main/java/org/apache/bookkeeper/stats/codahale/TimerBenchmark.java +++ b/microbenchmarks/src/main/java/org/apache/bookkeeper/stats/codahale/TimerBenchmark.java @@ -16,9 +16,9 @@ */ package org.apache.bookkeeper.stats.codahale; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; - import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; import org.openjdk.jmh.annotations.Benchmark; @@ -71,6 +71,7 @@ public static class MyState { private int timeIdx = 0; @Setup(Level.Trial) + @SuppressFBWarnings("SSD_DO_NOT_USE_INSTANCE_LOCK_ON_SHARED_STATIC_DATA") public void doSetup() throws Exception { StatsLogger logger = null; switch (timerType) { diff --git a/pom.xml b/pom.xml index 3ea99a9bc3c..07df38bb971 100644 --- a/pom.xml +++ b/pom.xml @@ -171,7 +171,7 @@ 3.0.1 1.7.32 1.30 - 3.1.8 + 4.6.0 1.3.2 1.15.1 3.9.8 @@ -205,7 +205,7 @@ 1.4.1.Final 0.6.1 6.19 - 3.1.8 + 4.6.0.0 1 4.0.0 3.0.1 diff --git a/stream/distributedlog/core/build.gradle b/stream/distributedlog/core/build.gradle index 2af471ac7aa..f8812f9a0a1 100644 --- a/stream/distributedlog/core/build.gradle +++ b/stream/distributedlog/core/build.gradle @@ -36,6 +36,7 @@ dependencies { implementation depLibs.guava compileOnly depLibs.jsr305 compileOnly depLibs.lombok + compileOnly depLibs.spotbugsAnnotations implementation depLibs.nettyBuffer implementation depLibs.nettyTransportNativeEpoll implementation depLibs.slf4j diff --git a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/metadata/ZKLogStreamMetadataStore.java b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/metadata/ZKLogStreamMetadataStore.java index 17f8113b982..b1ed272c413 100644 --- a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/metadata/ZKLogStreamMetadataStore.java +++ b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/metadata/ZKLogStreamMetadataStore.java @@ -32,10 +32,10 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.IOException; import java.net.URI; import java.util.Collections; - import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -533,6 +533,7 @@ public void processResult(int rc, String path, Object ctx, List result }, null); } + @SuppressFBWarnings("DCN_NULLPOINTER_EXCEPTION") static LogMetadataForWriter processLogMetadatas(URI uri, String logName, String logIdentifier, diff --git a/stream/distributedlog/pom.xml b/stream/distributedlog/pom.xml index 25bcd66dd5c..8e86bb9cf16 100644 --- a/stream/distributedlog/pom.xml +++ b/stream/distributedlog/pom.xml @@ -37,6 +37,9 @@ core io + + 4.6.0 + @@ -87,5 +90,21 @@ + + + + com.github.spotbugs + spotbugs-annotations + ${spotbugs-annotations.version} + + + + + + com.github.spotbugs + spotbugs-annotations + provided + + diff --git a/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java b/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java index 05724feae7e..7c4137a6ffa 100644 --- a/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java +++ b/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java @@ -37,8 +37,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -101,49 +99,38 @@ private static MavenClassLoader createClassLoader(ConfigurableMavenResolverSyste private static MavenClassLoader createClassLoader(File[] jars) { final ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); - URLClassLoader cl = AccessController.doPrivileged( - new PrivilegedAction() { - @Override - public URLClassLoader run() { - /** - * Child-first URLClassLoader. - * This is needed because Gradle uses a different version of - * Netty and it is placed in the System Class loader. - */ - return new URLClassLoader(Arrays.stream(jars) - .map((f) -> { - try { - return f.toURI().toURL(); - } catch (Throwable t) { - throw new RuntimeException(t); - } - }) - .toArray(URL[]::new), - systemClassLoader) { - - @Override - protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - Class loadedClass = findLoadedClass(name); - if (loadedClass == null) { - try { - loadedClass = findClass(name); - } catch (ClassNotFoundException ignored) { - } - if (loadedClass == null) { - try { - loadedClass = systemClassLoader.loadClass(name); - } catch (ClassNotFoundException e) { - } - } - } - if (resolve && loadedClass != null) { - resolveClass(loadedClass); - } - return loadedClass; - } - }; + URLClassLoader cl = new URLClassLoader(Arrays.stream(jars) + .map((f) -> { + try { + return f.toURI().toURL(); + } catch (Throwable t) { + throw new RuntimeException(t); + } + }) + .toArray(URL[]::new), + systemClassLoader) { + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + Class loadedClass = findLoadedClass(name); + if (loadedClass == null) { + try { + loadedClass = findClass(name); + } catch (ClassNotFoundException ignored) { + } + if (loadedClass == null) { + try { + loadedClass = systemClassLoader.loadClass(name); + } catch (ClassNotFoundException e) { + } } - }); + } + if (resolve && loadedClass != null) { + resolveClass(loadedClass); + } + return loadedClass; + } + }; return new MavenClassLoader(cl); }