You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2011/11/29 00:47:50 UTC

svn commit: r1207702 - in /lucene/dev/branches/solrcloud/solr: core/src/java/org/apache/solr/cloud/ core/src/java/org/apache/solr/update/processor/ core/src/test/org/apache/solr/cloud/ solrj/src/java/org/apache/solr/common/cloud/

Author: markrmiller
Date: Mon Nov 28 23:47:48 2011
New Revision: 1207702

URL: http://svn.apache.org/viewvc?rev=1207702&view=rev
Log:
make ZkNodeProps immutable

Modified:
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java

Modified: lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java Mon Nov 28 23:47:48 2011
@@ -294,11 +294,11 @@ public class Overseer implements NodeSta
         shardId = coreState.getProperties().get("shard_id");
       }
       
-      ZkNodeProps props = new ZkNodeProps();
+      Map<String,String> props = new HashMap<String,String>();
       for (Entry<String,String> entry : coreState.getProperties().entrySet()) {
         props.put(entry.getKey(), entry.getValue());
       }
-      
+      ZkNodeProps zkProps = new ZkNodeProps(props);
       Slice slice = cloudState.getSlice(collection, shardId);
       Map<String,ZkNodeProps> shardProps;
       if (slice == null) {
@@ -306,7 +306,7 @@ public class Overseer implements NodeSta
       } else {
         shardProps = cloudState.getSlice(collection, shardId).getShardsCopy();
       }
