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/26 15:51:55 UTC

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

Author: markrmiller
Date: Sun Jan 26 14:51:55 2014
New Revision: 1561497

URL: http://svn.apache.org/r1561497
Log:
SOLR-5577: Harden leaking Timer thread.

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=1561497&r1=1561496&r2=1561497&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 Sun Jan 26 14:51:55 2014
@@ -72,8 +72,8 @@ public class ConnectionManager implement
   private synchronized void disconnected() {
     cancelTimer();
     if (!isClosed) {
-      disconnectedTimer = new Timer(true);
-      disconnectedTimer.schedule(new TimerTask() {
+      Timer newDcTimer = new Timer(true);
+      newDcTimer.schedule(new TimerTask() {
         
         @Override
         public void run() {
@@ -84,7 +84,16 @@ public class ConnectionManager implement
       if (isClosed) {
         // we might have closed after getting by isClosed
         // and before starting the new timer
-        cancelTimer();
+        newDcTimer.cancel();
+      } else {
+        disconnectedTimer = newDcTimer;
+        if (isClosed) {
+          // now deal with we may have been closed after getting
+          // by isClosed but before setting disconnectedTimer -
+          // if close happens after isClosed check this time, it 
+          // will handle stopping the timer
+          cancelTimer();
+        }
       }
     }
     connected = false;
@@ -196,7 +205,7 @@ public class ConnectionManager implement
   }
   
   // we use a volatile rather than sync
-  // to avoid deadlock on shutdown
+  // to avoid possible deadlock on shutdown
   public void close() {
     this.isClosed = true;
     this.likelyExpired = true;