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

andor pushed a commit to branch branch-3.4
in repository https://gitbox.apache.org/repos/asf/zookeeper.git


The following commit(s) were added to refs/heads/branch-3.4 by this push:
     new adf4e78  ZOOKEEPER-3223: Configure Spotbugs - on branch 3.4
adf4e78 is described below

commit adf4e78dfeb96f802c1ac77d226c58a9355a75a8
Author: Enrico Olivelli <[email protected]>
AuthorDate: Mon Jan 21 16:20:15 2019 +0100

    ZOOKEEPER-3223: Configure Spotbugs - on branch 3.4
    
    - add spotbugs configuration (default)
    - make build pass spotbugs
    
    Fix errors:
    [ERROR] Increment of volatile field 
org.apache.zookeeper.server.quorum.AuthFastLeaderElection.logicalclock in 
org.apache.zookeeper.server.quorum.AuthFastLeaderElection.leaveInstance() 
[org.apache.zookeeper.server.quorum.AuthFastLeaderElection] At 
AuthFastLeaderElection.java:[line 780] VO_VOLATILE_INCREMENT
    [ERROR] Increment of volatile field 
org.apache.zookeeper.server.quorum.AuthFastLeaderElection.logicalclock in 
org.apache.zookeeper.server.quorum.AuthFastLeaderElection.lookForLeader() 
[org.apache.zookeeper.server.quorum.AuthFastLeaderElection] At 
AuthFastLeaderElection.java:[line 854] VO_VOLATILE_INCREMENT
    [ERROR] Switch statement found in 
org.apache.zookeeper.server.quorum.AuthFastLeaderElection$Messenger$WorkerReceiver.run()
 where default case is missing 
[org.apache.zookeeper.server.quorum.AuthFastLeaderElection$Messenger$WorkerReceiver]
 At AuthFastLeaderElection.java:[lines 270-278] SF_SWITCH_NO_DEFAULT
    [ERROR] Switch statement found in 
org.apache.zookeeper.server.quorum.AuthFastLeaderElection$Messenger$WorkerSender.process(AuthFastLeaderElection$ToSend)
 where default case is missing 
[org.apache.zookeeper.server.quorum.AuthFastLeaderElection$Messenger$WorkerSender]
 At AuthFastLeaderElection.java:[lines 468-700] SF_SWITCH_NO_DEFAULT
    [ERROR] Unread field: 
org.apache.zookeeper.server.quorum.LearnerSessionTracker.expirer 
[org.apache.zookeeper.server.quorum.LearnerSessionTracker] At 
LearnerSessionTracker.java:[line 45] URF_UNREAD_FIELD
    [ERROR] 
org.apache.zookeeper.server.quorum.QuorumPeer.writeLongToFile(String, long) may 
fail to close stream [org.apache.zookeeper.server.quorum.QuorumPeer] At 
QuorumPeer.java:[line 1387] OS_OPEN_STREAM
    [ERROR] Inconsistent synchronization of 
org.apache.zookeeper.server.upgrade.DataNodeV1.data; locked 50% of time 
[org.apache.zookeeper.server.upgrade.DataNodeV1, 
org.apache.zookeeper.server.upgrade.DataNodeV1, 
org.apache.zookeeper.server.upgrade.UpgradeSnapShotV1, 
org.apache.zookeeper.server.upgrade.DataNodeV1, 
org.apache.zookeeper.server.upgrade.DataTreeV1, 
org.apache.zookeeper.server.upgrade.DataTreeV1] Unsynchronized access at 
DataNodeV1.java:[line 98]Unsynchronized access at DataNo [...]
    [ERROR] Dead store to $L9 in 
org.apache.zookeeper.server.upgrade.DataTreeV1.processTxn(TxnHeader, Record) 
[org.apache.zookeeper.server.upgrade.DataTreeV1] At DataTreeV1.java:[line 417] 
DLS_DEAD_LOCAL_STORE
    [ERROR] Switch statement found in 
