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 2015/04/01 07:42:48 UTC

svn commit: r1670566 - in /lucene/dev/trunk/solr: ./ core/src/java/org/apache/solr/cloud/ core/src/java/org/apache/solr/cloud/overseer/ core/src/java/org/apache/solr/core/ core/src/java/org/apache/solr/servlet/ core/src/java/org/apache/solr/update/proc...

Author: shaie
Date: Wed Apr  1 05:42:47 2015
New Revision: 1670566

URL: http://svn.apache.org/r1670566
Log:
SOLR-7325: Change Slice state into enum

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrCLI.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Wed Apr  1 05:42:47 2015
@@ -94,6 +94,10 @@ Upgrading from Solr 5.0
   contain some LGPL-only code. Until that's resolved by Tika, you can download the
   .jar yourself and place it under contrib/extraction/lib.  
 
+* SOLR-7325: Slice.getState() now returns a State enum instead of a String. This helps
+  clarify the states a Slice can be in, as well comparing the state of a Slice.
+  (Shai Erera)
+
 Detailed Change List
 ----------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java Wed Apr  1 05:42:47 2015
@@ -39,7 +39,7 @@ public class CloudDescriptor {
   /* shardRange and shardState are used once-only during sub shard creation for shard splits
    * Use the values from {@link Slice} instead */
   volatile String shardRange = null;
-  volatile String shardState = Slice.ACTIVE;
+  volatile Slice.State shardState = Slice.State.ACTIVE;
   volatile String shardParent = null;
 
   volatile boolean isLeader = false;

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java Wed Apr  1 05:42:47 2015
@@ -175,7 +175,7 @@ public class OverseerAutoReplicaFailover
         
         Collection<Slice> slices = docCollection.getSlices();
         for (Slice slice : slices) {
-          if (slice.getState().equals(Slice.ACTIVE)) {
+          if (slice.getState() == Slice.State.ACTIVE) {
             
             final Collection<DownReplica> downReplicas = new ArrayList<DownReplica>();
             
@@ -318,7 +318,7 @@ public class OverseerAutoReplicaFailover
         Collection<Slice> slices = docCollection.getSlices();
         for (Slice slice : slices) {
           // only look at active shards
-          if (slice.getState().equals(Slice.ACTIVE)) {
+          if (slice.getState() == Slice.State.ACTIVE) {
             log.debug("look at slice {} as possible create candidate", slice.getName()); 
             Collection<Replica> replicas = slice.getReplicas();
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Wed Apr  1 05:42:47 2015
@@ -18,6 +18,7 @@ package org.apache.solr.cloud;
  */
 
 import com.google.common.collect.ImmutableSet;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -43,6 +44,7 @@ import org.apache.solr.common.cloud.Plai
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.RoutingRule;
 import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.Slice.State;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkConfigManager;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
@@ -1072,7 +1074,7 @@ public class OverseerCollectionProcessor
         log.warn("Exception trying to unload core " + sreq, e);
       }
 
-      collectShardResponses(!Slice.ACTIVE.equals(replica.getStr(Slice.STATE)) ? new NamedList() : results,
+      collectShardResponses(!ZkStateReader.ACTIVE.equals(replica.getStr(ZkStateReader.STATE_PROP)) ? new NamedList() : results,
           false, null, shardHandler);
 
       if (waitForCoreNodeGone(collectionName, shard, replicaName, 5000))
@@ -1495,9 +1497,10 @@ public class OverseerCollectionProcessor
 
           Slice oSlice = clusterState.getSlice(collectionName, subSlice);
           if (oSlice != null) {
-            if (Slice.ACTIVE.equals(oSlice.getState())) {
+            final Slice.State state = oSlice.getState();
+            if (state == Slice.State.ACTIVE) {
               throw new SolrException(ErrorCode.BAD_REQUEST, "Sub-shard: " + subSlice + " exists in active state. Aborting split shard.");
-            } else if (Slice.CONSTRUCTION.equals(oSlice.getState()) || Slice.RECOVERY.equals(oSlice.getState())) {
+            } else if (state == Slice.State.CONSTRUCTION || state == Slice.State.RECOVERY) {
               // delete the shards
               for (String sub : subSlices) {
                 log.info("Sub-shard: {} already exists therefore requesting its deletion", sub);
@@ -1538,7 +1541,7 @@ public class OverseerCollectionProcessor
           propMap.put(ZkStateReader.SHARD_ID_PROP, subSlice);
           propMap.put(ZkStateReader.COLLECTION_PROP, collectionName);
           propMap.put(ZkStateReader.SHARD_RANGE_PROP, subRange.toString());
-          propMap.put(ZkStateReader.SHARD_STATE_PROP, Slice.CONSTRUCTION);
+          propMap.put(ZkStateReader.SHARD_STATE_PROP, Slice.State.CONSTRUCTION.toString());
           propMap.put(ZkStateReader.SHARD_PARENT_PROP, parentSlice.getName());
           DistributedQueue inQueue = Overseer.getInQueue(zkStateReader.getZkClient());
           inQueue.offer(ZkStateReader.toJSON(new ZkNodeProps(propMap)));
@@ -1733,9 +1736,9 @@ public class OverseerCollectionProcessor
           DistributedQueue inQueue = Overseer.getInQueue(zkStateReader.getZkClient());
           Map<String, Object> propMap = new HashMap<>();
           propMap.put(Overseer.QUEUE_OPERATION, OverseerAction.UPDATESHARDSTATE.toLower());
-          propMap.put(slice, Slice.INACTIVE);
+          propMap.put(slice, Slice.State.INACTIVE.toString());
           for (String subSlice : subSlices) {
-            propMap.put(subSlice, Slice.ACTIVE);
+            propMap.put(subSlice, Slice.State.ACTIVE.toString());
           }
           propMap.put(ZkStateReader.COLLECTION_PROP, collectionName);
           ZkNodeProps m = new ZkNodeProps(propMap);
@@ -1746,7 +1749,7 @@ public class OverseerCollectionProcessor
           Map<String, Object> propMap = new HashMap<>();
           propMap.put(Overseer.QUEUE_OPERATION, OverseerAction.UPDATESHARDSTATE.toLower());
           for (String subSlice : subSlices) {
-            propMap.put(subSlice, Slice.RECOVERY);
+            propMap.put(subSlice, Slice.State.RECOVERY.toString());
           }
           propMap.put(ZkStateReader.COLLECTION_PROP, collectionName);
           ZkNodeProps m = new ZkNodeProps(propMap);
@@ -1887,11 +1890,12 @@ public class OverseerCollectionProcessor
       }
       // For now, only allow for deletions of Inactive slices or custom hashes (range==null).
       // TODO: Add check for range gaps on Slice deletion
-      if (!(slice.getRange() == null || slice.getState().equals(Slice.INACTIVE)
-          || slice.getState().equals(Slice.RECOVERY) || slice.getState().equals(Slice.CONSTRUCTION))) {
+      final Slice.State state = slice.getState();
+      if (!(slice.getRange() == null || state == Slice.State.INACTIVE
+          || state == Slice.State.RECOVERY || state == Slice.State.CONSTRUCTION)) {
         throw new SolrException(ErrorCode.BAD_REQUEST,
             "The slice: " + slice.getName() + " is currently "
-                + slice.getState() + ". Only non-active (or custom-hashed) slices can be deleted.");
+                + state + ". Only non-active (or custom-hashed) slices can be deleted.");
       }
       ShardHandler shardHandler = shardHandlerFactory.getShardHandler();
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java Wed Apr  1 05:42:47 2015
@@ -17,6 +17,14 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
 import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.store.Directory;
@@ -57,14 +65,6 @@ import org.apache.zookeeper.KeeperExcept
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
 public class RecoveryStrategy extends Thread implements ClosableThread {
   private static final int WAIT_FOR_UPDATES_WITH_STALE_STATE_PAUSE = Integer.getInteger("solr.cloud.wait-for-updates-with-stale-state-pause", 7000);
   private static final int MAX_RETRIES = 500;
@@ -580,7 +580,8 @@ public class RecoveryStrategy extends Th
       prepCmd.setState(ZkStateReader.RECOVERING);
       prepCmd.setCheckLive(true);
       prepCmd.setOnlyIfLeader(true);
-      if (!Slice.CONSTRUCTION.equals(slice.getState()) && !Slice.RECOVERY.equals(slice.getState())) {
+      final Slice.State state = slice.getState();
+      if (state != Slice.State.CONSTRUCTION && state != Slice.State.RECOVERY) {
         prepCmd.setOnlyIfLeaderActive(true);
       }
       HttpUriRequestResponse mrr = client.httpUriRequest(prepCmd);

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java Wed Apr  1 05:42:47 2015
@@ -17,6 +17,33 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import static org.apache.solr.common.cloud.ZkStateReader.*;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.URLEncoder;
+import java.net.UnknownHostException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.CoreAdminRequest.WaitForState;
@@ -69,40 +96,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.URLEncoder;
-import java.net.UnknownHostException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import static org.apache.solr.common.cloud.ZkStateReader.BASE_URL_PROP;
-import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
-import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP;
-import static org.apache.solr.common.cloud.ZkStateReader.ELECTION_NODE_PROP;
-import static org.apache.solr.common.cloud.ZkStateReader.NODE_NAME_PROP;
-import static org.apache.solr.common.cloud.ZkStateReader.REJOIN_AT_HEAD_PROP;
-import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
-
 /**
  * Handle ZooKeeper interactions.
  * <p>
@@ -895,9 +888,8 @@ public final class ZkController {
         if (!core.isReloaded() && ulog != null) {
           // disable recovery in case shard is in construction state (for shard splits)
           Slice slice = getClusterState().getSlice(collection, shardId);
-          if (!Slice.CONSTRUCTION.equals(slice.getState()) || !isLeader) {
-            Future<UpdateLog.RecoveryInfo> recoveryFuture = core.getUpdateHandler()
-                .getUpdateLog().recoverFromLog();
+          if (slice.getState() != Slice.State.CONSTRUCTION || !isLeader) {
+            Future<UpdateLog.RecoveryInfo> recoveryFuture = core.getUpdateHandler().getUpdateLog().recoverFromLog();
             if (recoveryFuture != null) {
               log.info("Replaying tlog for " + ourUrl + " during startup... NOTE: This can take a while.");
               recoveryFuture.get(); // NOTE: this could potentially block for

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java Wed Apr  1 05:42:47 2015
@@ -53,7 +53,7 @@ public class CollectionMutator {
       String shardState = message.getStr(ZkStateReader.SHARD_STATE_PROP);
       String shardParent = message.getStr(ZkStateReader.SHARD_PARENT_PROP);
       sliceProps.put(Slice.RANGE, shardRange);
-      sliceProps.put(Slice.STATE, shardState);
+      sliceProps.put(ZkStateReader.STATE_PROP, shardState);
       if (shardParent != null) {
         sliceProps.put(Slice.PARENT, shardParent);
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java Wed Apr  1 05:42:47 2015
@@ -17,6 +17,9 @@ package org.apache.solr.cloud.overseer;
  * limitations under the License.
  */
 
+import static org.apache.solr.cloud.OverseerCollectionProcessor.*;
+import static org.apache.solr.cloud.overseer.CollectionMutator.*;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -39,10 +42,6 @@ import org.apache.solr.common.cloud.ZkSt
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.cloud.OverseerCollectionProcessor.COLL_PROP_PREFIX;
-import static org.apache.solr.cloud.overseer.CollectionMutator.checkCollectionKeyExistence;
-import static org.apache.solr.cloud.overseer.CollectionMutator.checkKeyExistence;
-
 public class ReplicaMutator {
   private static Logger log = LoggerFactory.getLogger(ReplicaMutator.class);
 
@@ -322,7 +321,7 @@ public class ReplicaMutator {
       replicas = new HashMap<>(1);
       sliceProps = new HashMap<>();
       sliceProps.put(Slice.RANGE, shardRange);
-      sliceProps.put(Slice.STATE, shardState);
+      sliceProps.put(ZkStateReader.STATE_PROP, shardState);
       sliceProps.put(Slice.PARENT, shardParent);
     }
 
@@ -357,8 +356,7 @@ public class ReplicaMutator {
   private DocCollection checkAndCompleteShardSplit(ClusterState prevState, DocCollection collection, String coreNodeName, String sliceName, Map<String, Object> replicaProps) {
     Slice slice = collection.getSlice(sliceName);
     Map<String, Object> sliceProps = slice.getProperties();
-    String sliceState = slice.getState();
-    if (Slice.RECOVERY.equals(sliceState)) {
+    if (slice.getState() == Slice.State.RECOVERY) {
       log.info("Shard: {} is in recovery state", sliceName);
       // is this replica active?
       if (ZkStateReader.ACTIVE.equals(replicaProps.get(ZkStateReader.STATE_PROP))) {
@@ -367,7 +365,7 @@ public class ReplicaMutator {
         boolean allActive = true;
         for (Map.Entry<String, Replica> entry : slice.getReplicasMap().entrySet()) {
           if (coreNodeName.equals(entry.getKey())) continue;
-          if (!Slice.ACTIVE.equals(entry.getValue().getStr(Slice.STATE))) {
+          if (!ZkStateReader.ACTIVE.equals(entry.getValue().getStr(ZkStateReader.STATE_PROP))) {
             allActive = false;
             break;
           }
@@ -382,7 +380,7 @@ public class ReplicaMutator {
             if (sliceName.equals(entry.getKey()))
               continue;
             Slice otherSlice = entry.getValue();
-            if (Slice.RECOVERY.equals(otherSlice.getState())) {
+            if (otherSlice.getState() == Slice.State.RECOVERY) {
               if (slice.getParent() != null && slice.getParent().equals(otherSlice.getParent())) {
                 log.info("Shard: {} - Fellow sub-shard: {} found", sliceName, otherSlice.getName());
                 // this is a fellow sub shard so check if all replicas are active
@@ -404,10 +402,10 @@ public class ReplicaMutator {
 
             Map<String, Object> propMap = new HashMap<>();
             propMap.put(Overseer.QUEUE_OPERATION, "updateshardstate");
-            propMap.put(parentSliceName, Slice.INACTIVE);
-            propMap.put(sliceName, Slice.ACTIVE);
+            propMap.put(parentSliceName, Slice.State.INACTIVE.toString());
+            propMap.put(sliceName, Slice.State.ACTIVE.toString());
             for (Slice subShardSlice : subShardSlices) {
-              propMap.put(subShardSlice.getName(), Slice.ACTIVE);
+              propMap.put(subShardSlice.getName(), Slice.State.ACTIVE.toString());
             }
             propMap.put(ZkStateReader.COLLECTION_PROP, collection.getName());
             ZkNodeProps m = new ZkNodeProps(propMap);

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java Wed Apr  1 05:42:47 2015
@@ -23,6 +23,7 @@ import java.util.Map;
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
+
 import org.apache.solr.cloud.Assign;
 import org.apache.solr.cloud.Overseer;
 import org.apache.solr.common.cloud.ClusterState;
@@ -187,10 +188,12 @@ public class SliceMutator {
       }
       log.info("Update shard state " + key + " to " + message.getStr(key));
       Map<String, Object> props = slice.shallowCopy();
-      if (Slice.RECOVERY.equals(props.get(Slice.STATE)) && Slice.ACTIVE.equals(message.getStr(key))) {
+      
+      if (Slice.State.getState((String) props.get(ZkStateReader.STATE_PROP)) == Slice.State.RECOVERY
+          && Slice.State.getState(message.getStr(key)) == Slice.State.ACTIVE) {
         props.remove(Slice.PARENT);
       }
-      props.put(Slice.STATE, message.getStr(key));
+      props.put(ZkStateReader.STATE_PROP, message.getStr(key));
       Slice newSlice = new Slice(slice.getName(), slice.getReplicasCopy(), props);
       slicesCopy.put(slice.getName(), newSlice);
     }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java Wed Apr  1 05:42:47 2015
@@ -913,9 +913,9 @@ public final class SolrCore implements S
 
       // ZK pre-Register would have already happened so we read slice properties now
       ClusterState clusterState = cc.getZkController().getClusterState();
-      Slice slice = clusterState.getSlice(cd.getCloudDescriptor().getCollectionName(),
+      Slice slice = clusterState.getSlice(cd.getCloudDescriptor().getCollectionName(), 
           cd.getCloudDescriptor().getShardId());
-      if (Slice.CONSTRUCTION.equals(slice.getState())) {
+      if (slice.getState() == Slice.State.CONSTRUCTION) {
         // set update log to buffer before publishing the core
         getUpdateHandler().getUpdateLog().bufferUpdates();
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java Wed Apr  1 05:42:47 2015
@@ -46,6 +46,7 @@ import org.apache.solr.common.SolrExcept
 import org.apache.solr.common.cloud.OnReconnect;
 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.SolrParams;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.util.FastWriter;
@@ -166,12 +167,12 @@ public final class ZookeeperInfoServlet
           
           // state can lie to you if the node is offline, so need to reconcile with live_nodes too
           if (!liveNodes.contains(nodeName))
-            coreState = "down"; // not on a live node, so must be down
+            coreState = ZkStateReader.DOWN; // not on a live node, so must be down
           
-          if ("active".equals(coreState)) {
+          if (ZkStateReader.ACTIVE.equals(coreState)) {
             hasActive = true; // assumed no replicas active and found one that is for this shard
           } else {
-            if ("recovering".equals(coreState)) {
+            if (ZkStateReader.RECOVERING.equals(coreState)) {
               replicaInRecovery = true;
             }
             isHealthy = false; // assumed healthy and found one replica that is not
@@ -188,7 +189,7 @@ public final class ZookeeperInfoServlet
         return !hasDownedShard && !isHealthy; // means no shards offline but not 100% healthy either
       } else if ("downed_shard".equals(filter)) {
         return hasDownedShard;
-      } else if ("recovering".equals(filter)) {
+      } else if (ZkStateReader.RECOVERING.equals(filter)) {
         return !isHealthy && replicaInRecovery;
       }
       

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Wed Apr  1 05:42:47 2015
@@ -37,6 +37,7 @@ import org.apache.solr.common.cloud.DocR
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.RoutingRule;
 import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.Slice.State;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -436,19 +437,18 @@ public class DistributedUpdateProcessor
 
   private boolean couldIbeSubShardLeader(DocCollection coll) {
     // Could I be the leader of a shard in "construction/recovery" state?
-    String myShardId = req.getCore().getCoreDescriptor().getCloudDescriptor()
-        .getShardId();
+    String myShardId = req.getCore().getCoreDescriptor().getCloudDescriptor().getShardId();
     Slice mySlice = coll.getSlice(myShardId);
-    String state = mySlice.getState();
-    return (Slice.CONSTRUCTION.equals(state) || Slice.RECOVERY.equals(state));
+    State state = mySlice.getState();
+    return state == Slice.State.CONSTRUCTION || state == Slice.State.RECOVERY;
   }
   
   private boolean amISubShardLeader(DocCollection coll, Slice parentSlice, String id, SolrInputDocument doc) throws InterruptedException {
     // Am I the leader of a shard in "construction/recovery" state?
     String myShardId = req.getCore().getCoreDescriptor().getCloudDescriptor().getShardId();
     Slice mySlice = coll.getSlice(myShardId);
-    String state = mySlice.getState();
-    if (Slice.CONSTRUCTION.equals(state) || Slice.RECOVERY.equals(state)) {
+    final State state = mySlice.getState();
+    if (state == Slice.State.CONSTRUCTION || state == Slice.State.RECOVERY) {
       Replica myLeader = zkController.getZkStateReader().getLeaderRetry(collection, myShardId);
       boolean amILeader = myLeader.getName().equals(
           req.getCore().getCoreDescriptor().getCloudDescriptor()
@@ -473,7 +473,8 @@ public class DistributedUpdateProcessor
     Collection<Slice> allSlices = coll.getSlices();
     List<Node> nodes = null;
     for (Slice aslice : allSlices) {
-      if (Slice.CONSTRUCTION.equals(aslice.getState()) || Slice.RECOVERY.equals(aslice.getState()))  {
+      final Slice.State state = aslice.getState();
+      if (state == Slice.State.CONSTRUCTION || state == Slice.State.RECOVERY)  {
         DocRouter.Range myRange = coll.getSlice(shardId).getRange();
         if (myRange == null) myRange = new DocRouter.Range(Integer.MIN_VALUE, Integer.MAX_VALUE);
         boolean isSubset = aslice.getRange() != null && aslice.getRange().isSubsetOf(myRange);
@@ -588,7 +589,7 @@ public class DistributedUpdateProcessor
     if (DistribPhase.FROMLEADER == phase && localIsLeader && from != null) { // from will be null on log replay
       String fromShard = req.getParams().get(DISTRIB_FROM_PARENT);
       if (fromShard != null) {
-        if (Slice.ACTIVE.equals(mySlice.getState()))  {
+        if (mySlice.getState() == Slice.State.ACTIVE)  {
           throw new SolrException(ErrorCode.SERVICE_UNAVAILABLE,
               "Request says it is coming from parent shard leader but we are in active state");
         }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrCLI.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrCLI.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrCLI.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrCLI.java Wed Apr  1 05:42:47 2015
@@ -864,7 +864,7 @@ public class SolrCLI {
         if (replicaHealth.isLeader) 
           hasLeader = true;
         
-        if (!"active".equals(replicaHealth.status)) {
+        if (!ZkStateReader.ACTIVE.equals(replicaHealth.status)) {
           healthy = false;
         } else {
           atLeastOneActive = true;

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java Wed Apr  1 05:42:47 2015
@@ -282,7 +282,7 @@ public class CustomCollectionTest extend
         attempts++;
         int activeReplicaCount = 0;
         for (Replica x : zkStateReader.getClusterState().getCollection(collectionName).getSlice("x").getReplicas()) {
-          if("active".equals(x.getStr("state"))) activeReplicaCount++;
+          if(ZkStateReader.ACTIVE.equals(x.getStr(ZkStateReader.STATE_PROP))) activeReplicaCount++;
         }
         Thread.sleep(500);
         if(activeReplicaCount >= replicationFactor) break;

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java Wed Apr  1 05:42:47 2015
@@ -17,6 +17,14 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import static org.apache.solr.cloud.CollectionsAPIDistributedZkTest.*;
+import static org.apache.solr.common.cloud.ZkNodeProps.*;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -31,16 +39,6 @@ import org.apache.solr.common.params.Map
 import org.apache.solr.common.util.NamedList;
 import org.junit.Test;
 
-import java.net.URL;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.solr.cloud.CollectionsAPIDistributedZkTest.setClusterProp;
-import static org.apache.solr.cloud.OverseerCollectionProcessor.NUM_SLICES;
-import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
-import static org.apache.solr.common.cloud.ZkStateReader.MAX_SHARDS_PER_NODE;
-
 public class DeleteInactiveReplicaTest extends AbstractFullDistribZkTestBase{
 
   @Test
@@ -109,8 +107,8 @@ public class DeleteInactiveReplicaTest e
       while (System.currentTimeMillis() < endAt) {
         testcoll = client.getZkStateReader()
             .getClusterState().getCollection(collectionName);
-        if (!"active".equals(testcoll.getSlice(shard1.getName())
-            .getReplica(replica1.getName()).getStr(Slice.STATE))) {
+        if (!ZkStateReader.ACTIVE.equals(testcoll.getSlice(shard1.getName())
+            .getReplica(replica1.getName()).getStr(ZkStateReader.STATE_PROP))) {
           success = true;
         }
         if (success) break;

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java Wed Apr  1 05:42:47 2015
@@ -92,10 +92,10 @@ public class DeleteReplicaTest extends A
       for (Slice slice : testcoll.getSlices()) {
         if(replica1 != null)
           break;
-        if ("active".equals(slice.getStr("state"))) {
+        if (slice.getState() == Slice.State.ACTIVE) {
           shard1 = slice;
           for (Replica replica : shard1.getReplicas()) {
-            if ("active".equals(replica.getStr("state"))) {
+            if (ZkStateReader.ACTIVE.equals(replica.getStr(ZkStateReader.STATE_PROP))) {
               replica1 = replica;
               break;
             }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java Wed Apr  1 05:42:47 2015
@@ -25,6 +25,7 @@ import org.apache.solr.cloud.overseer.Ov
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.Slice.State;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionParams;
@@ -69,8 +70,8 @@ public class DeleteShardTest extends Abs
 
     assertNotNull("Shard1 not found", slice1);
     assertNotNull("Shard2 not found", slice2);
-    assertEquals("Shard1 is not active", Slice.ACTIVE, slice1.getState());
-    assertEquals("Shard2 is not active", Slice.ACTIVE, slice2.getState());
+    assertSame("Shard1 is not active", Slice.State.ACTIVE, slice1.getState());
+    assertSame("Shard2 is not active", Slice.State.ACTIVE, slice2.getState());
 
     try {
       deleteShard(SHARD1);
@@ -79,19 +80,19 @@ public class DeleteShardTest extends Abs
       // expected
     }
 
-    setSliceState(SHARD1, Slice.INACTIVE);
+    setSliceState(SHARD1, Slice.State.INACTIVE);
 
     clusterState = cloudClient.getZkStateReader().getClusterState();
 
     slice1 = clusterState.getSlice(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1);
 
-    assertEquals("Shard1 is not inactive yet.", Slice.INACTIVE, slice1.getState());
+    assertSame("Shard1 is not inactive yet.", Slice.State.INACTIVE, slice1.getState());
 
     deleteShard(SHARD1);
 
     confirmShardDeletion(SHARD1);
 
-    setSliceState(SHARD2, Slice.CONSTRUCTION);
+    setSliceState(SHARD2, Slice.State.CONSTRUCTION);
     deleteShard(SHARD2);
     confirmShardDeletion(SHARD2);
   }
@@ -135,12 +136,12 @@ public class DeleteShardTest extends Abs
     }
   }
 
-  protected void setSliceState(String slice, String state) throws SolrServerException, IOException,
+  protected void setSliceState(String slice, State state) throws SolrServerException, IOException,
       KeeperException, InterruptedException {
     DistributedQueue inQueue = Overseer.getInQueue(cloudClient.getZkStateReader().getZkClient());
     Map<String, Object> propMap = new HashMap<>();
     propMap.put(Overseer.QUEUE_OPERATION, OverseerAction.UPDATESHARDSTATE.toLower());
-    propMap.put(slice, state);
+    propMap.put(slice, state.toString());
     propMap.put(ZkStateReader.COLLECTION_PROP, "collection1");
     ZkNodeProps m = new ZkNodeProps(propMap);
     ZkStateReader zkStateReader = cloudClient.getZkStateReader();
@@ -150,8 +151,8 @@ public class DeleteShardTest extends Abs
     for (int counter = 10; counter > 0; counter--) {
       zkStateReader.updateClusterState(true);
       ClusterState clusterState = zkStateReader.getClusterState();
-      String sliceState = clusterState.getSlice("collection1", slice).getState();
-      if (sliceState.equals(state)) {
+      State sliceState = clusterState.getSlice("collection1", slice).getState();
+      if (sliceState == state) {
         transition = true;
         break;
       }
@@ -164,4 +165,3 @@ public class DeleteShardTest extends Abs
   }
 
 }
-

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java Wed Apr  1 05:42:47 2015
@@ -22,6 +22,7 @@ import org.apache.solr.client.solrj.impl
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.junit.Test;
 
 import java.io.File;
@@ -57,6 +58,7 @@ public class LeaderInitiatedRecoveryOnCo
     }
   }
 
+  @Override
   @Test
   public void test() throws Exception {
     oneShardTest();
@@ -91,7 +93,7 @@ public class LeaderInitiatedRecoveryOnCo
 
     cloudClient.getZkStateReader().updateClusterState(true); // get the latest state
     leader = cloudClient.getZkStateReader().getLeaderRetry(testCollectionName, "shard1");
-    assertEquals("Leader was not active", "active", leader.getStr("state"));
+    assertEquals("Leader was not active", ZkStateReader.ACTIVE, leader.getStr(ZkStateReader.STATE_PROP));
 
     leaderProxy.reopen();
     Thread.sleep(sleepMsBeforeHealPartition);
@@ -134,7 +136,7 @@ public class LeaderInitiatedRecoveryOnCo
 
     cloudClient.getZkStateReader().updateClusterState(true); // get the latest state
     leader = cloudClient.getZkStateReader().getLeaderRetry(testCollectionName, "shard1");
-    assertEquals("Leader was not active", "active", leader.getStr("state"));
+    assertEquals("Leader was not active", ZkStateReader.ACTIVE, leader.getStr(ZkStateReader.STATE_PROP));
 
     leaderProxy.reopen();
     Thread.sleep(sleepMsBeforeHealPartition);

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java Wed Apr  1 05:42:47 2015
@@ -396,8 +396,9 @@ public class ShardSplitTest extends Basi
       clusterState = zkStateReader.getClusterState();
       slice1_0 = clusterState.getSlice(AbstractDistribZkTestBase.DEFAULT_COLLECTION, "shard1_0");
       slice1_1 = clusterState.getSlice(AbstractDistribZkTestBase.DEFAULT_COLLECTION, "shard1_1");
-      if (Slice.ACTIVE.equals(slice1_0.getState()) && Slice.ACTIVE.equals(slice1_1.getState()))
+      if (slice1_0.getState() == Slice.State.ACTIVE && slice1_1.getState() == Slice.State.ACTIVE) {
         break;
+      }
       Thread.sleep(500);
     }
 
@@ -405,8 +406,8 @@ public class ShardSplitTest extends Basi
 
     assertNotNull("Cluster state does not contain shard1_0", slice1_0);
     assertNotNull("Cluster state does not contain shard1_0", slice1_1);
-    assertEquals("shard1_0 is not active", Slice.ACTIVE, slice1_0.getState());
-    assertEquals("shard1_1 is not active", Slice.ACTIVE, slice1_1.getState());
+    assertSame("shard1_0 is not active", Slice.State.ACTIVE, slice1_0.getState());
+    assertSame("shard1_1 is not active", Slice.State.ACTIVE, slice1_1.getState());
     assertEquals("Wrong number of replicas created for shard1_0", numReplicas, slice1_0.getReplicas().size());
     assertEquals("Wrong number of replicas created for shard1_1", numReplicas, slice1_1.getReplicas().size());
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java Wed Apr  1 05:42:47 2015
@@ -32,8 +32,9 @@ import java.util.Map;
 import java.util.Set;
 
 public class SliceStateTest extends SolrTestCaseJ4 {
+  
   @Test
-  public void testDefaultSliceState() throws Exception {
+  public void testDefaultSliceState() {
     Map<String, DocCollection> collectionStates = new HashMap<>();
     Set<String> liveNodes = new HashSet<>();
     liveNodes.add("node1");
@@ -45,15 +46,14 @@ public class SliceStateTest extends Solr
     Replica replica = new Replica("node1", props);
     sliceToProps.put("node1", replica);
     Slice slice = new Slice("shard1", sliceToProps, null);
-    assertEquals("Default state not set to active", Slice.ACTIVE, slice.getState());
+    assertSame("Default state not set to active", Slice.State.ACTIVE, slice.getState());
     slices.put("shard1", slice);
     collectionStates.put("collection1", new DocCollection("collection1", slices, null, DocRouter.DEFAULT));
 
-    ZkStateReader mockZkStateReader = ClusterStateTest.getMockZkStateReader(collectionStates.keySet());
     ClusterState clusterState = new ClusterState(-1,liveNodes, collectionStates);
     byte[] bytes = ZkStateReader.toJSON(clusterState);
     ClusterState loadedClusterState = ClusterState.load(-1, bytes, liveNodes);
 
-    assertEquals("Default state not set to active", "active", loadedClusterState.getSlice("collection1", "shard1").getState());
+    assertSame("Default state not set to active", Slice.State.ACTIVE, loadedClusterState.getSlice("collection1", "shard1").getState());
   }
 }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java Wed Apr  1 05:42:47 2015
@@ -24,6 +24,7 @@ import org.apache.solr.cloud.MockZkState
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
 
 public class TestClusterStateMutator extends SolrTestCaseJ4 {
@@ -60,8 +61,8 @@ public class TestClusterStateMutator ext
     assertNotNull(collection.getSlicesMap().get("y"));
     assertNull(collection.getSlicesMap().get("x").getRange());
     assertNull(collection.getSlicesMap().get("y").getRange());
-    assertEquals("active", collection.getSlicesMap().get("x").getState());
-    assertEquals("active", collection.getSlicesMap().get("y").getState());
+    assertSame(Slice.State.ACTIVE, collection.getSlicesMap().get("x").getState());
+    assertSame(Slice.State.ACTIVE, collection.getSlicesMap().get("y").getState());
     assertEquals(4, collection.getMaxShardsPerNode());
     assertEquals(ImplicitDocRouter.class, collection.getRouter().getClass());
     assertNotNull(state.getCollectionOrNull("xyz")); // we still have the old collection

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java Wed Apr  1 05:42:47 2015
@@ -75,7 +75,7 @@ public class ClusterStateUtil {
           Collection<Slice> slices = docCollection.getSlices();
           for (Slice slice : slices) {
             // only look at active shards
-            if (slice.getState().equals(Slice.ACTIVE)) {
+            if (slice.getState() == Slice.State.ACTIVE) {
               Collection<Replica> replicas = slice.getReplicas();
               for (Replica replica : replicas) {
                 // on a live node?
@@ -135,7 +135,7 @@ public class ClusterStateUtil {
         Collection<Slice> slices = docCollection.getSlices();
         for (Slice slice : slices) {
           // only look at active shards
-          if (slice.getState().equals(Slice.ACTIVE)) {
+          if (slice.getState() == Slice.State.ACTIVE) {
             Collection<Replica> replicas = slice.getReplicas();
             for (Replica replica : replicas) {
               // on a live node?
@@ -188,7 +188,7 @@ public class ClusterStateUtil {
           Collection<Slice> slices = docCollection.getSlices();
           for (Slice slice : slices) {
             // only look at active shards
-            if (slice.getState().equals(Slice.ACTIVE)) {
+            if (slice.getState() == Slice.State.ACTIVE) {
               Collection<Replica> replicas = slice.getReplicas();
               for (Replica replica : replicas) {
                 // on a live node?

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java Wed Apr  1 05:42:47 2015
@@ -87,7 +87,7 @@ public class DocCollection extends ZkNod
 
     while (iter.hasNext()) {
       Map.Entry<String, Slice> slice = iter.next();
-      if (slice.getValue().getState().equals(Slice.ACTIVE))
+      if (slice.getValue().getState() == Slice.State.ACTIVE)
         this.activeSlices.put(slice.getKey(), slice.getValue());
     }
     this.router = router;

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java?rev=1670566&r1=1670565&r2=1670566&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java Wed Apr  1 05:42:47 2015
@@ -23,28 +23,65 @@ import org.noggit.JSONWriter;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.Locale;
 import java.util.Map;
 
 /**
  * A Slice contains immutable information about a logical shard (all replicas that share the same shard id).
  */
 public class Slice extends ZkNodeProps {
-  public static String REPLICAS = "replicas";
-  public static String RANGE = "range";
-  public static String STATE = "state";
-  public static String LEADER = "leader";       // FUTURE: do we want to record the leader as a slice property in the JSON (as opposed to isLeader as a replica property?)
-  public static String ACTIVE = "active";
-  public static String INACTIVE = "inactive";
-  public static String CONSTRUCTION = "construction";
-  public static String RECOVERY = "recovery";
-  public static String PARENT = "parent";
+  
+  /** The slice's state. */
+  public enum State {
+    
+    /** The default state of a slice. */
+    ACTIVE,
+    
+    /**
+     * A slice is put in that state after it has been successfully split. See
+     * <a href="https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api3">
+     * the reference guide</a> for more details.
+     */
+    INACTIVE,
+    
+    /**
+     * When a shard is split, the new sub-shards are put in that state while the
+     * split operation is in progress. A shard in that state still receives
+     * update requests from the parent shard leader, however does not participate
+     * in distributed search.
+     */
+    CONSTRUCTION,
+    
+    /**
+     * Sub-shards of a split shard are put in that state, when they need to
+     * create replicas in order to meet the collection's replication factor. A
+     * shard in that state still receives update requests from the parent shard
+     * leader, however does not participate in distributed search.
+     */
+    RECOVERY;
+    
+    @Override
+    public String toString() {
+      return super.toString().toLowerCase(Locale.ROOT);
+    }
+    
+    /** Converts the state string to a State instance. */
+    public static State getState(String stateStr) {
+      return State.valueOf(stateStr.toUpperCase(Locale.ROOT));
+    }
+  }
+  
+  public static final String REPLICAS = "replicas";
+  public static final String RANGE = "range";
+  public static final String LEADER = "leader";       // FUTURE: do we want to record the leader as a slice property in the JSON (as opposed to isLeader as a replica property?)
+  public static final String PARENT = "parent";
 
   private final String name;
   private final DocRouter.Range range;
   private final Integer replicationFactor;      // FUTURE: optional per-slice override of the collection replicationFactor
   private final Map<String,Replica> replicas;
   private final Replica leader;
-  private final String state;
+  private final State state;
   private final String parent;
   private final Map<String, RoutingRule> routingRules;
 
@@ -58,11 +95,11 @@ public class Slice extends ZkNodeProps {
     this.name = name;
 
     Object rangeObj = propMap.get(RANGE);
-    if (propMap.containsKey(STATE) && propMap.get(STATE) != null)
-      this.state = (String) propMap.get(STATE);
-    else {
-      this.state = ACTIVE;                         //Default to ACTIVE
-      propMap.put(STATE, this.state);
+    if (propMap.get(ZkStateReader.STATE_PROP) != null) {
+      this.state = State.getState((String) propMap.get(ZkStateReader.STATE_PROP));
+    } else {
+      this.state = State.ACTIVE;                         //Default to ACTIVE
+      propMap.put(ZkStateReader.STATE_PROP, state.toString());
     }
     DocRouter.Range tmpRange = null;
     if (rangeObj instanceof DocRouter.Range) {
@@ -172,7 +209,7 @@ public class Slice extends ZkNodeProps {
     return range;
   }
 
-  public String getState() {
+  public State getState() {
     return state;
   }