You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2014/12/18 18:17:12 UTC
svn commit: r1646493 [2/2] - in /lucene/dev/branches/branch_5x: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/cloud/
solr/core/src/java/org/apache/solr/cloud/overseer/
solr/core/src/java/org/apache/solr/handler/admin/
solr/core/src/java/org/ap...
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java Thu Dec 18 17:17:11 2014
@@ -84,6 +84,7 @@ import org.apache.solr.cloud.Distributed
import org.apache.solr.cloud.Overseer;
import org.apache.solr.cloud.OverseerCollectionProcessor;
import org.apache.solr.cloud.OverseerSolrResponse;
+import org.apache.solr.cloud.overseer.SliceMutator;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.cloud.ClusterState;
@@ -305,7 +306,7 @@ public class CollectionsHandler extends
for (Slice slice : dc.getSlices()) {
for (Replica replica : slice.getReplicas()) {
// Tell the replica to become the leader if we're the preferred leader AND active AND not the leader already
- if (replica.getBool(Overseer.preferredLeaderProp, false) == false) {
+ if (replica.getBool(SliceMutator.PREFERRED_LEADER_PROP, false) == false) {
continue;
}
if (StringUtils.equalsIgnoreCase(replica.getStr(STATE_PROP), ACTIVE) == false) {
@@ -446,7 +447,7 @@ public class CollectionsHandler extends
// Check if we're trying to set a property with parameters that allow us to set the property on multiple replicas
// in a slice on properties that are known to only be one-per-slice and error out if so.
if (StringUtils.isNotBlank((String)map.get(SHARD_UNIQUE)) &&
- Overseer.sliceUniqueBooleanProperties.contains(property.toLowerCase(Locale.ROOT)) &&
+ SliceMutator.SLICE_UNIQUE_BOOLEAN_PROPERTIES.contains(property.toLowerCase(Locale.ROOT)) &&
uniquePerSlice == false) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"Overseer replica property command received for property " + property +
@@ -476,7 +477,7 @@ public class CollectionsHandler extends
}
if (shardUnique == false &&
- Overseer.sliceUniqueBooleanProperties.contains(prop) == false) {
+ SliceMutator.SLICE_UNIQUE_BOOLEAN_PROPERTIES.contains(prop) == false) {
throw new SolrException(ErrorCode.BAD_REQUEST, "Balancing properties amongst replicas in a slice requires that"
+ " the property be pre-defined as a unique property (e.g. 'preferredLeader') or that 'shardUnique' be set to 'true'. " +
" Property: " + prop + " shardUnique: " + Boolean.toString(shardUnique));
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Thu Dec 18 17:17:11 2014
@@ -47,6 +47,7 @@ import org.apache.solr.cloud.Distributed
import org.apache.solr.cloud.LeaderInitiatedRecoveryThread;
import org.apache.solr.cloud.Overseer;
import org.apache.solr.cloud.ZkController;
+import org.apache.solr.cloud.overseer.OverseerAction;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.SolrInputDocument;
@@ -77,7 +78,6 @@ import org.apache.solr.request.SolrReque
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.SchemaField;
-import org.apache.solr.schema.TrieDateField;
import org.apache.solr.update.AddUpdateCommand;
import org.apache.solr.update.CommitUpdateCommand;
import org.apache.solr.update.DeleteUpdateCommand;
@@ -542,7 +542,7 @@ public class DistributedUpdateProcessor
if (ruleExpiryLock.tryLock(10, TimeUnit.MILLISECONDS)) {
log.info("Going to expire routing rule");
try {
- Map<String, Object> map = ZkNodeProps.makeMap(Overseer.QUEUE_OPERATION, Overseer.OverseerAction.REMOVEROUTINGRULE.toLower(),
+ Map<String, Object> map = ZkNodeProps.makeMap(Overseer.QUEUE_OPERATION, OverseerAction.REMOVEROUTINGRULE.toLower(),
ZkStateReader.COLLECTION_PROP, collection,
ZkStateReader.SHARD_ID_PROP, myShardId,
"routeKey", routeKey + "!");
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java Thu Dec 18 17:17:11 2014
@@ -21,6 +21,7 @@ import org.apache.solr.client.solrj.Solr
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.cloud.overseer.OverseerAction;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.Slice;
@@ -157,7 +158,7 @@ public class DeleteShardTest extends Abs
KeeperException, InterruptedException {
DistributedQueue inQueue = Overseer.getInQueue(cloudClient.getZkStateReader().getZkClient());
Map<String, Object> propMap = new HashMap<>();
- propMap.put(Overseer.QUEUE_OPERATION, Overseer.OverseerAction.UPDATESHARDSTATE.toLower());
+ propMap.put(Overseer.QUEUE_OPERATION, OverseerAction.UPDATESHARDSTATE.toLower());
propMap.put(slice, state);
propMap.put(ZkStateReader.COLLECTION_PROP, "collection1");
ZkNodeProps m = new ZkNodeProps(propMap);
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java Thu Dec 18 17:17:11 2014
@@ -38,6 +38,7 @@ import org.apache.solr.client.solrj.Solr
import org.apache.solr.client.solrj.embedded.JettySolrRunner;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.cloud.overseer.OverseerAction;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkNodeProps;
import org.apache.solr.common.cloud.ZkStateReader;
@@ -106,7 +107,7 @@ public class OverseerRolesTest extends
Map m = (Map) ZkStateReader.fromJSON(data);
String s = (String) m.get("id");
String leader = LeaderElector.getNodeName(s);
- Overseer.getInQueue(zk).offer(ZkStateReader.toJSON(new ZkNodeProps(Overseer.QUEUE_OPERATION, Overseer.OverseerAction.QUIT.toLower())));
+ Overseer.getInQueue(zk).offer(ZkStateReader.toJSON(new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.QUIT.toLower())));
long timeout = System.currentTimeMillis()+10000;
String newLeader=null;
for(;System.currentTimeMillis() < timeout;){
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java Thu Dec 18 17:17:11 2014
@@ -36,6 +36,7 @@ import javax.xml.parsers.ParserConfigura
import org.apache.lucene.util.LuceneTestCase.Slow;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.cloud.overseer.OverseerAction;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.Replica;
@@ -43,10 +44,14 @@ import org.apache.solr.common.cloud.Slic
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkNodeProps;
import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.params.CollectionParams;
import org.apache.solr.handler.component.HttpShardHandlerFactory;
import org.apache.solr.update.UpdateShardHandler;
import org.apache.solr.util.DefaultSolrThreadFactory;
import org.apache.solr.util.MockConfigSolr;
+import org.apache.solr.util.stats.Snapshot;
+import org.apache.solr.util.stats.Timer;
+import org.apache.solr.util.stats.TimerContext;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.KeeperException.NoNodeException;
@@ -54,6 +59,7 @@ import org.apache.zookeeper.KeeperExcept
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.xml.sax.SAXException;
@@ -112,7 +118,7 @@ public class OverseerTest extends SolrTe
if (ec != null) {
ec.cancelElection();
}
- ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, Overseer.OverseerAction.DELETECORE.toLower(),
+ ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.DELETECORE.toLower(),
ZkStateReader.NODE_NAME_PROP, nodeName,
ZkStateReader.CORE_NAME_PROP, coreName,
ZkStateReader.CORE_NODE_NAME_PROP, coreNodeName,
@@ -121,7 +127,7 @@ public class OverseerTest extends SolrTe
q.offer(ZkStateReader.toJSON(m));
return null;
} else {
- ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, Overseer.OverseerAction.STATE.toLower(),
+ ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.STATE.toLower(),
ZkStateReader.STATE_PROP, stateName,
ZkStateReader.NODE_NAME_PROP, nodeName,
ZkStateReader.CORE_NAME_PROP, coreName,
@@ -525,7 +531,7 @@ public class OverseerTest extends SolrTe
DistributedQueue q = Overseer.getInQueue(zkClient);
- ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, Overseer.OverseerAction.STATE.toLower(),
+ ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.STATE.toLower(),
ZkStateReader.BASE_URL_PROP, "http://127.0.0.1/solr",
ZkStateReader.NODE_NAME_PROP, "node1",
ZkStateReader.COLLECTION_PROP, "collection1",
@@ -878,6 +884,135 @@ public class OverseerTest extends SolrTe
}
}
+ @Test
+ @Ignore
+ public void testPerformance() throws Exception {
+ String zkDir = createTempDir("OverseerTest.testPerformance").toFile().getAbsolutePath();
+
+ ZkTestServer server = new ZkTestServer(zkDir);
+
+ SolrZkClient controllerClient = null;
+ SolrZkClient overseerClient = null;
+ ZkStateReader reader = null;
+ MockZKController mockController = null;
+
+ try {
+ server.run();
+ controllerClient = new SolrZkClient(server.getZkAddress(), TIMEOUT);
+
+ AbstractZkTestCase.tryCleanSolrZkNode(server.getZkHost());
+ AbstractZkTestCase.makeSolrZkNode(server.getZkHost());
+ controllerClient.makePath(ZkStateReader.LIVE_NODES_ZKNODE, true);
+
+ reader = new ZkStateReader(controllerClient);
+ reader.createClusterStateWatchersAndUpdate();
+
+ mockController = new MockZKController(server.getZkAddress(), "node1");
+
+ final int MAX_COLLECTIONS = 10, MAX_CORES = 10, MAX_STATE_CHANGES = 20000, STATE_FORMAT = 2;
+
+ for (int i=0; i<MAX_COLLECTIONS; i++) {
+ ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, CollectionParams.CollectionAction.CREATE.toLower(),
+ "name", "perf" + i,
+ ZkStateReader.NUM_SHARDS_PROP, "1",
+ "stateFormat", String.valueOf(STATE_FORMAT),
+ ZkStateReader.REPLICATION_FACTOR, "1",
+ ZkStateReader.MAX_SHARDS_PER_NODE, "1"
+ );
+ DistributedQueue q = Overseer.getInQueue(controllerClient);
+ q.offer(ZkStateReader.toJSON(m));
+ controllerClient.makePath("/collections/perf" + i, true);
+ }
+
+ for (int i = 0, j = 0, k = 0; i < MAX_STATE_CHANGES; i++, j++, k++) {
+ ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.STATE.toLower(),
+ ZkStateReader.STATE_PROP, ZkStateReader.RECOVERING,
+ ZkStateReader.NODE_NAME_PROP, "node1",
+ ZkStateReader.CORE_NAME_PROP, "core" + k,
+ ZkStateReader.CORE_NODE_NAME_PROP, "node1",
+ ZkStateReader.COLLECTION_PROP, "perf" + j,
+ ZkStateReader.NUM_SHARDS_PROP, "1",
+ ZkStateReader.BASE_URL_PROP, "http://" + "node1"
+ + "/solr/");
+ DistributedQueue q = Overseer.getInQueue(controllerClient);
+ q.offer(ZkStateReader.toJSON(m));
+ if (j >= MAX_COLLECTIONS - 1) j = 0;
+ if (k >= MAX_CORES - 1) k = 0;
+ if (i > 0 && i % 100 == 0) log.info("Published {} items", i);
+ }
+
+ // let's publish a sentinel collection which we'll use to wait for overseer to complete operations
+ ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.STATE.toLower(),
+ ZkStateReader.STATE_PROP, ZkStateReader.ACTIVE,
+ ZkStateReader.NODE_NAME_PROP, "node1",
+ ZkStateReader.CORE_NAME_PROP, "core1",
+ ZkStateReader.CORE_NODE_NAME_PROP, "node1",
+ ZkStateReader.COLLECTION_PROP, "perf_sentinel",
+ ZkStateReader.NUM_SHARDS_PROP, "1",
+ ZkStateReader.BASE_URL_PROP, "http://" + "node1"
+ + "/solr/");
+ DistributedQueue q = Overseer.getInQueue(controllerClient);
+ q.offer(ZkStateReader.toJSON(m));
+
+ Timer t = new Timer();
+ TimerContext context = t.time();
+ try {
+ overseerClient = electNewOverseer(server.getZkAddress());
+ assertTrue(overseers.size() > 0);
+
+ while (true) {
+ reader.updateClusterState(true);
+ ClusterState state = reader.getClusterState();
+ if (state.hasCollection("perf_sentinel")) {
+ break;
+ }
+ Thread.sleep(1000);
+ }
+ } finally {
+ context.stop();
+ }
+
+ log.info("Overseer loop finished processing: ");
+ printTimingStats(t);
+
+ Overseer overseer = overseers.get(0);
+ Overseer.Stats stats = overseer.getStats();
+
+ String[] interestingOps = {"state", "update_state", "am_i_leader", ""};
+ Arrays.sort(interestingOps);
+ for (Map.Entry<String, Overseer.Stat> entry : stats.getStats().entrySet()) {
+ String op = entry.getKey();
+ if (Arrays.binarySearch(interestingOps, op) < 0)
+ continue;
+ Overseer.Stat stat = entry.getValue();
+ log.info("op: {}, success: {}, failure: {}", op, stat.success.get(), stat.errors.get());
+ Timer timer = stat.requestTime;
+ printTimingStats(timer);
+ }
+
+ } finally {
+ close(overseerClient);
+ close(mockController);
+ close(controllerClient);
+ close(reader);
+ server.shutdown();
+ }
+ }
+
+ private void printTimingStats(Timer timer) {
+ Snapshot snapshot = timer.getSnapshot();
+ log.info("\t totalTime: {}", timer.getSum());
+ log.info("\t avgRequestsPerMinute: {}", timer.getMeanRate());
+ log.info("\t 5minRateRequestsPerMinute: {}", timer.getFiveMinuteRate());
+ log.info("\t 15minRateRequestsPerMinute: {}", timer.getFifteenMinuteRate());
+ log.info("\t avgTimePerRequest: {}", timer.getMean());
+ log.info("\t medianRequestTime: {}", snapshot.getMedian());
+ log.info("\t 75thPctlRequestTime: {}", snapshot.get75thPercentile());
+ log.info("\t 95thPctlRequestTime: {}", snapshot.get95thPercentile());
+ log.info("\t 99thPctlRequestTime: {}", snapshot.get99thPercentile());
+ log.info("\t 999thPctlRequestTime: {}", snapshot.get999thPercentile());
+ }
+
private void close(MockZKController mockController) {
if (mockController != null) {
mockController.close();
@@ -928,7 +1063,7 @@ public class OverseerTest extends SolrTe
//submit to proper queue
queue = Overseer.getInQueue(zkClient);
- m = new ZkNodeProps(Overseer.QUEUE_OPERATION, Overseer.OverseerAction.STATE.toLower(),
+ m = new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.STATE.toLower(),
ZkStateReader.BASE_URL_PROP, "http://127.0.0.1/solr",
ZkStateReader.NODE_NAME_PROP, "node1",
ZkStateReader.SHARD_ID_PROP, "s1",
Copied: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java (from r1642693, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java)
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java?p2=lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java&p1=lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java&r1=1642693&r2=1646493&rev=1646493&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java Thu Dec 18 17:17:11 2014
@@ -28,6 +28,7 @@ import org.apache.solr.cloud.ZkTestServe
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.DocRouter;
+import org.apache.solr.common.cloud.Slice;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkStateReader;
@@ -61,13 +62,13 @@ public class ZkStateWriterTest extends S
// create new collection with stateFormat = 2
ZkWriteCommand c1 = new ZkWriteCommand("c1",
- new DocCollection("c1", new HashMap<>(), new HashMap<>(), DocRouter.DEFAULT, 0, ZkStateReader.COLLECTIONS_ZKNODE + "/c1"));
+ new DocCollection("c1", new HashMap<String, Slice>(), new HashMap<String, Object>(), DocRouter.DEFAULT, 0, ZkStateReader.COLLECTIONS_ZKNODE + "/c1"));
assertFalse("First requests can always be batched", writer.maybeFlushBefore(c1));
- ClusterState clusterState = writer.enqueueUpdate(reader.getClusterState(), c1);
+ ClusterState clusterState = writer.enqueueUpdate(reader.getClusterState(), c1, null);
ZkWriteCommand c2 = new ZkWriteCommand("c2",
- new DocCollection("c2", new HashMap<>(), new HashMap<>(), DocRouter.DEFAULT, 0, ZkStateReader.COLLECTIONS_ZKNODE + "/c2"));
+ new DocCollection("c2", new HashMap<String, Slice>(), new HashMap<String, Object>(), DocRouter.DEFAULT, 0, ZkStateReader.COLLECTIONS_ZKNODE + "/c2"));
assertTrue("Different (new) collection create cannot be batched together with another create", writer.maybeFlushBefore(c2));
// simulate three state changes on same collection, all should be batched together before
@@ -90,8 +91,8 @@ public class ZkStateWriterTest extends S
// create a collection in stateFormat = 1 i.e. inside the main cluster state
ZkWriteCommand c3 = new ZkWriteCommand("c3",
- new DocCollection("c3", new HashMap<>(), new HashMap<>(), DocRouter.DEFAULT, 0, ZkStateReader.CLUSTER_STATE));
- clusterState = writer.enqueueUpdate(clusterState, c3);
+ new DocCollection("c3", new HashMap<String, Slice>(), new HashMap<String, Object>(), DocRouter.DEFAULT, 0, ZkStateReader.CLUSTER_STATE));
+ clusterState = writer.enqueueUpdate(clusterState, c3, null);
// simulate three state changes in c3, all should be batched
for (int i=0; i<3; i++) {
Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java Thu Dec 18 17:17:11 2014
@@ -40,7 +40,7 @@ import org.slf4j.LoggerFactory;
public class ClusterState implements JSONWriter.Writable {
private static Logger log = LoggerFactory.getLogger(ClusterState.class);
- private Integer znodeVersion;
+ private final Integer znodeVersion;
private final Map<String, CollectionRef> collectionStates;
private Set<String> liveNodes;
@@ -84,15 +84,19 @@ public class ClusterState implements JSO
}
- public ClusterState copyWith(Map<String,DocCollection> modified){
+ /**
+ * Returns a new cluster state object modified with the given collection.
+ *
+ * @param collectionName the name of the modified (or deleted) collection
+ * @param collection the collection object. A null value deletes the collection from the state
+ * @return the updated cluster state which preserves the current live nodes and zk node version
+ */
+ public ClusterState copyWith(String collectionName, DocCollection collection) {
ClusterState result = new ClusterState(liveNodes, new LinkedHashMap<>(collectionStates), znodeVersion);
- for (Entry<String, DocCollection> e : modified.entrySet()) {
- DocCollection c = e.getValue();
- if(c == null) {
- result.collectionStates.remove(e.getKey());
- continue;
- }
- result.collectionStates.put(c.getName(), new CollectionRef(c));
+ if (collection == null) {
+ result.collectionStates.remove(collectionName);
+ } else {
+ result.collectionStates.put(collectionName, new CollectionRef(collection));
}
return result;
}
Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java Thu Dec 18 17:17:11 2014
@@ -35,7 +35,7 @@ public class DocCollection extends ZkNod
public static final String DOC_ROUTER = "router";
public static final String SHARDS = "shards";
public static final String STATE_FORMAT = "stateFormat";
- private int znodeVersion;
+ private int znodeVersion = -1; // sentinel
private final String name;
private final Map<String, Slice> slices;
Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java?rev=1646493&r1=1646492&r2=1646493&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java Thu Dec 18 17:17:11 2014
@@ -873,8 +873,7 @@ public class ZkStateReader implements Cl
log.info("Updating data for {} to ver {} ", newState.getName(),
newState.getZNodeVersion());
- this.clusterState = clusterState.copyWith(Collections.singletonMap(
- newState.getName(), newState));
+ this.clusterState = clusterState.copyWith(newState.getName(), newState);
}
/** This is not a public API. Only used by ZkController */