You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2015/04/01 17:24:22 UTC

svn commit: r1670673 [1/2] - in /lucene/dev/branches/lucene6271: ./ dev-tools/ dev-tools/scripts/ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/java/org/apache/lucene/search/ lucene/core/src/test/org/apache/lucene/i...

Author: rmuir
Date: Wed Apr  1 15:24:20 2015
New Revision: 1670673

URL: http://svn.apache.org/r1670673
Log:
merge trunk up to r1670672

Modified:
    lucene/dev/branches/lucene6271/   (props changed)
    lucene/dev/branches/lucene6271/dev-tools/   (props changed)
    lucene/dev/branches/lucene6271/dev-tools/scripts/createPatch.py
    lucene/dev/branches/lucene6271/lucene/   (props changed)
    lucene/dev/branches/lucene6271/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/lucene6271/lucene/core/   (props changed)
    lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java
    lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java
    lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
    lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java
    lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java
    lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java
    lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java
    lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java
    lucene/dev/branches/lucene6271/lucene/facet/   (props changed)
    lucene/dev/branches/lucene6271/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java
    lucene/dev/branches/lucene6271/lucene/suggest/   (props changed)
    lucene/dev/branches/lucene6271/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/SuggestFieldTest.java
    lucene/dev/branches/lucene6271/solr/   (props changed)
    lucene/dev/branches/lucene6271/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/lucene6271/solr/core/   (props changed)
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/ZkController.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
    lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/util/SolrCLI.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
    lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/handler/component/DistributedExpandComponentTest.java
    lucene/dev/branches/lucene6271/solr/solrj/   (props changed)
    lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java
    lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
    lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
    lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
    lucene/dev/branches/lucene6271/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java

Modified: lucene/dev/branches/lucene6271/dev-tools/scripts/createPatch.py
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/dev-tools/scripts/createPatch.py?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/dev-tools/scripts/createPatch.py (original)
+++ lucene/dev/branches/lucene6271/dev-tools/scripts/createPatch.py Wed Apr  1 15:24:20 2015
@@ -90,7 +90,7 @@ def run_diff(from_dir, to_dir, skip_whit
     flags += 'bBw'
 
   args = ['diff', flags]
-  for ignore in ('.svn', '.git', 'build', '.caches', '.idea', 'idea-build'):
+  for ignore in ('.svn', '.git', 'build', '.caches', '.idea', 'idea-build', 'eclipse-build'):
     args.append('-x')
     args.append(ignore)
   args.append(from_dir)

Modified: lucene/dev/branches/lucene6271/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/CHANGES.txt?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/lucene6271/lucene/CHANGES.txt Wed Apr  1 15:24:20 2015
@@ -52,6 +52,12 @@ Bug Fixes
 
 * LUCENE-6378: Fix all RuntimeExceptions to throw the underlying root cause.
   (Varun Thacker, Adrien Grand, Mike McCandless)
+
+API Changes
+
+* LUCENE-6377: SearcherFactory#newSearcher now accepts the previous reader
+  to simplify warming logic during opening new searchers. (Simon Willnauer)
+
 ======================= Lucene 5.1.0 =======================
 
 New Features
@@ -109,6 +115,10 @@ Bug Fixes
   toString method of IndexInputs confess when they are from a compound
   file. (Robert Muir, Mike McCandless)
 
+* LUCENE-6381: Add defensive wait time limit in
+  DocumentsWriterStallControl to prevent hangs during indexing if we
+  miss a .notify/All somewhere (Mike McCandless)
+
 Optimizations
 
 * LUCENE-6183, LUCENE-5647: Avoid recompressing stored fields

Modified: lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java Wed Apr  1 15:24:20 2015
@@ -77,7 +77,9 @@ final class DocumentsWriterStallControl
           // don't loop here, higher level logic will re-stall!
           try {
             incWaiters();
-            wait();
+            // Defensive, in case we have a concurrency bug that fails to .notify/All our thread:
+            // just wait for up to 1 second here, and let caller re-stall if it's still needed:
+            wait(1000);
             decrWaiters();
           } catch (InterruptedException e) {
             throw new ThreadInterruptedException(e);

Modified: lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java Wed Apr  1 15:24:20 2015
@@ -49,9 +49,15 @@ import org.apache.lucene.search.similari
  */
 public class SearcherFactory {
   /** 
-   * Returns a new IndexSearcher over the given reader. 
+   * Returns a new IndexSearcher over the given reader.
+   * @param reader the reader to create a new searcher for
+   * @param previousReader the reader previously used to create a new searcher.
+   *                       This can be <code>null</code> if unknown or if the given reader is the initially opened reader.
+   *                       If this reader is non-null it can be used to find newly opened segments compared to the new reader to warm
+   *                       the searcher up before returning.
    */
-  public IndexSearcher newSearcher(IndexReader reader) throws IOException {
+  public IndexSearcher newSearcher(IndexReader reader, IndexReader previousReader) throws IOException {
     return new IndexSearcher(reader);
   }
+
 }

Modified: lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java Wed Apr  1 15:24:20 2015
@@ -86,7 +86,7 @@ public final class SearcherManager exten
       searcherFactory = new SearcherFactory();
     }
     this.searcherFactory = searcherFactory;
-    current = getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes));
+    current = getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes), null);
   }
   
   /**
@@ -103,7 +103,7 @@ public final class SearcherManager exten
       searcherFactory = new SearcherFactory();
     }
     this.searcherFactory = searcherFactory;
-    current = getSearcher(searcherFactory, DirectoryReader.open(dir));
+    current = getSearcher(searcherFactory, DirectoryReader.open(dir), null);
   }
 
   /**
@@ -122,7 +122,7 @@ public final class SearcherManager exten
       searcherFactory = new SearcherFactory();
     }
     this.searcherFactory = searcherFactory;
-    this.current = getSearcher(searcherFactory, reader);
+    this.current = getSearcher(searcherFactory, reader, null);
   }
 
   @Override
@@ -138,7 +138,7 @@ public final class SearcherManager exten
     if (newReader == null) {
       return null;
     } else {
-      return getSearcher(searcherFactory, newReader);
+      return getSearcher(searcherFactory, newReader, r);
     }
   }
   
@@ -172,11 +172,11 @@ public final class SearcherManager exten
    *  IndexReader} using the provided {@link
    *  SearcherFactory}.  NOTE: this decRefs incoming reader
    * on throwing an exception. */
