You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by ma...@apache.org on 2010/02/01 15:56:17 UTC

svn commit: r905295 - in /lucene/solr/branches/cloud/src: java/org/apache/solr/cloud/ZkController.java java/org/apache/solr/core/CoreContainer.java test/org/apache/solr/cloud/AbstractZkTestCase.java test/org/apache/solr/cloud/CloudStateUpdateTest.java

Author: markrmiller
Date: Mon Feb  1 14:56:17 2010
New Revision: 905295

URL: http://svn.apache.org/viewvc?rev=905295&view=rev
Log:
add more rigorous testing for cloud state updates and sharing

Added:
    lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
Modified:
    lucene/solr/branches/cloud/src/java/org/apache/solr/cloud/ZkController.java
    lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java
    lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/AbstractZkTestCase.java

Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/cloud/ZkController.java?rev=905295&r1=905294&r2=905295&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/cloud/ZkController.java Mon Feb  1 14:56:17 2010
@@ -69,6 +69,8 @@
 
   static final String NEWL = System.getProperty("line.separator");
 
+  private static final long CLOUD_UPDATE_DELAY = Long.parseLong(System.getProperty("CLOUD_UPDATE_DELAY", "5000"));
+
   private final static Pattern URL_POST = Pattern.compile("https?://(.*)");
   private final static Pattern URL_PREFIX = Pattern.compile("(https?://).*");
 
@@ -416,6 +418,7 @@
       this.cloudState = cloudState;
     } else {
       if(cloudStateUpdateScheduled) {
+        log.info("Cloud state update for ZooKeeper already scheduled");
         return;
       }
       log.info("Scheduling cloud state update from ZooKeeper...");
@@ -425,6 +428,7 @@
         public void run() {
           log.info("Updating cloud state from ZooKeeper...");
           synchronized (ZkController.this) {
+            cloudStateUpdateScheduled = false;
             CloudState cloudState;
             try {
               cloudState = CloudState.buildCloudState(zkClient);
@@ -445,10 +449,9 @@
             }
             // update volatile
             ZkController.this.cloudState = cloudState;
-            cloudStateUpdateScheduled = false;
           }
         }
-      }, 5000, TimeUnit.MILLISECONDS);
+      }, CLOUD_UPDATE_DELAY, TimeUnit.MILLISECONDS);
     }
 
   }

Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java?rev=905295&r1=905294&r2=905295&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java Mon Feb  1 14:56:17 2010
@@ -165,7 +165,7 @@
     protected String solrConfigFilename = null;
     protected boolean abortOnConfigurationError = true;
     protected String dataDir = null; // override datadir for single core mode
-    private String zkPortOverride;
+    protected String zkPortOverride;
     protected String testShardListOverride;
 
     public boolean isAbortOnConfigurationError() {

Modified: lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/AbstractZkTestCase.java?rev=905295&r1=905294&r2=905295&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/AbstractZkTestCase.java Mon Feb  1 14:56:17 2010
@@ -114,9 +114,6 @@
     putConfig(zkClient, "mapping-ISOLatin1Accent.txt");
     putConfig(zkClient, "old_synonyms.txt");
     
-    //nocommit
-    zkClient.printLayoutToStdOut();
-    
     zkClient.close();
   }
 