-      shardProps.put(coreName, props);
+      shardProps.put(coreName, zkProps);
       System.out.println("Current slices:" + cloudState.getSlice(collection, shardId));
       slice = new Slice(shardId, shardProps);
       CloudState state = new CloudState(cloudState.getLiveNodes(),
@@ -357,9 +357,9 @@ public class Overseer implements NodeSta
         if (data != null) {
           ZkNodeProps props = new ZkNodeProps();
           try {
-            props.load(data);
+            props = ZkNodeProps.load(data);
           } catch (IOException e) {
-            e.printStackTrace();
+            log.error("Could not load ZkNodeProps", e);
           }
           collections.put(collection, props);
           log.info("Registered collection " + collection + " with following properties: "

Modified: lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java Mon Nov 28 23:47:48 2011
@@ -321,12 +321,12 @@ public final class ZkController {
               return;
             }
           } catch (KeeperException e) {
-            log.error("Could not read node assignments.", e);
+            log.warn("Could not read node assignments.", e);
             return;
           } catch (InterruptedException e) {
             // Restore the interrupted status
             Thread.currentThread().interrupt();
-            log.error("Could not read node assignments.", e);
+            log.warn("Could not read node assignments.", e);
             return;
           }
           
@@ -430,10 +430,9 @@ public final class ZkController {
       log.info("Load collection config from:" + path);
     }
     byte[] data = zkClient.getData(path, null, null);
-    ZkNodeProps props = new ZkNodeProps();
     
     if(data != null) {
-      props.load(data);
+      ZkNodeProps props = ZkNodeProps.load(data);
       configName = props.get(CONFIGNAME_PROP);
     }
     
@@ -473,7 +472,7 @@ public final class ZkController {
     // checkRecovery will have updated the shardId if it already exists...
     String shardId = cloudDesc.getShardId();
 
-    ZkNodeProps props = new ZkNodeProps();
+    Map<String,String> props = new HashMap<String,String>();
     props.put(ZkStateReader.URL_PROP, shardUrl);
     props.put(ZkStateReader.NODE_NAME_PROP, getNodeName());
     props.put(ZkStateReader.ROLES_PROP, cloudDesc.getRoles());
@@ -482,7 +481,6 @@ public final class ZkController {
       props.put("shard_id", shardId);
     }
 
-
     if (shardId == null && getShardId(desc, state, shardZkNodeName)) {
       publishState(cloudDesc, shardZkNodeName, props); //need to publish state to get overseer assigned id
       shardId = doGetShardIdProcess(coreName, cloudDesc);
@@ -500,7 +498,8 @@ public final class ZkController {
     leaderElector.setupForSlice(shardId, collection);
     
     // leader election
-    doLeaderElectionProcess(shardId, collection, shardZkNodeName, props);
+    ZkNodeProps zkProps = new ZkNodeProps(props);
+    doLeaderElectionProcess(shardId, collection, shardZkNodeName, zkProps);
     
     // should be fine if we do this rather than read from cloud state since it's rare?
     String leaderUrl = zkStateReader.getLeader(collection, cloudDesc.getShardId());
@@ -564,7 +563,8 @@ public final class ZkController {
   ZkNodeProps addToZk(String collection, final CoreDescriptor desc, final CloudDescriptor cloudDesc, String shardUrl,
       final String shardZkNodeName, String state)
       throws Exception {
-    ZkNodeProps props = new ZkNodeProps();
+
+    Map<String,String> props = new HashMap<String,String>();
     props.put(ZkStateReader.URL_PROP, shardUrl);
     
     props.put(ZkStateReader.NODE_NAME_PROP, getNodeName());
@@ -574,10 +574,10 @@ public final class ZkController {
     props.put(ZkStateReader.STATE_PROP, state);
     
     System.out.println("update state to:" + state);
-    
+    ZkNodeProps zkProps = new ZkNodeProps(props);
 
     Map<String, ZkNodeProps> shardProps = new HashMap<String, ZkNodeProps>();
-    shardProps.put(shardZkNodeName, props);
+    shardProps.put(shardZkNodeName, zkProps);
 		Slice slice = new Slice(cloudDesc.getShardId(), shardProps);
 		
 		boolean persisted = false;
@@ -618,7 +618,7 @@ public final class ZkController {
         
         Map<String, ZkNodeProps> shards = new HashMap<String, ZkNodeProps>();
         shards.putAll(slice.getShards());
-        shards.put(shardZkNodeName, props);
+        shards.put(shardZkNodeName, zkProps);
         Slice newSlice = new Slice(slice.getName(), shards);
         
 
@@ -640,7 +640,7 @@ public final class ZkController {
 
 			}
 		}
-    return props;
+    return zkProps;
   }
 
 
@@ -807,7 +807,7 @@ public final class ZkController {
        SolrParams params = cd.getParams();
 
         try {
-          ZkNodeProps collectionProps = new ZkNodeProps();
+          Map<String,String> collectionProps = new HashMap<String,String>();
           // TODO: if collection.configName isn't set, and there isn't already a conf in zk, just use that?
           String defaultConfigName = System.getProperty(COLLECTION_PARAM_PREFIX+CONFIGNAME_PROP, "configuration1");
 
@@ -847,9 +847,8 @@ public final class ZkController {
             int retry = 1;
             for (; retry < 6; retry++) {
               if (zkClient.exists(collectionPath)) {
-                collectionProps = new ZkNodeProps();
-                collectionProps.load(zkClient.getData(collectionPath, null, null));
-                if (collectionProps.containsKey(CONFIGNAME_PROP)) {
+                ZkNodeProps cProps = ZkNodeProps.load(zkClient.getData(collectionPath, null, null));
+                if (cProps.containsKey(CONFIGNAME_PROP)) {
                   break;
                 }
               }
@@ -873,8 +872,8 @@ public final class ZkController {
           }
           
           collectionProps.put("num_shards", Integer.toString(numShards));
-          
-          zkClient.makePath(collectionPath, collectionProps.store(), CreateMode.PERSISTENT, null, true);
+          ZkNodeProps zkProps = new ZkNodeProps(collectionProps);
+          zkClient.makePath(collectionPath, zkProps.store(), CreateMode.PERSISTENT, null, true);
           try {
             // shards_lock node
             if (!zkClient.exists(ZkStateReader.COLLECTIONS_ZKNODE + "/" + collection + "/shards_lock")) {
@@ -915,7 +914,7 @@ public final class ZkController {
 
   
   private void publishState(CloudDescriptor cloudDesc, String shardZkNodeName,
-      ZkNodeProps props) {
+      Map<String,String> props) {
     CoreState coreState = new CoreState(shardZkNodeName,
         cloudDesc.getCollectionName(), props);
     coreStates.put(shardZkNodeName, coreState);

Modified: lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Mon Nov 28 23:47:48 2011
@@ -28,7 +28,6 @@ import java.util.Set;
 import org.apache.commons.lang.NullArgumentException;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.CharsRef;
-import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.cloud.HashPartitioner;
 import org.apache.solr.cloud.HashPartitioner.Range;
 import org.apache.solr.common.SolrException;
@@ -48,7 +47,15 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.update.*;
+import org.apache.solr.update.AddUpdateCommand;
+import org.apache.solr.update.CommitUpdateCommand;
+import org.apache.solr.update.DeleteUpdateCommand;
+import org.apache.solr.update.SolrCmdDistributor;
+import org.apache.solr.update.UpdateCommand;
+import org.apache.solr.update.UpdateHandler;
+import org.apache.solr.update.UpdateLog;
+import org.apache.solr.update.VersionBucket;
+import org.apache.solr.update.VersionInfo;
 import org.apache.zookeeper.KeeperException;
 
 // NOT mt-safe... create a new processor for each add thread
@@ -135,10 +142,9 @@ public class DistributedUpdateProcessor 
         if (leaderChildren.size() > 0) {
           String leader = leaderChildren.get(0);
           
-          ZkNodeProps zkNodeProps = new ZkNodeProps();
           byte[] bytes = zkClient
               .getData(leaderNode + "/" + leader, null, null);
-          zkNodeProps.load(bytes);
+          ZkNodeProps zkNodeProps = ZkNodeProps.load(bytes);
           
           String leaderUrl = zkNodeProps.get("url");
           

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java Mon Nov 28 23:47:48 2011
@@ -18,8 +18,9 @@ package org.apache.solr.cloud;
  */
 
 import java.io.File;
-import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -74,12 +75,13 @@ public abstract class AbstractZkTestCase
 
     zkClient = new SolrZkClient(zkAddress, AbstractZkTestCase.TIMEOUT);
 
-    ZkNodeProps props = new ZkNodeProps();
+    Map<String,String> props = new HashMap<String,String>();
     props.put("configName", "conf1");
-    zkClient.makePath("/collections/collection1", props.store(), CreateMode.PERSISTENT);
+    ZkNodeProps zkProps = new ZkNodeProps(props);
+    zkClient.makePath("/collections/collection1", zkProps.store(), CreateMode.PERSISTENT);
     zkClient.makePath("/collections/collection1/shards", CreateMode.PERSISTENT);
 
-    zkClient.makePath("/collections/control_collection", props.store(), CreateMode.PERSISTENT);
+    zkClient.makePath("/collections/control_collection", zkProps.store(), CreateMode.PERSISTENT);
     zkClient.makePath("/collections/control_collection/shards", CreateMode.PERSISTENT);
 
     putConfig(zkClient, config);

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java Mon Nov 28 23:47:48 2011
@@ -37,9 +37,11 @@ public class CloudStateTest extends Solr
     
     Map<String,Slice> slices = new HashMap<String,Slice>();
     Map<String,ZkNodeProps> sliceToProps = new HashMap<String,ZkNodeProps>();
-    ZkNodeProps zkNodeProps = new ZkNodeProps();
-    zkNodeProps.put("prop1", "value");
-    sliceToProps.put("node1", zkNodeProps );
+    Map<String,String> props = new HashMap<String,String>();
+
+    props.put("prop1", "value");
+    ZkNodeProps zkNodeProps = new ZkNodeProps(props);
+    sliceToProps.put("node1", zkNodeProps);
     Slice slice = new Slice("shard1", sliceToProps);
     slices.put("shard1", slice);
     collectionStates.put("collection1", slices);

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java Mon Nov 28 23:47:48 2011
@@ -18,6 +18,7 @@ package org.apache.solr.cloud;
  */
 
 import java.io.File;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -136,11 +137,13 @@ public class CloudStateUpdateTest extend
   public void testCoreRegistration() throws Exception {
     System.setProperty("CLOUD_UPDATE_DELAY", "1");
     
-    ZkNodeProps props2 = new ZkNodeProps();
+   
+    Map<String,String> props2 = new HashMap<String,String>();
     props2.put("configName", "conf1");
+    ZkNodeProps zkProps2 = new ZkNodeProps(props2);
     
     SolrZkClient zkClient = new SolrZkClient(zkServer.getZkAddress(), AbstractZkTestCase.TIMEOUT);
-    zkClient.makePath("/collections/testcore", props2.store(), CreateMode.PERSISTENT);
+    zkClient.makePath("/collections/testcore", zkProps2.store(), CreateMode.PERSISTENT);
     zkClient.makePath("/collections/testcore/shards", CreateMode.PERSISTENT);
     zkClient.close();
     

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java Mon Nov 28 23:47:48 2011
@@ -120,9 +120,7 @@ public class LeaderElectionIntegrationTe
   
   @Test
   public void testSimpleSliceLeaderElection() throws Exception {
-    
-    ZkNodeProps props2 = new ZkNodeProps();
-    props2.put("configName", "conf1");
+
     //printLayout(zkServer.getZkAddress());
     
     for (int i = 0; i < 4; i++) {

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java Mon Nov 28 23:47:48 2011
@@ -1,7 +1,9 @@
 package org.apache.solr.cloud;
 
 import java.io.File;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -57,12 +59,16 @@ public class OverseerTest extends SolrTe
       collection2Desc.setCollectionName("collection2");
 
       //create collection specs
-      ZkNodeProps props = new ZkNodeProps();
+      Map<String,String> props = new HashMap<String,String>();
+   
       props.put("num_shards", "3");
-      zkClient.setData("/collections/collection1", props.store());
+      ZkNodeProps zkProps = new ZkNodeProps(props);
+      zkClient.setData("/collections/collection1", zkProps.store());
       props.put("num_shards", "1");
-      zkClient.setData("/collections/collection2", props.store());
-
+      zkProps = new ZkNodeProps(props);
+      zkClient.setData("/collections/collection2", zkProps.store());
+      ZkNodeProps z = new ZkNodeProps(props);
+      
       CoreDescriptor desc = new CoreDescriptor(null, "core1", "");
       desc.setCloudDescriptor(collection1Desc);
       String shard1 = zkController.register("core1", desc);

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java Mon Nov 28 23:47:48 2011
@@ -18,7 +18,9 @@ package org.apache.solr.cloud;
  */
 
 import java.io.File;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -60,9 +62,10 @@ public class ZkControllerTest extends So
 
       zkClient.makePath(ZkController.CONFIGS_ZKNODE + "/" + actualConfigName);
       
-      ZkNodeProps props = new ZkNodeProps();
+      Map<String,String> props = new HashMap<String,String>();
       props.put("configName", actualConfigName);
-      zkClient.makePath(ZkStateReader.COLLECTIONS_ZKNODE + "/" + COLLECTION_NAME , props.store(), CreateMode.PERSISTENT);
+      ZkNodeProps zkProps = new ZkNodeProps(props);
+      zkClient.makePath(ZkStateReader.COLLECTIONS_ZKNODE + "/" + COLLECTION_NAME , zkProps.store(), CreateMode.PERSISTENT);
 
       if (DEBUG) {
         zkClient.printLayoutToStdOut();

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java Mon Nov 28 23:47:48 2011
@@ -18,27 +18,29 @@ package org.apache.solr.cloud;
  */
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.junit.Test;
 
-
 public class ZkNodePropsTest extends SolrTestCaseJ4 {
   @Test
   public void testBasic() throws IOException {
-
-    ZkNodeProps props = new ZkNodeProps();
+    
+    Map<String,String> props = new HashMap<String,String>();
     props.put("prop1", "value1");
     props.put("prop2", "value2");
     props.put("prop3", "value3");
     props.put("prop4", "value4");
     props.put("prop5", "value5");
     props.put("prop6", "value6");
-    byte[] bytes = props.store();
     
-    ZkNodeProps props2 = new ZkNodeProps();
-    props2.load(bytes);
+    ZkNodeProps zkProps = new ZkNodeProps(props);
+    byte[] bytes = zkProps.store();
+    
+    ZkNodeProps props2 = ZkNodeProps.load(bytes);
     assertEquals("value1", props2.get("prop1"));
     assertEquals("value2", props2.get("prop2"));
     assertEquals("value3", props2.get("prop3"));

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java Mon Nov 28 23:47:48 2011
@@ -165,7 +165,7 @@ public class CloudState {
 							String shardName = shard.getAttributes()
 									.getNamedItem("name").getNodeValue();
 							NodeList propsList = shard.getChildNodes();
-							ZkNodeProps props = new ZkNodeProps();
+							Map<String,String> props = new HashMap<String,String>();
 							
 							for (int i = 0; i < propsList.getLength(); i++) {
 								Node prop = propsList.item(i);
@@ -174,7 +174,7 @@ public class CloudState {
 								String propValue = prop.getTextContent();
 								props.put(propName, propValue);
 							}
-							shards.put(shardName, props);
+							shards.put(shardName, new ZkNodeProps(props));
 						}
             Map<String,Slice> s = null;
             if (!colStates.containsKey(collectionName)) {

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java Mon Nov 28 23:47:48 2011
@@ -39,8 +39,7 @@ public class Slice {
   public Map<String,ZkNodeProps> getShardsCopy() {
     Map<String,ZkNodeProps> shards = new HashMap<String,ZkNodeProps>();
     for (Map.Entry<String,ZkNodeProps> entry : this.shards.entrySet()) {
-      ZkNodeProps zkProps = new ZkNodeProps();
-      zkProps.putAll(entry.getValue());
+      ZkNodeProps zkProps = new ZkNodeProps(entry.getValue());
       shards.put(entry.getKey(), zkProps);
     }
     return shards;

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java Mon Nov 28 23:47:48 2011
@@ -494,7 +494,7 @@ public class SolrZkClient {
       StringWriter stringWriter = new StringWriter();
       StreamResult xmlOutput = new StreamResult(stringWriter);
       TransformerFactory transformerFactory = TransformerFactory.newInstance();
-//      transformerFactory.setAttribute("indent-number", indent);
+      transformerFactory.setAttribute("indent-number", indent);
       Transformer transformer = transformerFactory.newTransformer();
       transformer.setOutputProperty(OutputKeys.INDENT, "yes");
       transformer.transform(xmlInput, xmlOutput);

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java Mon Nov 28 23:47:48 2011
@@ -18,42 +18,72 @@ package org.apache.solr.common.cloud;
  */
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
 
-public class ZkNodeProps extends HashMap<String,String> {
-
-  private static final long serialVersionUID = 1L;
-
-  public void load(byte[] bytes) throws IOException {
+// Immutable
+public class ZkNodeProps  {
+  private final Map<String,String> propMap;
+
+  public ZkNodeProps(Map<String,String> propMap) {
+    this.propMap = new HashMap<String,String>();
+    this.propMap.putAll(propMap);
+  }
+  
+  public ZkNodeProps(ZkNodeProps zkNodeProps) {
+    this.propMap = new HashMap<String,String>();
+    this.propMap.putAll(zkNodeProps.propMap);
+  }
+  
+  public ZkNodeProps() {
+    propMap = new HashMap<String,String>();
+  }
+  
+  public Set<String> keySet() {
+    return Collections.unmodifiableSet(propMap.keySet());
+  }
+  
+  public static ZkNodeProps load(byte[] bytes) throws IOException {
+    ZkNodeProps props = new ZkNodeProps();
     String stringRep = new String(bytes, "UTF-8");
     String[] lines = stringRep.split("\n");
     for (String line : lines) {
       int sepIndex = line.indexOf('=');
       String key = line.substring(0, sepIndex);
       String value = line.substring(sepIndex + 1, line.length());
-      put(key, value);
+      props.propMap.put(key, value);
     }
+    return props;
   }
 
   public byte[] store() throws IOException {
     StringBuilder sb = new StringBuilder();
-    Set<Entry<String,String>> entries = entrySet();
+    Set<Entry<String,String>> entries = propMap.entrySet();
     for(Entry<String,String> entry : entries) {
       sb.append(entry.getKey() + "=" + entry.getValue() + "\n");
     }
     return sb.toString().getBytes("UTF-8");
   }
   
+  public String get(String key) {
+    return propMap.get(key);
+  }
+  
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();
-    Set<Entry<String,String>> entries = entrySet();
+    Set<Entry<String,String>> entries = propMap.entrySet();
     for(Entry<String,String> entry : entries) {
       sb.append(entry.getKey() + "=" + entry.getValue() + "\n");
     }
     return sb.toString();
   }
 
+  public boolean containsKey(String key) {
+    return propMap.containsKey(key);
+  }
+
 }

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java?rev=1207702&r1=1207701&r2=1207702&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java Mon Nov 28 23:47:48 2011
@@ -349,8 +349,7 @@ public class ZkStateReader {
       if (leaderChildren.size() > 0) {
         String leader = leaderChildren.get(0);
         byte[] data = zkClient.getData(leaderPath + "/" + leader, null, null);
-        ZkNodeProps props = new ZkNodeProps();
-        props.load(data);
+        ZkNodeProps props = ZkNodeProps.load(data);
         url = props.get(ZkStateReader.URL_PROP);
         break;
       } else {