-  public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader) throws IOException {
+  public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader, IndexReader previousReader) throws IOException {
     boolean success = false;
     final IndexSearcher searcher;
     try {
-      searcher = searcherFactory.newSearcher(reader);
+      searcher = searcherFactory.newSearcher(reader, previousReader);
       if (searcher.getIndexReader() != reader) {
         throw new IllegalStateException("SearcherFactory must wrap exactly the provided reader (got " + searcher.getIndexReader() + " but expected " + reader + ")");
       }

Modified: lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java Wed Apr  1 15:24:20 2015
@@ -46,7 +46,7 @@ public class TestDocumentsWriterStallCon
     ctrl.updateStalled(true);
     waitThreads = waitThreads(atLeast(1), ctrl);
     start(waitThreads);
-    awaitState(Thread.State.WAITING, waitThreads);
+    awaitState(Thread.State.TIMED_WAITING, waitThreads);
     assertTrue(ctrl.hasBlocked());
     assertTrue(ctrl.anyStalledThreads());
     ctrl.updateStalled(false);

Modified: lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java Wed Apr  1 15:24:20 2015
@@ -219,7 +219,7 @@ public class TestControlledRealTimeReope
 
     final SearcherFactory sf = new SearcherFactory() {
         @Override
-        public IndexSearcher newSearcher(IndexReader r) throws IOException {
+        public IndexSearcher newSearcher(IndexReader r, IndexReader previous) throws IOException {
           TestControlledRealTimeReopenThread.this.warmCalled = true;
           IndexSearcher s = new IndexSearcher(r, es);
           s.search(new TermQuery(new Term("body", "united")), 10);
@@ -413,7 +413,7 @@ public class TestControlledRealTimeReope
 
     final SearcherFactory theEvilOne = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader ignored) {
+      public IndexSearcher newSearcher(IndexReader ignored, IndexReader previous) {
         return LuceneTestCase.newSearcher(other);
       }
       };

Modified: lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java Wed Apr  1 15:24:20 2015
@@ -83,7 +83,7 @@ public class TestLRUQueryCache extends L
     final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
     final SearcherFactory searcherFactory = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader reader) throws IOException {
+      public IndexSearcher newSearcher(IndexReader reader, IndexReader previous) throws IOException {
         IndexSearcher searcher = new IndexSearcher(reader);
         searcher.setQueryCachingPolicy(MAYBE_CACHE_POLICY);
         searcher.setQueryCache(queryCache);

Modified: lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java Wed Apr  1 15:24:20 2015
@@ -51,7 +51,7 @@ public class TestLiveFieldValues extends
 
     final SearcherManager mgr = new SearcherManager(w, true, new SearcherFactory() {
         @Override
-        public IndexSearcher newSearcher(IndexReader r) {
+        public IndexSearcher newSearcher(IndexReader r, IndexReader previous) {
           return new IndexSearcher(r);
         }
       });

Modified: lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java (original)
+++ lucene/dev/branches/lucene6271/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java Wed Apr  1 15:24:20 2015
@@ -78,7 +78,7 @@ public class TestSearcherManager extends
   protected void doAfterWriter(final ExecutorService es) throws Exception {
     final SearcherFactory factory = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader r) throws IOException {
+      public IndexSearcher newSearcher(IndexReader r, IndexReader previous) throws IOException {
         IndexSearcher s = new IndexSearcher(r, es);
         TestSearcherManager.this.warmCalled = true;
         s.search(new TermQuery(new Term("body", "united")), 10);
@@ -217,7 +217,7 @@ public class TestSearcherManager extends
     final ExecutorService es = random().nextBoolean() ? null : Executors.newCachedThreadPool(new NamedThreadFactory("testIntermediateClose"));
     final SearcherFactory factory = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader r) {
+      public IndexSearcher newSearcher(IndexReader r, IndexReader previous) {
         try {
           if (triedReopen.get()) {
             awaitEnterWarm.countDown();
@@ -400,7 +400,7 @@ public class TestSearcherManager extends
 
     final SearcherFactory theEvilOne = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader ignored) {
+      public IndexSearcher newSearcher(IndexReader ignored, IndexReader previous) {
         return LuceneTestCase.newSearcher(other);
       }
       };
@@ -503,4 +503,47 @@ public class TestSearcherManager extends
     w.close();
     dir.close();
   }
+
+  public void testPreviousReaderIsPassed() throws IOException {
+    final Directory dir = newDirectory();
+    final IndexWriter w = new IndexWriter(dir, newIndexWriterConfig());
+    w.addDocument(new Document());
+    class MySearcherFactory extends SearcherFactory {
+      IndexReader lastReader = null;
+      IndexReader lastPreviousReader = null;
+      int called = 0;
+      @Override
+      public IndexSearcher newSearcher(IndexReader reader, IndexReader previousReader) throws IOException {
+        called++;
+        lastReader = reader;
+        lastPreviousReader = previousReader;
+        return super.newSearcher(reader, previousReader);
+      }
+    }
+
+    MySearcherFactory factory = new MySearcherFactory();
+    final SearcherManager sm = new SearcherManager(w, random().nextBoolean(), factory);
+    assertEquals(1, factory.called);
+    assertNull(factory.lastPreviousReader);
+    assertNotNull(factory.lastReader);
+    IndexSearcher acquire = sm.acquire();
+    assertSame(factory.lastReader, acquire.getIndexReader());
+    sm.release(acquire);
+
+    final IndexReader lastReader = factory.lastReader;
+    // refresh
+    w.addDocument(new Document());
+    assertTrue(sm.maybeRefresh());
+
+    acquire = sm.acquire();
+    assertSame(factory.lastReader, acquire.getIndexReader());
+    sm.release(acquire);
+    assertNotNull(factory.lastPreviousReader);
+    assertSame(lastReader, factory.lastPreviousReader);
+    assertNotSame(factory.lastReader, lastReader);
+    assertEquals(2, factory.called);
+    w.close();
+    sm.close();
+    dir.close();
+  }
 }

Modified: lucene/dev/branches/lucene6271/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java (original)
+++ lucene/dev/branches/lucene6271/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java Wed Apr  1 15:24:20 2015
@@ -70,7 +70,7 @@ public class SearcherTaxonomyManager ext
     this.searcherFactory = searcherFactory;
     this.taxoWriter = taxoWriter;
     DirectoryTaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoWriter);
-    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes)), taxoReader);
+    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes), null), taxoReader);
     this.taxoEpoch = taxoWriter.getTaxonomyEpoch();
   }
 
