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

lucene-solr:jira/solr-11285-sim: SOLR-11285: Javadocs + cleanup.

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-11285-sim 9b2090a84 -> c50436b7e


SOLR-11285: Javadocs + cleanup.


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

Branch: refs/heads/jira/solr-11285-sim
Commit: c50436b7ef3f6b70186dc1470d0193c9af6f4c58
Parents: 9b2090a
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Tue Dec 12 10:29:46 2017 +0100
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Tue Dec 12 10:29:46 2017 +0100

----------------------------------------------------------------------
 .../sim/GenericDistributedQueueFactory.java     |  2 +-
 .../cloud/autoscaling/sim/SimCloudManager.java  | 44 ++++++++++++++++----
 .../sim/SimClusterStateProvider.java            | 32 ++++++++++----
 .../autoscaling/sim/SimDistribStateManager.java | 19 ++++++++-
 .../autoscaling/sim/SimNodeStateProvider.java   |  3 +-
 .../autoscaling/sim/SimSolrCloudTestCase.java   | 13 ++++--
 .../sim/TestClusterStateProvider.java           |  3 +-
 .../autoscaling/sim/TestComputePlanAction.java  |  2 +-
 .../autoscaling/sim/TestExecutePlanAction.java  |  2 +-
 .../cloud/autoscaling/sim/TestLargeCluster.java |  6 ++-
 .../autoscaling/sim/TestNodeAddedTrigger.java   |  2 +-
 .../autoscaling/sim/TestNodeLostTrigger.java    |  2 +-
 .../cloud/autoscaling/sim/TestPolicyCloud.java  |  2 +-
 .../autoscaling/sim/TestTriggerIntegration.java |  2 +-
 .../cloud/autoscaling/sim/package-info.java     | 21 ++++++++++
 15 files changed, 123 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/GenericDistributedQueueFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/GenericDistributedQueueFactory.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/GenericDistributedQueueFactory.java
