diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/build.gradle b/bookkeeper-stats-providers/codahale-metrics-provider/build.gradle
index b60c3c5ea49..2ac1dbbf17f 100644
--- a/bookkeeper-stats-providers/codahale-metrics-provider/build.gradle
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/build.gradle
@@ -41,6 +41,7 @@ dependencies {
annotationProcessor depLibs.lombok
testAnnotationProcessor depLibs.lombok
+ testImplementation depLibs.junit
}
jar {
diff --git a/build.gradle b/build.gradle
index 1b32c483294..5e45cc6900c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -28,6 +28,7 @@ plugins {
id "com.github.vlsi.stage-vote-release" version "1.73"
id 'checkstyle'
id 'org.nosphere.apache.rat'
+ id 'com.github.spotbugs'
}
subprojects {
@@ -68,6 +69,7 @@ allprojects {
apply plugin: 'signing'
apply plugin: 'org.nosphere.apache.rat'
apply plugin: "checkstyle"
+ apply plugin: 'com.github.spotbugs'
checkstyle {
toolVersion "${checkStyleVersion}"
configFile file("$rootDir/buildtools/src/main/resources/bookkeeper/checkstyle.xml")
@@ -79,6 +81,12 @@ allprojects {
source ='src/test/java'
}
}
+
+ spotbugs {
+ toolVersion = '3.1.8'
+ excludeFilter = file("$rootDir/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml")
+ reportLevel = 'high'
+ }
task testJar(type: Jar, dependsOn: testClasses) {
classifier = 'tests'
diff --git a/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml b/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml
index 83a39f46ca9..da6867c132d 100644
--- a/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml
+++ b/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml
@@ -157,4 +157,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gradle.properties b/gradle.properties
index 6caefd9b1be..f3e91a7e3f2 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -24,3 +24,4 @@ apcheRatPluginVersion=0.7.0
shadowPluginVersion=6.1.0
licenseGradlePluginVersion=0.15.0
checkStyleVersion=6.19
+spotbugsPlugin=4.7.0
diff --git a/settings.gradle b/settings.gradle
index fa452349798..f6abee52eda 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -22,6 +22,7 @@ pluginManagement {
id "org.nosphere.apache.rat" version "${apcheRatPluginVersion}"
id "com.github.johnrengelman.shadow" version "${shadowPluginVersion}"
id "com.github.hierynomus.license" version "${licenseGradlePluginVersion}"
+ id "com.github.spotbugs" version "${spotbugsPlugin}"
}
}
diff --git a/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/mvcc/MVCCStoreImpl.java b/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/mvcc/MVCCStoreImpl.java
index 5c9a83d0f5c..74d862861a9 100644
--- a/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/mvcc/MVCCStoreImpl.java
+++ b/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/mvcc/MVCCStoreImpl.java
@@ -965,7 +965,7 @@ synchronized RangeResult processRange(RangeOp rangeOp) {
// raw key
byte[] rawKey = (null != key) ? keyCoder.encode(key) : NULL_START_KEY;
-
+ byte[] rawEndKey = NULL_END_KEY;
if (null == endKey) {
// point lookup
MVCCRecord record = getKeyRecord(key, rawKey);
@@ -988,8 +988,9 @@ synchronized RangeResult processRange(RangeOp rangeOp) {
record.recycle();
}
}
+ } else {
+ rawEndKey = keyCoder.encode(endKey);
}
- byte[] rawEndKey = (null != endKey) ? keyCoder.encode(endKey) : NULL_END_KEY;
Pair realRange = getRealRange(rawKey, rawEndKey);
rawKey = realRange.getLeft();
rawEndKey = realRange.getRight();
diff --git a/stream/storage/impl/src/main/java/org/apache/bookkeeper/stream/storage/impl/metadata/stream/MetaRangeImpl.java b/stream/storage/impl/src/main/java/org/apache/bookkeeper/stream/storage/impl/metadata/stream/MetaRangeImpl.java
index af7f2d7699e..6792802ad64 100644
--- a/stream/storage/impl/src/main/java/org/apache/bookkeeper/stream/storage/impl/metadata/stream/MetaRangeImpl.java
+++ b/stream/storage/impl/src/main/java/org/apache/bookkeeper/stream/storage/impl/metadata/stream/MetaRangeImpl.java
@@ -384,7 +384,7 @@ private void loadMetadata(List> kvs) {
}
}
- private void loadStreamMetadata(long streamId, byte[] streamMetadataBytes) {
+ private synchronized void loadStreamMetadata(long streamId, byte[] streamMetadataBytes) {
this.streamId = streamId;
StreamMetadata metadata;
try {