@@ -88,7 +88,7 @@ public class SearcherTaxonomyManager ext
     }
     this.searcherFactory = searcherFactory;
     DirectoryTaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);
-    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(indexDir)), taxoReader);
+    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(indexDir), null), taxoReader);
     this.taxoWriter = null;
     taxoEpoch = -1;
   }
@@ -138,7 +138,7 @@ public class SearcherTaxonomyManager ext
         throw new IllegalStateException("DirectoryTaxonomyWriter.replaceTaxonomy was called, which is not allowed when using SearcherTaxonomyManager");
       }
 
-      return new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, newReader), tr);
+      return new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, newReader, r), tr);
     }
   }
 

Modified: lucene/dev/branches/lucene6271/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/SuggestFieldTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/SuggestFieldTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/SuggestFieldTest.java (original)
+++ lucene/dev/branches/lucene6271/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/SuggestFieldTest.java Wed Apr  1 15:24:20 2015
@@ -45,6 +45,7 @@ import org.apache.lucene.index.LeafReade
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.StorableField;
 import org.apache.lucene.index.StoredDocument;
+import org.apache.lucene.index.Term;
 import org.apache.lucene.queries.TermsQuery;
 import org.apache.lucene.search.DocIdSet;
 import org.apache.lucene.search.DocIdSetIterator;
