You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2016/02/25 02:57:47 UTC

[27/50] [abbrv] lucene-solr git commit: SOLR-8666: Adds header 'zkConnected' to response of SearchHandler and PingRequestHandler

SOLR-8666: Adds header 'zkConnected' to response of SearchHandler and PingRequestHandler

Header is used to notify the client when a connection to zookeeper has been lost and there is a possibility of stale data on the node the request is coming from.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/d6105334
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/d6105334
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/d6105334

Branch: refs/heads/jira/SOLR-445
Commit: d6105334a0fb46dbb2b5d4a4f8a9d9355a6d7a17
Parents: 2c0a5e3
Author: Dennis Gove <dp...@gmail.com>
Authored: Fri Feb 12 08:14:58 2016 -0500
Committer: Dennis Gove <dp...@gmail.com>
Committed: Mon Feb 22 19:25:17 2016 -0500

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  4 ++
 .../apache/solr/handler/PingRequestHandler.java |  7 ++-
 .../solr/handler/component/SearchHandler.java   | 19 +++++++-
 .../solr/handler/PingRequestHandlerTest.java    |  3 ++
 .../handler/component/SearchHandlerTest.java    | 47 ++++++++++++++++++++
 5 files changed, 77 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d6105334/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d834c37..a85e6fa 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -201,6 +201,10 @@ Bug Fixes
 * SOLR-8599: After a failed connection during construction of SolrZkClient attempt to retry until a connection
   can be made. (Keith Laban, Dennis Gove)
 
+* SOLR-8666: Adds header 'zkConnected' to response of SearchHandler and PingRequestHandler to notify the client when
+  a connection to zookeeper has been lost and there is a possibility of stale data on the node the request is coming
+  from. (Keith Laban, Dennis Gove)
+
 Optimizations
 ----------------------
 * SOLR-7876: Speed up queries and operations that use many terms when timeAllowed has not been

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d6105334/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
index 426bb1a..5df46f5 100644
--- a/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
@@ -278,7 +278,12 @@ public class PingRequestHandler extends RequestHandlerBase implements SolrCoreAw
       try {
         SolrQueryResponse pingrsp = new SolrQueryResponse();
         core.execute(handler, req, pingrsp );
-        ex = pingrsp.getException();       
+        ex = pingrsp.getException(); 
+        NamedList<Object> headers = rsp.getResponseHeader();
+        if(headers != null) {
+          headers.add("zkConnected", pingrsp.getResponseHeader().get("zkConnected"));
+        }
+        
       }
       catch( Exception e ) {
         ex = e;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d6105334/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java b/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
index 9cb4183..3518ecb 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
@@ -28,6 +28,7 @@ import java.util.Set;
 import org.apache.lucene.index.ExitableDirectoryReader;
 import org.apache.lucene.util.Version;
 import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
@@ -36,6 +37,7 @@ import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.CloseHook;
+import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.RequestHandlerBase;
@@ -201,8 +203,9 @@ public class SearchHandler extends RequestHandlerBase implements SolrCoreAware ,
   private ShardHandler getAndPrepShardHandler(SolrQueryRequest req, ResponseBuilder rb) {
     ShardHandler shardHandler = null;
 
-    rb.isDistrib = req.getParams().getBool("distrib", req.getCore().getCoreDescriptor()
-        .getCoreContainer().isZooKeeperAware());
+    CoreContainer cc = req.getCore().getCoreDescriptor().getCoreContainer();
+    boolean isZkAware = cc.isZooKeeperAware();
+    rb.isDistrib = req.getParams().getBool("distrib", isZkAware);
     if (!rb.isDistrib) {
       // for back compat, a shards param with URLs like localhost:8983/solr will mean that this
       // search is distributed.
@@ -218,6 +221,18 @@ public class SearchHandler extends RequestHandlerBase implements SolrCoreAware ,
       }
     }
 
+    if(isZkAware) {
+      ZkController zkController = cc.getZkController();
+      NamedList<Object> headers = rb.rsp.getResponseHeader();
+      if(headers != null) {
+        headers.add("zkConnected", 
+            zkController != null 
+          ? !zkController.getZkClient().getConnectionManager().isLikelyExpired() 
+          : false);
+      }
+      
+    }
+
     return shardHandler;
   }
   

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d6105334/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java
index 7a3a640..b95a5f6 100644
--- a/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java
@@ -198,10 +198,13 @@ public class PingRequestHandlerTest extends SolrTestCaseJ4 {
       reqDistrib.setDistrib(true);
       SolrPingResponse rsp = reqDistrib.process(cloudSolrClient, collectionName);
       assertEquals(0, rsp.getStatus()); 
+      assertTrue(rsp.getResponseHeader().getBooleanArg(("zkConnected")));
+
       
       SolrPing reqNonDistrib = new SolrPing();
       rsp = reqNonDistrib.process(cloudSolrClient, collectionName);
       assertEquals(0, rsp.getStatus());   
+      assertTrue(rsp.getResponseHeader().getBooleanArg(("zkConnected")));
 
       // delete the collection we created earlier
       miniCluster.deleteCollection(collectionName);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d6105334/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java
index f35754b..7e8ab47 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java
@@ -16,12 +16,22 @@
  */
 package org.apache.solr.handler.component;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.client.solrj.SolrResponse;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.request.SolrPing;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.client.solrj.response.SolrPingResponse;
+import org.apache.solr.cloud.MiniSolrCloudCluster;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.response.SolrQueryResponse;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -99,4 +109,41 @@ public class SearchHandlerTest extends SolrTestCaseJ4
     //Debug component is always last in this case
     assertEquals( core.getSearchComponent( DebugComponent.COMPONENT_NAME ), comps.get( comps.size()-1 ) );
   }
+  
+  @Test
+  public void testZkConnected() throws Exception{
+    MiniSolrCloudCluster miniCluster = new MiniSolrCloudCluster(5, createTempDir(), buildJettyConfig("/solr"));
+
+    final CloudSolrClient cloudSolrClient = miniCluster.getSolrClient();
+
+    try {
+      assertNotNull(miniCluster.getZkServer());
+      List<JettySolrRunner> jettys = miniCluster.getJettySolrRunners();
+      assertEquals(5, jettys.size());
+      for (JettySolrRunner jetty : jettys) {
+        assertTrue(jetty.isRunning());
+      }
+
+      // create collection
+      String collectionName = "testSolrCloudCollection";
+      String configName = "solrCloudCollectionConfig";
+      File configDir = new File(SolrTestCaseJ4.TEST_HOME() + File.separator + "collection1" + File.separator + "conf");
+      miniCluster.uploadConfigDir(configDir, configName);
+      miniCluster.createCollection(collectionName, 2, 2, configName, null); 
+   
+      
+    
+      QueryRequest req = new QueryRequest();
+      QueryResponse rsp = req.process(cloudSolrClient, collectionName);
+      assertTrue(rsp.getResponseHeader().getBooleanArg("zkConnected"));
+    
+      
+      // delete the collection we created earlier
+      miniCluster.deleteCollection(collectionName);
+
+    }
+    finally {
+      miniCluster.shutdown();
+    }
+  }
 }