You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2014/01/20 23:25:45 UTC

svn commit: r1559844 - /lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java

Author: markrmiller
Date: Mon Jan 20 22:25:44 2014
New Revision: 1559844

URL: http://svn.apache.org/r1559844
Log:
SOLR-5577: Protect against NPE race with close - spotted by Greg Chanan

Modified:
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java?rev=1559844&r1=1559843&r2=1559844&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java Mon Jan 20 22:25:44 2014
@@ -63,20 +63,14 @@ public class ConnectionManager implement
   }
   
   private synchronized void connected() {
-    if (disconnectedTimer != null) {
-      disconnectedTimer.cancel();
-      disconnectedTimer = null;
-    }
+    cancelTimer();
     connected = true;
     likelyExpired = false;
     notifyAll();
   }
 
   private synchronized void disconnected() {
-    if (disconnectedTimer != null) {
-      disconnectedTimer.cancel();
-      disconnectedTimer = null;
-    }
+    cancelTimer();
     if (!isClosed) {
       disconnectedTimer = new Timer(true);
       disconnectedTimer.schedule(new TimerTask() {
@@ -90,14 +84,23 @@ public class ConnectionManager implement
       if (isClosed) {
         // we might have closed after getting by isClosed
         // and before starting the new timer
-        disconnectedTimer.cancel();
-        disconnectedTimer = null;
+        cancelTimer();
       }
     }
     connected = false;
     notifyAll();
   }
 
+  private void cancelTimer() {
+    try {
+      this.disconnectedTimer.cancel();
+    } catch (NullPointerException e) {
+      // fine
+    } finally {
+      this.disconnectedTimer = null;
+    }
+  }
+
   @Override
   public void process(WatchedEvent event) {
     if (log.isInfoEnabled()) {
@@ -117,10 +120,10 @@ public class ConnectionManager implement
       clientConnected.countDown();
       connectionStrategy.connected();
     } else if (state == KeeperState.Expired) {
-      if (disconnectedTimer != null) {
-        disconnectedTimer.cancel();
-        disconnectedTimer = null;
-      }
+      // we don't call disconnected because there
+      // is no need to start the timer - if we are expired
+      // likelyExpired can just be set to true
+      cancelTimer();
       
       connected = false;
       likelyExpired = true;
@@ -197,13 +200,7 @@ public class ConnectionManager implement
   public void close() {
     this.isClosed = true;
     this.likelyExpired = true;
-    try {
-      this.disconnectedTimer.cancel();
-    } catch (NullPointerException e) {
-      // fine
-    } finally {
-      this.disconnectedTimer = null;
-    }
+    cancelTimer();
   }
   
   public boolean isLikelyExpired() {