@@ -56,9 +57,11 @@ import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.BytesRefBuilder;
 import org.apache.lucene.util.FixedBitSet;
 import org.apache.lucene.util.LineFileDocs;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.NumericUtils;
 import org.apache.lucene.util.TestUtil;
 import org.junit.After;
 import org.junit.Before;
@@ -199,22 +202,9 @@ public class SuggestFieldTest extends Lu
       document.clear();
     }
 
-    // get docIDs to delete
-    DirectoryReader reader = DirectoryReader.open(iw, false);
-    List<Integer> docIdsToDelete = new ArrayList<>();
-    for (int i = 0; i < reader.maxDoc(); i++) {
-      StoredDocument doc = reader.document(i);
-      if ("delete".equals(doc.get("str_field"))) {
-        docIdsToDelete.add(i);
-      }
-    }
-
-    for (Integer docID : docIdsToDelete) {
-      assertTrue(iw.tryDeleteDocument(reader, docID));
-    }
-    reader.close();
+    iw.deleteDocuments(new Term("str_field", "delete"));
 
-    reader = DirectoryReader.open(iw, false);
+    DirectoryReader reader = DirectoryReader.open(iw, false);
     SuggestIndexSearcher indexSearcher = new SuggestIndexSearcher(reader, analyzer);
     TopSuggestDocs suggest = indexSearcher.suggest("suggest_field", "abc_", numLive);
     assertSuggestions(suggest, expectedEntries.toArray(new Entry[expectedEntries.size()]));
@@ -256,17 +246,14 @@ public class SuggestFieldTest extends Lu
     Document document = new Document();
     for (int i = 0; i < num; i++) {
       document.add(newSuggestField("suggest_field", "abc_" + i, i));
+      document.add(newStringField("delete", "delete", Field.Store.NO));
       iw.addDocument(document);
       document.clear();
     }
 
-    DirectoryReader reader = DirectoryReader.open(iw, false);
-    for (int docID = 0; docID < reader.maxDoc(); docID++) {
-      assertTrue(iw.tryDeleteDocument(reader, docID));
-    }
-    reader.close();
+    iw.deleteDocuments(new Term("delete", "delete"));
 
