Browse Source

ZOOKEEPER-3223: Configure Spotbugs

- add spotbugs configuration (default)
- make build pass spotbugs

Author: Enrico Olivelli <eolivelliapache.org>

Reviewers: andorapache.org

Author: Enrico Olivelli <eolivelli@apache.org>

Reviewers: andor@apache.org

Closes #763 from eolivelli/fix/ZOOKEEPER-3223-branch-3.5
Enrico Olivelli 7 years ago
parent
commit
d6b4cd6c18

+ 1 - 0
build.xml

@@ -28,6 +28,7 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
     <!-- ====================================================== -->
     <!-- ====================================================== -->
     <property name="slf4j.version" value="1.7.25"/>
     <property name="slf4j.version" value="1.7.25"/>
     <property name="commons-cli.version" value="1.2"/>
     <property name="commons-cli.version" value="1.2"/>
+    <property name="spotbugsannotations.version" value="3.1.8"/>
 
 
     <property name="wagon-http.version" value="2.4"/>
     <property name="wagon-http.version" value="2.4"/>
     <property name="maven-ant-tasks.version" value="2.1.3"/>
     <property name="maven-ant-tasks.version" value="2.1.3"/>

+ 14 - 0
excludeFindBugsFilter.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<FindBugsFilter>
+    <!-- this work work on JDK11  https://github.com/spotbugs/spotbugs-maven-plugin/issues/92 -->
+    <Bug pattern="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"/>
+
+    <!-- this problem is to be addressed in ZOOKEEPER-3227 -->
+    <Bug pattern="DM_DEFAULT_ENCODING"/>
+
+    <!-- not really a problem -->
+    <Bug pattern="DM_EXIT"/>
+
+</FindBugsFilter>
+

+ 1 - 0
ivy.xml

@@ -46,6 +46,7 @@
     <dependency org="org.slf4j" name="slf4j-api" rev="${slf4j.version}"/>
     <dependency org="org.slf4j" name="slf4j-api" rev="${slf4j.version}"/>
     <dependency org="org.slf4j" name="slf4j-log4j12" rev="${slf4j.version}" transitive="false"/>
     <dependency org="org.slf4j" name="slf4j-log4j12" rev="${slf4j.version}" transitive="false"/>
     <dependency org="commons-cli" name="commons-cli" rev="${commons-cli.version}" />
     <dependency org="commons-cli" name="commons-cli" rev="${commons-cli.version}" />
+    <dependency org="com.github.spotbugs" name="spotbugs-annotations" rev="${spotbugsannotations.version}" />
   
   
     <dependency org="org.apache.maven.wagon" name="wagon-http" rev="${wagon-http.version}"
     <dependency org="org.apache.maven.wagon" name="wagon-http" rev="${wagon-http.version}"
                 conf="mvn-ant-task->default"/>
                 conf="mvn-ant-task->default"/>

+ 21 - 1
pom.xml

@@ -275,6 +275,7 @@
     <kerby.version>1.1.0</kerby.version>
     <kerby.version>1.1.0</kerby.version>
     <bouncycastle.version>1.56</bouncycastle.version>
     <bouncycastle.version>1.56</bouncycastle.version>
     <commons-collections.version>3.2.2</commons-collections.version>
     <commons-collections.version>3.2.2</commons-collections.version>
+    <spotbugsannotations.version>3.1.8</spotbugsannotations.version>
   </properties>
   </properties>
 
 
   <dependencyManagement>
   <dependencyManagement>
@@ -407,6 +408,13 @@
         <artifactId>jline</artifactId>
         <artifactId>jline</artifactId>
         <version>${jline.version}</version>
         <version>${jline.version}</version>
       </dependency>
       </dependency>
+      <dependency>
+         <groupId>com.github.spotbugs</groupId>
+         <artifactId>spotbugs-annotations</artifactId>
+         <version>${spotbugsannotations.version}</version>
+         <scope>provided</scope>
+         <optional>true</optional>
+        </dependency>
     </dependencies>
     </dependencies>
   </dependencyManagement>
   </dependencyManagement>
 
 
@@ -458,6 +466,14 @@
           <artifactId>clover-maven-plugin</artifactId>
           <artifactId>clover-maven-plugin</artifactId>
           <version>4.3.1</version>
           <version>4.3.1</version>
         </plugin>
         </plugin>