index d06698c..12b4af8 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/GenericDistributedQueueFactory.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/GenericDistributedQueueFactory.java
@@ -23,7 +23,7 @@ import org.apache.solr.client.solrj.cloud.DistributedQueueFactory;
 import org.apache.solr.client.solrj.cloud.autoscaling.DistribStateManager;
 
 /**
- *
+ * Factory for {@link GenericDistributedQueue}.
  */
 public class GenericDistributedQueueFactory implements DistributedQueueFactory {
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimCloudManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimCloudManager.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimCloudManager.java
index 92840c8..2d72f5f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimCloudManager.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimCloudManager.java
@@ -106,6 +106,10 @@ public class SimCloudManager implements SolrCloudManager {
 
   private static int nodeIdPort = 10000;
 
+  /**
+   * Create a simulated cluster.
+   * @param timeSource time source to use.
+   */
   public SimCloudManager(TimeSource timeSource) throws Exception {
     this.stateManager = new SimDistribStateManager();
     this.loader = new SolrResourceLoader();
@@ -135,6 +139,12 @@ public class SimCloudManager implements SolrCloudManager {
 
   // ---------- simulator setup methods -----------
 
+  /**
+   * Create a cluster with the specified number of nodes. Node metrics are pre-populated.
+   * @param numNodes number of nodes to create
+   * @param timeSource time source
+   * @return instance of simulated cluster
+   */
   public static SimCloudManager createCluster(int numNodes, TimeSource timeSource) throws Exception {
     SimCloudManager cloudManager = new SimCloudManager(timeSource);
     for (int i = 1; i <= numNodes; i++) {
@@ -149,6 +159,12 @@ public class SimCloudManager implements SolrCloudManager {
     return cloudManager;
   }
 
+  /**
+   * Create a cluster initialized from the provided cluster state.
+   * @param initialState existing cluster state
+   * @param timeSource time source
+   * @return instance of simulated cluster with the same layout as the provided cluster state.
+   */
   public static SimCloudManager createCluster(ClusterState initialState, TimeSource timeSource) throws Exception {
     SimCloudManager cloudManager = new SimCloudManager(timeSource);
     cloudManager.getSimClusterStateProvider().simSetClusterState(initialState);
@@ -159,8 +175,9 @@ public class SimCloudManager implements SolrCloudManager {
   }
 
   /**
-   * Create node values (metrics) for a node.
-   * @param nodeName node name (eg. '127.0.0.1:10000_solr')
+   * Create simulated node values (metrics) for a node.
+   * @param nodeName node name (eg. '127.0.0.1:10000_solr'). If null then a new node name will be
+   *                 created using sequentially increasing port number.
    * @return node values
    */
   public static Map<String, Object> createNodeValues(String nodeName) {
@@ -210,12 +227,16 @@ public class SimCloudManager implements SolrCloudManager {
     return values;
   }
 
+  /**
+   * Get the instance of {@link SolrResourceLoader} that is used by the cluster components.
+   */
   public SolrResourceLoader getLoader() {
     return loader;
   }
 
   /**
-   * Add a new node and initialize its node values (metrics).
+   * Add a new node and initialize its node values (metrics). The
+   * /live_nodes list is updated with the new node id.
    * @return new node id
    */
   public String simAddNode() throws Exception {
@@ -229,6 +250,7 @@ public class SimCloudManager implements SolrCloudManager {
 
   /**
    * Remove a node from the cluster. This simulates a node lost scenario.
+   * Node id is removed from the /live_nodes list.
    * @param nodeId node id
    * @param withValues when true, remove also simulated node values. If false
    *                   then node values are retained to later simulate
@@ -268,7 +290,7 @@ public class SimCloudManager implements SolrCloudManager {
 
   /**
    * Get the content of (simulated) .system collection.
-   * @return documents in the collection.
+   * @return documents in the collection, in chronological order starting from the oldest.
    */
   public List<SolrInputDocument> simGetSystemCollection() {
     return systemColl;
@@ -276,7 +298,7 @@ public class SimCloudManager implements SolrCloudManager {
 
   /**
    * Get a {@link SolrClient} implementation where calls are forwarded to this
-   * instance.
+   * instance of the cluster.
    * @return simulated SolrClient.
    */
   public SolrClient simGetSolrClient() {
@@ -296,7 +318,7 @@ public class SimCloudManager implements SolrCloudManager {
 
   /**
    * Simulate the effect of restarting Overseer leader - in this case this means restarting the
-   * OverseerTriggerThread.
+   * OverseerTriggerThread and optionally killing a node.
    * @param killNodeId optional nodeId to kill. If null then don't kill any node, just restart the thread
    */
   public void simRestartOverseer(String killNodeId) throws Exception {
@@ -339,10 +361,18 @@ public class SimCloudManager implements SolrCloudManager {
     return liveNodesSet;
   }
 
+  /**
+   * Get the number and type of operations processed by this cluster.
+   */
   public Map<String, AtomicLong> simGetOpCounts() {
     return opCounts;
   }
 
+  /**
+   * Get the number of processed operations of a specified type.
+   * @param op operation name, eg. MOVEREPLICA
+   * @return number of operations
+   */
   public long simGetOpCount(String op) {
     AtomicLong count = opCounts.get(op);
     return count != null ? count.get() : 0L;
@@ -397,7 +427,7 @@ public class SimCloudManager implements SolrCloudManager {
   }
 
   /**
-   * Handler for autoscaling requests. NOTE: only a specific subset of autoscaling requests is
+   * Handler method for autoscaling requests. NOTE: only a specific subset of autoscaling requests is
    * supported!
    * @param req autoscaling request
    * @return results

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java
index 563749f..24cb5d0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java
@@ -79,6 +79,19 @@ import static org.apache.solr.common.params.CommonParams.NAME;
 
 /**
  * Simulated {@link ClusterStateProvider}.
+ * <p>
+ *   The following behaviors are supported:
+ *   <ul>
+ *     <li>using autoscaling policy for replica placements</li>
+ *     <li>maintaining and up-to-date list of /live_nodes and nodeAdded / nodeLost markers</li>
+ *     <li>running a simulated leader election on collection changes (with throttling), when needed</li>
+ *     <li>maintaining an up-to-date /clusterstate.json (single file format), which also tracks replica states,
+ *     leader election changes, replica property changes, etc. Note: this file is only written,
+ *     but never read by the framework!</li>
+ *     <li>maintaining an up-to-date /clusterprops.json. Note: this file is only written, but never read by the
+ *     framework!</li>
+ *   </ul>
+ * </p>
  */
 public class SimClusterStateProvider implements ClusterStateProvider {
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -119,7 +132,7 @@ public class SimClusterStateProvider implements ClusterStateProvider {
     this.cloudManager = cloudManager;
     this.stateManager = cloudManager.getSimDistribStateManager();
     this.leaderThrottle = new ActionThrottle("leader", 5000, cloudManager.getTimeSource());
-    // names are CollectionAction names, delays are in ms (simulated time)
+    // names are CollectionAction operation names, delays are in ms (simulated time)
     defaultOpDelays.put(CollectionParams.CollectionAction.MOVEREPLICA.name(), 5000L);
     defaultOpDelays.put(CollectionParams.CollectionAction.DELETEREPLICA.name(), 5000L);
     defaultOpDelays.put(CollectionParams.CollectionAction.ADDREPLICA.name(), 500L);
@@ -234,8 +247,6 @@ public class SimClusterStateProvider implements ClusterStateProvider {
     }
   }
 
-  // todo: maybe hook up DistribStateManager /clusterstate.json watchers?
-
   /**
    * Remove node from a cluster. This is equivalent to a situation when a node is lost.
    * All replicas that were assigned to this node are marked as DOWN.
@@ -286,6 +297,11 @@ public class SimClusterStateProvider implements ClusterStateProvider {
     }
   }
 
+  /**
+   * Restore a previously removed node. This also simulates a short replica recovery state.
+   * @param nodeId node id to restore
+   * @return true when this operation restored any replicas, false otherwise (empty node).
+   */
   public boolean simRestoreNode(String nodeId) throws Exception {
     liveNodes.add(nodeId);
     createEphemeralLiveNode(nodeId);
@@ -338,6 +354,7 @@ public class SimClusterStateProvider implements ClusterStateProvider {
         message.getProperties()
     );
     simAddReplica(message.getStr(CoreAdminParams.NODE), ri, true);
+    results.add("success", "");
   }
 
   /**
@@ -363,9 +380,7 @@ public class SimClusterStateProvider implements ClusterStateProvider {
     if (replicaInfo.getCore() == null) {
       throw new Exception("Missing core: " + replicaInfo);
     }
-//    if (replicaInfo.getShard() == null) {
-//      throw new Exception("Missing shard: " + replicaInfo);
-//    }
+    // XXX replica info is not supposed to have this as a variable
     replicaInfo.getVariables().remove(ZkStateReader.SHARD_ID_PROP);
     if (replicaInfo.getName() == null) {
       throw new Exception("Missing name: " + replicaInfo);
@@ -385,7 +400,7 @@ public class SimClusterStateProvider implements ClusterStateProvider {
       List<ReplicaInfo> replicas = nodeReplicaMap.computeIfAbsent(nodeId, n -> new ArrayList<>());
       // mark replica as active
       replicaInfo.getVariables().put(ZkStateReader.STATE_PROP, Replica.State.ACTIVE.toString());
-      // add property expected in tests
+      // add a property expected in tests
       replicaInfo.getVariables().put(Suggestion.coreidxsize, 123450000);
       // at this point nuke our cached DocCollection state
       collectionsStatesRef.set(null);
@@ -1025,7 +1040,7 @@ public class SimClusterStateProvider implements ClusterStateProvider {
    * @param collection collection name
    * @param key property name
    * @param value property value
-   * @param divide if the value is a {@link Number} and this is true, then the value will be evenly
+   * @param divide if the value is a {@link Number} and this param is true, then the value will be evenly
    *               divided by the number of replicas.
    */
   public void simSetCollectionValue(String collection, String key, Object value, boolean divide) throws Exception {
@@ -1153,7 +1168,6 @@ public class SimClusterStateProvider implements ClusterStateProvider {
             props = new HashMap<>(ri.getVariables());
           }
           props.put(ZkStateReader.NODE_NAME_PROP, n);
-          //props.put(ZkStateReader.SHARD_ID_PROP, ri.getShard());
           props.put(ZkStateReader.CORE_NAME_PROP, ri.getCore());
           props.put(ZkStateReader.REPLICA_TYPE, ri.getType().toString());
           props.put(ZkStateReader.STATE_PROP, ri.getState().toString());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimDistribStateManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimDistribStateManager.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimDistribStateManager.java
index 12b38e7..6c2a9a6 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimDistribStateManager.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimDistribStateManager.java
@@ -248,14 +248,31 @@ public class SimDistribStateManager implements DistribStateManager {
     this.errorRef.set(actionError);
   }
 
+  /**
+   * Create a copy of this instance using a specified ephemeral owner id. This is useful when performing
+   * node operations that require using a specific id. Note: this instance should never be closed, it can
+   * be just discarded after use.
+   * @param id ephemeral owner id
+   */
   public SimDistribStateManager withEphemeralId(String id) {
-    return new SimDistribStateManager(id, watchersPool, root, throttleRef.get(), errorRef.get());
+    return new SimDistribStateManager(id, watchersPool, root, throttleRef.get(), errorRef.get()) {
+      @Override
+      public void close() throws IOException {
+        throw new UnsupportedOperationException("this instance should never be closed - instead close the parent instance.");
+      }
+    };
   }
 
+  /**
+   * Get the root node of the tree used by this instance. It could be a static shared root node.
+   */
   public Node getRoot() {
     return root;
   }
 
+  /**
+   * Clear this instance. All nodes, watchers and data is deleted.
+   */
   public void clear() {
     root.clear();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimNodeStateProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimNodeStateProvider.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimNodeStateProvider.java
index a9b3b5b..e2147e4 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimNodeStateProvider.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimNodeStateProvider.java
@@ -234,7 +234,7 @@ public class SimNodeStateProvider implements NodeStateProvider {
       return Collections.emptyMap();
     }
     Map<String, Object> result = new HashMap<>();
-    Map<String, Object> metrics = getReplicaMetricsValues(node, tags.stream().filter(s -> s.startsWith("metrics:")).collect(Collectors.toList()));
+    Map<String, Object> metrics = getReplicaMetricsValues(node, tags.stream().filter(s -> s.startsWith("metrics:solr.core.")).collect(Collectors.toList()));
     result.putAll(metrics);
     Map<String, Object> values = nodeValues.get(node);
     if (values == null) {
@@ -251,6 +251,7 @@ public class SimNodeStateProvider implements NodeStateProvider {
       return Collections.emptyMap();
     }
     Map<String, Map<String, List<ReplicaInfo>>> res = new HashMap<>();
+    // TODO: probably needs special treatment for "metrics:solr.core..." tags
     for (ReplicaInfo r : replicas) {
       Map<String, List<ReplicaInfo>> perCollection = res.computeIfAbsent(r.getCollection(), s -> new HashMap<>());
       List<ReplicaInfo> perShard = perCollection.computeIfAbsent(r.getShard(), s -> new ArrayList<>());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimSolrCloudTestCase.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimSolrCloudTestCase.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimSolrCloudTestCase.java
index 9324be1..02c42ac 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimSolrCloudTestCase.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimSolrCloudTestCase.java
@@ -39,7 +39,14 @@ import org.junit.AfterClass;
 import org.junit.Before;
 
 /**
- * Base class for simulated test cases.
+ * Base class for simulated test cases. Tests that use this class should configure the simulated cluster
+ * in <code>@BeforeClass</code> like this:
+ * <pre>
+ *   @BeforeClass
+ *   public static void setupCluster() throws Exception {
+ *     cluster = configureCluster(5, TimeSource.get("simTime:50"));
+ *   }
+ * </pre>
  */
 public class SimSolrCloudTestCase extends SolrTestCaseJ4 {
 
@@ -48,8 +55,8 @@ public class SimSolrCloudTestCase extends SolrTestCaseJ4 {
   /** The cluster. */
   protected static SimCloudManager cluster;
 
-  protected static SimCloudManager configureCluster(int nodeCount, TimeSource timeSource) throws Exception {
-    return SimCloudManager.createCluster(nodeCount, timeSource);
+  protected static void configureCluster(int nodeCount, TimeSource timeSource) throws Exception {
+    cluster = SimCloudManager.createCluster(nodeCount, timeSource);
   }
 
   @AfterClass

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestClusterStateProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestClusterStateProvider.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestClusterStateProvider.java
index cb3bb4c..396edea 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestClusterStateProvider.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestClusterStateProvider.java
@@ -72,8 +72,7 @@ public class TestClusterStateProvider extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     simulated = random().nextBoolean();
-    simulated = true;
-    LOG.info("####### Using simulated component? " + simulated);
+    LOG.info("####### Using simulated components? " + simulated);
 
     configureCluster(NODE_COUNT)
         .addConfig("conf", configset("cloud-minimal"))

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestComputePlanAction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestComputePlanAction.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestComputePlanAction.java
index 89f3f68..020ec67 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestComputePlanAction.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestComputePlanAction.java
@@ -73,7 +73,7 @@ public class TestComputePlanAction extends SimSolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    cluster = SimCloudManager.createCluster(1, TimeSource.get("simTime:50"));
+    configureCluster(1, TimeSource.get("simTime:50"));
   }
 
   @Before

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestExecutePlanAction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestExecutePlanAction.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestExecutePlanAction.java
index 8c4c287..9f3e4cf 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestExecutePlanAction.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestExecutePlanAction.java
@@ -66,7 +66,7 @@ public class TestExecutePlanAction extends SimSolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    cluster = SimCloudManager.createCluster(NODE_COUNT, TimeSource.get("simTime:50"));
+    configureCluster(NODE_COUNT, TimeSource.get("simTime:50"));
   }
 
   @Before

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestLargeCluster.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestLargeCluster.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestLargeCluster.java
index 5bd0d97..7be7edc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestLargeCluster.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestLargeCluster.java
@@ -75,7 +75,7 @@ public class TestLargeCluster extends SimSolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    cluster = SimCloudManager.createCluster(NUM_NODES, TimeSource.get("simTime:" + SPEED));
+    configureCluster(NUM_NODES, TimeSource.get("simTime:" + SPEED));
   }
 
   @Before
@@ -170,6 +170,7 @@ public class TestLargeCluster extends SimSolrCloudTestCase {
       }
     }
     Collections.shuffle(nodes, random());
+    // create collection on these nodes
     String collectionName = "testBasic";
     CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(collectionName,
         "conf", 5, 5, 5, 5);
@@ -184,7 +185,7 @@ public class TestLargeCluster extends SimSolrCloudTestCase {
     for (int i = 0; i < KILL_NODES; i++) {
       cluster.simRemoveNode(nodes.get(i), false);
     }
-
+    // should fully recover
     log.info("Ready after " + waitForState(collectionName, 90 * KILL_NODES, TimeUnit.SECONDS, clusterShape(5, 15)) + "ms");
 
     log.info("OP COUNTS: " + cluster.simGetOpCounts());
@@ -210,6 +211,7 @@ public class TestLargeCluster extends SimSolrCloudTestCase {
     log.info("OP COUNTS: " + cluster.simGetOpCounts());
     long newMoveReplicaOps = cluster.simGetOpCount(CollectionParams.CollectionAction.MOVEREPLICA.name());
     log.info("==== Flaky replicas: {}. Additional MOVEREPLICA count: {}", flakyReplicas, (newMoveReplicaOps - moveReplicaOps));
+    // flaky nodes lead to a number of MOVEREPLICA that is non-zero but lower than the number of flaky replicas
     assertTrue("there should be new MOVERPLICA ops", newMoveReplicaOps - moveReplicaOps > 0);
     assertTrue("there should be less than flakyReplicas=" + flakyReplicas + " MOVEREPLICA ops",
         newMoveReplicaOps - moveReplicaOps < flakyReplicas);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeAddedTrigger.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeAddedTrigger.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeAddedTrigger.java
index c1f10d0..9b4e2bc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeAddedTrigger.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeAddedTrigger.java
@@ -59,7 +59,7 @@ public class TestNodeAddedTrigger extends SimSolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    cluster = SimCloudManager.createCluster(1, TimeSource.get("simTime:" + SPEED));
+    configureCluster(1, TimeSource.get("simTime:" + SPEED));
     timeSource = cluster.getTimeSource();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeLostTrigger.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeLostTrigger.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeLostTrigger.java
index d7b7ecb..109cee3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeLostTrigger.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestNodeLostTrigger.java
@@ -59,7 +59,7 @@ public class TestNodeLostTrigger extends SimSolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    cluster = SimCloudManager.createCluster(5, TimeSource.get("simTime:" + SPEED));
+    configureCluster(5, TimeSource.get("simTime:" + SPEED));
     timeSource = cluster.getTimeSource();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestPolicyCloud.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestPolicyCloud.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestPolicyCloud.java
index dd3a054..18ce4e9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestPolicyCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestPolicyCloud.java
@@ -61,7 +61,7 @@ public class TestPolicyCloud extends SimSolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    cluster = SimCloudManager.createCluster(5, TimeSource.get("simTime:50"));
+    configureCluster(5, TimeSource.get("simTime:50"));
   }
 
   @After

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestTriggerIntegration.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestTriggerIntegration.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestTriggerIntegration.java
index e05b789..fec84c3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestTriggerIntegration.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestTriggerIntegration.java
@@ -87,7 +87,7 @@ public class TestTriggerIntegration extends SimSolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    cluster = SimCloudManager.createCluster(2, TimeSource.get("simTime:" + SPEED));
+    configureCluster(2, TimeSource.get("simTime:" + SPEED));
   }
 
   private static CountDownLatch getTriggerFiredLatch() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c50436b7/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/package-info.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/package-info.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/package-info.java
new file mode 100644
index 0000000..0b412cb
--- /dev/null
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+/**
+ * Simulated environment for autoscaling tests.
+ */
+package org.apache.solr.cloud.autoscaling.sim;
+