-    reader = DirectoryReader.open(iw, false);
+    DirectoryReader reader = DirectoryReader.open(iw, false);
     SuggestIndexSearcher indexSearcher = new SuggestIndexSearcher(reader, analyzer);
     TopSuggestDocs suggest = indexSearcher.suggest("suggest_field", "abc_", num);
     assertThat(suggest.totalHits, equalTo(0));
@@ -289,20 +276,9 @@ public class SuggestFieldTest extends Lu
       document.clear();
     }
 
-    DirectoryReader reader = DirectoryReader.open(iw, false);
-    // delete all but the lowest scored suggestion
-    for (int docID = 0; docID < reader.maxDoc(); docID++) {
-      StoredDocument doc = reader.document(docID);
-      StorableField[] weights = doc.getFields("weight_fld");
-      assertThat(weights.length, equalTo(1));
-      int weight = (int) weights[0].numericValue();
-      if (weight != 1) {
-        assertTrue(iw.tryDeleteDocument(reader, docID));
-      }
-    }
-    reader.close();
+    iw.deleteDocuments(NumericRangeQuery.newIntRange("weight_fld", 2, null, true, false));
 
-    reader = DirectoryReader.open(iw, false);
+    DirectoryReader reader = DirectoryReader.open(iw, true);
     SuggestIndexSearcher indexSearcher = new SuggestIndexSearcher(reader, analyzer);
     TopSuggestDocs suggest = indexSearcher.suggest("suggest_field", "abc_", 1);
     assertSuggestions(suggest, new Entry("abc_1", 1));

Modified: lucene/dev/branches/lucene6271/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/CHANGES.txt?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/CHANGES.txt (original)
+++ lucene/dev/branches/lucene6271/solr/CHANGES.txt Wed Apr  1 15:24:20 2015
@@ -59,7 +59,36 @@ Other Changes
 * SOLR-6954: Deprecated SolrClient.shutdown() method removed (Alan Woodward)
 
 ==================  5.2.0 ==================
-(No Changes)
+
+Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release
+
+Versions of Major Components
+---------------------
+
+Upgrading from Solr 5.1
+-----------------------
+
+* 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
+----------------------
+
+New Features
+----------------------
+
+Bug Fixes
+----------------------
+
+* SOLR-6709: Fix QueryResponse to deal with the "expanded" section when using the XMLResponseParser
+  (Varun Thacker, Joel Bernstein)
+
+Optimizations
+----------------------
+
+* SOLR-7324: IndexFetcher does not need to call isIndexStale if full copy is already needed
+  (Stephan Lagraulet via Varun Thacker)
 
 ==================  5.1.0 ==================
 
@@ -359,9 +388,6 @@ Optimizations
  * SOLR-7239: improved performance of min & max in StatsComponent, as well as situations 
    where local params disable all stats (hossman)
 
- * SOLR-7324: IndexFetcher does not need to call isIndexStale if full copy is already needed
-   (Stephan Lagraulet via Varun Thacker)
-
 Other Changes
 ----------------------
 
@@ -446,6 +472,10 @@ Other Changes
 * SOLR-7203: Remove buggy no-op retry code in HttpSolrClient (Alan Woodward,
   Mark Miller, Greg Solovyev)
 
+* SOLR-7202: Remove deprecated string action types in Overseer and OverseerCollectionProcessor -
+  "deletecollection", "createcollection", "reloadcollection", "removecollection", "removeshard".
+  (Varun Thacker, shalin)
+
 ==================  5.0.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
@@ -1236,10 +1266,6 @@ Other Changes
 * SOLR-6227: Avoid spurious failures of ChaosMonkeySafeLeaderTest by ensuring there's
   at least one jetty to kill. (shalin)
 
-* SOLR-7202: Remove deprecated string action types in Overseer and OverseerCollectionProcessor -
-  "deletecollection", "createcollection", "reloadcollection", "removecollection", "removeshard".
-  (Varun Thacker, shalin)
-
 ==================  4.10.4 ==================
 
 Bug Fixes

