You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2012/07/25 10:10:28 UTC

svn commit: r1365483 - in /lucene/dev/branches/lucene2510: ./ lucene/ lucene/analysis/ lucene/analysis/common/ lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/ lucene/core/ lucene/core/src/java/org/apache/lucene/codecs/memory/ lucen...

Author: uschindler
Date: Wed Jul 25 08:10:27 2012
New Revision: 1365483

URL: http://svn.apache.org/viewvc?rev=1365483&view=rev
Log:
Merged revision(s) 1364862-1365482 from lucene/dev/trunk:

........
LUCENE-4044: add spi support to Tokenizer/CharFilter/TokenFilter factory
........
LUCENE-2510: apply movefactories.sh
........
LUCENE-4044: few steps closer to fixing compile
........
LUCENE-4044: add the rest for common/
........
LUCENE-4044: add services for kuromoji
........
LUCENE-4044: more factories and tests
........
LUCENE-4044: fix more compil
........
LUCENE-4044: fix some more tests
........
LUCENE-4197 rename CachedDistanceValueSource
........
LUCENE-4044: get analysis/common tests passing
........
improve zk tests vs blackhole
........
LUCENE-4044: get all lucene tests passing
........
LUCENE-4044: register phonetic factories
........
LUCENE-4245: Make IndexWriter#close() and MergeScheduler#close() non-interruptible
........
LUCENE-4044: port over icu module
........
LUCENE-4044: port over morfologik
........
LUCENE-4044: port over smartcn
........
LUCENE-4245: Addon: handle failures during flushing by enforcing CMS to stop
........
LUCENE-4044: port over stempel/uima
........
LUCENE-4044: port over synfilter
........
LUCENE-4245: better record interruption
........
fix reuse bug
........
simplify + improve test infra
........
LUCENE-4245: use IOUtils to close everything in finally block
........
LUCENE-4044: get solr tests working
........
LUCENE-4044: dont use instances just class names
........

Added:
    lucene/dev/branches/lucene2510/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeFieldCacheDistanceValueSource.java
      - copied unchanged from r1365482, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeFieldCacheDistanceValueSource.java
    lucene/dev/branches/lucene2510/solr/example/solr-webapp/.gitignore
      - copied unchanged from r1365482, lucene/dev/trunk/solr/example/solr-webapp/.gitignore
Removed:
    lucene/dev/branches/lucene2510/lucene/spatial/src/java/org/apache/lucene/spatial/util/CachedDistanceValueSource.java
Modified:
    lucene/dev/branches/lucene2510/   (props changed)
    lucene/dev/branches/lucene2510/lucene/   (props changed)
    lucene/dev/branches/lucene2510/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/lucene2510/lucene/analysis/   (props changed)
    lucene/dev/branches/lucene2510/lucene/analysis/common/   (props changed)
    lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemFilterTest.java
    lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemmerTest.java
    lucene/dev/branches/lucene2510/lucene/core/   (props changed)
    lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/codecs/memory/DirectPostingsFormat.java
    lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
    lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
    lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/MergeScheduler.java
    lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/util/IOUtils.java
    lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java
    lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java
    lucene/dev/branches/lucene2510/lucene/misc/   (props changed)
    lucene/dev/branches/lucene2510/lucene/misc/src/test/org/apache/lucene/misc/TestHighFreqTerms.java
    lucene/dev/branches/lucene2510/lucene/spatial/   (props changed)
    lucene/dev/branches/lucene2510/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
    lucene/dev/branches/lucene2510/solr/   (props changed)
    lucene/dev/branches/lucene2510/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/lucene2510/solr/build.xml   (contents, props changed)
    lucene/dev/branches/lucene2510/solr/contrib/   (props changed)
    lucene/dev/branches/lucene2510/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessor.java
    lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
    lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
    lucene/dev/branches/lucene2510/solr/core/   (props changed)
    lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
    lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/UpdateCommand.java
    lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/TestMultiCoreConfBootstrap.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
    lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java
    lucene/dev/branches/lucene2510/solr/example/   (props changed)
    lucene/dev/branches/lucene2510/solr/example/example-DIH/solr/rss/conf/rss-data-config.xml
    lucene/dev/branches/lucene2510/solr/example/solr/   (props changed)
    lucene/dev/branches/lucene2510/solr/example/solr/collection1/   (props changed)

Modified: lucene/dev/branches/lucene2510/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/CHANGES.txt?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/lucene2510/lucene/CHANGES.txt Wed Jul 25 08:10:27 2012
@@ -100,6 +100,9 @@ Bug Fixes
 * LUCENE-4234: Exception when FacetsCollector is used with ScoreFacetRequest, 
   and the number of matching documents is too large. (Gilad Barkai via Shai Erera)
 
+* LUCENE-4245: Make IndexWriter#close() and MergeScheduler#close()
+  non-interruptible.  (Mark Miller, Uwe Schindler)
+
 Build
 
 * LUCENE-4094: Support overriding file.encoding on forked test JVMs