Added: lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java?rev=905295&view=auto
==============================================================================
--- lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java (added)
+++ lucene/solr/branches/cloud/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java Mon Feb  1 14:56:17 2010
@@ -0,0 +1,170 @@
+package org.apache.solr.cloud;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.File;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.CoreDescriptor;
+import org.apache.solr.core.SolrCore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloudStateUpdateTest extends TestCase {
+  protected static Logger log = LoggerFactory
+      .getLogger(AbstractZkTestCase.class);
+
+  protected File tmpDir = new File(System.getProperty("java.io.tmpdir")
+      + System.getProperty("file.separator") + getClass().getName() + "-"
+      + System.currentTimeMillis());
+  
+  private static final boolean VERBOSE = true;
+
+  protected ZkTestServer zkServer;
+
+  protected String zkDir;
+
+  private CoreContainer container1;
+
+  private CoreContainer container2;
+  
+  private CoreContainer container3;
+
+  private File dataDir1;
+
+  private File dataDir2;
+
+  public void setUp() throws Exception {
+    try {
+      System.setProperty("zkHost", AbstractZkTestCase.ZOO_KEEPER_ADDRESS);
+      zkDir = tmpDir.getAbsolutePath() + File.separator
+          + "zookeeper/server1/data";
+      zkServer = new ZkTestServer(zkDir);
+      zkServer.run();
+
+      AbstractZkTestCase.buildZooKeeper("solrconfig.xml", "schema.xml");
+
+      log.info("####SETUP_START " + getName());
+      dataDir1 = new File(tmpDir + File.separator + "data1");
+      dataDir1.mkdirs();
+
+      dataDir2 = new File(tmpDir + File.separator + "data2");
+      dataDir2.mkdirs();
+
+      // set some system properties for use by tests
+      System.setProperty("solr.test.sys.prop1", "propone");
+      System.setProperty("solr.test.sys.prop2", "proptwo");
+
+      CoreContainer.Initializer init1 = new CoreContainer.Initializer() {
+        {
+          this.dataDir = CloudStateUpdateTest.this.dataDir1.getAbsolutePath();
+          this.zkPortOverride = "8983";
+        }
+      };
+
+      container1 = init1.initialize();
+
+      CoreContainer.Initializer init2 = new CoreContainer.Initializer() {
+        {
+          this.dataDir = CloudStateUpdateTest.this.dataDir2.getAbsolutePath();
+          this.zkPortOverride = "8984";
+        }
+      };
+
+      container2 = init2.initialize();
+      
+      CoreContainer.Initializer init3 = new CoreContainer.Initializer() {
+        {
+          this.dataDir = CloudStateUpdateTest.this.dataDir2.getAbsolutePath();
+          this.zkPortOverride = "8985";
+        }
+      };
+
+      container3 = init3.initialize();
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+    log.info("####SETUP_END " + getName());
+
+  }
+  
+  public void testCoreRegistration() throws Exception {
+    System.setProperty("CLOUD_UPDATE_DELAY", "1");
+    CoreDescriptor dcore= new CoreDescriptor(container1, "testcore", "testcore");
+
+    SolrCore core = container1.create(dcore);
+    container1.register(core, false);
+    
+    // slight pause - TODO: takes an oddly long amount of time to schedule tasks with almost no delay ...
+    Thread.sleep(5000);
+    
+    ZkController zkController2 = container2.getZooKeeperController();
+    
+    CloudState cloudState2 = zkController2.getCloudState();
+    Map<String,Slice> slices = cloudState2.getSlices("testcore");
+    
+    assertNotNull(slices);
+    assertTrue(slices.containsKey("thequadway:8983_solr_testcore"));
+    
+    Slice slice = slices.get("thequadway:8983_solr_testcore");
+    assertEquals("thequadway:8983_solr_testcore", slice.getName());
+    
+    Map<String,ZkNodeProps> shards = slice.getShards();
+    
+    assertEquals(1, shards.size());
+    
+    ZkNodeProps zkProps = shards.get("thequadway:8983_solr_testcore");
+    
+    assertNotNull(zkProps);
+    
+    assertEquals("thequadway:8983_solr", zkProps.get("node_name"));
+    
+    assertEquals("http://thequadway:8983/solr/testcore", zkProps.get("url"));
+    
+    Set<String> liveNodes = cloudState2.getLiveNodes();
+    assertNotNull(liveNodes);
+    assertEquals(3, liveNodes.size());
+    
+    container3.shutdown();
+    
+    liveNodes = zkController2.getCloudState().getLiveNodes();
+    
+    // nocommit - fix update cloud state when nodes removed
+    //assertEquals(2, liveNodes.size());
+  }
+
+  public void tearDown() throws Exception {
+    if(VERBOSE) {
+      printLayout();
+    }
+    super.tearDown();
+    zkServer.shutdown();
+  }
+
+  private void printLayout() throws Exception {
+    SolrZkClient zkClient = new SolrZkClient(
+        AbstractZkTestCase.ZOO_KEEPER_SERVER, AbstractZkTestCase.TIMEOUT);
+    zkClient.printLayoutToStdOut();
+    zkClient.close();
+  }
+}