+        <plugin>
+          <groupId>com.github.spotbugs</groupId>
+          <artifactId>spotbugs-maven-plugin</artifactId>
+          <version>3.1.8</version>
+          <configuration>
+            <excludeFilterFile>excludeFindBugsFilter.xml</excludeFilterFile>
+          </configuration>
+        </plugin>
       </plugins>
       </plugins>
     </pluginManagement>
     </pluginManagement>
 
 
@@ -485,7 +501,11 @@
           </execution>
           </execution>
         </executions>
         </executions>
       </plugin>
       </plugin>
-    </plugins>
+      <plugin>
+        <groupId>com.github.spotbugs</groupId>
+        <artifactId>spotbugs-maven-plugin</artifactId>
+      </plugin>
+      </plugins>
   </build>
   </build>
 
 
   <reporting>
   <reporting>

+ 8 - 0
zookeeper-jute/pom.xml

@@ -145,6 +145,14 @@
           </execution>
           </execution>
         </executions>
         </executions>
       </plugin>
       </plugin>
+      <plugin>
+        <!-- spotbugs does not make sense for generated code -->
+        <groupId>com.github.spotbugs</groupId>
+        <artifactId>spotbugs-maven-plugin</artifactId>
+        <configuration>
+            <skip>true</skip>
+        </configuration>
+      </plugin>
     </plugins>
     </plugins>
   </build>
   </build>
 
 

+ 6 - 0
zookeeper-server/pom.xml

@@ -34,6 +34,12 @@
   <description>ZooKeeper server</description>
   <description>ZooKeeper server</description>
 
 
   <dependencies>
   <dependencies>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
     <dependency>
     <dependency>
       <groupId>org.hamcrest</groupId>
       <groupId>org.hamcrest</groupId>
       <artifactId>hamcrest-all</artifactId>
       <artifactId>hamcrest-all</artifactId>

+ 4 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java

@@ -18,6 +18,7 @@
 
 
 package org.apache.zookeeper;
 package org.apache.zookeeper;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.BufferedReader;
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.IOException;
@@ -97,6 +98,7 @@ import org.slf4j.MDC;
  * connected to as needed.
  * connected to as needed.
  *
  *
  */
  */