org.apache.zookeeper.server.upgrade.DataTreeV1.processTxn(TxnHeader, Record) 
where default case is missing [org.apache.zookeeper.server.upgrade.DataTreeV1] 
At DataTreeV1.java:[lines 392-417] SF_SWITCH_NO_DEFAULT
    [ERROR] org.apache.zookeeper.server.upgrade.DataTreeV1.dumpEphemerals() 
makes inefficient use of keySet iterator instead of entrySet iterator 
[org.apache.zookeeper.server.upgrade.DataTreeV1] At DataTreeV1.java:[line 545] 
WMI_WRONG_MAP_ITERATOR
    
    [ERROR] Inconsistent synchronization of 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport.hostName; locked 60% 
of time [org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport] Unsynch [...]
    [ERROR] Inconsistent synchronization of 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport.leaderOffer; locked 
53% of time [org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, 
org.apache.zookeeper.recipes.leader.LeaderElectionSupport, org. [...]
    [ERROR] org.apache.zookeeper.recipes.leader.LeaderOffer$IdComparator 
implements Comparator but not Serializable 
[org.apache.zookeeper.recipes.leader.LeaderOffer$IdComparator] At 
LeaderOffer.java:[lines 75-79] SE_COMPARATOR_SHOULD_BE_SERIALIZABLE
    [INFO]
    
    Author: Enrico Olivelli <[email protected]>
    
    Reviewers: [email protected]
    
    Closes #764 from eolivelli/fix/ZOOKEEPER-3223-branch-3.4 and squashes the 
following commits:
    
    488925dc7 [Enrico Olivelli] Upgrade to spotbugs 3.1.9
    66f43cdbc [Enrico Olivelli] Suppress IS2_INCONSISTENT_SYNC on 
DataNodeV1#data
    716e26984 [Enrico Olivelli] revert synchronized blocks on core code
    13415fb84 [Enrico Olivelli] Remove unused imports
    8079261e0 [Enrico Olivelli] Fix recipes and disable spotbugs on contrib
    b6dac0519 [Enrico Olivelli] Fix spotbugs errors
    febc57bc4 [Enrico Olivelli] ZOOKEEPER-3223: Configure Spotbugs
---
 build.xml                                          |  1 +
 excludeFindBugsFilter.xml                          | 14 ++++
 ivy.xml                                            |  2 +-
 pom.xml                                            | 22 ++++++-
 zookeeper-contrib/pom.xml                          | 18 ++++-
 zookeeper-jute/pom.xml                             |  8 +++
 .../recipes/leader/LeaderElectionSupport.java      | 46 ++++++++-----
 .../zookeeper/recipes/leader/LeaderOffer.java      |  4 +-
 zookeeper-recipes/zookeeper-recipes-lock/pom.xml   |  9 ++-
 .../apache/zookeeper/recipes/lock/WriteLock.java   | 77 +++++++++++-----------
 .../zookeeper/recipes/queue/DistributedQueue.java  |  4 +-
 zookeeper-server/pom.xml                           |  6 ++
 .../main/java/org/apache/zookeeper/ClientCnxn.java |  4 ++
 .../main/java/org/apache/zookeeper/ZooDefs.java    |  4 ++
 .../java/org/apache/zookeeper/server/DataNode.java |  2 +
 .../zookeeper/server/persistence/FileTxnLog.java   |  8 +--
 .../server/quorum/AuthFastLeaderElection.java      | 10 +++
 .../server/quorum/LearnerSessionTracker.java       |  2 -
 .../apache/zookeeper/server/quorum/QuorumPeer.java |  3 +
 .../zookeeper/server/upgrade/DataNodeV1.java       |  2 +
 .../zookeeper/server/upgrade/DataTreeV1.java       | 10 +--
 21 files changed, 183 insertions(+), 73 deletions(-)

diff --git a/build.xml b/build.xml
index d4b6981..57de37a 100644
--- a/build.xml
+++ b/build.xml
@@ -27,6 +27,7 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle">
     <!-- Dependency versions                                    -->
     <!-- ====================================================== -->
     <property name="slf4j.version" value="1.7.25"/>
+    <property name="spotbugsannotations.version" value="3.1.9"/>
 
     <property name="wagon-http.version" value="2.4"/>
     <property name="maven-ant-tasks.version" value="2.1.3"/>
diff --git a/excludeFindBugsFilter.xml b/excludeFindBugsFilter.xml
new file mode 100644
index 0000000..c836911
--- /dev/null
+++ b/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>
+
diff --git a/ivy.xml b/ivy.xml
index dbc7f81..0f18664 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -44,7 +44,7 @@
   <dependencies>
     <dependency org="org.slf4j" name="slf4j-api" rev="${slf4j.version}"/>
     <dependency org="org.slf4j" name="slf4j-log4j12" rev="${slf4j.version}" 
transitive="false"/>
-
+    <dependency org="com.github.spotbugs" name="spotbugs-annotations" 
rev="${spotbugsannotations.version}" />
     <dependency org="org.apache.maven.wagon" name="wagon-http" 
rev="${wagon-http.version}"
                 conf="mvn-ant-task->default"/>
     <dependency org="org.apache.maven" name="maven-ant-tasks" 
rev="${maven-ant-tasks.version}"
diff --git a/pom.xml b/pom.xml
index 17823fd..9738eb1 100755
--- a/pom.xml
+++ b/pom.xml
@@ -281,6 +281,7 @@
     <commons-lang.version>2.4</commons-lang.version>
     
<apache-directory-server.version>2.0.0-M15</apache-directory-server.version>
     <apache-directory-api.version>1.0.0-M20</apache-directory-api.version>
+    <spotbugsannotations.version>3.1.9</spotbugsannotations.version>
   </properties>
 
   <dependencyManagement>
@@ -654,6 +655,13 @@
           </exclusion>
         </exclusions>
       </dependency>
+      <dependency>
+         <groupId>com.github.spotbugs</groupId>
+         <artifactId>spotbugs-annotations</artifactId>
+         <version>${spotbugsannotations.version}</version>
+         <scope>provided</scope>
+         <optional>true</optional>
+        </dependency>
     </dependencies>
   </dependencyManagement>
 
@@ -710,6 +718,14 @@
           <artifactId>maven-install-plugin</artifactId>
           <version>3.0.0-M1</version>
         </plugin>
+        <plugin>
+          <groupId>com.github.spotbugs</groupId>
+          <artifactId>spotbugs-maven-plugin</artifactId>
+          <version>3.1.9</version>
+          <configuration>
+            <excludeFilterFile>excludeFindBugsFilter.xml</excludeFilterFile>
+          </configuration>
+        </plugin>
       </plugins>
     </pluginManagement>
 
@@ -737,7 +753,11 @@
           </execution>
         </executions>
       </plugin>
-    </plugins>
+      <plugin>
+        <groupId>com.github.spotbugs</groupId>
+        <artifactId>spotbugs-maven-plugin</artifactId>
+      </plugin>
+      </plugins>
   </build>
 
   <reporting>
diff --git a/zookeeper-contrib/pom.xml b/zookeeper-contrib/pom.xml
index 5f45c8b..08309f5 100755
--- a/zookeeper-contrib/pom.xml
+++ b/zookeeper-contrib/pom.xml
@@ -34,11 +34,25 @@
   <description>
     Contrib projects to Apache ZooKeeper
   </description>
-
+  <build>
+    <pluginManagement>
+       <plugins>
+          <plugin>
+            <groupId>com.github.spotbugs</groupId>
+            <artifactId>spotbugs-maven-plugin</artifactId>
+            <version>3.1.9</version>
+            <configuration>
+                <!-- No spotbugs for contri modules -->
+                <skip>true</skip>
+            </configuration>
+          </plugin>
+        </plugins>
+      </pluginManagement>
+  </build>
   <modules>
     <module>zookeeper-contrib-loggraph</module>
     <module>zookeeper-contrib-rest</module>
     <module>zookeeper-contrib-zooinspector</module>
   </modules>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/zookeeper-jute/pom.xml b/zookeeper-jute/pom.xml
index fa129cd..c83ad3c 100755
--- a/zookeeper-jute/pom.xml
+++ b/zookeeper-jute/pom.xml
@@ -145,6 +145,14 @@
           </execution>
         </executions>
       </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>
   </build>
 
diff --git 
a/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java
 
b/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java
index 8f8ae20..86c4d77 100644
--- 
a/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java
+++ 
b/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java
@@ -180,17 +180,25 @@ public class LeaderElectionSupport implements Watcher {
     state = State.OFFER;
     dispatchEvent(EventType.OFFER_START);
 
-    leaderOffer = new LeaderOffer();
-
-    leaderOffer.setHostName(hostName);
-    leaderOffer.setNodePath(zooKeeper.create(rootNodeName + "/" + "n_",
-        hostName.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
+    LeaderOffer newLeaderOffer = new LeaderOffer();
+    byte[] hostnameBytes;
+    synchronized (this) {
+        newLeaderOffer.setHostName(hostName);
+        hostnameBytes = hostName.getBytes();
+        newLeaderOffer.setNodePath(zooKeeper.create(rootNodeName + "/" + "n_",
+        hostnameBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE,
         CreateMode.EPHEMERAL_SEQUENTIAL));
-
-    logger.debug("Created leader offer {}", leaderOffer);
-
+        leaderOffer = newLeaderOffer;
+    }
+    
+    logger.debug("Created leader offer {}", newLeaderOffer);
+    
     dispatchEvent(EventType.OFFER_COMPLETE);
   }
+  
+  private synchronized LeaderOffer getLeaderOffer() {
+      return leaderOffer;
+  }
 
   private void determineElectionStatus() throws KeeperException,
       InterruptedException {
@@ -198,9 +206,11 @@ public class LeaderElectionSupport implements Watcher {
     state = State.DETERMINE;
     dispatchEvent(EventType.DETERMINE_START);
 
-    String[] components = leaderOffer.getNodePath().split("/");
+    LeaderOffer currentLeaderOffer = getLeaderOffer();
+    
+    String[] components = currentLeaderOffer.getNodePath().split("/");
 
-    leaderOffer.setId(Integer.valueOf(components[components.length - 1]
+    currentLeaderOffer.setId(Integer.valueOf(components[components.length - 1]
         .substring("n_".length())));
 
     List<LeaderOffer> leaderOffers = toLeaderOffers(zooKeeper.getChildren(
@@ -215,7 +225,7 @@ public class LeaderElectionSupport implements Watcher {
     for (int i = 0; i < leaderOffers.size(); i++) {
       LeaderOffer leaderOffer = leaderOffers.get(i);
 
-      if (leaderOffer.getId().equals(this.leaderOffer.getId())) {
+      if (leaderOffer.getId().equals(currentLeaderOffer.getId())) {
         logger.debug("There are {} leader offers. I am {} in line.",
             leaderOffers.size(), i);
 
@@ -238,7 +248,7 @@ public class LeaderElectionSupport implements Watcher {
     dispatchEvent(EventType.READY_START);
 
     logger.info("{} not elected leader. Watching node:{}",
-        leaderOffer.getNodePath(), neighborLeaderOffer.getNodePath());
+        getLeaderOffer().getNodePath(), neighborLeaderOffer.getNodePath());
 
     /*
      * Make sure to pass an explicit Watcher because we could be sharing this
@@ -270,7 +280,7 @@ public class LeaderElectionSupport implements Watcher {
     state = State.ELECTED;
     dispatchEvent(EventType.ELECTED_START);
 
-    logger.info("Becoming leader with node:{}", leaderOffer.getNodePath());
+    logger.info("Becoming leader with node:{}", 
getLeaderOffer().getNodePath());
 
     dispatchEvent(EventType.ELECTED_COMPLETE);
   }
@@ -336,7 +346,7 @@ public class LeaderElectionSupport implements Watcher {
   @Override
   public void process(WatchedEvent event) {
     if (event.getType().equals(Watcher.Event.EventType.NodeDeleted)) {
-      if (!event.getPath().equals(leaderOffer.getNodePath())
+      if (!event.getPath().equals(getLeaderOffer().getNodePath())
           && state != State.STOP) {
         logger.debug(
             "Node {} deleted. Need to run through the election process.",
@@ -384,8 +394,8 @@ public class LeaderElectionSupport implements Watcher {
 
   @Override
   public String toString() {
-    return "{ state:" + state + " leaderOffer:" + leaderOffer + " zooKeeper:"
-        + zooKeeper + " hostName:" + hostName + " listeners:" + listeners
+    return "{ state:" + state + " leaderOffer:" + getLeaderOffer() + " 
zooKeeper:"
+        + zooKeeper + " hostName:" + getHostName() + " listeners:" + listeners
         + " }";
   }
 
@@ -437,11 +447,11 @@ public class LeaderElectionSupport implements Watcher {
    * The hostname of this process. Mostly used as a convenience for logging and
    * to respond to {@link #getLeaderHostName()} requests.
    */
-  public String getHostName() {
+  public synchronized String getHostName() {
     return hostName;
   }
 
-  public void setHostName(String hostName) {
+  public synchronized void setHostName(String hostName) {
     this.hostName = hostName;
   }
 
diff --git 
a/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java
 
b/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java
index 188a6d5..e60cb25 100644
--- 
a/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java
+++ 
b/zookeeper-recipes/zookeeper-recipes-election/src/main/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.zookeeper.recipes.leader;
 
+import java.io.Serializable;
 import java.util.Comparator;
 
 /**
@@ -72,7 +73,8 @@ public class LeaderOffer {
    * Compare two instances of {@link LeaderOffer} using only the {code}id{code}
    * member.
    */
-  public static class IdComparator implements Comparator<LeaderOffer> {
+  public static final class IdComparator
+          implements Comparator<LeaderOffer>, Serializable {
 
     @Override
     public int compare(LeaderOffer o1, LeaderOffer o2) {
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/pom.xml 
b/zookeeper-recipes/zookeeper-recipes-lock/pom.xml
index c05f40f..78f2b7f 100755
--- a/zookeeper-recipes/zookeeper-recipes-lock/pom.xml
+++ b/zookeeper-recipes/zookeeper-recipes-lock/pom.xml
@@ -47,6 +47,13 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <version>3.1.9</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
   </dependencies>
 
   <build>
@@ -71,4 +78,4 @@
     </plugins>
   </build>
 
-</project>
\ No newline at end of file
+</project>
diff --git 
a/zookeeper-recipes/zookeeper-recipes-lock/src/main/java/org/apache/zookeeper/recipes/lock/WriteLock.java
 
b/zookeeper-recipes/zookeeper-recipes-lock/src/main/java/org/apache/zookeeper/recipes/lock/WriteLock.java
index 5caebee..a42e8ef 100644
--- 
a/zookeeper-recipes/zookeeper-recipes-lock/src/main/java/org/apache/zookeeper/recipes/lock/WriteLock.java
+++ 
b/zookeeper-recipes/zookeeper-recipes-lock/src/main/java/org/apache/zookeeper/recipes/lock/WriteLock.java
@@ -17,6 +17,7 @@
  */
 package org.apache.zookeeper.recipes.lock;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.zookeeper.KeeperException;
@@ -85,7 +86,7 @@ public class WriteLock extends ProtocolSupport {
      * return the current locklistener
      * @return the locklistener
      */
-    public LockListener getLockListener() {
+    public synchronized LockListener getLockListener() {
         return this.callback;
     }
     
@@ -93,7 +94,7 @@ public class WriteLock extends ProtocolSupport {
      * register a different call back listener
      * @param callback the call back instance
      */
-    public void setLockListener(LockListener callback) {
+    public synchronized void setLockListener(LockListener callback) {
         this.callback = callback;
     }
 
@@ -201,7 +202,9 @@ public class WriteLock extends ProtocolSupport {
          * obtaining the lock
          * @return if the command was successful or not
          */
-        public boolean execute() throws KeeperException, InterruptedException {
+        @SuppressFBWarnings(value = "NP_NULL_PARAM_DEREF_NONVIRTUAL",
+                justification = "findPrefixInChildren will assign a value to 
this.id")
+        public final boolean execute() throws KeeperException, 
InterruptedException {
             do {
                 if (id == null) {
                     long sessionId = zookeeper.getSessionId();
@@ -210,45 +213,44 @@ public class WriteLock extends ProtocolSupport {
                     // in the middle of creating the znode
                     findPrefixInChildren(prefix, zookeeper, dir);
                     idName = new ZNodeName(id);
-                }
-                if (id != null) {
-                    List<String> names = zookeeper.getChildren(dir, false);
-                    if (names.isEmpty()) {
-                        LOG.warn("No children in: " + dir + " when we've just 
" +
-                        "created one! Lets recreate it...");
-                        // lets force the recreation of the id
-                        id = null;
-                    } else {
-                        // lets sort them explicitly (though they do seem to 
come back in order ususally :)
-                        SortedSet<ZNodeName> sortedNames = new 
TreeSet<ZNodeName>();
-                        for (String name : names) {
-                            sortedNames.add(new ZNodeName(dir + "/" + name));
+                }                
+                List<String> names = zookeeper.getChildren(dir, false);
+                if (names.isEmpty()) {
+                    LOG.warn("No children in: " + dir + " when we've just " +
+                    "created one! Lets recreate it...");
+                    // lets force the recreation of the id
+                    id = null;
+                } else {
+                    // lets sort them explicitly (though they do seem to come 
back in order ususally :)
+                    SortedSet<ZNodeName> sortedNames = new 
TreeSet<ZNodeName>();
+                    for (String name : names) {
+                        sortedNames.add(new ZNodeName(dir + "/" + name));
+                    }
+                    ownerId = sortedNames.first().getName();
+                    SortedSet<ZNodeName> lessThanMe = 
sortedNames.headSet(idName);
+                    if (!lessThanMe.isEmpty()) {
+                        ZNodeName lastChildName = lessThanMe.last();
+                        lastChildId = lastChildName.getName();
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("watching less than me node: " + 
lastChildId);
                         }
-                        ownerId = sortedNames.first().getName();
-                        SortedSet<ZNodeName> lessThanMe = 
sortedNames.headSet(idName);
-                        if (!lessThanMe.isEmpty()) {
-                            ZNodeName lastChildName = lessThanMe.last();
-                            lastChildId = lastChildName.getName();
-                            if (LOG.isDebugEnabled()) {
-                                LOG.debug("watching less than me node: " + 
lastChildId);
-                            }
-                            Stat stat = zookeeper.exists(lastChildId, new 
LockWatcher());
-                            if (stat != null) {
-                                return Boolean.FALSE;
-                            } else {
-                                LOG.warn("Could not find the" +
-                                               " stats for less than me: " + 
lastChildName.getName());
-                            }
+                        Stat stat = zookeeper.exists(lastChildId, new 
LockWatcher());
+                        if (stat != null) {
+                            return Boolean.FALSE;
                         } else {
-                            if (isOwner()) {
-                                if (callback != null) {
-                                    callback.lockAcquired();
-                                }
-                                return Boolean.TRUE;
+                            LOG.warn("Could not find the" +
+                                            " stats for less than me: " + 
lastChildName.getName());
+                        }
+                    } else {
+                        if (isOwner()) {
+                            LockListener lockListener = getLockListener();
+                            if (lockListener != null) {
+                                lockListener.lockAcquired();
                             }
+                            return Boolean.TRUE;
                         }
                     }
-                }
+                }                
             }
             while (id == null);
             return Boolean.FALSE;
@@ -292,5 +294,6 @@ public class WriteLock extends ProtocolSupport {
     public String getId() {
        return this.id;
     }
+    
 }
 
diff --git 
a/zookeeper-recipes/zookeeper-recipes-queue/src/main/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java
 
b/zookeeper-recipes/zookeeper-recipes-queue/src/main/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java
index c5d7c83..b636562 100644
--- 
a/zookeeper-recipes/zookeeper-recipes-queue/src/main/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java
+++ 
b/zookeeper-recipes/zookeeper-recipes-queue/src/main/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java
@@ -86,7 +86,7 @@ public class DistributedQueue {
                     continue;
                 }
                 String suffix = childName.substring(prefix.length());
-                Long childId = new Long(suffix);
+                Long childId = Long.parseLong(suffix);
                 orderedChildren.put(childId,childName);
             }catch(NumberFormatException e){
                 LOG.warn("Found child node with improper format : " + 
childName + " " + e,e);
@@ -208,7 +208,7 @@ public class DistributedQueue {
         }
     }
 
-    private class LatchChildWatcher implements Watcher {
+    private static class LatchChildWatcher implements Watcher {
 
         CountDownLatch latch;
 
diff --git a/zookeeper-server/pom.xml b/zookeeper-server/pom.xml
index b39df73..44a58b5 100755
--- a/zookeeper-server/pom.xml
+++ b/zookeeper-server/pom.xml
@@ -35,6 +35,12 @@
 
   <dependencies>
     <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
       <groupId>org.hamcrest</groupId>
       <artifactId>hamcrest-all</artifactId>
       <scope>test</scope>
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java
index 8dd27bc..dfd036e 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java
@@ -18,6 +18,7 @@
 
 package org.apache.zookeeper;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -89,6 +90,7 @@ import org.slf4j.LoggerFactory;
  * connected to as needed.
  *
  */
+@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"})
 public class ClientCnxn {
     private static final Logger LOG = 
LoggerFactory.getLogger(ClientCnxn.class);
 
@@ -477,6 +479,7 @@ public class ClientCnxn {
             waitingEvents.add(pair);
         }
 
+       @SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
        public void queuePacket(Packet packet) {
           if (wasKilled) {
              synchronized (waitingEvents) {
@@ -493,6 +496,7 @@ public class ClientCnxn {
         }
 
         @Override
+        @SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
         public void run() {
            try {
               isRunning = true;
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooDefs.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooDefs.java
index 09bc95c..7e55de1 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooDefs.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooDefs.java
@@ -18,6 +18,7 @@
 
 package org.apache.zookeeper;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collections;
 
@@ -102,18 +103,21 @@ public class ZooDefs {
         /**
          * 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>(
                 Collections.singletonList(new ACL(Perms.ALL, 
ANYONE_ID_UNSAFE)));
 
         /**
          * 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>(
                 Collections.singletonList(new ACL(Perms.ALL, AUTH_IDS)));
 
         /**
          * 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>(
                 Collections
                         .singletonList(new ACL(Perms.READ, ANYONE_ID_UNSAFE)));
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataNode.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataNode.java
index 8efdaf8..d6edc5f 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataNode.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataNode.java
@@ -18,6 +18,7 @@
 
 package org.apache.zookeeper.server;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.util.HashSet;
 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.
  * 
  */
+@SuppressFBWarnings("EI_EXPOSE_REP2")
 public class DataNode implements Record {
     /** the parent of this datanode */
     DataNode parent;
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
index 95462e7..76821cf 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
@@ -152,10 +152,10 @@ public class FileTxnLog implements TxnLog {
      * Setter for ServerStats to monitor fsync threshold exceed
      * @param serverStats used to update fsyncThresholdExceedCount
      */
-     @Override
-     public void setServerStats(ServerStats serverStats) {
-         this.serverStats = serverStats;
-     }
+    @Override
+    public synchronized void setServerStats(ServerStats serverStats) {
+        this.serverStats = serverStats;
+    }
 
     /**
      * creates a checksum algorithm to be used
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java
index d32a725..b6e1a4c 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java
@@ -18,6 +18,7 @@
 
 package org.apache.zookeeper.server.quorum;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
@@ -51,6 +52,8 @@ import 
org.apache.zookeeper.server.quorum.QuorumPeer.ServerState;
  * @deprecated This class has been deprecated as of release 3.4.0. 
  */
 @Deprecated
+@SuppressFBWarnings(value = "VO_VOLATILE_INCREMENT",
+        justification = "This class is deprecated, no need to fix this 
warning")
 public class AuthFastLeaderElection implements Election {
     private static final Logger LOG = 
LoggerFactory.getLogger(AuthFastLeaderElection.class);
 
@@ -276,6 +279,8 @@ public class AuthFastLeaderElection implements Election {
                     case 2:
                         ackstate = QuorumPeer.ServerState.FOLLOWING;
                         break;
+                    default:
+                        throw new IllegalStateException("bad state 
"+responseBuffer.getInt());
                     }
 
                     Vote current = self.getCurrentVote();
@@ -454,6 +459,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) {
                 int attempts = 0;
                 byte zeroes[];
@@ -697,6 +704,9 @@ public class AuthFastLeaderElection implements Election {
                         LOG.warn("Exception while sending ack: ", e);
                     }
                     break;
+                default:
+                    LOG.warn("unknown type " + m.type);
+                    break;
                 }
             }
         }
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java
index 72f007e..e2b1424 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java
@@ -31,7 +31,6 @@ import org.apache.zookeeper.server.ZooKeeperServerListener;
  * to be forwarded to the Leader using a PING.
  */
 public class LearnerSessionTracker implements SessionTracker {
-    SessionExpirer expirer;
 
     HashMap<Long, Integer> touchTable = new HashMap<Long, Integer>();
     long serverId = 1;
@@ -42,7 +41,6 @@ public class LearnerSessionTracker implements SessionTracker {
     public LearnerSessionTracker(SessionExpirer expirer,
             ConcurrentHashMap<Long, Integer> sessionsWithTimeouts, long id,
             ZooKeeperServerListener listener) {
-        this.expirer = expirer;
         this.sessionsWithTimeouts = sessionsWithTimeouts;
         this.serverId = id;
         nextSessionId = 
SessionTrackerImpl.initializeNextSession(this.serverId);
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java
index 267f89e..219bb21 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java
@@ -17,6 +17,7 @@
  */
 package org.apache.zookeeper.server.quorum;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -1381,6 +1382,8 @@ public class QuorumPeer extends ZooKeeperThread 
implements QuorumStats.Provider
         * @param value the long value to write to the named file
         * @throws IOException if the file cannot be written atomically
         */
+    @SuppressFBWarnings(value = "OS_OPEN_STREAM",
+            justification = "Stream will be eventually closed in abort()")
     private void writeLongToFile(String name, long value) throws IOException {
         File file = new File(logFactory.getSnapDir(), name);
         AtomicFileOutputStream out = new AtomicFileOutputStream(file);
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataNodeV1.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataNodeV1.java
index 8c4fda0..f33e275 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataNodeV1.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataNodeV1.java
@@ -18,6 +18,7 @@
 
 package org.apache.zookeeper.server.upgrade;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -71,6 +72,7 @@ public class DataNodeV1 implements Record {
     
     DataNodeV1 parent;
 
+    @SuppressFBWarnings(value="IS2_INCONSISTENT_SYNC")
     byte data[];
 
     public List<ACL> acl;
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataTreeV1.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataTreeV1.java
index 678f4c6..8736335 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataTreeV1.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/upgrade/DataTreeV1.java
@@ -414,7 +414,9 @@ public class DataTreeV1 {
                 killSession(header.getClientId());
                 break;
             case OpCode.error:
-                ErrorTxn errTxn = (ErrorTxn) txn;
+                break;
+            default:
+                debug = "Unknown code " + header.getType();
                 break;
             }
         } catch (KeeperException e) {
@@ -539,10 +541,10 @@ public class DataTreeV1 {
         Set<Long> keys = ephemerals.keySet();
         StringBuilder sb = new StringBuilder("Sessions with Ephemerals ("
                 + keys.size() + "):\n");
-        for (long k : keys) {
-            sb.append("0x" + Long.toHexString(k));
+        for (Map.Entry<Long, HashSet<String>> entry : ephemerals.entrySet()) {
+            sb.append("0x" + Long.toHexString(entry.getKey()));
             sb.append(":\n");
-            HashSet<String> tmp = ephemerals.get(k);
+            HashSet<String> tmp = entry.getValue();
             synchronized(tmp) {
                 for (String path : tmp) {
                     sb.append("\t" + path + "\n");

Reply via email to