Modified: lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/CloudDescriptor.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/ZkController.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/core/SolrCore.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java Wed Apr  1 15:24:20 2015
@@ -27,6 +27,15 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import com.carrotsearch.hppc.IntObjectOpenHashMap;
+import com.carrotsearch.hppc.IntOpenHashSet;
+import com.carrotsearch.hppc.LongObjectMap;
+import com.carrotsearch.hppc.LongObjectOpenHashMap;
+import com.carrotsearch.hppc.LongOpenHashSet;
+import com.carrotsearch.hppc.cursors.IntObjectCursor;
+import com.carrotsearch.hppc.cursors.LongCursor;
+import com.carrotsearch.hppc.cursors.LongObjectCursor;
+import com.carrotsearch.hppc.cursors.ObjectCursor;
 import org.apache.lucene.index.DocValues;
 import org.apache.lucene.index.DocValuesType;
 import org.apache.lucene.index.FieldInfo;
@@ -62,6 +71,7 @@ import org.apache.solr.common.SolrDocume
 import org.apache.solr.common.params.ExpandParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
@@ -82,16 +92,6 @@ import org.apache.solr.search.SolrIndexS
 import org.apache.solr.util.plugin.PluginInfoInitialized;
 import org.apache.solr.util.plugin.SolrCoreAware;
 
