You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2014/01/05 22:05:03 UTC

svn commit: r1555629 [7/7] - in /lucene/dev/branches/lucene5376: ./ dev-tools/ dev-tools/maven/solr/contrib/map-reduce/ lucene/ lucene/analysis/ lucene/analysis/common/ lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/ lucene/analysis/com...

Modified: lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java?rev=1555629&r1=1555628&r2=1555629&view=diff
==============================================================================
--- lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java (original)
+++ lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java Sun Jan  5 21:04:58 2014
@@ -17,6 +17,8 @@ package org.apache.solr.common.cloud;
  * limitations under the License.
  */
 
+import java.util.Timer;
+import java.util.TimerTask;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeoutException;
 
@@ -27,7 +29,7 @@ import org.apache.zookeeper.Watcher.Even
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class ConnectionManager implements Watcher {
+public class ConnectionManager implements Watcher {
   protected static final Logger log = LoggerFactory
       .getLogger(ConnectionManager.class);
 
@@ -35,26 +37,26 @@ class ConnectionManager implements Watch
   private CountDownLatch clientConnected;
   private KeeperState state;
   private boolean connected;
+  private boolean likelyExpired = true;
 
   private final ZkClientConnectionStrategy connectionStrategy;
 
   private final String zkServerAddress;
 
-  private final int zkClientTimeout;
-
   private final SolrZkClient client;
 
   private final OnReconnect onReconnect;
   private final BeforeReconnect beforeReconnect;
 
   private volatile boolean isClosed = false;
+  
+  private volatile Timer disconnectedTimer;
 
-  public ConnectionManager(String name, SolrZkClient client, String zkServerAddress, int zkClientTimeout, ZkClientConnectionStrategy strat, OnReconnect onConnect, BeforeReconnect beforeReconnect) {
+  public ConnectionManager(String name, SolrZkClient client, String zkServerAddress, ZkClientConnectionStrategy strat, OnReconnect onConnect, BeforeReconnect beforeReconnect) {
     this.name = name;
     this.client = client;
     this.connectionStrategy = strat;
     this.zkServerAddress = zkServerAddress;
-    this.zkClientTimeout = zkClientTimeout;
     this.onReconnect = onConnect;
     this.beforeReconnect = beforeReconnect;
     reset();
@@ -63,6 +65,36 @@ class ConnectionManager implements Watch
   private synchronized void reset() {
     clientConnected = new CountDownLatch(1);
     state = KeeperState.Disconnected;
+    disconnected();
+  }
+  
+  private synchronized void connected() {
+    connected = true;
+    if (disconnectedTimer != null) {
+      disconnectedTimer.cancel();
+      disconnectedTimer = null;
+    }
+    likelyExpired = false;
+  }
+
+  private synchronized void disconnected() {
+    if (disconnectedTimer != null) {
+      disconnectedTimer.cancel();
+      disconnectedTimer = null;
+    }
+    if (!isClosed) {
+      disconnectedTimer = new Timer();
+      disconnectedTimer.schedule(new TimerTask() {
+        
+        @Override
+        public void run() {
+          synchronized (ConnectionManager.this) {
+            likelyExpired = true;
+          }
+        }
+        
+      }, (long) (client.getZkClientTimeout() * 0.90));
+    }
     connected = false;
   }
 
@@ -80,17 +112,17 @@ class ConnectionManager implements Watch
 
     state = event.getState();
     if (state == KeeperState.SyncConnected) {
-      connected = true;
+      connected();
       clientConnected.countDown();
       connectionStrategy.connected();
     } else if (state == KeeperState.Expired) {
-      connected = false;
+      disconnected();
       log.info("Our previous ZooKeeper session was expired. Attempting to reconnect to recover relationship with ZooKeeper...");
       if (beforeReconnect != null) {
         beforeReconnect.command();
       }
       try {
-        connectionStrategy.reconnect(zkServerAddress, zkClientTimeout, this,
+        connectionStrategy.reconnect(zkServerAddress, client.getZkClientTimeout(), this,
             new ZkClientConnectionStrategy.ZkUpdate() {
               @Override
               public void update(SolrZooKeeper keeper) {
@@ -118,9 +150,7 @@ class ConnectionManager implements Watch
                   onReconnect.command();
                 }
                 
-                synchronized (ConnectionManager.this) {
-                  ConnectionManager.this.connected = true;
-                }
+                connected();
                 
               }
             });
@@ -130,10 +160,10 @@ class ConnectionManager implements Watch
       log.info("Connected:" + connected);
     } else if (state == KeeperState.Disconnected) {
       log.info("zkClient has disconnected");
-      connected = false;
+      disconnected();
       connectionStrategy.disconnected();
     } else {
-      connected = false;
+      disconnected();
     }
     notifyAll();
   }
@@ -146,11 +176,23 @@ class ConnectionManager implements Watch
   // to avoid deadlock on shutdown
   public void close() {
     this.isClosed = true;
+    this.likelyExpired = true;
+    try {
+      this.disconnectedTimer.cancel();
+    } catch (NullPointerException e) {
+      // fine
+    } finally {
+      this.disconnectedTimer = null;
+    }
   }
 
   public synchronized KeeperState state() {
     return state;
   }
+  
+  public synchronized boolean isLikelyExpired() {
+    return likelyExpired;
+  }
 
   public synchronized void waitForConnected(long waitForConnection)
       throws TimeoutException {

Modified: lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java?rev=1555629&r1=1555628&r2=1555629&view=diff
==============================================================================
--- lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java (original)
+++ lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java Sun Jan  5 21:04:58 2014
@@ -105,7 +105,7 @@ public class SolrZkClient {
     // we must retry at least as long as the session timeout
     zkCmdExecutor = new ZkCmdExecutor(zkClientTimeout);
     connManager = new ConnectionManager("ZooKeeperConnection Watcher:"
-        + zkServerAddress, this, zkServerAddress, zkClientTimeout, strat, onReconnect, beforeReconnect);
+        + zkServerAddress, this, zkServerAddress, strat, onReconnect, beforeReconnect);
     try {
       strat.connect(zkServerAddress, zkClientTimeout, connManager,
           new ZkUpdate() {
@@ -149,6 +149,10 @@ public class SolrZkClient {
     numOpens.incrementAndGet();
   }
 
+  public ConnectionManager getConnectionManager() {
+    return connManager;
+  }
+  
   public ZkClientConnectionStrategy getZkClientConnectionStrategy() {
     return zkClientConnectionStrategy;
   }

Modified: lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ZkCmdExecutor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ZkCmdExecutor.java?rev=1555629&r1=1555628&r2=1555629&view=diff
==============================================================================
--- lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ZkCmdExecutor.java (original)
+++ lucene/dev/branches/lucene5376/solr/solrj/src/java/org/apache/solr/common/cloud/ZkCmdExecutor.java Sun Jan  5 21:04:58 2014
@@ -31,6 +31,14 @@ public class ZkCmdExecutor {
   private int retryCount;
   private List<ACL> acl = ZooDefs.Ids.OPEN_ACL_UNSAFE;
   
+  /**
+   * TODO: At this point, this should probably take a SolrZkClient in
+   * it's constructor.
+   * 
+   * @param timeoutms
+   *          the client timeout for the ZooKeeper clients that will be used
+   *          with this class.
+   */
   public ZkCmdExecutor(int timeoutms) {
     double timeouts = timeoutms / 1000.0;
     this.retryCount = Math.round(0.5f * ((float)Math.sqrt(8.0f * timeouts + 1.0f) - 1.0f));

Modified: lucene/dev/branches/lucene5376/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java?rev=1555629&r1=1555628&r2=1555629&view=diff
==============================================================================
--- lucene/dev/branches/lucene5376/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java (original)
+++ lucene/dev/branches/lucene5376/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java Sun Jan  5 21:04:58 2014
@@ -254,7 +254,7 @@ public abstract class AbstractFullDistri
     server.setParallelUpdates(random().nextBoolean());
     if (defaultCollection != null) server.setDefaultCollection(defaultCollection);
     server.getLbServer().getHttpClient().getParams()
-        .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 15000);
+        .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
     return server;
   }