You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2017/07/25 09:06:29 UTC

[44/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-8736: these tests should have been removed

SOLR-8736: these tests should have been removed


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

Branch: refs/heads/feature/autoscaling
Commit: a323f55d7913dc85ffacf85c79a28c5f2e48b51e
Parents: 97ca529
Author: Noble Paul <no...@apache.org>
Authored: Mon Jul 24 21:22:00 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Mon Jul 24 21:22:00 2017 +0930

----------------------------------------------------------------------
 .../rest/schema/TestClassNameShortening.java    |  76 --
 .../TestCloudManagedSchemaConcurrent.java       | 717 -------------------
 2 files changed, 793 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a323f55d/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java b/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
deleted file mode 100644
index 07f7995..0000000
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.
- */
-package org.apache.solr.rest.schema;
-
-import org.apache.lucene.util.LuceneTestCase.AwaitsFix;
-
-import org.apache.solr.util.RestTestBase;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.restlet.ext.servlet.ServerServlet;
-
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-@AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-10142")
-public class TestClassNameShortening extends RestTestBase {
-
-  @BeforeClass
-  public static void init() throws Exception {
-    final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
-    final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
-    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
-    extraServlets.put(solrRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
-
-    createJettyAndHarness(TEST_HOME(), "solrconfig-minimal.xml", "schema-class-name-shortening-on-serialization.xml", 
-                          "/solr", true, extraServlets);
-  }
-
-  @Test
-  public void testClassNamesNotShortened() throws Exception {
-    assertQ("/schema/fieldtypes/fullClassNames?indent=on&wt=xml&showDefaults=true",
-            "count(/response/lst[@name='fieldType']) = 1",
-            "/response/lst[@name='fieldType']/str[@name='class'] = 'org.apache.solr.schema.TextField'",
-            "//arr[@name='charFilters']/lst/str[@name='class'] = 'org.apache.solr.analysis.MockCharFilterFactory'",
-            "//lst[@name='tokenizer']/str[@name='class'] = 'org.apache.solr.analysis.MockTokenizerFactory'",
-            "//arr[@name='filters']/lst/str[@name='class'] = 'org.apache.solr.analysis.MockTokenFilterFactory'",
-            "/response/lst[@name='fieldType']/lst[@name='similarity']/str[@name='class'] = 'org.apache.lucene.misc.SweetSpotSimilarity'");
-  }
-
-  /** 
-   * See {@link TestSchemaSimilarityResource#testGetSchemaSimilarity} for where the long class name
-   * is verified when the config doesn't specify a sim at all
-   */
-  @Test
-  public void testShortenedGlobalSimilarityStaysShortened() throws Exception {
-    assertQ("/schema/similarity?indent=on&wt=xml",
-            "count(/response/lst[@name='similarity']) = 1",
-            "/response/lst[@name='similarity']/str[@name='class'][.='solr.SchemaSimilarityFactory']");
-  }
-
-  @Test
-  public void testShortenedClassNamesStayShortened() throws Exception {
-    assertQ("/schema/fieldtypes/shortenedClassNames?indent=on&wt=xml&showDefaults=true",
-            "count(/response/lst[@name='fieldType']) = 1",
-            "/response/lst[@name='fieldType']/str[@name='class'] = 'solr.TextField'",
-            "//arr[@name='charFilters']/lst/str[@name='class'] = 'solr.MockCharFilterFactory'",
-            "//lst[@name='tokenizer']/str[@name='class'] = 'solr.MockTokenizerFactory'",
-            "//arr[@name='filters']/lst/str[@name='class'] = 'solr.MockTokenFilterFactory'",
-            "/response/lst[@name='fieldType']/lst[@name='similarity']/str[@name='class'] = 'solr.SweetSpotSimilarityFactory'");
-  }
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a323f55d/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaConcurrent.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaConcurrent.java b/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaConcurrent.java
deleted file mode 100644
index 703b42b..0000000
--- a/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaConcurrent.java
+++ /dev/null
@@ -1,717 +0,0 @@
-/*
- * 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.
- */
-package org.apache.solr.schema;
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.embedded.JettySolrRunner;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
-import org.apache.solr.common.cloud.ClusterState;
-import org.apache.solr.common.cloud.Replica;
-import org.apache.solr.common.cloud.Slice;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkCoreNodeProps;
-import org.apache.solr.util.BaseTestHarness;
-import org.apache.solr.util.RestTestHarness;
-import org.apache.zookeeper.data.Stat;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.restlet.ext.servlet.ServerServlet;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-@Ignore
-public class TestCloudManagedSchemaConcurrent extends AbstractFullDistribZkTestBase {
-  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-  private static final String SUCCESS_XPATH = "/response/lst[@name='responseHeader']/int[@name='status'][.='0']";
-  private static final String PUT_DYNAMIC_FIELDNAME = "newdynamicfieldPut";
-  private static final String POST_DYNAMIC_FIELDNAME = "newdynamicfieldPost";
-  private static final String PUT_FIELDNAME = "newfieldPut";
-  private static final String POST_FIELDNAME = "newfieldPost";
-  private static final String PUT_FIELDTYPE = "newfieldtypePut";
-  private static final String POST_FIELDTYPE = "newfieldtypePost";
-
-  public TestCloudManagedSchemaConcurrent() {
-    super();
-    sliceCount = 4;
-  }
-
-  @BeforeClass
-  public static void initSysProperties() {
-    System.setProperty("managed.schema.mutable", "true");
-    System.setProperty("enable.update.log", "true");
-  }
-
-  @Override
-  public void distribTearDown() throws Exception {
-    super.distribTearDown();
-    for (RestTestHarness h : restTestHarnesses) {
-      h.close();
-    }
-  }
-
-  @Override
-  protected String getCloudSolrConfig() {
-    return "solrconfig-managed-schema.xml";
-  }
-
-  @Override
-  public SortedMap<ServletHolder,String> getExtraServlets() {
-    final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
-    final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
-    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
-    extraServlets.put(solrRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
-    return extraServlets;
-  }
-  
-  private List<RestTestHarness> restTestHarnesses = new ArrayList<>();
-  
-  private void setupHarnesses() {
-    for (final SolrClient client : clients) {
-      RestTestHarness harness = new RestTestHarness(() -> ((HttpSolrClient)client).getBaseURL());
-      restTestHarnesses.add(harness);
-    }
-  }
-
-  private static void verifySuccess(String request, String response) throws Exception {
-    String result = BaseTestHarness.validateXPath(response, SUCCESS_XPATH);
-    if (null != result) {
-      String msg = "QUERY FAILED: xpath=" + result + "  request=" + request + "  response=" + response;
-      log.error(msg);
-      fail(msg);
-    }
-  }
-
-  private static void addFieldPut(RestTestHarness publisher, String fieldName, int updateTimeoutSecs) throws Exception {
-    final String content = "{\"type\":\"text\",\"stored\":\"false\"}";
-    String request = "/schema/fields/" + fieldName + "?wt=xml";
-    if (updateTimeoutSecs > 0)
-      request += "&updateTimeoutSecs="+updateTimeoutSecs;
-    String response = publisher.put(request, content);
-    verifySuccess(request, response);
-  }
-
-  private static void addFieldPost(RestTestHarness publisher, String fieldName, int updateTimeoutSecs) throws Exception {
-    final String content = "[{\"name\":\""+fieldName+"\",\"type\":\"text\",\"stored\":\"false\"}]";
-    String request = "/schema/fields/?wt=xml";
-    if (updateTimeoutSecs > 0)
-      request += "&updateTimeoutSecs="+updateTimeoutSecs;
-    String response = publisher.post(request, content);
-    verifySuccess(request, response);
-  }
-
-  private static void addDynamicFieldPut(RestTestHarness publisher, String dynamicFieldPattern, int updateTimeoutSecs) throws Exception {
-    final String content = "{\"type\":\"text\",\"stored\":\"false\"}";
-    String request = "/schema/dynamicfields/" + dynamicFieldPattern + "?wt=xml";
-    if (updateTimeoutSecs > 0)
-      request += "&updateTimeoutSecs="+updateTimeoutSecs;
-    String response = publisher.put(request, content);
-    verifySuccess(request, response);
-  }
-
-  private static void addDynamicFieldPost(RestTestHarness publisher, String dynamicFieldPattern, int updateTimeoutSecs) throws Exception {
-    final String content = "[{\"name\":\""+dynamicFieldPattern+"\",\"type\":\"text\",\"stored\":\"false\"}]";
-    String request = "/schema/dynamicfields/?wt=xml";
-    if (updateTimeoutSecs > 0)
-      request += "&updateTimeoutSecs="+updateTimeoutSecs;
-    String response = publisher.post(request, content);
-    verifySuccess(request, response);
-  }
-
-  private static void copyField(RestTestHarness publisher, String source, String dest, int updateTimeoutSecs) throws Exception {
-    final String content = "[{\"source\":\""+source+"\",\"dest\":[\""+dest+"\"]}]";
-    String request = "/schema/copyfields/?wt=xml";
-    if (updateTimeoutSecs > 0)
-      request += "&updateTimeoutSecs="+updateTimeoutSecs;
-    String response = publisher.post(request, content);
-    verifySuccess(request, response);
-  }
-
-  private static void addFieldTypePut(RestTestHarness publisher, String typeName, int updateTimeoutSecs) throws Exception {
-    final String content = "{\"class\":\""+RANDOMIZED_NUMERIC_FIELDTYPES.get(Integer.class)+"\"}";
-    String request = "/schema/fieldtypes/" + typeName + "?wt=xml";
-    if (updateTimeoutSecs > 0)
-      request += "&updateTimeoutSecs="+updateTimeoutSecs;
-    String response = publisher.put(request, content);
-    verifySuccess(request, response);
-  }
-
-  private static void addFieldTypePost(RestTestHarness publisher, String typeName, int updateTimeoutSecs) throws Exception {
-    final String content = "[{\"name\":\""+typeName+"\",\"class\":\""+RANDOMIZED_NUMERIC_FIELDTYPES.get(Integer.class)+"\"}]";
-    String request = "/schema/fieldtypes/?wt=xml";
-    if (updateTimeoutSecs > 0)
-      request += "&updateTimeoutSecs="+updateTimeoutSecs;
-    String response = publisher.post(request, content);
-    verifySuccess(request, response);
-  }
-
-  private String[] getExpectedFieldResponses(Info info) {
-    String[] expectedAddFields = new String[1 + info.numAddFieldPuts + info.numAddFieldPosts];
-    expectedAddFields[0] = SUCCESS_XPATH;
-
-    for (int i = 0; i < info.numAddFieldPuts; ++i) {
-      String newFieldName = PUT_FIELDNAME + info.fieldNameSuffix + i;
-      expectedAddFields[1 + i] 
-          = "/response/arr[@name='fields']/lst/str[@name='name'][.='" + newFieldName + "']";
-    }
-
-    for (int i = 0; i < info.numAddFieldPosts; ++i) {
-      String newFieldName = POST_FIELDNAME + info.fieldNameSuffix + i;
-      expectedAddFields[1 + info.numAddFieldPuts + i]
-          = "/response/arr[@name='fields']/lst/str[@name='name'][.='" + newFieldName + "']";
-    }
-
-    return expectedAddFields;
-  }
-
-  private String[] getExpectedDynamicFieldResponses(Info info) {
-    String[] expectedAddDynamicFields = new String[1 + info.numAddDynamicFieldPuts + info.numAddDynamicFieldPosts];
-    expectedAddDynamicFields[0] = SUCCESS_XPATH;
-
-    for (int i = 0; i < info.numAddDynamicFieldPuts; ++i) {
-      String newDynamicFieldPattern = PUT_DYNAMIC_FIELDNAME + info.fieldNameSuffix + i + "_*";
-      expectedAddDynamicFields[1 + i]
-          = "/response/arr[@name='dynamicFields']/lst/str[@name='name'][.='" + newDynamicFieldPattern + "']";
-    }
-
-    for (int i = 0; i < info.numAddDynamicFieldPosts; ++i) {
-      String newDynamicFieldPattern = POST_DYNAMIC_FIELDNAME + info.fieldNameSuffix + i + "_*";
-      expectedAddDynamicFields[1 + info.numAddDynamicFieldPuts + i]
-          = "/response/arr[@name='dynamicFields']/lst/str[@name='name'][.='" + newDynamicFieldPattern + "']";
-    }
-
-    return expectedAddDynamicFields;
-  }
-
-  private String[] getExpectedCopyFieldResponses(Info info) {
-    ArrayList<String> expectedCopyFields = new ArrayList<>();
-    expectedCopyFields.add(SUCCESS_XPATH);
-    for (CopyFieldInfo cpi : info.copyFields) {
-      String expectedSourceName = cpi.getSourceField();
-      expectedCopyFields.add
-          ("/response/arr[@name='copyFields']/lst/str[@name='source'][.='" + expectedSourceName + "']");
-      String expectedDestName = cpi.getDestField();
-      expectedCopyFields.add
-          ("/response/arr[@name='copyFields']/lst/str[@name='dest'][.='" + expectedDestName + "']");
-    }
-
-    return expectedCopyFields.toArray(new String[expectedCopyFields.size()]);
-  }
-
-  private String[] getExpectedFieldTypeResponses(Info info) {
-    String[] expectedAddFieldTypes = new String[1 + info.numAddFieldTypePuts + info.numAddFieldTypePosts];
-    expectedAddFieldTypes[0] = SUCCESS_XPATH;
-
-    for (int i = 0; i < info.numAddFieldTypePuts; ++i) {
-      String newFieldTypeName = PUT_FIELDTYPE + info.fieldNameSuffix + i;
-      expectedAddFieldTypes[1 + i]
-          = "/response/arr[@name='fieldTypes']/lst/str[@name='name'][.='" + newFieldTypeName + "']";
-    }
-
-    for (int i = 0; i < info.numAddFieldTypePosts; ++i) {
-      String newFieldTypeName = POST_FIELDTYPE + info.fieldNameSuffix + i;
-      expectedAddFieldTypes[1 + info.numAddFieldTypePuts + i]
-          = "/response/arr[@name='fieldTypes']/lst/str[@name='name'][.='" + newFieldTypeName + "']";
-    }
-
-    return expectedAddFieldTypes;
-  }
-
-
-  @Test
-  @ShardsFixed(num = 8)
-  public void test() throws Exception {
-    verifyWaitForSchemaUpdateToPropagate();
-    setupHarnesses();
-    concurrentOperationsTest();
-    schemaLockTest();
-  }
-  
-  private static class Info {
-    int numAddFieldPuts = 0;
-    int numAddFieldPosts = 0;
-    int numAddDynamicFieldPuts = 0;
-    int numAddDynamicFieldPosts = 0;
-    int numAddFieldTypePuts = 0;
-    int numAddFieldTypePosts = 0;
-    public String fieldNameSuffix;
-    List<CopyFieldInfo> copyFields = new ArrayList<>();
-
-    public Info(String fieldNameSuffix) {
-      this.fieldNameSuffix = fieldNameSuffix;
-    }
-  }
-
-  private enum Operation {
-    PUT_AddField {
-      @Override public void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception {
-        String fieldname = PUT_FIELDNAME + info.numAddFieldPuts++;
-        addFieldPut(publisher, fieldname, 15);
-      }
-    },
-    POST_AddField {
-      @Override public void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception {
-        String fieldname = POST_FIELDNAME + info.numAddFieldPosts++;
-        addFieldPost(publisher, fieldname, 15);
-      }
-    },
-    PUT_AddDynamicField {
-      @Override public void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception {
-        addDynamicFieldPut(publisher, PUT_DYNAMIC_FIELDNAME + info.numAddDynamicFieldPuts++ + "_*", 15);
-      }
-    },
-    POST_AddDynamicField {
-      @Override public void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception {
-        addDynamicFieldPost(publisher, POST_DYNAMIC_FIELDNAME + info.numAddDynamicFieldPosts++ + "_*", 15);
-      }
-    },
-    POST_AddCopyField {
-      @Override public void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception {
-        String sourceField = null;
-        String destField = null;
-
-        int sourceType = random().nextInt(3);
-        if (sourceType == 0) {  // existing
-          sourceField = "name";
-        } else if (sourceType == 1) { // newly created
-          sourceField = "copySource" + fieldNum;
-          addFieldPut(publisher, sourceField, 15);
-        } else { // dynamic
-          sourceField = "*_dynamicSource" + fieldNum + "_t";
-          // * only supported if both src and dst use it
-          destField = "*_dynamicDest" + fieldNum + "_t";
-        }
-
-        if (destField == null) {
-          int destType = random().nextInt(2);
-          if (destType == 0) {  // existing
-            destField = "title";
-          } else { // newly created
-            destField = "copyDest" + fieldNum;
-            addFieldPut(publisher, destField, 15);
-          }
-        }
-        copyField(publisher, sourceField, destField, 15);
-        info.copyFields.add(new CopyFieldInfo(sourceField, destField));
-      }
-    },
-    PUT_AddFieldType {
-      @Override public void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception {
-        String typeName = PUT_FIELDTYPE + info.numAddFieldTypePuts++;
-        addFieldTypePut(publisher, typeName, 15);
-      }
-    },
-    POST_AddFieldType {
-      @Override public void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception {
-        String typeName = POST_FIELDTYPE + info.numAddFieldTypePosts++;
-        addFieldTypePost(publisher, typeName, 15);
-      }
-    };
-
-
-    public abstract void execute(RestTestHarness publisher, int fieldNum, Info info) throws Exception;
-
-    private static final Operation[] VALUES = values();
-    public static Operation randomOperation()  {
-      return VALUES[r.nextInt(VALUES.length)];
-    }
-  }
-
-  private void verifyWaitForSchemaUpdateToPropagate() throws Exception {
-    String testCollectionName = "collection1";
-
-    ClusterState clusterState = cloudClient.getZkStateReader().getClusterState();
-    Replica shard1Leader = clusterState.getLeader(testCollectionName, "shard1");
-    final String coreUrl = (new ZkCoreNodeProps(shard1Leader)).getCoreUrl();
-    assertNotNull(coreUrl);
-
-    RestTestHarness harness = new RestTestHarness(() -> coreUrl.endsWith("/") ? coreUrl.substring(0, coreUrl.length()-1) : coreUrl);
-    try {
-      addFieldTypePut(harness, "fooInt", 15);
-    } finally {
-      harness.close();
-    }
-
-    // go into ZK to get the version of the managed schema after the update
-    SolrZkClient zkClient = cloudClient.getZkStateReader().getZkClient();
-    Stat stat = new Stat();
-    String znodePath = "/configs/conf1/managed-schema";
-    byte[] managedSchemaBytes = zkClient.getData(znodePath, null, stat, false);
-    int schemaZkVersion = stat.getVersion();
-
-    // now loop over all replicas and verify each has the same schema version
-    Replica randomReplicaNotLeader = null;
-    for (Slice slice : clusterState.getActiveSlices(testCollectionName)) {
-      for (Replica replica : slice.getReplicas()) {
-        validateZkVersion(replica, schemaZkVersion, 0, false);
-
-        // save a random replica to test zk watcher behavior
-        if (randomReplicaNotLeader == null && !replica.getName().equals(shard1Leader.getName()))
-          randomReplicaNotLeader = replica;
-      }
-    }
-    assertNotNull(randomReplicaNotLeader);
-
-    // now update the data and then verify the znode watcher fires correctly
-    // before an after a zk session expiration (see SOLR-6249)
-    zkClient.setData(znodePath, managedSchemaBytes, schemaZkVersion, false);
-    stat = new Stat();
-    managedSchemaBytes = zkClient.getData(znodePath, null, stat, false);
-    int updatedSchemaZkVersion = stat.getVersion();
-    assertTrue(updatedSchemaZkVersion > schemaZkVersion);
-    validateZkVersion(randomReplicaNotLeader, updatedSchemaZkVersion, 2, true);
-
-    // ok - looks like the watcher fired correctly on the replica
-    // now, expire that replica's zk session and then verify the watcher fires again (after reconnect)
-    JettySolrRunner randomReplicaJetty =
-        getJettyOnPort(getReplicaPort(randomReplicaNotLeader));
-    assertNotNull(randomReplicaJetty);
-    chaosMonkey.expireSession(randomReplicaJetty);
-
-    // update the data again to cause watchers to fire
-    zkClient.setData(znodePath, managedSchemaBytes, updatedSchemaZkVersion, false);
-    stat = new Stat();
-    managedSchemaBytes = zkClient.getData(znodePath, null, stat, false);
-    updatedSchemaZkVersion = stat.getVersion();
-    // give up to 10 secs for the replica to recover after zk session loss and see the update
-    validateZkVersion(randomReplicaNotLeader, updatedSchemaZkVersion, 10, true);
-  }
-
-  /**
-   * Sends a GET request to get the zk schema version from a specific replica.
-   */
-  protected void validateZkVersion(Replica replica, int schemaZkVersion, int waitSecs, boolean retry) throws Exception {
-    final String replicaUrl = (new ZkCoreNodeProps(replica)).getCoreUrl();
-    RestTestHarness testHarness = new RestTestHarness(() -> replicaUrl.endsWith("/") ? replicaUrl.substring(0, replicaUrl.length()-1) : replicaUrl);
-    try {
-      long waitMs = waitSecs * 1000L;
-      if (waitMs > 0) Thread.sleep(waitMs); // wait a moment for the zk watcher to fire
-  
-      try {
-        testHarness.validateQuery("/schema/zkversion?wt=xml", "//zkversion=" + schemaZkVersion);
-      } catch (Exception exc) {
-        if (retry) {
-          // brief wait before retrying
-          Thread.sleep(waitMs > 0 ? waitMs : 2000L);
-  
-          testHarness.validateQuery("/schema/zkversion?wt=xml", "//zkversion=" + schemaZkVersion);
-        } else {
-          throw exc;
-        }
-      }
-    } finally {
-      testHarness.close();
-    }
-  }
-
-  private void concurrentOperationsTest() throws Exception {
-    
-    // First, add a bunch of fields and dynamic fields via PUT and POST, as well as copyFields,
-    // but do it fast enough and verify shards' schemas after all of them are added
-    int numFields = 100;
-    Info info = new Info("");
-
-    for (int fieldNum = 0; fieldNum <= numFields ; ++fieldNum) {
-      RestTestHarness publisher = restTestHarnesses.get(r.nextInt(restTestHarnesses.size()));
-      Operation.randomOperation().execute(publisher, fieldNum, info);
-    }
-
-    String[] expectedAddFields = getExpectedFieldResponses(info);
-    String[] expectedAddDynamicFields = getExpectedDynamicFieldResponses(info);
-    String[] expectedCopyFields = getExpectedCopyFieldResponses(info);
-    String[] expectedAddFieldTypes = getExpectedFieldTypeResponses(info);
-
-    boolean success = false;
-    long maxTimeoutMillis = 100000;
-    long startTime = System.nanoTime();
-    String request = null;
-    String response = null;
-    String result = null;
-
-    while ( ! success 
-           && TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutMillis) {
-      Thread.sleep(100);
-
-      for (RestTestHarness client : restTestHarnesses) {
-        // verify addFieldTypePuts and addFieldTypePosts
-        request = "/schema/fieldtypes?wt=xml";
-        response = client.query(request);
-        result = BaseTestHarness.validateXPath(response, expectedAddFieldTypes);
-        if (result != null) {
-          break;
-        }
-
-        // verify addFieldPuts and addFieldPosts
-        request = "/schema/fields?wt=xml";
-        response = client.query(request);
-        result = BaseTestHarness.validateXPath(response, expectedAddFields);
-        if (result != null) {
-          break;
-        }
-
-        // verify addDynamicFieldPuts and addDynamicFieldPosts
-        request = "/schema/dynamicfields?wt=xml";
-        response = client.query(request);
-        result = BaseTestHarness.validateXPath(response, expectedAddDynamicFields);
-        if (result != null) {
-          break;
-        }
-
-        // verify copyFields
-        request = "/schema/copyfields?wt=xml";
-        response = client.query(request);
-        result = BaseTestHarness.validateXPath(response, expectedCopyFields);
-        if (result != null) {
-          break;
-        }
-      }
-      success = (result == null);
-    }
-    if ( ! success) {
-      String msg = "QUERY FAILED: xpath=" + result + "  request=" + request + "  response=" + response;
-      log.error(msg);
-      fail(msg);
-    }
-  }
-
-  private abstract class PutPostThread extends Thread {
-    RestTestHarness harness;
-    Info info;
-    public String fieldName;
-
-    public PutPostThread(RestTestHarness harness, Info info) {
-      this.harness = harness;
-      this.info = info;
-    }
-
-    public abstract void run();
-  }
-  
-  private class PutFieldThread extends PutPostThread {
-    public PutFieldThread(RestTestHarness harness, Info info) {
-      super(harness, info);
-      fieldName = PUT_FIELDNAME + "Thread" + info.numAddFieldPuts++;
-    }
-    public void run() {
-      try {
-        // don't have the client side wait for all replicas to see the update or that defeats the purpose
-        // of testing the locking support on the server-side
-        addFieldPut(harness, fieldName, -1);
-      } catch (Exception e) {
-        // log.error("###ACTUAL FAILURE!");
-        throw new RuntimeException(e);
-      }
-    }
-  }
-  
-  private class PostFieldThread extends PutPostThread {
-    public PostFieldThread(RestTestHarness harness, Info info) {
-      super(harness, info);
-      fieldName = POST_FIELDNAME + "Thread" + info.numAddFieldPosts++;
-    }
-    public void run() {
-      try {
-        addFieldPost(harness, fieldName, -1);
-      } catch (Exception e) {
-        // log.error("###ACTUAL FAILURE!");
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  private class PutFieldTypeThread extends PutPostThread {
-    public PutFieldTypeThread(RestTestHarness harness, Info info) {
-      super(harness, info);
-      fieldName = PUT_FIELDTYPE + "Thread" + info.numAddFieldTypePuts++;
-    }
-    public void run() {
-      try {
-        addFieldTypePut(harness, fieldName, -1);
-      } catch (Exception e) {
-        // log.error("###ACTUAL FAILURE!");
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  private class PostFieldTypeThread extends PutPostThread {
-    public PostFieldTypeThread(RestTestHarness harness, Info info) {
-      super(harness, info);
-      fieldName = POST_FIELDTYPE + "Thread" + info.numAddFieldTypePosts++;
-    }
-    public void run() {
-      try {
-        addFieldTypePost(harness, fieldName, -1);
-      } catch (Exception e) {
-        // log.error("###ACTUAL FAILURE!");
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  private class PutDynamicFieldThread extends PutPostThread {
-    public PutDynamicFieldThread(RestTestHarness harness, Info info) {
-      super(harness, info);
-      fieldName = PUT_FIELDNAME + "Thread" + info.numAddFieldPuts++;
-    }
-    public void run() {
-      try {
-        addFieldPut(harness, fieldName, -1);
-      } catch (Exception e) {
-        // log.error("###ACTUAL FAILURE!");
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  private class PostDynamicFieldThread extends PutPostThread {
-    public PostDynamicFieldThread(RestTestHarness harness, Info info) {
-      super(harness, info);
-      fieldName = POST_FIELDNAME + "Thread" + info.numAddFieldPosts++;
-    }
-    public void run() {
-      try {
-        addFieldPost(harness, fieldName, -1);
-      } catch (Exception e) {
-        // log.error("###ACTUAL FAILURE!");
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  private void schemaLockTest() throws Exception {
-
-    // First, add a bunch of fields via PUT and POST, as well as copyFields,
-    // but do it fast enough and verify shards' schemas after all of them are added
-    int numFields = 5;
-    Info info = new Info("Thread");
-
-    for (int i = 0; i <= numFields ; ++i) {
-      // System.err.println("###ITERATION: " + i);
-      RestTestHarness publisher = restTestHarnesses.get(r.nextInt(restTestHarnesses.size()));
-      PostFieldThread postFieldThread = new PostFieldThread(publisher, info);
-      postFieldThread.start();
-
-      publisher = restTestHarnesses.get(r.nextInt(restTestHarnesses.size()));
-      PutFieldThread putFieldThread = new PutFieldThread(publisher, info);
-      putFieldThread.start();
-
-      publisher = restTestHarnesses.get(r.nextInt(restTestHarnesses.size()));
-      PostDynamicFieldThread postDynamicFieldThread = new PostDynamicFieldThread(publisher, info);
-      postDynamicFieldThread.start();
-
-      publisher = restTestHarnesses.get(r.nextInt(restTestHarnesses.size()));
-      PutDynamicFieldThread putDynamicFieldThread = new PutDynamicFieldThread(publisher, info);
-      putDynamicFieldThread.start();
-
-      publisher = restTestHarnesses.get(r.nextInt(restTestHarnesses.size()));
-      PostFieldTypeThread postFieldTypeThread = new PostFieldTypeThread(publisher, info);
-      postFieldTypeThread.start();
-
-      publisher = restTestHarnesses.get(r.nextInt(restTestHarnesses.size()));
-      PutFieldTypeThread putFieldTypeThread = new PutFieldTypeThread(publisher, info);
-      putFieldTypeThread.start();
-
-      postFieldThread.join();
-      putFieldThread.join();
-      postDynamicFieldThread.join();
-      putDynamicFieldThread.join();
-      postFieldTypeThread.join();
-      putFieldTypeThread.join();
-
-      String[] expectedAddFields = getExpectedFieldResponses(info);
-      String[] expectedAddFieldTypes = getExpectedFieldTypeResponses(info);
-      String[] expectedAddDynamicFields = getExpectedDynamicFieldResponses(info);
-
-      boolean success = false;
-      long maxTimeoutMillis = 100000;
-      long startTime = System.nanoTime();
-      String request = null;
-      String response = null;
-      String result = null;
-
-      while ( ! success
-          && TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutMillis) {
-        Thread.sleep(10);
-
-        // int j = 0;
-        for (RestTestHarness client : restTestHarnesses) {
-          // System.err.println("###CHECKING HARNESS: " + j++ + " for iteration: " + i);
-
-          // verify addFieldPuts and addFieldPosts
-          request = "/schema/fields?wt=xml";
-          response = client.query(request);
-          //System.err.println("###RESPONSE: " + response);
-          result = BaseTestHarness.validateXPath(response, expectedAddFields);
-          
-          if (result != null) {
-            // System.err.println("###FAILURE!");
-            break;
-          }
-
-          // verify addDynamicFieldPuts and addDynamicFieldPosts
-          request = "/schema/dynamicfields?wt=xml";
-          response = client.query(request);
-          //System.err.println("###RESPONSE: " + response);
-          result = BaseTestHarness.validateXPath(response, expectedAddDynamicFields);
-
-          if (result != null) {
-            // System.err.println("###FAILURE!");
-            break;
-          }
-
-          request = "/schema/fieldtypes?wt=xml";
-          response = client.query(request);
-          //System.err.println("###RESPONSE: " + response);
-          result = BaseTestHarness.validateXPath(response, expectedAddFieldTypes);
-
-          if (result != null) {
-            // System.err.println("###FAILURE!");
-            break;
-          }
-
-        }
-        success = (result == null);
-      }
-      if ( ! success) {
-        String msg = "QUERY FAILED: xpath=" + result + "  request=" + request + "  response=" + response;
-        log.error(msg);
-        fail(msg);
-      }
-    }
-  }
-
-  private static class CopyFieldInfo {
-    private String sourceField;
-    private String destField;
-
-    public CopyFieldInfo(String sourceField, String destField) {
-      this.sourceField = sourceField;
-      this.destField = destField;
-    }
-
-    public String getSourceField() { return sourceField; }
-    public String getDestField() { return destField; }
-  }
-}