-import com.carrotsearch.hppc.IntObjectOpenHashMap;
-import com.carrotsearch.hppc.IntOpenHashSet;
-import com.carrotsearch.hppc.LongObjectMap;
-import com.carrotsearch.hppc.LongObjectOpenHashMap;
-import com.carrotsearch.hppc.LongOpenHashSet;
-import com.carrotsearch.hppc.cursors.IntObjectCursor;
-import com.carrotsearch.hppc.cursors.LongCursor;
-import com.carrotsearch.hppc.cursors.LongObjectCursor;
-import com.carrotsearch.hppc.cursors.ObjectCursor;
-
 /**
  * The ExpandComponent is designed to work with the CollapsingPostFilter.
  * The CollapsingPostFilter collapses a result set on a field.
@@ -384,7 +384,7 @@ public class ExpandComponent extends Sea
       searcher.search(new FilteredQuery(query, pfilter.filter), collector);
     }
     LongObjectMap groups = ((GroupCollector)groupExpandCollector).getGroups();
-    Map<String, DocSlice> outMap = new HashMap<>();
+    NamedList outMap = new SimpleOrderedMap();
     CharsRefBuilder charsRef = new CharsRefBuilder();
     for (LongObjectCursor cursor : (Iterable<LongObjectCursor>) groups) {
       long groupValue = cursor.key;
@@ -405,14 +405,14 @@ public class ExpandComponent extends Sea
           final BytesRef bytesRef = ordBytes.get((int)groupValue);
           fieldType.indexedToReadable(bytesRef, charsRef);
           String group = charsRef.toString();
-          outMap.put(group, slice);
+          outMap.add(group, slice);
         } else {
           if(fieldType instanceof TrieIntField || fieldType instanceof TrieLongField ) {
-            outMap.put(Long.toString(groupValue), slice);
+            outMap.add(Long.toString(groupValue), slice);
           } else if(fieldType instanceof TrieFloatField) {
-            outMap.put(Float.toString(Float.intBitsToFloat((int)groupValue)), slice);
+            outMap.add(Float.toString(Float.intBitsToFloat((int) groupValue)), slice);
           } else if(fieldType instanceof TrieDoubleField) {
-            outMap.put(Double.toString(Double.longBitsToDouble(groupValue)), slice);
+            outMap.add(Double.toString(Double.longBitsToDouble(groupValue)), slice);
           }
         }
       }
@@ -450,19 +450,19 @@ public class ExpandComponent extends Sea
 
     if ((sreq.purpose & ShardRequest.PURPOSE_GET_FIELDS) != 0) {
       SolrQueryRequest req = rb.req;
-      Map expanded = (Map) req.getContext().get("expanded");
+      NamedList expanded = (NamedList) req.getContext().get("expanded");
       if (expanded == null) {
-        expanded = new HashMap();
+        expanded = new SimpleOrderedMap();
         req.getContext().put("expanded", expanded);
       }
 
       for (ShardResponse srsp : sreq.responses) {
         NamedList response = srsp.getSolrResponse().getResponse();
-        Map ex = (Map) response.get("expanded");
-        for (Map.Entry<String, SolrDocumentList> entry : (Iterable<Map.Entry<String, SolrDocumentList>>) ex.entrySet()) {
-          String name = entry.getKey();
-          SolrDocumentList val = entry.getValue();
-          expanded.put(name, val);
+        NamedList ex = (NamedList) response.get("expanded");
+        for (int i=0; i<ex.size(); i++) {
+          String name = ex.getName(i);
+          SolrDocumentList val = (SolrDocumentList) ex.getVal(i);
+          expanded.add(name, val);
         }
       }
     }
@@ -479,9 +479,9 @@ public class ExpandComponent extends Sea
       return;
     }
 
-    Map expanded = (Map) rb.req.getContext().get("expanded");
+    NamedList expanded = (NamedList) rb.req.getContext().get("expanded");
     if (expanded == null) {
-      expanded = new HashMap();
+      expanded = new SimpleOrderedMap();
     }
 
     rb.rsp.add("expanded", expanded);

Modified: lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/java/org/apache/solr/util/SolrCLI.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/util/SolrCLI.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/util/SolrCLI.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/java/org/apache/solr/util/SolrCLI.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/LeaderInitiatedRecoveryOnCommitTest.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/SliceStateTest.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/core/src/test/org/apache/solr/handler/component/DistributedExpandComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/handler/component/DistributedExpandComponentTest.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/handler/component/DistributedExpandComponentTest.java (original)
+++ lucene/dev/branches/lucene6271/solr/core/src/test/org/apache/solr/handler/component/DistributedExpandComponentTest.java Wed Apr  1 15:24:20 2015
@@ -78,6 +78,7 @@ public class DistributedExpandComponentT
     handle.put("q", SKIP);
     handle.put("maxScore", SKIPVAL);
     handle.put("_version_", SKIP);
+    handle.put("expanded", UNORDERED);
 
     query("q", "*:*", "fq", "{!collapse field="+group+"}", "defType", "edismax", "bf", "field(test_ti)", "expand", "true", "fl","*,score");
     query("q", "*:*", "fq", "{!collapse field="+group+"}", "defType", "edismax", "bf", "field(test_ti)", "expand", "true", "expand.sort", "test_tl desc", "fl","*,score");

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java Wed Apr  1 15:24:20 2015
@@ -17,13 +17,6 @@
 
 package org.apache.solr.client.solrj.response;
 
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
-import org.apache.solr.common.SolrDocumentList;
-import org.apache.solr.common.params.CursorMarkParams;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.SimpleOrderedMap;
-
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -32,6 +25,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.params.CursorMarkParams;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SimpleOrderedMap;
+
 /**
  * 
  *
@@ -86,7 +86,7 @@ public class QueryResponse extends SolrR
 
   // utility variable used for automatic binding -- it should not be serialized
   private transient final SolrClient solrClient;
-  
+
   public QueryResponse(){
     solrClient = null;
   }
@@ -134,7 +134,8 @@ public class QueryResponse extends SolrR
         extractGroupedInfo( _groupedInfo );
       }
       else if("expanded".equals(n)) {
-        _expandedResults = (Map<String, SolrDocumentList>) res.getVal( i );
+        NamedList map = (NamedList) res.getVal(i);
+        _expandedResults = map.asMap(1);
       }
       else if( "highlighting".equals( n ) ) {
         _highlightingInfo = (NamedList<Object>) res.getVal( i );
@@ -480,7 +481,13 @@ public class QueryResponse extends SolrR
     return _facetQuery;
   }
 
-  public Map<String, SolrDocumentList> getExpandedResults(){
+  /**
+   *
+   * @return map with each group value as key and the expanded documents that belong to the group as value.
+   * There is no guarantee on the order of the keys obtained via an iterator.
+   *
+   */
+  public Map<String, SolrDocumentList> getExpandedResults() {
     return this._expandedResults;
   }
 

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java Wed Apr  1 15:24:20 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/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java?rev=1670673&r1=1670672&r2=1670673&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java Wed Apr  1 15:24:20 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;