+@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"})
 public class ClientCnxn {
 public class ClientCnxn {
     private static final Logger LOG = LoggerFactory.getLogger(ClientCnxn.class);
     private static final Logger LOG = LoggerFactory.getLogger(ClientCnxn.class);
 
 
@@ -479,6 +481,7 @@ public class ClientCnxn {
             waitingEvents.add(new LocalCallback(cb, rc, path, ctx));
             waitingEvents.add(new LocalCallback(cb, rc, path, ctx));
         }
         }
 
 
+       @SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
        public void queuePacket(Packet packet) {
        public void queuePacket(Packet packet) {
           if (wasKilled) {
           if (wasKilled) {
              synchronized (waitingEvents) {
              synchronized (waitingEvents) {
@@ -495,6 +498,7 @@ public class ClientCnxn {
         }
         }
 
 
         @Override
         @Override
+        @SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
         public void run() {
         public void run() {
            try {
            try {
               isRunning = true;
               isRunning = true;

+ 4 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/ZooDefs.java

@@ -18,6 +18,7 @@
 
 
 package org.apache.zookeeper;
 package org.apache.zookeeper;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Collections;
 
 
@@ -118,18 +119,21 @@ public class ZooDefs {
         /**
         /**
          * This is a completely open ACL .
          * This is a completely open ACL .
          */
          */
+        @SuppressFBWarnings(value = "MS_MUTABLE_COLLECTION", justification = "Cannot break API")
         public final ArrayList<ACL> OPEN_ACL_UNSAFE = new ArrayList<ACL>(
         public final ArrayList<ACL> OPEN_ACL_UNSAFE = new ArrayList<ACL>(
                 Collections.singletonList(new ACL(Perms.ALL, ANYONE_ID_UNSAFE)));
                 Collections.singletonList(new ACL(Perms.ALL, ANYONE_ID_UNSAFE)));
 
 
         /**
         /**
          * This ACL gives the creators authentication id's all permissions.
          * This ACL gives the creators authentication id's all permissions.
          */
          */
+        @SuppressFBWarnings(value = "MS_MUTABLE_COLLECTION", justification = "Cannot break API")
         public final ArrayList<ACL> CREATOR_ALL_ACL = new ArrayList<ACL>(
         public final ArrayList<ACL> CREATOR_ALL_ACL = new ArrayList<ACL>(
                 Collections.singletonList(new ACL(Perms.ALL, AUTH_IDS)));
                 Collections.singletonList(new ACL(Perms.ALL, AUTH_IDS)));
 
 
         /**
         /**
          * This ACL gives the world the ability to read.
          * This ACL gives the world the ability to read.
          */
          */
+        @SuppressFBWarnings(value = "MS_MUTABLE_COLLECTION", justification = "Cannot break API")
         public final ArrayList<ACL> READ_ACL_UNSAFE = new ArrayList<ACL>(
         public final ArrayList<ACL> READ_ACL_UNSAFE = new ArrayList<ACL>(
                 Collections
                 Collections
                         .singletonList(new ACL(Perms.READ, ANYONE_ID_UNSAFE)));
                         .singletonList(new ACL(Perms.READ, ANYONE_ID_UNSAFE)));

+ 2 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/server/DataNode.java

@@ -18,6 +18,7 @@
 
 
 package org.apache.zookeeper.server;
 package org.apache.zookeeper.server;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.Set;
@@ -36,6 +37,7 @@ import org.apache.zookeeper.data.StatPersisted;
  * array of ACLs, a stat object, and a set of its children's paths.
  * array of ACLs, a stat object, and a set of its children's paths.
  * 
  * 
  */
  */
+@SuppressFBWarnings("EI_EXPOSE_REP2")
 public class DataNode implements Record {
 public class DataNode implements Record {
     /** the data for this datanode */
     /** the data for this datanode */
     byte data[];
     byte data[];

+ 3 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/server/EphemeralType.java

@@ -18,6 +18,7 @@
 
 
 package org.apache.zookeeper.server;
 package org.apache.zookeeper.server;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.CreateMode;
 
 
 import java.util.Collections;
 import java.util.Collections;
@@ -210,6 +211,8 @@ public enum EphemeralType {
      * @param ttl  ttl
      * @param ttl  ttl
      * @throws IllegalArgumentException if the ttl is not valid for the mode
      * @throws IllegalArgumentException if the ttl is not valid for the mode
      */
      */
+    @SuppressFBWarnings(value = "RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT",
+            justification = "toEphemeralOwner may throw IllegalArgumentException")
     public static void validateTTL(CreateMode mode, long ttl) {
     public static void validateTTL(CreateMode mode, long ttl) {
         if (mode.isTTL()) {
         if (mode.isTTL()) {
             TTL.toEphemeralOwner(ttl);
             TTL.toEphemeralOwner(ttl);

+ 1 - 1
zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java

@@ -155,7 +155,7 @@ public class FileTxnLog implements TxnLog {
      * @param serverStats used to update fsyncThresholdExceedCount
      * @param serverStats used to update fsyncThresholdExceedCount
      */
      */
     @Override
     @Override
-    public void setServerStats(ServerStats serverStats) {
+    public synchronized void setServerStats(ServerStats serverStats) {
         this.serverStats = serverStats;
         this.serverStats = serverStats;
     }
     }
 
 

+ 3 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java

@@ -18,6 +18,7 @@
 
 
 package org.apache.zookeeper.server.quorum;
 package org.apache.zookeeper.server.quorum;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.DatagramSocket;
@@ -459,6 +460,8 @@ public class AuthFastLeaderElection implements Election {
                 }
                 }
             }
             }
 
 
+            @SuppressFBWarnings(value = "RV_RETURN_VALUE_IGNORED",
+                    justification = "tryAcquire result not chacked, but it is not an issue")
             private void process(ToSend m) {
             private void process(ToSend m) {
                 int attempts = 0;
                 int attempts = 0;
                 byte zeroes[];
                 byte zeroes[];

+ 3 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java

@@ -18,6 +18,7 @@
 
 
 package org.apache.zookeeper.server.quorum;
 package org.apache.zookeeper.server.quorum;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -316,6 +317,7 @@ public class CommitProcessor extends ZooKeeperCriticalThread implements
         }
         }
     }
     }
 
 
+    @SuppressFBWarnings("NN_NAKED_NOTIFY")
     synchronized private void wakeup() {
     synchronized private void wakeup() {
         notifyAll();
         notifyAll();
     }
     }
@@ -333,6 +335,7 @@ public class CommitProcessor extends ZooKeeperCriticalThread implements
         }
         }
     }
     }
 
 
+    @Override
     public void processRequest(Request request) {
     public void processRequest(Request request) {
         if (stopped) {
         if (stopped) {
             return;
             return;