Modified: lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemFilterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemFilterTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemFilterTest.java (original)
+++ lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemFilterTest.java Wed Jul 25 08:10:27 2012
@@ -30,6 +30,7 @@ import org.apache.lucene.analysis.Tokeni
 import org.apache.lucene.analysis.core.KeywordTokenizer;
 import org.apache.lucene.analysis.miscellaneous.KeywordMarkerFilter;
 import org.apache.lucene.analysis.util.CharArraySet;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
 public class HunspellStemFilterTest  extends BaseTokenStreamTestCase {
@@ -39,6 +40,10 @@ public class HunspellStemFilterTest  ext
   public static void beforeClass() throws IOException, ParseException {
     DICTIONARY = createDict(true);
   }
+  @AfterClass
+  public static void afterClass() {
+    DICTIONARY = null;
+  }
   public static HunspellDictionary createDict(boolean ignoreCase) throws IOException, ParseException {
     InputStream affixStream = HunspellStemmerTest.class.getResourceAsStream("test.aff");
     InputStream dictStream = HunspellStemmerTest.class.getResourceAsStream("test.dic");

Modified: lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemmerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemmerTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemmerTest.java (original)
+++ lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/HunspellStemmerTest.java Wed Jul 25 08:10:27 2012
@@ -19,6 +19,7 @@ package org.apache.lucene.analysis.hunsp
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.Version;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -37,6 +38,11 @@ public class HunspellStemmerTest extends
   public static void beforeClass() throws IOException, ParseException {
     createStemmer(true);
   }
+  
+  @AfterClass
+  public static void afterClass() {
+    stemmer = null;
+  }
 
   @Test
   public void testStem_simpleSuffix() {

Modified: lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/codecs/memory/DirectPostingsFormat.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/codecs/memory/DirectPostingsFormat.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/codecs/memory/DirectPostingsFormat.java (original)
+++ lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/codecs/memory/DirectPostingsFormat.java Wed Jul 25 08:10:27 2012
@@ -1852,7 +1852,7 @@ public class DirectPostingsFormat extend
     public DocsEnum reset(int[] docIDs, int[] freqs) {
       this.docIDs = docIDs;
       this.freqs = freqs;
-      upto = -1;
+      docID = upto = -1;
       return this;
     }
 

Modified: lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java (original)
+++ lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java Wed Jul 25 08:10:27 2012
@@ -243,27 +243,34 @@ public class ConcurrentMergeScheduler ex
     sync();
   }
 
-  /** Wait for any running merge threads to finish */
+  /** Wait for any running merge threads to finish. This call is not interruptible as used by {@link #close()}. */
   public void sync() {
-    while (true) {
-      MergeThread toSync = null;
-      synchronized (this) {
-        for (MergeThread t : mergeThreads) {
-          if (t.isAlive()) {
-            toSync = t;
-            break;
+    boolean interrupted = false;
+    try {
+      while (true) {
+        MergeThread toSync = null;
+        synchronized (this) {
+          for (MergeThread t : mergeThreads) {
+            if (t.isAlive()) {
+              toSync = t;
+              break;
+            }
           }
         }
-      }
-      if (toSync != null) {
-        try {
-          toSync.join();
-        } catch (InterruptedException ie) {
-          throw new ThreadInterruptedException(ie);
+        if (toSync != null) {
+          try {
+            toSync.join();
+          } catch (InterruptedException ie) {
+            // ignore this Exception, we will retry until all threads are dead
+            interrupted = true;
+          }
+        } else {
+          break;
         }
-      } else {
-        break;
       }
+    } finally {
+      // finally, restore interrupt status:
+      if (interrupted) Thread.currentThread().interrupt();
     }
   }
 

Modified: lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java Wed Jul 25 08:10:27 2012
@@ -842,7 +842,7 @@ public class IndexWriter implements Clos
         if (hitOOM) {
           rollbackInternal();
         } else {
-          closeInternal(waitForMerges, !hitOOM);
+          closeInternal(waitForMerges, true);
         }
       }
     }
@@ -870,7 +870,7 @@ public class IndexWriter implements Clos
   }
 
   private void closeInternal(boolean waitForMerges, boolean doFlush) throws IOException {
-
+    boolean interrupted = false;
     try {
 
       if (pendingCommit != null) {
@@ -883,26 +883,57 @@ public class IndexWriter implements Clos
 
       docWriter.close();
 
-      // Only allow a new merge to be triggered if we are
-      // going to wait for merges:
-      if (doFlush) {
-        flush(waitForMerges, true);
-      } else {
-        docWriter.abort(); // already closed
-      }
-
-      if (waitForMerges)
-        // Give merge scheduler last chance to run, in case
-        // any pending merges are waiting:
-        mergeScheduler.merge(this);
-
-      mergePolicy.close();
-
-      synchronized(this) {
-        finishMerges(waitForMerges);
-        stopMerges = true;
+      try {
+        // Only allow a new merge to be triggered if we are
+        // going to wait for merges:
+        if (doFlush) {
+          flush(waitForMerges, true);
+        } else {
+          docWriter.abort(); // already closed
+        }
+        
+      } finally {
+        try {
+          // clean up merge scheduler in all cases, although flushing may have failed:
+          interrupted = Thread.interrupted();
+        
+          if (waitForMerges) {
+            try {
+              // Give merge scheduler last chance to run, in case
+              // any pending merges are waiting:
+              mergeScheduler.merge(this);
+            } catch (ThreadInterruptedException tie) {
+              // ignore any interruption, does not matter
+              interrupted = true;
+              if (infoStream.isEnabled("IW")) {
+                infoStream.message("IW", "interrupted while waiting for final merges");
+              }
+            }
+          }
+          
+          synchronized(this) {
+            for (;;) {
+              try {
+                finishMerges(waitForMerges && !interrupted);
+                break;
+              } catch (ThreadInterruptedException tie) {
+                // by setting the interrupted status, the
+                // next call to finishMerges will pass false,
+                // so it will not wait
+                interrupted = true;
+                if (infoStream.isEnabled("IW")) {
+                  infoStream.message("IW", "interrupted while waiting for merges to finish");
+                }
+              }
+            }
+            stopMerges = true;
+          }
+          
+        } finally {
+          // shutdown policy, scheduler and all threads (this call is not interruptible):
+          IOUtils.closeWhileHandlingException(mergePolicy, mergeScheduler);
+        }
       }
-      mergeScheduler.close();
 
       if (infoStream.isEnabled("IW")) {
         infoStream.message("IW", "now call final commit()");
@@ -943,6 +974,8 @@ public class IndexWriter implements Clos
           }
         }
       }
+      // finally, restore interrupt status:
+      if (interrupted) Thread.currentThread().interrupt();
     }
   }
 

Modified: lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/MergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/MergeScheduler.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/MergeScheduler.java (original)
+++ lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/index/MergeScheduler.java Wed Jul 25 08:10:27 2012
@@ -17,6 +17,7 @@ package org.apache.lucene.index;
  * limitations under the License.
  */
 
+import java.io.Closeable;
 import java.io.IOException;
 
 /** <p>Expert: {@link IndexWriter} uses an instance
@@ -26,7 +27,7 @@ import java.io.IOException;
  *
  * @lucene.experimental
 */
-public abstract class MergeScheduler {
+public abstract class MergeScheduler implements Closeable {
 
   /** Run the merges provided by {@link IndexWriter#getNextMerge()}. */
   public abstract void merge(IndexWriter writer) throws IOException;

Modified: lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/util/IOUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/util/IOUtils.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/util/IOUtils.java (original)
+++ lucene/dev/branches/lucene2510/lucene/core/src/java/org/apache/lucene/util/IOUtils.java Wed Jul 25 08:10:27 2012
@@ -65,7 +65,7 @@ public final class IOUtils {
    * } catch (ExpectedException e) {
    *   priorE = e;
    * } finally {
-   *   closeSafely(priorE, resource1, resource2, resource3);
+   *   closeWhileHandlingException(priorE, resource1, resource2, resource3);
    * }
    * </pre>
    * </p>

Modified: lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java (original)
+++ lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java Wed Jul 25 08:10:27 2012
@@ -43,6 +43,7 @@ import org.apache.lucene.util.Constants;
 import org.apache.lucene.util.FixedBitSet;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util._TestUtil;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
 /* NOTE: This test focuses on the postings
@@ -315,6 +316,15 @@ public class TestPostingsFormat extends 
       System.out.println("TEST: done init postings; maxDocID=" + maxDocID + "; " + allTerms.size() + " total terms, across " + fieldInfos.size() + " fields");
     }
   }
+  
+  @AfterClass
+  public static void afterClass() throws Exception {
+    allTerms = null;
+    fieldInfos = null;
+    fields = null;
+    fieldsLive = null;
+    globalLiveDocs = null;
+  }
 
   // TODO maybe instead of @BeforeClass just make a single test run: build postings & index & test it?
 
@@ -554,7 +564,7 @@ public class TestPostingsFormat extends 
 
     assertNotNull("null DocsEnum", docsEnum);
     int initialDocID = docsEnum.docID();
-    assertTrue("inital docID should be -1 or NO_MORE_DOCS", initialDocID == -1 || initialDocID == DocsEnum.NO_MORE_DOCS);
+    assertTrue("inital docID should be -1 or NO_MORE_DOCS: " + docsEnum, initialDocID == -1 || initialDocID == DocsEnum.NO_MORE_DOCS);
 
     if (VERBOSE) {
       if (prevDocsEnum == null) {

Modified: lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java (original)
+++ lucene/dev/branches/lucene2510/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java Wed Jul 25 08:10:27 2012
@@ -96,7 +96,7 @@ public class TestBasics extends LuceneTe
     }
   }
   
-  static final Analyzer simplePayloadAnalyzer = new Analyzer() {
+  static Analyzer simplePayloadAnalyzer = new Analyzer() {
 
     @Override
     public TokenStreamComponents createComponents(String fieldName, Reader reader) {
@@ -130,6 +130,7 @@ public class TestBasics extends LuceneTe
     searcher = null;
     reader = null;
     directory = null;
+    simplePayloadAnalyzer = null;
   }
 
   @Test

Modified: lucene/dev/branches/lucene2510/lucene/misc/src/test/org/apache/lucene/misc/TestHighFreqTerms.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/misc/src/test/org/apache/lucene/misc/TestHighFreqTerms.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/misc/src/test/org/apache/lucene/misc/TestHighFreqTerms.java (original)
+++ lucene/dev/branches/lucene2510/lucene/misc/src/test/org/apache/lucene/misc/TestHighFreqTerms.java Wed Jul 25 08:10:27 2012
@@ -56,6 +56,7 @@ public class TestHighFreqTerms extends L
     dir.close();
     dir = null;
     reader = null;
+    writer = null;
   }
 /******************** Tests for getHighFreqTerms **********************************/
   

Modified: lucene/dev/branches/lucene2510/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java (original)
+++ lucene/dev/branches/lucene2510/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java Wed Jul 25 08:10:27 2012
@@ -30,7 +30,7 @@ import org.apache.lucene.spatial.Spatial
 import org.apache.lucene.spatial.prefix.tree.Node;
 import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
 import org.apache.lucene.spatial.query.SpatialArgs;
-import org.apache.lucene.spatial.util.CachedDistanceValueSource;
+import org.apache.lucene.spatial.util.ShapeFieldCacheDistanceValueSource;
 
 import java.util.Iterator;
 import java.util.List;
@@ -144,7 +144,7 @@ public abstract class PrefixTreeStrategy
       }
     }
     Point point = args.getShape().getCenter();
-    return new CachedDistanceValueSource(point, calc, p);
+    return new ShapeFieldCacheDistanceValueSource(point, calc, p);
   }
 
   public SpatialPrefixTree getGrid() {

Modified: lucene/dev/branches/lucene2510/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/CHANGES.txt?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/CHANGES.txt (original)
+++ lucene/dev/branches/lucene2510/solr/CHANGES.txt Wed Jul 25 08:10:27 2012
@@ -134,6 +134,10 @@ Bug Fixes
 * SOLR-3623: Fixed inconsistent treatment of third-party dependencies for 
   solr contribs analysis-extras & uima (hossman) 
 
+* SOLR-3652: Fixed range faceting to error instead of looping infinitely 
+  when 'gap' is zero -- or effectively zero due to floating point arithmetic 
+  underflow. (hossman)
+
 Other Changes
 ----------------------
 

Modified: lucene/dev/branches/lucene2510/solr/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/build.xml?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/build.xml (original)
+++ lucene/dev/branches/lucene2510/solr/build.xml Wed Jul 25 08:10:27 2012
@@ -179,7 +179,7 @@
         <!-- Exclude start.jar only (it'd be weird to have a license file there?) -->
         <exclude name="example/start.jar" />
         <exclude name="example/exampledocs/post.jar" />
-        <exclude name="example/work/**" />
+        <exclude name="example/solr-webapp/**" />
       </additional-excludes>
       <additional-filters>
         <replaceregex pattern="/jetty([^/]+)$" replace="/jetty" flags="gi" />
@@ -243,7 +243,7 @@
       <fileset dir="example">
         <include name="**/data/**/*" />
         <include name="webapps/**/*" />
-        <include name="work/**/*" />
+        <include name="solr-webapp/**/*" />
         <exclude name="**/.gitignore" />
       </fileset>
     </delete>

Modified: lucene/dev/branches/lucene2510/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessor.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessor.java (original)
+++ lucene/dev/branches/lucene2510/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessor.java Wed Jul 25 08:10:27 2012
@@ -25,6 +25,7 @@ import org.apache.solr.common.params.Sol
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.IndexSchema;
+import org.apache.solr.schema.SchemaField;
 import org.apache.solr.update.AddUpdateCommand;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -97,7 +98,8 @@ public abstract class LanguageIdentifier
       }
       langField = params.get(LANG_FIELD, DOCID_LANGFIELD_DEFAULT);
       langsField = params.get(LANGS_FIELD, DOCID_LANGSFIELD_DEFAULT);
-      docIdField = params.get(DOCID_PARAM, DOCID_FIELD_DEFAULT);
+      SchemaField uniqueKeyField = schema.getUniqueKeyField();
+      docIdField = params.get(DOCID_PARAM, uniqueKeyField == null ? DOCID_FIELD_DEFAULT : uniqueKeyField.getName());
       fallbackValue = params.get(FALLBACK);
       if(params.get(FALLBACK_FIELDS, "").length() > 0) {
         fallbackFields = params.get(FALLBACK_FIELDS).split(",");

Modified: lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java (original)
+++ lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java Wed Jul 25 08:10:27 2012
@@ -24,7 +24,7 @@ import org.junit.Test;
 public class LangDetectLanguageIdentifierUpdateProcessorFactoryTest extends LanguageIdentifierUpdateProcessorFactoryTestCase {
   @Override
   protected LanguageIdentifierUpdateProcessor createLangIdProcessor(ModifiableSolrParams parameters) throws Exception {
-    return new LangDetectLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(null, parameters, null), resp, null);
+    return new LangDetectLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(h.getCore(), parameters, null), resp, null);
   }
   
   // this one actually works better it seems with short docs

Modified: lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java (original)
+++ lucene/dev/branches/lucene2510/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java Wed Jul 25 08:10:27 2012
@@ -22,6 +22,6 @@ import org.apache.solr.common.params.Mod
 public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageIdentifierUpdateProcessorFactoryTestCase {
   @Override
   protected LanguageIdentifierUpdateProcessor createLangIdProcessor(ModifiableSolrParams parameters) throws Exception {
-    return new TikaLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(null, parameters, null), resp, null);
+    return new TikaLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(h.getCore(), parameters, null), resp, null);
   }
 }

Modified: lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/request/SimpleFacets.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/request/SimpleFacets.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/request/SimpleFacets.java Wed Jul 25 08:10:27 2012
@@ -924,6 +924,11 @@ public class SimpleFacets {
               (SolrException.ErrorCode.BAD_REQUEST,
                   "date facet infinite loop (is gap negative?)");
         }
+        if (high.equals(low)) {
+          throw new SolrException
+            (SolrException.ErrorCode.BAD_REQUEST,
+             "date facet infinite loop: gap is effectively zero");
+        }
         final boolean includeLower =
             (include.contains(FacetRangeInclude.LOWER) ||
                 (include.contains(FacetRangeInclude.EDGE) && low.equals(start)));
@@ -1113,6 +1118,11 @@ public class SimpleFacets {
           (SolrException.ErrorCode.BAD_REQUEST,
            "range facet infinite loop (is gap negative? did the math overflow?)");
       }
+      if (high.compareTo(low) == 0) {
+        throw new SolrException
+          (SolrException.ErrorCode.BAD_REQUEST,
+           "range facet infinite loop: gap is either zero, or too small relative start/end and caused underflow: " + low + " + " + gap + " = " + high );
+      }
       
       final boolean includeLower = 
         (include.contains(FacetRangeInclude.LOWER) ||

Modified: lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/UpdateCommand.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/UpdateCommand.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/UpdateCommand.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/UpdateCommand.java Wed Jul 25 08:10:27 2012
@@ -44,7 +44,7 @@ public abstract class UpdateCommand impl
 
   @Override
   public String toString() {
-    return name() + "{flags="+flags+",version="+version;
+    return name() + "{flags="+flags+",_version_="+version;
   }
 
   public long getVersion() {

Modified: lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Wed Jul 25 08:10:27 2012
@@ -748,7 +748,10 @@ public class DistributedUpdateProcessor 
 
     if (zkEnabled && DistribPhase.TOLEADER == phase) {
       // This core should be a leader
+      isLeader = true;
       replicas = setupRequest();
+    } else if (DistribPhase.FROMLEADER == phase) {
+      isLeader = false;
     }
 
     if (vinfo == null) {

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java Wed Jul 25 08:10:27 2012
@@ -66,18 +66,13 @@ public class ChaosMonkey {
   private boolean expireSessions;
   private boolean causeConnectionLoss;
   private boolean aggressivelyKillLeaders;
-  private Map<String,SolrServer> shardToLeaderClient;
   private Map<String,CloudJettyRunner> shardToLeaderJetty;
   private long startTime;
   
   public ChaosMonkey(ZkTestServer zkServer, ZkStateReader zkStateReader,
       String collection, Map<String,List<CloudJettyRunner>> shardToJetty,
-      Map<String,List<SolrServer>> shardToClient,
-      Map<String,SolrServer> shardToLeaderClient,
       Map<String,CloudJettyRunner> shardToLeaderJetty) {
     this.shardToJetty = shardToJetty;
-    this.shardToClient = shardToClient;
-    this.shardToLeaderClient = shardToLeaderClient;
     this.shardToLeaderJetty = shardToLeaderJetty;
     this.zkServer = zkServer;
     this.zkStateReader = zkStateReader;
@@ -104,7 +99,7 @@ public class ChaosMonkey {
   public void expireRandomSession() throws KeeperException, InterruptedException {
     String sliceName = getRandomSlice();
     
-    JettySolrRunner jetty = getRandomJetty(sliceName, aggressivelyKillLeaders);
+    JettySolrRunner jetty = getRandomJetty(sliceName, aggressivelyKillLeaders).jetty;
     if (jetty != null) {
       expireSession(jetty);
       expires.incrementAndGet();
@@ -115,7 +110,7 @@ public class ChaosMonkey {
     monkeyLog("cause connection loss!");
     
     String sliceName = getRandomSlice();
-    JettySolrRunner jetty = getRandomJetty(sliceName, aggressivelyKillLeaders);
+    JettySolrRunner jetty = getRandomJetty(sliceName, aggressivelyKillLeaders).jetty;
     if (jetty != null) {
       causeConnectionLoss(jetty);
       connloss.incrementAndGet();
@@ -135,23 +130,29 @@ public class ChaosMonkey {
     }
   }
 
-  public JettySolrRunner stopShard(String slice, int index) throws Exception {
-    JettySolrRunner jetty = shardToJetty.get(slice).get(index).jetty;
-    stopJetty(jetty);
-    return jetty;
+  public CloudJettyRunner stopShard(String slice, int index) throws Exception {
+    CloudJettyRunner cjetty = shardToJetty.get(slice).get(index);
+    stopJetty(cjetty);
+    return cjetty;
   }
 
-  public void stopJetty(JettySolrRunner jetty) throws Exception {
-    stop(jetty);
+  public void stopJetty(CloudJettyRunner cjetty) throws Exception {
+    stop(cjetty.jetty);
     stops.incrementAndGet();
   }
 
-  public void killJetty(JettySolrRunner jetty) throws Exception {
-    kill(jetty);
+  public void killJetty(CloudJettyRunner cjetty) throws Exception {
+    kill(cjetty);
     stops.incrementAndGet();
   }
   
-  public static void stop(JettySolrRunner jetty) throws Exception {
+  public void stopJetty(JettySolrRunner jetty) throws Exception {
+    stops.incrementAndGet();
+    stopJettySolrRunner(jetty);
+  }
+  
+  private static void stopJettySolrRunner(JettySolrRunner jetty) throws Exception {
+    
     monkeyLog("stop shard! " + jetty.getLocalPort());
     // get a clean shutdown so that no dirs are left open...
     FilterHolder fh = jetty.getDispatchFilter();
@@ -168,7 +169,8 @@ public class ChaosMonkey {
     }
   }
   
-  public static void kill(JettySolrRunner jetty) throws Exception {
+  public static void kill(CloudJettyRunner cjetty) throws Exception {
+    JettySolrRunner jetty = cjetty.jetty;
     monkeyLog("kill shard! " + jetty.getLocalPort());
     FilterHolder fh = jetty.getDispatchFilter();
     SolrDispatchFilter sdf = null;
@@ -189,7 +191,7 @@ public class ChaosMonkey {
   public void stopShard(String slice) throws Exception {
     List<CloudJettyRunner> jetties = shardToJetty.get(slice);
     for (CloudJettyRunner jetty : jetties) {
-      stopJetty(jetty.jetty);
+      stopJetty(jetty);
     }
   }
   
@@ -197,7 +199,7 @@ public class ChaosMonkey {
     List<CloudJettyRunner> jetties = shardToJetty.get(slice);
     for (CloudJettyRunner jetty : jetties) {
       if (!jetty.nodeName.equals(shardName)) {
-        stopJetty(jetty.jetty);
+        stopJetty(jetty);
       }
     }
   }
@@ -207,22 +209,22 @@ public class ChaosMonkey {
     return jetty;
   }
   
-  public JettySolrRunner stopRandomShard() throws Exception {
+  public CloudJettyRunner stopRandomShard() throws Exception {
     String sliceName = getRandomSlice();
     
     return stopRandomShard(sliceName);
   }
   
-  public JettySolrRunner stopRandomShard(String slice) throws Exception {
-    JettySolrRunner jetty = getRandomJetty(slice, aggressivelyKillLeaders);
-    if (jetty != null) {
-      stopJetty(jetty);
+  public CloudJettyRunner stopRandomShard(String slice) throws Exception {
+    CloudJettyRunner cjetty = getRandomJetty(slice, aggressivelyKillLeaders);
+    if (cjetty != null) {
+      stopJetty(cjetty);
     }
-    return jetty;
+    return cjetty;
   }
   
   
-  public JettySolrRunner killRandomShard() throws Exception {
+  public CloudJettyRunner killRandomShard() throws Exception {
     // add all the shards to a list
     String sliceName = getRandomSlice();
     
@@ -238,15 +240,15 @@ public class ChaosMonkey {
     return sliceName;
   }
   
-  public JettySolrRunner killRandomShard(String slice) throws Exception {
-    JettySolrRunner jetty = getRandomJetty(slice, aggressivelyKillLeaders);
-    if (jetty != null) {
-      killJetty(jetty);
+  public CloudJettyRunner killRandomShard(String slice) throws Exception {
+    CloudJettyRunner cjetty = getRandomJetty(slice, aggressivelyKillLeaders);
+    if (cjetty != null) {
+      killJetty(cjetty);
     }
-    return jetty;
+    return cjetty;
   }
   
-  public JettySolrRunner getRandomJetty(String slice, boolean aggressivelyKillLeaders) throws KeeperException, InterruptedException {
+  public CloudJettyRunner getRandomJetty(String slice, boolean aggressivelyKillLeaders) throws KeeperException, InterruptedException {
     
 
     int numRunning = 0;
@@ -301,15 +303,15 @@ public class ChaosMonkey {
     }
     Random random = LuceneTestCase.random();
     int chance = random.nextInt(10);
-    JettySolrRunner jetty;
+    CloudJettyRunner cjetty;
     if (chance <= 5 && aggressivelyKillLeaders) {
       // if killLeader, really aggressively go after leaders
-      jetty = shardToLeaderJetty.get(slice).jetty;
+      cjetty = shardToLeaderJetty.get(slice);
     } else {
       // get random shard
       List<CloudJettyRunner> jetties = shardToJetty.get(slice);
       int index = random.nextInt(jetties.size());
-      jetty = jetties.get(index).jetty;
+      cjetty = jetties.get(index);
       
       ZkNodeProps leader = zkStateReader.getLeaderProps(collection, slice);
       boolean isLeader = leader.get(ZkStateReader.NODE_NAME_PROP).equals(jetties.get(index).nodeName);
@@ -320,15 +322,16 @@ public class ChaosMonkey {
       } 
     }
 
-    if (jetty.getLocalPort() == -1) {
+    if (cjetty.jetty.getLocalPort() == -1) {
       // we can't kill the dead
       monkeyLog("abort! This guy is already dead");
       return null;
     }
     
     //System.out.println("num active:" + numActive + " for " + slice + " sac:" + jetty.getLocalPort());
-    monkeyLog("chose a victim! " + jetty.getLocalPort());
-    return jetty;
+    monkeyLog("chose a victim! " + cjetty.jetty.getLocalPort());
+  
+    return cjetty;
   }
   
   public SolrServer getRandomClient(String slice) throws KeeperException, InterruptedException {
@@ -353,7 +356,7 @@ public class ChaosMonkey {
     
     stop = false;
     new Thread() {
-      private List<JettySolrRunner> deadPool = new ArrayList<JettySolrRunner>();
+      private List<CloudJettyRunner> deadPool = new ArrayList<CloudJettyRunner>();
 
       @Override
       public void run() {
@@ -364,25 +367,9 @@ public class ChaosMonkey {
             if (random.nextBoolean()) {
              if (!deadPool.isEmpty()) {
                int index = random.nextInt(deadPool.size());
-               JettySolrRunner jetty = deadPool.get(index);
-               try {
-                 jetty.start();
-               } catch (BindException e) {
-                 jetty.stop();
-                 sleep(2000);
-                 try {
-                   jetty.start();
-                 } catch (BindException e2) {
-                   jetty.stop();
-                   sleep(5000);
-                   try {
-                     jetty.start();
-                   } catch (BindException e3) {
-                     // we coud not get the port
-                     jetty.stop();
-                     continue;
-                   }
-                 }
+               JettySolrRunner jetty = deadPool.get(index).jetty;
+               if (!ChaosMonkey.start(jetty)) {
+                 continue;
                }
                //System.out.println("started on port:" + jetty.getLocalPort());
                deadPool.remove(index);
@@ -402,16 +389,16 @@ public class ChaosMonkey {
               randomConnectionLoss();
             }
             
-            JettySolrRunner jetty;
+            CloudJettyRunner cjetty;
             if (random.nextBoolean()) {
-              jetty = stopRandomShard();
+              cjetty = stopRandomShard();
             } else {
-              jetty = killRandomShard();
+              cjetty = killRandomShard();
             }
-            if (jetty == null) {
+            if (cjetty == null) {
               // we cannot kill
             } else {
-              deadPool.add(jetty);
+              deadPool.add(cjetty);
             }
             
           } catch (InterruptedException e) {
@@ -441,4 +428,31 @@ public class ChaosMonkey {
     return starts.get();
   }
 
+  public static void stop(JettySolrRunner jetty) throws Exception {
+    stopJettySolrRunner(jetty);
+  }
+  
+  public static boolean start(JettySolrRunner jetty) throws Exception {
+    try {
+      jetty.start();
+    } catch (BindException e) {
+      jetty.stop();
+      Thread.sleep(2000);
+      try {
+        jetty.start();
+      } catch (BindException e2) {
+        jetty.stop();
+        Thread.sleep(5000);
+        try {
+          jetty.start();
+        } catch (BindException e3) {
+          // we coud not get the port
+          jetty.stop();
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
 }
\ No newline at end of file

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java Wed Jul 25 08:10:27 2012
@@ -87,7 +87,7 @@ public class ChaosMonkeyNothingIsSafeTes
       // as it's not supported for recovery
       // del("*:*");
       
-      List<StopableIndexingThread> threads = new ArrayList<StopableIndexingThread>();
+      List<StopableThread> threads = new ArrayList<StopableThread>();
       int threadCount = 1;
       int i = 0;
       for (i = 0; i < threadCount; i++) {
@@ -97,6 +97,14 @@ public class ChaosMonkeyNothingIsSafeTes
         indexThread.start();
       }
       
+      threadCount = 1;
+      i = 0;
+      for (i = 0; i < threadCount; i++) {
+        StopableSearchThread searchThread = new StopableSearchThread();
+        threads.add(searchThread);
+        searchThread.start();
+      }
+      
       FullThrottleStopableIndexingThread ftIndexThread = new FullThrottleStopableIndexingThread(
           clients, i * 50000, true);
       threads.add(ftIndexThread);
@@ -110,12 +118,12 @@ public class ChaosMonkeyNothingIsSafeTes
         chaosMonkey.stopTheMonkey();
       }
       
-      for (StopableIndexingThread indexThread : threads) {
+      for (StopableThread indexThread : threads) {
         indexThread.safeStop();
       }
       
       // wait for stop...
-      for (StopableIndexingThread indexThread : threads) {
+      for (StopableThread indexThread : threads) {
         indexThread.join();
       }
       

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java Wed Jul 25 08:10:27 2012
@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -66,7 +67,7 @@ import org.slf4j.LoggerFactory;
  */
 @Slow
 public class FullSolrCloudTest extends AbstractDistributedZkTestCase {
-  private static Logger log = LoggerFactory.getLogger(FullSolrCloudTest.class);
+  static Logger log = LoggerFactory.getLogger(FullSolrCloudTest.class);
   
   @BeforeClass
   public static void beforeFullSolrCloudTest() {
@@ -98,39 +99,40 @@ public class FullSolrCloudTest extends A
   
   protected volatile CloudSolrServer cloudClient;
   
-  protected Map<JettySolrRunner,ZkNodeProps> jettyToInfo = new HashMap<JettySolrRunner,ZkNodeProps>();
-  protected Map<CloudSolrServerClient,ZkNodeProps> clientToInfo = new HashMap<CloudSolrServerClient,ZkNodeProps>();
-  protected Map<String,List<SolrServer>> shardToClient = new HashMap<String,List<SolrServer>>();
+  protected List<CloudJettyRunner> cloudJettys = new ArrayList<CloudJettyRunner>();
   protected Map<String,List<CloudJettyRunner>> shardToJetty = new HashMap<String,List<CloudJettyRunner>>();
   private AtomicInteger jettyIntCntr = new AtomicInteger(0);
   protected ChaosMonkey chaosMonkey;
   protected volatile ZkStateReader zkStateReader;
   
-  protected Map<String,SolrServer> shardToLeaderClient = new HashMap<String,SolrServer>();
   protected Map<String,CloudJettyRunner> shardToLeaderJetty = new HashMap<String,CloudJettyRunner>();
   
-  class CloudJettyRunner {
+  static class CloudJettyRunner {
     JettySolrRunner jetty;
     String nodeName;
     String coreNodeName;
     String url;
+    CloudSolrServerClient client;
+    public ZkNodeProps info;
   }
   
   static class CloudSolrServerClient {
-    SolrServer client;
+    SolrServer solrClient;
     String shardName;
+    int port;
+    public ZkNodeProps info;
     
     public CloudSolrServerClient() {}
     
     public CloudSolrServerClient(SolrServer client) {
-      this.client = client;
+      this.solrClient = client;
     }
     
     @Override
     public int hashCode() {
       final int prime = 31;
       int result = 1;
-      result = prime * result + ((client == null) ? 0 : client.hashCode());
+      result = prime * result + ((solrClient == null) ? 0 : solrClient.hashCode());
       return result;
     }
     
@@ -140,9 +142,9 @@ public class FullSolrCloudTest extends A
       if (obj == null) return false;
       if (getClass() != obj.getClass()) return false;
       CloudSolrServerClient other = (CloudSolrServerClient) obj;
-      if (client == null) {
-        if (other.client != null) return false;
-      } else if (!client.equals(other.client)) return false;
+      if (solrClient == null) {
+        if (other.solrClient != null) return false;
+      } else if (!solrClient.equals(other.solrClient)) return false;
       return true;
     }
     
@@ -189,7 +191,7 @@ public class FullSolrCloudTest extends A
       }
       
       chaosMonkey = new ChaosMonkey(zkServer, zkStateReader,
-          DEFAULT_COLLECTION, shardToJetty, shardToClient, shardToLeaderClient,
+          DEFAULT_COLLECTION, shardToJetty,
           shardToLeaderJetty);
     }
     
@@ -335,9 +337,8 @@ public class FullSolrCloudTest extends A
   protected void updateMappingsFromZk(List<JettySolrRunner> jettys,
       List<SolrServer> clients) throws Exception {
     zkStateReader.updateCloudState(true);
-    shardToClient.clear();
+    cloudJettys.clear();
     shardToJetty.clear();
-    jettyToInfo.clear();
     
     CloudState cloudState = zkStateReader.getCloudState();
     Map<String,Slice> slices = cloudState.getSlices(DEFAULT_COLLECTION);
@@ -347,6 +348,7 @@ public class FullSolrCloudTest extends A
           + DEFAULT_COLLECTION + " in " + cloudState.getCollections());
     }
     
+    List<CloudSolrServerClient> theClients = new ArrayList<CloudSolrServerClient>();
     for (SolrServer client : clients) {
       // find info for this client in zk 
       nextClient:
@@ -359,36 +361,23 @@ public class FullSolrCloudTest extends A
           
           if (shard.getKey().contains(":" + port + "_")) {
             CloudSolrServerClient csc = new CloudSolrServerClient();
-            csc.client = client;
+            csc.solrClient = client;
+            csc.port = port;
             csc.shardName = shard.getValue().get(ZkStateReader.NODE_NAME_PROP);
-            boolean isLeader = shard.getValue().containsKey(
-                ZkStateReader.LEADER_PROP);
-            clientToInfo.put(csc, shard.getValue());
-            List<SolrServer> list = shardToClient.get(slice.getKey());
-            if (list == null) {
-              list = new ArrayList<SolrServer>();
-              shardToClient.put(slice.getKey(), list);
-            }
-            list.add(client);
+            csc.info = shard.getValue();
+            
+            theClients .add(csc);
             
-            if (isLeader) {
-              shardToLeaderClient.put(slice.getKey(), client);
-            }
             break nextClient;
           }
         }
       }
     }
-    
-    for (Map.Entry<String,Slice> slice : slices.entrySet()) {
-      // check that things look right
-      assertEquals(slice.getValue().getShards().size(), shardToClient.get(slice.getKey()).size());
-    }
  
     for (JettySolrRunner jetty : jettys) {
       int port = jetty.getLocalPort();
       if (port == -1) {
-        continue; // If we cannot get the port, this jetty is down
+        throw new RuntimeException("Cannot find the port for jetty");
       }
       
       nextJetty:
@@ -396,7 +385,6 @@ public class FullSolrCloudTest extends A
         Map<String,ZkNodeProps> theShards = slice.getValue().getShards();
         for (Map.Entry<String,ZkNodeProps> shard : theShards.entrySet()) {
           if (shard.getKey().contains(":" + port + "_")) {
-            jettyToInfo.put(jetty, shard.getValue());
             List<CloudJettyRunner> list = shardToJetty.get(slice.getKey());
             if (list == null) {
               list = new ArrayList<CloudJettyRunner>();
@@ -406,13 +394,16 @@ public class FullSolrCloudTest extends A
                 ZkStateReader.LEADER_PROP);
             CloudJettyRunner cjr = new CloudJettyRunner();
             cjr.jetty = jetty;
+            cjr.info = shard.getValue();
             cjr.nodeName = shard.getValue().get(ZkStateReader.NODE_NAME_PROP);
             cjr.coreNodeName = shard.getKey();
             cjr.url = shard.getValue().get(ZkStateReader.BASE_URL_PROP) + "/" + shard.getValue().get(ZkStateReader.CORE_NAME_PROP);
+            cjr.client = findClientByPort(port, theClients);
             list.add(cjr);
             if (isLeader) {
               shardToLeaderJetty.put(slice.getKey(), cjr);
             }
+            cloudJettys.add(cjr);
             break nextJetty;
           }
         }
@@ -431,6 +422,15 @@ public class FullSolrCloudTest extends A
     }
   }
   
+  private CloudSolrServerClient findClientByPort(int port, List<CloudSolrServerClient> theClients) {
+    for (CloudSolrServerClient client : theClients) {
+      if (client.port == port) {
+        return client;
+      }
+    }
+    throw new IllegalArgumentException("Client with the give port does not exist:" + port);
+  }
+
   @Override
   protected void setDistributedParams(ModifiableSolrParams params) {
     
@@ -509,11 +509,15 @@ public class FullSolrCloudTest extends A
   
   protected void del(String q) throws Exception {
     controlClient.deleteByQuery(q);
+    cloudClient.deleteByQuery(q);
+
+    /***
     for (SolrServer client : clients) {
       UpdateRequest ureq = new UpdateRequest();
       // ureq.setParam("update.chain", DISTRIB_UPDATE_CHAIN);
       ureq.deleteByQuery(q).process(client);
     }
+     ***/
   }// serial commit...
   
   /*
@@ -647,9 +651,9 @@ public class FullSolrCloudTest extends A
     
     // new server should be part of first shard
     // how many docs are on the new shard?
-    for (SolrServer client : shardToClient.get("shard1")) {
+    for (CloudJettyRunner cjetty : shardToJetty.get("shard1")) {
       if (VERBOSE) System.err.println("total:"
-          + client.query(new SolrQuery("*:*")).getResults().getNumFound());
+          + cjetty.client.solrClient.query(new SolrQuery("*:*")).getResults().getNumFound());
     }
     
     checkShardConsistency("shard1");
@@ -673,24 +677,32 @@ public class FullSolrCloudTest extends A
     
     commit();
     
-    long deadShardCount = shardToClient.get(SHARD2).get(0).query(query).getResults().getNumFound();
-    
+    long deadShardCount = shardToJetty.get(SHARD2).get(0).client.solrClient
+        .query(query).getResults().getNumFound();
+
     query("q", "*:*", "sort", "n_tl1 desc");
     
     // kill a shard
-    JettySolrRunner deadShard = chaosMonkey.stopShard(SHARD2, 0);
+    CloudJettyRunner deadShard = chaosMonkey.stopShard(SHARD2, 0);
     cloudClient.connect();
-    int tries = 0;
-    while (cloudClient.getZkStateReader().getCloudState().liveNodesContain(clientToInfo.get(new CloudSolrServerClient(shardToClient.get(SHARD2).get(0))).get(ZkStateReader.NODE_NAME_PROP))) {
-      if (tries++ == 60) {
-        fail("Shard still reported as live in zk");
-      }
-      Thread.sleep(1000);
+
+    // we are careful to make sure the downed node is no longer in the state,
+    // because on some systems (especially freebsd w/ blackhole enabled), trying
+    // to talk to a downed node causes grief
+    Set<CloudJettyRunner> jetties = new HashSet<CloudJettyRunner>();
+    jetties.addAll(shardToJetty.get(SHARD2));
+    jetties.remove(deadShard);
+    
+    for (CloudJettyRunner cjetty : jetties) {
+      waitToSeeNotLive(((SolrDispatchFilter) cjetty.jetty.getDispatchFilter()
+          .getFilter()).getCores().getZkController().getZkStateReader(),
+          deadShard);
     }
-	
+    waitToSeeNotLive(cloudClient.getZkStateReader(), deadShard);
+
     // ensure shard is dead
     try {
-      index_specific(shardToClient.get(SHARD2).get(0), id, 999, i1, 107, t1,
+      index_specific(deadShard.client.solrClient, id, 999, i1, 107, t1,
           "specific doc!");
       fail("This server should be down and this update should have failed");
     } catch (SolrServerException e) {
@@ -705,21 +717,11 @@ public class FullSolrCloudTest extends A
     // System.out.println("clouddocs:" + cloudClientDocs);
     
     // try to index to a living shard at shard2
-    
-    // we are careful to make sure the downed node is no longer in the state,
-    // because on some systems (especially freebsd w/ blackhole enabled), trying
-    // to talk to a downed node causes grief
-    tries = 0;
-    while (((SolrDispatchFilter) shardToJetty.get(SHARD2).get(1).jetty.getDispatchFilter().getFilter()).getCores().getZkController().getZkStateReader().getCloudState().liveNodesContain(clientToInfo.get(new CloudSolrServerClient(shardToClient.get(SHARD2).get(0))).get(ZkStateReader.NODE_NAME_PROP))) {
-      if (tries++ == 120) {
-        fail("Shard still reported as live in zk");
-      }
-      Thread.sleep(1000);
-    }
+
 	
     long numFound1 = cloudClient.query(new SolrQuery("*:*")).getResults().getNumFound();
     
-    index_specific(shardToClient.get(SHARD2).get(1), id, 1000, i1, 108, t1,
+    index_specific(shardToJetty.get(SHARD2).get(1).client.solrClient, id, 1000, i1, 108, t1,
         "specific doc!");
     
     commit();
@@ -777,21 +779,29 @@ public class FullSolrCloudTest extends A
     // query("q","matchesnothing","fl","*,score", "debugQuery", "true");
     
     // this should trigger a recovery phase on deadShard
-    deadShard.start(true);
+    ChaosMonkey.start(deadShard.jetty);
     
     // make sure we have published we are recovering
     Thread.sleep(1500);
     
     waitForRecoveriesToFinish(false);
     
-    deadShardCount = shardToClient.get(SHARD2).get(0).query(query).getResults().getNumFound();
+    deadShardCount = shardToJetty.get(SHARD2).get(0).client.solrClient
+        .query(query).getResults().getNumFound();
     // if we properly recovered, we should now have the couple missing docs that
     // came in while shard was down
     checkShardConsistency(true, false);
     
     
     // recover over 100 docs so we do more than just peer sync (replicate recovery)
-    deadShard = chaosMonkey.stopShard(SHARD2, 0);
+    chaosMonkey.stopJetty(deadShard);
+    
+    for (CloudJettyRunner cjetty : jetties) {
+      waitToSeeNotLive(((SolrDispatchFilter) cjetty.jetty.getDispatchFilter()
+          .getFilter()).getCores().getZkController().getZkStateReader(),
+          deadShard);
+    }
+    waitToSeeNotLive(cloudClient.getZkStateReader(), deadShard);
     
     for (int i = 0; i < 226; i++) {
       doc = new SolrInputDocument();
@@ -804,7 +814,9 @@ public class FullSolrCloudTest extends A
     }
     commit();
     
-    deadShard.start(true);
+    Thread.sleep(1500);
+    
+    ChaosMonkey.start(deadShard.jetty);
     
     // make sure we have published we are recovering
     Thread.sleep(1500);
@@ -1009,10 +1021,10 @@ public class FullSolrCloudTest extends A
   protected String checkShardConsistency(String shard, boolean verbose)
       throws Exception {
     
-    List<SolrServer> solrClients = shardToClient.get(shard);
-    if (solrClients == null) {
+    List<CloudJettyRunner> solrJetties = shardToJetty.get(shard);
+    if (solrJetties == null) {
       throw new RuntimeException("shard not found:" + shard + " keys:"
-          + shardToClient.keySet());
+          + shardToJetty.keySet());
     }
     long num = -1;
     long lastNum = -1;
@@ -1024,18 +1036,18 @@ public class FullSolrCloudTest extends A
         "The client count does not match up with the shard count for slice:"
             + shard,
         zkStateReader.getCloudState().getSlice(DEFAULT_COLLECTION, shard)
-            .getShards().size(), solrClients.size());
+            .getShards().size(), solrJetties.size());
 
     SolrServer lastClient = null;
-    for (SolrServer client : solrClients) {
-      ZkNodeProps props = clientToInfo.get(new CloudSolrServerClient(client));
+    for (CloudJettyRunner cjetty : solrJetties) {
+      ZkNodeProps props = cjetty.info;
       if (verbose) System.err.println("client" + cnt++);
       if (verbose) System.err.println("PROPS:" + props);
       
       try {
         SolrQuery query = new SolrQuery("*:*");
         query.set("distrib", false);
-        num = client.query(query).getResults().getNumFound();
+        num = cjetty.client.solrClient.query(query).getResults().getNumFound();
       } catch (SolrServerException e) {
         if (verbose) System.err.println("error contacting client: "
             + e.getMessage() + "\n");
@@ -1060,7 +1072,7 @@ public class FullSolrCloudTest extends A
       if (active && live) {
         if (lastNum > -1 && lastNum != num && failMessage == null) {
           failMessage = shard + " is not consistent.  Got " + lastNum + " from " + lastClient + "lastClient"
-              + " and got " + num + " from " + client;
+              + " and got " + num + " from " + cjetty.url;
 
           if (verbose || true) {
             System.err.println("######" + failMessage);
@@ -1071,14 +1083,14 @@ public class FullSolrCloudTest extends A
             query.set("sort","id asc");
 
             SolrDocumentList lst1 = lastClient.query(query).getResults();
-            SolrDocumentList lst2 = client.query(query).getResults();
+            SolrDocumentList lst2 = cjetty.client.solrClient.query(query).getResults();
 
-            showDiff(lst1, lst2, lastClient.toString(), client.toString());
+            showDiff(lst1, lst2, lastClient.toString(), cjetty.client.solrClient.toString());
           }
 
         }
         lastNum = num;
-        lastClient = client;
+        lastClient = cjetty.client.solrClient;
       }
     }
     return failMessage;
@@ -1125,7 +1137,7 @@ public class FullSolrCloudTest extends A
     
     updateMappingsFromZk(jettys, clients);
     
-    Set<String> theShards = shardToClient.keySet();
+    Set<String> theShards = shardToJetty.keySet();
     String failMessage = null;
     for (String shard : theShards) {
       String shardFailMessage = checkShardConsistency(shard, verbose);
@@ -1140,15 +1152,15 @@ public class FullSolrCloudTest extends A
     
     if (checkVsControl) {
       // now check that the right # are on each shard
-      theShards = shardToClient.keySet();
+      theShards = shardToJetty.keySet();
       int cnt = 0;
       for (String s : theShards) {
-        int times = shardToClient.get(s).size();
+        int times = shardToJetty.get(s).size();
         for (int i = 0; i < times; i++) {
           try {
-            SolrServer client = shardToClient.get(s).get(i);
-            ZkNodeProps props = clientToInfo.get(new CloudSolrServerClient(
-                client));
+            CloudJettyRunner cjetty = shardToJetty.get(s).get(i);
+            ZkNodeProps props = cjetty.info;
+            SolrServer client = cjetty.client.solrClient;
             boolean active = props.get(ZkStateReader.STATE_PROP).equals(
                 ZkStateReader.ACTIVE);
             if (active) {
@@ -1180,9 +1192,10 @@ public class FullSolrCloudTest extends A
   }
   
   private SolrServer getClient(String nodeName) {
-    for (CloudSolrServerClient client : clientToInfo.keySet()) {
+    for (CloudJettyRunner cjetty : cloudJettys) {
+      CloudSolrServerClient client = cjetty.client;
       if (client.shardName.equals(nodeName)) {
-        return client.client;
+        return client.solrClient;
       }
     }
     return null;
@@ -1216,12 +1229,13 @@ public class FullSolrCloudTest extends A
           + DEFAULT_COLLECTION + " in " + cloudState.getCollections());
     }
     
-    for (SolrServer client : clients) {
+    for (CloudJettyRunner cjetty : cloudJettys) {
+      CloudSolrServerClient client = cjetty.client;
       for (Map.Entry<String,Slice> slice : slices.entrySet()) {
         Map<String,ZkNodeProps> theShards = slice.getValue().getShards();
         for (Map.Entry<String,ZkNodeProps> shard : theShards.entrySet()) {
           String shardName = new URI(
-              ((HttpSolrServer) client).getBaseURL()).getPort()
+              ((HttpSolrServer) client.solrClient).getBaseURL()).getPort()
               + "_solr_";
           if (verbose && shard.getKey().endsWith(shardName)) {
             System.err.println("shard:" + slice.getKey());
@@ -1231,12 +1245,14 @@ public class FullSolrCloudTest extends A
       }
       
       long count = 0;
-      String currentState = clientToInfo.get(new CloudSolrServerClient(client))
-          .get(ZkStateReader.STATE_PROP);
-      if (currentState != null && currentState.equals(ZkStateReader.ACTIVE)) {
+      String currentState = cjetty.info.get(ZkStateReader.STATE_PROP);
+      if (currentState != null
+          && currentState.equals(ZkStateReader.ACTIVE)
+          && zkStateReader.getCloudState().liveNodesContain(
+              cjetty.info.get(ZkStateReader.NODE_NAME_PROP))) {
         SolrQuery query = new SolrQuery("*:*");
         query.set("distrib", false);
-        count = client.query(query).getResults().getNumFound();
+        count = client.solrClient.query(query).getResults().getNumFound();
       }
       
       if (verbose) System.err.println("client docs:" + count + "\n\n");
@@ -1259,7 +1275,14 @@ public class FullSolrCloudTest extends A
     return rsp;
   }
   
-  class StopableIndexingThread extends Thread {
+  abstract class StopableThread extends Thread {
+    public StopableThread(String name) {
+      super(name);
+    }
+    public abstract void safeStop();
+  }
+  
+  class StopableIndexingThread extends StopableThread {
     private volatile boolean stop = false;
     protected final int startI;
     protected final List<Integer> deletes = new ArrayList<Integer>();
@@ -1333,6 +1356,55 @@ public class FullSolrCloudTest extends A
     
   };
   
+  class StopableSearchThread extends StopableThread {
+    private volatile boolean stop = false;
+    protected final AtomicInteger fails = new AtomicInteger();
+    private String[] QUERIES = new String[] {"to come","their country","aid","co*"};
+    
+    public StopableSearchThread() {
+      super("StopableSearchThread");
+      setDaemon(true);
+    }
+    
+    @Override
+    public void run() {
+      Random random = random();
+      int numSearches = 0;
+      
+      while (true && !stop) {
+        numSearches++;
+        try {
+          //to come to the aid of their country.
+          cloudClient.query(new SolrQuery(QUERIES[random.nextInt(QUERIES.length)]));
+        } catch (Exception e) {
+          System.err.println("QUERY REQUEST FAILED:");
+          e.printStackTrace();
+          if (e instanceof SolrServerException) {
+            System.err.println("ROOT CAUSE:");
+            ((SolrServerException) e).getRootCause().printStackTrace();
+          }
+          fails.incrementAndGet();
+        }
+        try {
+          Thread.sleep(random.nextInt(4000) + 300);
+        } catch (InterruptedException e) {
+          Thread.currentThread().interrupt();
+        }
+      }
+      
+      System.err.println("num searches done:" + numSearches + " with " + fails + " fails");
+    }
+    
+    public void safeStop() {
+      stop = true;
+    }
+    
+    public int getFails() {
+      return fails.get();
+    }
+    
+  };
+  
   protected void waitForThingsToLevelOut(int waitForRecTimeSeconds) throws Exception {
     log.info("Wait for recoveries to finish - wait " + waitForRecTimeSeconds + " for each attempt");
     int cnt = 0;
@@ -1348,7 +1420,7 @@ public class FullSolrCloudTest extends A
       
       updateMappingsFromZk(jettys, clients);
       
-      Set<String> theShards = shardToClient.keySet();
+      Set<String> theShards = shardToJetty.keySet();
       String failMessage = null;
       for (String shard : theShards) {
         failMessage = checkShardConsistency(shard, false);
@@ -1415,4 +1487,16 @@ public class FullSolrCloudTest extends A
       throw new RuntimeException(ex);
     }
   }
+  
+  protected void waitToSeeNotLive(ZkStateReader zkStateReader,
+      CloudJettyRunner cjetty) throws InterruptedException {
+    int tries = 0;
+    while (zkStateReader.getCloudState()
+        .liveNodesContain(cjetty.info.get(ZkStateReader.NODE_NAME_PROP))) {
+      if (tries++ == 120) {
+        fail("Shard still reported as live in zk");
+      }
+      Thread.sleep(1000);
+    }
+  }
 }

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java Wed Jul 25 08:10:27 2012
@@ -72,7 +72,7 @@ public class RecoveryZkTest extends Full
     Thread.sleep(atLeast(2000));   
     
     // bring shard replica down
-    JettySolrRunner replica = chaosMonkey.stopShard("shard1", 1);
+    JettySolrRunner replica = chaosMonkey.stopShard("shard1", 1).jetty;
 
     
     // wait a moment - lets allow some docs to be indexed so replication time is non 0
@@ -100,8 +100,8 @@ public class RecoveryZkTest extends Full
     checkShardConsistency("shard1", false); 
     SolrQuery query = new SolrQuery("*:*");
     query.setParam("distrib", "false");
-    long client1Docs = shardToClient.get("shard1").get(0).query(query).getResults().getNumFound();
-    long client2Docs = shardToClient.get("shard1").get(1).query(query).getResults().getNumFound();
+    long client1Docs = shardToJetty.get("shard1").get(0).client.solrClient.query(query).getResults().getNumFound();
+    long client2Docs = shardToJetty.get("shard1").get(1).client.solrClient.query(query).getResults().getNumFound();
     
     assertTrue(client1Docs > 0);
     assertEquals(client1Docs, client2Docs);

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java Wed Jul 25 08:10:27 2012
@@ -26,9 +26,7 @@ import java.util.Set;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.HttpSolrServer;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -91,9 +89,7 @@ public class SyncSliceTest extends FullS
     
     waitForThingsToLevelOut();
 
-    // something wrong with this?
-    //del("*:*");
-    
+    del("*:*");
     List<String> skipServers = new ArrayList<String>();
     
     indexDoc(skipServers, id, 0, i1, 50, tlong, 50, t1,
@@ -121,7 +117,8 @@ public class SyncSliceTest extends FullS
     SolrRequest request = new QueryRequest(params);
     request.setPath("/admin/collections");
     
-    String baseUrl = ((HttpSolrServer) shardToClient.get("shard1").get(2)).getBaseURL();
+    String baseUrl = ((HttpSolrServer) shardToJetty.get("shard1").get(2).client.solrClient)
+        .getBaseURL();
     baseUrl = baseUrl.substring(0, baseUrl.length() - "collection1".length());
     
     HttpSolrServer baseServer = new HttpSolrServer(baseUrl);
@@ -143,28 +140,24 @@ public class SyncSliceTest extends FullS
         "to come to the aid of their country.");
     
     // kill the leader - new leader could have all the docs or be missing one
-    JettySolrRunner leaderJetty = shardToLeaderJetty.get("shard1").jetty;
-    SolrServer leaderClient = shardToLeaderClient.get("shard1");
-    Set<JettySolrRunner> jetties = new HashSet<JettySolrRunner>();
-    for (int i = 0; i < shardCount; i++) {
-      jetties.add(shardToJetty.get("shard1").get(i).jetty);
-    }
+    CloudJettyRunner leaderJetty = shardToLeaderJetty.get("shard1");
+
+    Set<CloudJettyRunner> jetties = new HashSet<CloudJettyRunner>();
+    jetties.addAll(shardToJetty.get("shard1"));
     jetties.remove(leaderJetty);
     
     chaosMonkey.killJetty(leaderJetty);
 
-    JettySolrRunner upJetty = jetties.iterator().next();
     // we are careful to make sure the downed node is no longer in the state,
     // because on some systems (especially freebsd w/ blackhole enabled), trying
     // to talk to a downed node causes grief
-    int tries = 0;
-    while (((SolrDispatchFilter) upJetty.getDispatchFilter().getFilter()).getCores().getZkController().getZkStateReader().getCloudState().liveNodesContain(clientToInfo.get(new CloudSolrServerClient(leaderClient)).get(ZkStateReader.NODE_NAME_PROP))) {
-      if (tries++ == 120) {
-        fail("Shard still reported as live in zk");
-      }
-      Thread.sleep(1000);
+    for (CloudJettyRunner cjetty : jetties) {
+      waitToSeeNotLive(((SolrDispatchFilter) cjetty.jetty.getDispatchFilter()
+          .getFilter()).getCores().getZkController().getZkStateReader(),
+          leaderJetty);
     }
-    
+    waitToSeeNotLive(cloudClient.getZkStateReader(), leaderJetty);
+
     waitForThingsToLevelOut();
     
     checkShardConsistency(false, true);
@@ -183,7 +176,7 @@ public class SyncSliceTest extends FullS
       
       updateMappingsFromZk(jettys, clients);
       
-      Set<String> theShards = shardToClient.keySet();
+      Set<String> theShards = shardToJetty.keySet();
       String failMessage = null;
       for (String shard : theShards) {
         failMessage = checkShardConsistency(shard, false);

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/TestMultiCoreConfBootstrap.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/TestMultiCoreConfBootstrap.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/TestMultiCoreConfBootstrap.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/cloud/TestMultiCoreConfBootstrap.java Wed Jul 25 08:10:27 2012
@@ -48,7 +48,8 @@ public class TestMultiCoreConfBootstrap 
   
   @AfterClass
   public static void afterClass() {
-
+    zkServer = null;
+    zkDir = null;
   }
   
   @Override

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java Wed Jul 25 08:10:27 2012
@@ -117,6 +117,9 @@ public class TestReplicationHandler exte
     slaveJetty.stop();
     master.tearDown();
     slave.tearDown();
+    masterJetty = slaveJetty = null;
+    master = slave = null;
+    masterClient = slaveClient = null;
   }
 
   private static JettySolrRunner createJetty(SolrInstance instance) throws Exception {

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java Wed Jul 25 08:10:27 2012
@@ -2004,4 +2004,61 @@ public class SimpleFacetsTest extends So
             ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
     );
   }
+
+  /** 
+   * kind of an absurd tests because if there is an inifnite loop, it 
+   * would ver finish -- but at least it ensures that <i>if</i> one of 
+   * these requests return, they return an error 
+   */
+  public void testRangeFacetInfiniteLoopDetection() {
+
+    for (String field : new String[] {"foo_f", "foo_sf", 
+                                      "foo_d", "foo_sd",
+                                      "foo_i", "foo_si"}) {
+      assertQEx("no zero gap error: " + field,
+                req("q", "*:*",
+                    "facet", "true",
+                    "facet.range", field,
+                    "facet.range.start", "23",
+                    "facet.range.gap", "0",
+                    "facet.range.end", "100"),
+                400);
+    }
+    for (String field : new String[] {"foo_pdt", "foo_dt"}) {
+      for (String type : new String[] {"date", "range"}) {
+      assertQEx("no zero gap error for facet." + type + ": " + field,
+                req("q", "*:*",
+                    "facet", "true",
+                    "facet." + type, field,
+                    "facet."+type+".start", "NOW",
+                    "facet."+type+".gap", "+0DAYS",
+                    "facet."+type+".end", "NOW+10DAY"),
+                400);
+      }
+    }
+    
+    for (String field : new String[] {"foo_f", "foo_sf"}) {
+      assertQEx("no float underflow error: " + field,
+                req("q", "*:*",
+                    "facet", "true",
+                    "facet.range", field,
+                    "facet.range.start", "100000000000",
+                    "facet.range.end", "100000086200",
+                    "facet.range.gap", "2160"),
+                400);
+    }
+
+    for (String field : new String[] {"foo_d", "foo_sd"}) {
+      assertQEx("no double underflow error: " + field,
+                req("q", "*:*",
+                    "facet", "true",
+                    "facet.range", field,
+                    "facet.range.start", "9900000000000",
+                    "facet.range.end", "9900000086200",
+                    "facet.range.gap", "0.0003"),
+                400);
+    }
+    
+  }
+
 }

Modified: lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java (original)
+++ lucene/dev/branches/lucene2510/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java Wed Jul 25 08:10:27 2012
@@ -21,6 +21,7 @@ import org.apache.lucene.queryparser.cla
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.QueryUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -34,6 +35,11 @@ public class TestValueSourceCache extend
   }
 
   static QParser _func;
+  
+  @AfterClass
+  public static void afterClass() throws Exception {
+    _func = null;
+  }
 
   Query getQuery(String query) throws ParseException {
     _func.setString(query);

Modified: lucene/dev/branches/lucene2510/solr/example/example-DIH/solr/rss/conf/rss-data-config.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/solr/example/example-DIH/solr/rss/conf/rss-data-config.xml?rev=1365483&r1=1365482&r2=1365483&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/solr/example/example-DIH/solr/rss/conf/rss-data-config.xml (original)
+++ lucene/dev/branches/lucene2510/solr/example/example-DIH/solr/rss/conf/rss-data-config.xml Wed Jul 25 08:10:27 2012
@@ -17,7 +17,7 @@
             <field column="description" xpath="/RDF/item/description" />
             <field column="creator" xpath="/RDF/item/creator" />
             <field column="item-subject" xpath="/RDF/item/subject" />
-            <field column="date" xpath="/RDF/item/date" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss" />
+            <field column="date" xpath="/RDF/item/date" dateTimeFormat="yyyy-MM-dd'T'HH:mm:ss" />
             <field column="slash-department" xpath="/RDF/item/department" />
             <field column="slash-section" xpath="/RDF/item/section" />
             <field column="slash-comments" xpath="/RDF/item/comments" />