You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/02/07 20:45:38 UTC

[01/21] lucene-solr git commit: LUCENE-6835: add test case confirming listAll is sorted; fix dir impls that weren't

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/lucene-5438-nrt-replication bd6804bc6 -> f0f42780a


LUCENE-6835: add test case confirming listAll is sorted; fix dir impls that weren't


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/3c15c3f0
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/3c15c3f0
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/3c15c3f0

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 3c15c3f03df2d769174964e59a760264dce918d8
Parents: 8e78469
Author: Mike McCandless <mi...@apache.org>
Authored: Sat Feb 6 09:41:46 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sat Feb 6 09:41:46 2016 -0500

----------------------------------------------------------------------
 .../lucene/store/FileSwitchDirectory.java       |  5 +++-
 .../lucene/store/NRTCachingDirectory.java       |  4 ++-
 .../lucene/store/BaseDirectoryTestCase.java     | 26 ++++++++++++++++++++
 3 files changed, 33 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3c15c3f0/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java b/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
index eb3fa0f..db9f085 100644
--- a/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.nio.file.AtomicMoveNotSupportedException;
 import java.nio.file.NoSuchFileException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -118,7 +119,9 @@ public class FileSwitchDirectory extends Directory {
     if (exc != null && files.isEmpty()) {
       throw exc;
     }
-    return files.toArray(new String[files.size()]);
+    String[] result = files.toArray(new String[files.size()]);
+    Arrays.sort(result);
+    return result;
   }
 
   /** Utility method to return a file's extension. */

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3c15c3f0/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java b/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
index 4f3b254..ef7b895 100644
--- a/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
@@ -106,7 +106,9 @@ public class NRTCachingDirectory extends FilterDirectory implements Accountable
                                         "cache=" + Arrays.toString(cache.listAll()) + ",delegate=" + Arrays.toString(in.listAll()));
       }
     }
-    return files.toArray(new String[files.size()]);
+    String[] result = files.toArray(new String[files.size()]);
+    Arrays.sort(result);
+    return result;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3c15c3f0/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
index c2e1996..3d9c20d 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
@@ -1295,4 +1295,30 @@ public abstract class BaseDirectoryTestCase extends LuceneTestCase {
       assertTrue(Arrays.asList(fsDir.listAll()).contains(fileName));
     }
   }
+
+  public void testListAllIsSorted() throws IOException {
+    try (Directory dir = getDirectory(createTempDir())) {
+      int count = atLeast(20);
+      Set<String> names = new HashSet<>();
+      while(names.size() < count) {
+        String name = TestUtil.randomSimpleString(random());
+        if (name.length() == 0) {
+          continue;
+        }
+        if (random().nextInt(5) == 1) {
+          IndexOutput out = dir.createTempOutput(name, "foo", IOContext.DEFAULT);
+          names.add(out.getName());
+          out.close();
+        } else if (names.contains(name) == false) {
+          IndexOutput out = dir.createOutput(name, IOContext.DEFAULT);
+          names.add(out.getName());
+          out.close();
+        }
+      }
+      String[] actual = dir.listAll();
+      String[] expected = actual.clone();
+      Arrays.sort(expected);
+      assertEquals(expected, actual);
+    }
+  }
 }


[05/21] lucene-solr git commit: Put CHANGES entry for SOLR-8500 in the wrong section.

Posted by mi...@apache.org.
Put CHANGES entry for SOLR-8500 in the wrong section.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/112a2311
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/112a2311
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/112a2311

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 112a2311df50142ec19ec0033133fbc10df223c9
Parents: c04f0cb
Author: Erick Erickson <er...@apache.org>
Authored: Sat Feb 6 08:46:51 2016 -0800
Committer: Erick Erickson <er...@apache.org>
Committed: Sat Feb 6 08:46:51 2016 -0800

----------------------------------------------------------------------
 solr/CHANGES.txt | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/112a2311/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e93c45a..06e24d0 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -144,10 +144,6 @@ New Features
 
 * SOLR-8285: Ensure the /export handler works with NULL field values (Joel Bernstein)
 
-* SOLR-8500: Allow the number of threads ConcurrentUpdateSolrClient StreamingSolrClients configurable by a 
-  system property. NOTE: this is an expert option and can result in more often needing to do full index replication
-  for recovery, the sweet spot for using this is very high volume, leader-only indexing. (Tim Potter, Erick Erickson)
-
 Bug Fixes
 ----------------------
 * SOLR-8386: Add field option in the new admin UI schema page loads up even when no schemaFactory has been
@@ -351,6 +347,10 @@ New Features
 * SOLR-8586: added index fingerprint, a hash over all versions currently in the index.
   PeerSync now uses this to check if replicas are in sync. (yonik)
 
+* SOLR-8500: Allow the number of threads ConcurrentUpdateSolrClient StreamingSolrClients configurable by a 
+  system property. NOTE: this is an expert option and can result in more often needing to do full index replication
+  for recovery, the sweet spot for using this is very high volume, leader-only indexing. (Tim Potter, Erick Erickson)
+
 
 Bug Fixes
 ----------------------


[04/21] lucene-solr git commit: Merge remote-tracking branch 'origin/master'

Posted by mi...@apache.org.
Merge remote-tracking branch 'origin/master'


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c04f0cb6
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c04f0cb6
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c04f0cb6

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: c04f0cb603caeb719e73f29f7d0b60032f756b7a
Parents: 3e7fe78 0404be9
Author: Erick Erickson <er...@apache.org>
Authored: Sat Feb 6 08:34:30 2016 -0800
Committer: Erick Erickson <er...@apache.org>
Committed: Sat Feb 6 08:34:30 2016 -0800

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |   9 +
 .../analysis/hunspell/Test64kAffixes.java       |   4 +-
 .../analysis/hunspell/TestAllDictionaries.java  |   6 +-
 .../analysis/hunspell/TestAllDictionaries2.java |   6 -
 .../analysis/hunspell/TestDictionary.java       |   6 +-
 .../hunspell/TestHunspellStemFilter.java        |   6 +-
 .../util/TestFilesystemResourceLoader.java      |  28 +-
 .../index/TestBackwardsCompatibility.java       |   8 -
 .../benchmark/byTask/TestPerfTasksLogic.java    |   2 -
 .../benchmark/byTask/utils/StreamUtilsTest.java |  14 +-
 .../codecs/lucene50/Lucene50CompoundReader.java |  14 +-
 .../apache/lucene/index/IndexFileDeleter.java   | 137 +--
 .../org/apache/lucene/index/IndexWriter.java    |  14 +-
 .../index/PersistentSnapshotDeletionPolicy.java |   2 +-
 .../java/org/apache/lucene/store/Directory.java |   3 +-
 .../org/apache/lucene/store/FSDirectory.java    | 147 ++-
 .../lucene/store/FileSwitchDirectory.java       |  11 +-
 .../org/apache/lucene/store/MMapDirectory.java  |   1 +
 .../org/apache/lucene/store/NIOFSDirectory.java |   2 +-
 .../lucene/store/NRTCachingDirectory.java       |   6 +-
 .../org/apache/lucene/store/RAMDirectory.java   |   9 +-
 .../apache/lucene/store/SimpleFSDirectory.java  |   1 +
 .../java/org/apache/lucene/util/IOUtils.java    |   8 +-
 .../lucene/util/bkd/OfflinePointWriter.java     |   1 -
 .../org/apache/lucene/index/TestAddIndexes.java |   2 -
 .../index/TestAllFilesCheckIndexHeader.java     |   5 -
 .../index/TestAllFilesDetectTruncation.java     |   5 -
 .../apache/lucene/index/TestAtomicUpdate.java   |   1 -
 .../index/TestBinaryDocValuesUpdates.java       |   4 -
 .../lucene/index/TestCodecHoldsOpenFiles.java   |  12 +-
 .../index/TestConcurrentMergeScheduler.java     |   4 -
 .../apache/lucene/index/TestDeletionPolicy.java |  34 +-
 .../index/TestDemoParallelLeafReader.java       |   8 +-
 .../lucene/index/TestDirectoryReader.java       | 384 ++++----
 .../lucene/index/TestDirectoryReaderReopen.java |  10 +-
 .../test/org/apache/lucene/index/TestDoc.java   |   8 +-
 .../apache/lucene/index/TestFieldsReader.java   |  65 +-
 .../lucene/index/TestIndexFileDeleter.java      |  31 +-
 .../apache/lucene/index/TestIndexWriter.java    | 947 +++++++++----------
 .../lucene/index/TestIndexWriterCommit.java     |  20 -
 .../lucene/index/TestIndexWriterDelete.java     |   9 +-
 .../index/TestIndexWriterDeleteByQuery.java     |   2 +-
 .../lucene/index/TestIndexWriterExceptions.java |  15 +-
 .../lucene/index/TestIndexWriterForceMerge.java |   1 -
 .../lucene/index/TestIndexWriterFromReader.java |  17 +-
 .../lucene/index/TestIndexWriterOnDiskFull.java |   1 -
 .../TestIndexWriterOutOfFileDescriptors.java    |   2 +
 .../lucene/index/TestNRTReaderCleanup.java      |  10 +-
 .../apache/lucene/index/TestNeverDelete.java    |   8 -
 .../index/TestNumericDocValuesUpdates.java      |   4 -
 .../apache/lucene/index/TestOmitPositions.java  |   5 +-
 .../org/apache/lucene/index/TestOmitTf.java     |   5 +-
 .../TestPersistentSnapshotDeletionPolicy.java   |   2 +-
 .../apache/lucene/index/TestRollingUpdates.java |   4 -
 .../index/TestSnapshotDeletionPolicy.java       |  22 +-
 .../apache/lucene/index/TestStressIndexing.java |   2 +-
 .../lucene/index/TestStressIndexing2.java       |   6 +-
 .../org/apache/lucene/index/TestStressNRT.java  |   2 +-
 .../lucene/index/TestSwappedIndexFiles.java     |   9 -
 .../apache/lucene/search/TestPointQueries.java  |  41 +-
 .../lucene/store/TestBufferedIndexInput.java    |  86 +-
 .../org/apache/lucene/store/TestDirectory.java  |  19 +-
 .../lucene/store/TestFileSwitchDirectory.java   |   1 -
 .../lucene/store/TestNativeFSLockFactory.java   |  21 +-
 .../apache/lucene/store/TestRAMDirectory.java   |   1 -
 .../lucene/store/TestSimpleFSLockFactory.java   |   1 +
 .../org/apache/lucene/util/TestIOUtils.java     |   1 +
 .../apache/lucene/util/TestOfflineSorter.java   |  28 +-
 .../org/apache/lucene/util/bkd/TestBKD.java     |   6 -
 .../org/apache/lucene/util/fst/Test2BFST.java   |   1 +
 .../org/apache/lucene/util/fst/TestFSTs.java    |   3 +-
 .../taxonomy/directory/TestAddTaxonomy.java     |  17 +-
 .../writercache/TestCompactLabelToOrdinal.java  |   4 +-
 .../org/apache/lucene/store/RAFDirectory.java   |   1 +
 .../apache/lucene/util/fst/TestFSTsMisc.java    |   1 -
 .../IndexAndTaxonomyReplicationClientTest.java  |  17 -
 .../IndexAndTaxonomyRevisionTest.java           |   8 -
 .../lucene/replicator/IndexRevisionTest.java    |   4 -
 .../lucene/replicator/LocalReplicatorTest.java  |  90 +-
 .../replicator/http/HttpReplicatorTest.java     |   5 -
 .../lucene/spatial/document/GeoPointField.java  | 180 +++-
 .../spatial/document/GeoPointTokenStream.java   | 233 +++++
 .../spatial/search/GeoPointDistanceQuery.java   |  23 +-
 .../search/GeoPointDistanceQueryImpl.java       |  64 +-
 .../search/GeoPointDistanceRangeQuery.java      |  10 +-
 .../spatial/search/GeoPointInBBoxQuery.java     |  15 +-
 .../spatial/search/GeoPointInBBoxQueryImpl.java |  63 +-
 .../spatial/search/GeoPointInPolygonQuery.java  |  87 +-
 .../search/GeoPointInPolygonQueryImpl.java      | 103 ++
 .../spatial/search/GeoPointMultiTermQuery.java  | 166 ++++
 .../search/GeoPointNumericTermsEnum.java        | 161 ++++
 .../spatial/search/GeoPointPrefixTermsEnum.java | 237 +++++
 .../spatial/search/GeoPointTermQuery.java       | 114 ---
 .../GeoPointTermQueryConstantScoreWrapper.java  |  11 +-
 .../spatial/search/GeoPointTermsEnum.java       | 199 +---
 .../lucene/spatial/util/GeoEncodingUtils.java   | 157 +++
 .../lucene/spatial/util/GeoHashUtils.java       |   8 +-
 .../lucene/spatial/util/GeoRelationUtils.java   |  16 +-
 .../apache/lucene/spatial/util/GeoUtils.java    |  87 +-
 .../spatial/search/TestGeoPointQuery.java       | 117 ++-
 .../spatial/util/BaseGeoPointTestCase.java      |  13 +-
 .../lucene/spatial/util/TestGeoUtils.java       |  47 +-
 .../org/apache/lucene/geo3d/TestGeo3DPoint.java |  11 +-
 .../analyzing/AnalyzingInfixSuggester.java      |   3 +-
 .../search/suggest/fst/ExternalRefSorter.java   |   1 +
 .../lucene/search/suggest/PersistenceTest.java  |   6 +-
 .../search/suggest/TestInputIterator.java       |   6 +-
 .../analyzing/AnalyzingSuggesterTest.java       |   6 +-
 .../suggest/analyzing/FuzzySuggesterTest.java   |   6 +-
 .../search/suggest/fst/BytesRefSortersTest.java |   3 -
 .../search/suggest/fst/FSTCompletionTest.java   |   6 +-
 .../search/suggest/fst/WFSTCompletionTest.java  |   6 +-
 .../lucene/analysis/VocabularyAssert.java       |   2 -
 .../index/BaseCompoundFormatTestCase.java       |   5 -
 .../index/BaseIndexFileFormatTestCase.java      |  11 +-
 .../lucene/index/BasePointFormatTestCase.java   |  11 -
 .../index/BasePostingsFormatTestCase.java       |   2 -
 .../lucene/index/RandomPostingsTester.java      |   1 -
 .../ThreadedIndexingAndSearchingTestCase.java   |   1 -
 .../apache/lucene/mockfile/VirusCheckingFS.java |  80 ++
 .../lucene/store/BaseDirectoryTestCase.java     | 100 +-
 .../lucene/store/BaseLockFactoryTestCase.java   |  46 +-
 .../lucene/store/MockDirectoryWrapper.java      | 203 +---
 .../org/apache/lucene/util/LuceneTestCase.java  |  34 +-
 .../util/TestRuleTemporaryFilesCleanup.java     |   2 +
 .../java/org/apache/lucene/util/TestUtil.java   | 102 +-
 .../TestCompressingStoredFieldsFormat.java      |   4 -
 .../lucene/mockfile/TestVirusCheckingFS.java    |  62 ++
 .../apache/lucene/mockfile/TestWindowsFS.java   |   2 +-
 .../lucene/store/TestMockDirectoryWrapper.java  |   1 -
 .../org/apache/solr/handler/RestoreCore.java    |   1 -
 .../solr/store/blockcache/BlockDirectory.java   |   2 +-
 .../apache/solr/core/MockDirectoryFactory.java  |   3 -
 .../solr/core/MockFSDirectoryFactory.java       |   1 -
 134 files changed, 3060 insertions(+), 2248 deletions(-)
----------------------------------------------------------------------



[18/21] lucene-solr git commit: LUCENE-6750: add verbosity when this test fails

Posted by mi...@apache.org.
LUCENE-6750: add verbosity when this test fails


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/1d4d9c58
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/1d4d9c58
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/1d4d9c58

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 1d4d9c588ca433262feb79297262dca73e327f2e
Parents: f8bd22e
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 13:35:00 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 13:35:24 2016 -0500

----------------------------------------------------------------------
 .../lucene/TestMergeSchedulerExternal.java      | 39 ++++++++++++++------
 1 file changed, 27 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1d4d9c58/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java b/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java
index 241e966..d4aaeb1 100644
--- a/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java
+++ b/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java
@@ -17,6 +17,10 @@
 package org.apache.lucene;
 
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
@@ -24,16 +28,16 @@ import org.apache.lucene.index.ConcurrentMergeScheduler;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.LogMergePolicy;
-import org.apache.lucene.index.MergePolicy;
 import org.apache.lucene.index.MergePolicy.OneMerge;
+import org.apache.lucene.index.MergePolicy;
 import org.apache.lucene.index.MergeScheduler;
 import org.apache.lucene.index.MergeTrigger;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.MockDirectoryWrapper;
 import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
-
-import java.io.IOException;
+import org.apache.lucene.util.PrintStreamInfoStream;
 
 /**
  * Holds tests cases to verify external APIs are accessible
@@ -93,11 +97,16 @@ public class TestMergeSchedulerExternal extends LuceneTestCase {
     Document doc = new Document();
     Field idField = newStringField("id", "", Field.Store.YES);
     doc.add(idField);
-    
-    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random()))
-        .setMergeScheduler(new MyMergeScheduler())
-        .setMaxBufferedDocs(2).setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH)
-        .setMergePolicy(newLogMergePolicy()));
+
+    IndexWriterConfig iwc = newIndexWriterConfig(new MockAnalyzer(random()))
+      .setMergeScheduler(new MyMergeScheduler())
+      .setMaxBufferedDocs(2).setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH)
+      .setMergePolicy(newLogMergePolicy());
+
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    iwc.setInfoStream(new PrintStreamInfoStream(new PrintStream(baos, true, IOUtils.UTF_8)));
+
+    IndexWriter writer = new IndexWriter(dir, iwc);
     LogMergePolicy logMP = (LogMergePolicy) writer.getConfig().getMergePolicy();
     logMP.setMergeFactor(10);
     for(int i=0;i<20;i++) {
@@ -110,10 +119,16 @@ public class TestMergeSchedulerExternal extends LuceneTestCase {
       // OK
     }
     writer.rollback();
-    
-    assertTrue(mergeThreadCreated);
-    assertTrue(mergeCalled);
-    assertTrue(excCalled);
+
+    try {
+      assertTrue(mergeThreadCreated);
+      assertTrue(mergeCalled);
+      assertTrue(excCalled);
+    } catch (AssertionError ae) {
+      System.out.println("TEST FAILED; IW infoStream output:");
+      System.out.println(baos.toString(IOUtils.UTF_8));
+      throw ae;
+    }
     dir.close();
   }
   


[07/21] lucene-solr git commit: Fix Jaspell license header to not mimic Javadocs (reduces warning)

Posted by mi...@apache.org.
Fix Jaspell license header to not mimic Javadocs (reduces warning)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/8231bf9c
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/8231bf9c
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/8231bf9c

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 8231bf9cd46638e26ef33af9fd2b9e9532a9ca5c
Parents: afe792b
Author: Uwe Schindler <us...@apache.org>
Authored: Sun Feb 7 00:12:24 2016 +0100
Committer: Uwe Schindler <us...@apache.org>
Committed: Sun Feb 7 00:12:24 2016 +0100

----------------------------------------------------------------------
 .../lucene/search/suggest/jaspell/JaspellTernarySearchTrie.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8231bf9c/lucene/suggest/src/java/org/apache/lucene/search/suggest/jaspell/JaspellTernarySearchTrie.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/jaspell/JaspellTernarySearchTrie.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/jaspell/JaspellTernarySearchTrie.java
index 29a99aa..4dc377d 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/jaspell/JaspellTernarySearchTrie.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/jaspell/JaspellTernarySearchTrie.java
@@ -1,4 +1,4 @@
-/** 
+/*
  * Copyright (c) 2005 Bruno Martins
  * All rights reserved.
  *


[12/21] lucene-solr git commit: SOLR-8502: Improve Solr JDBC Driver to support SQL Clients like DBVisualizer

Posted by mi...@apache.org.
SOLR-8502: Improve Solr JDBC Driver to support SQL Clients like DBVisualizer


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c2eb7694
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c2eb7694
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c2eb7694

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: c2eb76941eb604f6cdf7873cab9ea02175c69000
Parents: 3d47612
Author: jbernste <jb...@apache.org>
Authored: Sat Feb 6 21:49:39 2016 -0500
Committer: jbernste <jb...@apache.org>
Committed: Sat Feb 6 21:49:39 2016 -0500

----------------------------------------------------------------------
 solr/CHANGES.txt | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c2eb7694/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 06e24d0..93a8447 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -144,6 +144,8 @@ New Features
 
 * SOLR-8285: Ensure the /export handler works with NULL field values (Joel Bernstein)
 
+* SOLR-8502: Improve Solr JDBC Driver to support SQL Clients like DBVisualizer (Kevin Risden, Joel Bernstein)
+
 Bug Fixes
 ----------------------
 * SOLR-8386: Add field option in the new admin UI schema page loads up even when no schemaFactory has been


[03/21] lucene-solr git commit: SOLR-8500: Allow the number of threads ConcurrentUpdateSolrClient StreamingSolrClients configurable by a system property

Posted by mi...@apache.org.
SOLR-8500: Allow the number of threads ConcurrentUpdateSolrClient StreamingSolrClients configurable by a system property


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/3e7fe786
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/3e7fe786
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/3e7fe786

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 3e7fe7867f64b254680d462092d01f07858aa7c3
Parents: 207f7f9
Author: Erick Erickson <er...@apache.org>
Authored: Sat Feb 6 08:34:04 2016 -0800
Committer: Erick Erickson <er...@apache.org>
Committed: Sat Feb 6 08:34:04 2016 -0800

----------------------------------------------------------------------
 solr/CHANGES.txt                                                 | 4 ++++
 .../src/java/org/apache/solr/update/StreamingSolrClients.java    | 4 +++-
 2 files changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3e7fe786/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 348cf01..e93c45a 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -144,6 +144,10 @@ New Features
 
 * SOLR-8285: Ensure the /export handler works with NULL field values (Joel Bernstein)
 
+* SOLR-8500: Allow the number of threads ConcurrentUpdateSolrClient StreamingSolrClients configurable by a 
+  system property. NOTE: this is an expert option and can result in more often needing to do full index replication
+  for recovery, the sweet spot for using this is very high volume, leader-only indexing. (Tim Potter, Erick Erickson)
+
 Bug Fixes
 ----------------------
 * SOLR-8386: Add field option in the new admin UI schema page loads up even when no schemaFactory has been

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3e7fe786/solr/core/src/java/org/apache/solr/update/StreamingSolrClients.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/StreamingSolrClients.java b/solr/core/src/java/org/apache/solr/update/StreamingSolrClients.java
index 0ca8149..ecc2a2b 100644
--- a/solr/core/src/java/org/apache/solr/update/StreamingSolrClients.java
+++ b/solr/core/src/java/org/apache/solr/update/StreamingSolrClients.java
@@ -41,6 +41,8 @@ import java.util.concurrent.ExecutorService;
 
 public class StreamingSolrClients {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  private final int runnerCount = Integer.getInteger("solr.cloud.replication.runners", 1);
   
   private HttpClient httpClient;
   
@@ -70,7 +72,7 @@ public class StreamingSolrClients {
       // NOTE: increasing to more than 1 threadCount for the client could cause updates to be reordered
       // on a greater scale since the current behavior is to only increase the number of connections/Runners when
       // the queue is more than half full.
-      client = new ConcurrentUpdateSolrClient(url, httpClient, 100, 1, updateExecutor, true) {
+      client = new ConcurrentUpdateSolrClient(url, httpClient, 100, runnerCount, updateExecutor, true) {
         @Override
         public void handleError(Throwable ex) {
           req.trackRequestResult(null, false);


[02/21] lucene-solr git commit: improve exception message

Posted by mi...@apache.org.
improve exception message


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/0404be94
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/0404be94
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/0404be94

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 0404be94a7e62dbb6e2d25ee8a3a10b975dd470e
Parents: 3c15c3f
Author: Mike McCandless <mi...@apache.org>
Authored: Sat Feb 6 11:08:07 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sat Feb 6 11:08:07 2016 -0500

----------------------------------------------------------------------
 lucene/core/src/java/org/apache/lucene/index/IndexWriter.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0404be94/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
index a10d2e1..8517fb1 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
@@ -755,7 +755,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable {
    */
   public IndexWriter(Directory d, IndexWriterConfig conf) throws IOException {
     if (d instanceof FSDirectory && ((FSDirectory) d).checkPendingDeletions()) {
-      throw new IllegalArgumentException("Directory " + d + " is still has pending deleted files; cannot initialize IndexWriter");
+      throw new IllegalArgumentException("Directory " + d + " still has pending deleted files; cannot initialize IndexWriter");
     }
 
     conf.setIndexWriter(this); // prevent reuse by other instances


[06/21] lucene-solr git commit: Fix ICU-License header to not mimic Javadocs (reduces warning)

Posted by mi...@apache.org.
Fix ICU-License header to not mimic Javadocs (reduces warning)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/afe792b5
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/afe792b5
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/afe792b5

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: afe792b57a1d1924ba73c1c9b20dfadea6ad55f7
Parents: 112a231
Author: Uwe Schindler <us...@apache.org>
Authored: Sun Feb 7 00:08:49 2016 +0100
Committer: Uwe Schindler <us...@apache.org>
Committed: Sun Feb 7 00:08:49 2016 +0100

----------------------------------------------------------------------
 .../apache/lucene/analysis/icu/segmentation/ScriptIterator.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/afe792b5/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ScriptIterator.java
----------------------------------------------------------------------
diff --git a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ScriptIterator.java b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ScriptIterator.java
index d17889b..4dd723e 100644
--- a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ScriptIterator.java
+++ b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ScriptIterator.java
@@ -1,4 +1,4 @@
-/** 
+/*
  * Copyright (C) 1999-2010, International Business Machines
  * Corporation and others.  All Rights Reserved.
  *


[13/21] lucene-solr git commit: add verbosity for this test when it fails

Posted by mi...@apache.org.
add verbosity for this test when it fails


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2a768764
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2a768764
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2a768764

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 2a7687641e03d586688dcdad419674032e8f7a01
Parents: c2eb769
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 05:24:19 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 05:24:19 2016 -0500

----------------------------------------------------------------------
 .../org/apache/lucene/store/BaseLockFactoryTestCase.java    | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2a768764/lucene/test-framework/src/java/org/apache/lucene/store/BaseLockFactoryTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/store/BaseLockFactoryTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/store/BaseLockFactoryTestCase.java
index 595efee..f2c7268 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/store/BaseLockFactoryTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/BaseLockFactoryTestCase.java
@@ -210,6 +210,7 @@ public abstract class BaseLockFactoryTestCase extends LuceneTestCase {
     @Override
     public void run() {
       IndexWriter writer = null;
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
       for(int i=0;i<this.numIteration;i++) {
         if (VERBOSE) {
           System.out.println("TEST: WriterThread iter=" + i);
@@ -218,13 +219,17 @@ public abstract class BaseLockFactoryTestCase extends LuceneTestCase {
         IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
 
         // We only print the IW infoStream output on exc, below:
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream printStream;
         try {
-          iwc.setInfoStream(new PrintStreamInfoStream(new PrintStream(baos, true, "UTF8")));
+          printStream = new PrintStream(baos, true, "UTF8");
         } catch (UnsupportedEncodingException uee) {
           // shouldn't happen
           throw new RuntimeException(uee);
         }
+
+        iwc.setInfoStream(new PrintStreamInfoStream(printStream));
+
+        printStream.println("\nTEST: WriterThread iter=" + i);
         iwc.setOpenMode(OpenMode.APPEND);
         try {
           writer = new IndexWriter(dir, iwc);


[08/21] lucene-solr git commit: SOLR-8507, SOLR-8638: Add information about database product name, product version, driver name, and driver version. Implement ConnectionImpl setCatalog and setSchema.

Posted by mi...@apache.org.
SOLR-8507, SOLR-8638: Add information about database product name, product version, driver name, and driver version. Implement ConnectionImpl setCatalog and setSchema.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/dc6b1a68
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/dc6b1a68
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/dc6b1a68

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: dc6b1a68d28142a1ef85f497b6437cbd7f2777f0
Parents: 8231bf9
Author: jbernste <jb...@apache.org>
Authored: Sat Feb 6 20:18:38 2016 -0500
Committer: jbernste <jb...@apache.org>
Committed: Sat Feb 6 20:25:51 2016 -0500

----------------------------------------------------------------------
 .../solr/client/solrj/io/SolrClientCache.java   | 13 ++-
 .../client/solrj/io/sql/ConnectionImpl.java     | 14 +--
 .../solrj/io/sql/DatabaseMetaDataImpl.java      | 95 ++++++++++++++++----
 .../solr/client/solrj/io/sql/JdbcTest.java      | 21 +++++
 4 files changed, 112 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/dc6b1a68/solr/solrj/src/java/org/apache/solr/client/solrj/io/SolrClientCache.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/SolrClientCache.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/SolrClientCache.java
index 7e3abd1..e544c10 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/SolrClientCache.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/SolrClientCache.java
@@ -37,10 +37,10 @@ public class SolrClientCache implements Serializable {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private Map<String, SolrClient> solrClients = new HashMap();
+  private final Map<String, SolrClient> solrClients = new HashMap<>();
 
   public synchronized CloudSolrClient getCloudSolrClient(String zkHost) {
-    CloudSolrClient client = null;
+    CloudSolrClient client;
     if (solrClients.containsKey(zkHost)) {
       client = (CloudSolrClient) solrClients.get(zkHost);
     } else {
@@ -53,7 +53,7 @@ public class SolrClientCache implements Serializable {
   }
 
   public synchronized HttpSolrClient getHttpSolrClient(String host) {
-    HttpSolrClient client = null;
+    HttpSolrClient client;
     if (solrClients.containsKey(host)) {
       client = (HttpSolrClient) solrClients.get(host);
     } else {
@@ -64,12 +64,11 @@ public class SolrClientCache implements Serializable {
   }
 
   public void close() {
-    Iterator<SolrClient> it = solrClients.values().iterator();
-    while(it.hasNext()) {
+    for(Map.Entry<String, SolrClient> entry : solrClients.entrySet()) {
       try {
-        it.next().close();
+        entry.getValue().close();
       } catch (IOException e) {
-        log.error(e.getMessage(), e);
+        log.error("Error closing SolrClient for " + entry.getKey(), e);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/dc6b1a68/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
index 9f9c00e..95105c8 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
@@ -45,17 +45,17 @@ class ConnectionImpl implements Connection {
   private final String url;
   private final SolrClientCache solrClientCache = new SolrClientCache();
   private final CloudSolrClient client;
-  private final String collection;
   private final Properties properties;
   private final DatabaseMetaData databaseMetaData;
   private final Statement connectionStatement;
+  private String collection;
   private boolean closed;
   private SQLWarning currentWarning;
 
   ConnectionImpl(String url, String zkHost, String collection, Properties properties) throws SQLException {
     this.url = url;
-    this.client = solrClientCache.getCloudSolrClient(zkHost);
-    this.collection = collection;
+    this.client = this.solrClientCache.getCloudSolrClient(zkHost);
+    this.setSchema(collection);
     this.properties = properties;
     this.connectionStatement = createStatement();
     this.databaseMetaData = new DatabaseMetaDataImpl(this, this.connectionStatement);
@@ -158,7 +158,7 @@ class ConnectionImpl implements Connection {
 
   @Override
   public void setCatalog(String catalog) throws SQLException {
-    throw new UnsupportedOperationException();
+
   }
 
   @Override
@@ -301,7 +301,7 @@ class ConnectionImpl implements Connection {
 
   @Override
   public boolean isValid(int timeout) throws SQLException {
-    // check that the connection isn't close and able to connect within the timeout
+    // check that the connection isn't closed and able to connect within the timeout
     try {
       if(!isClosed()) {
         this.client.connect(timeout, TimeUnit.SECONDS);
@@ -345,7 +345,7 @@ class ConnectionImpl implements Connection {
 
   @Override
   public void setSchema(String schema) throws SQLException {
-    throw new UnsupportedOperationException();
+    this.collection = schema;
   }
 
   @Override
@@ -377,4 +377,4 @@ class ConnectionImpl implements Connection {
   public boolean isWrapperFor(Class<?> iface) throws SQLException {
     throw new UnsupportedOperationException();
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/dc6b1a68/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java
index 33cd94e..62f2a18 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java
@@ -16,12 +16,22 @@
  */
 package org.apache.solr.client.solrj.io.sql;
 
+import java.io.IOException;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.RowIdLifetime;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.Set;
+
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.util.SimpleOrderedMap;
 
 class DatabaseMetaDataImpl implements DatabaseMetaData {
   private final ConnectionImpl connection;
@@ -32,6 +42,21 @@ class DatabaseMetaDataImpl implements DatabaseMetaData {
     this.connectionStatement = connectionStatement;
   }
 
+  private int getVersionPart(String version, int part) {
+    // TODO Is there a better way to do this? Reuse code from elsewhere?
+    // Gets the parts of the Solr version. If fail then just return 0.
+    if (version != null) {
+      try {
+        String[] versionParts = version.split("\\.", 3);
+        return Integer.parseInt(versionParts[part]);
+      } catch (Throwable e) {
+        return 0;
+      }
+    } else {
+      return 0;
+    }
+  }
+
   @Override
   public boolean allProceduresAreCallable() throws SQLException {
     return false;
@@ -79,32 +104,78 @@ class DatabaseMetaDataImpl implements DatabaseMetaData {
 
   @Override
   public String getDatabaseProductName() throws SQLException {
-    return null;
+    return "Apache Solr";
   }
 
   @Override
   public String getDatabaseProductVersion() throws SQLException {
-    return null;
+    // Returns the version for the first live node in the Solr cluster.
+    SolrQuery sysQuery = new SolrQuery();
+    sysQuery.setRequestHandler("/admin/info/system");
+
+    CloudSolrClient cloudSolrClient = this.connection.getClient();
+    Set<String> liveNodes = cloudSolrClient.getZkStateReader().getClusterState().getLiveNodes();
+    SolrClient solrClient = null;
+    for (String node : liveNodes) {
+      try {
+        String nodeURL = cloudSolrClient.getZkStateReader().getBaseUrlForNodeName(node);
+        solrClient = new HttpSolrClient(nodeURL);
+
+        QueryResponse rsp = solrClient.query(sysQuery);
+        return String.valueOf(((SimpleOrderedMap) rsp.getResponse().get("lucene")).get("solr-spec-version"));
+      } catch (SolrServerException | IOException ignore) {
+        return "";
+      } finally {
+        if (solrClient != null) {
+          try {
+            solrClient.close();
+          } catch (IOException ignore) {
+            // Don't worry about failing to close the Solr client
+          }
+        }
+      }
+    }
+
+    // If no version found just return empty string
+    return "";
+  }
+
+  @Override
+  public int getDatabaseMajorVersion() throws SQLException {
+    return getVersionPart(this.getDatabaseProductVersion(), 0);
+  }
+
+  @Override
+  public int getDatabaseMinorVersion() throws SQLException {
+    return getVersionPart(this.getDatabaseProductVersion(), 1);
   }
 
   @Override
   public String getDriverName() throws SQLException {
-    return null;
+    return this.getClass().getPackage().getSpecificationTitle();
   }
 
   @Override
   public String getDriverVersion() throws SQLException {
-    return null;
+    return this.getClass().getPackage().getSpecificationVersion();
   }
 
   @Override
   public int getDriverMajorVersion() {
-    return 0;
+    try {
+      return getVersionPart(this.getDriverVersion(), 0);
+    } catch (SQLException e) {
+      return 0;
+    }
   }
 
   @Override
   public int getDriverMinorVersion() {
-    return 0;
+    try {
+      return getVersionPart(this.getDriverVersion(), 1);
+    } catch (SQLException e) {
+      return 0;
+    }
   }
 
   @Override
@@ -823,18 +894,8 @@ class DatabaseMetaDataImpl implements DatabaseMetaData {
   }
 
   @Override
-  public int getDatabaseMajorVersion() throws SQLException {
-    return 0;
-  }
-
-  @Override
-  public int getDatabaseMinorVersion() throws SQLException {
-    return 0;
-  }
-
-  @Override
   public int getJDBCMajorVersion() throws SQLException {
-    return 0;
+    return 4;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/dc6b1a68/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index 82ae02e..ba21114 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -381,7 +381,13 @@ public class JdbcTest extends AbstractFullDistribZkTestBase {
   private void testJDBCMethods(String collection, String connectionString, Properties properties, String sql) throws Exception {
     try (Connection con = DriverManager.getConnection(connectionString, properties)) {
       assertTrue(con.isValid(DEFAULT_CONNECTION_TIMEOUT));
+
+      assertEquals(zkServer.getZkAddress(), con.getCatalog());
+      con.setCatalog(zkServer.getZkAddress());
       assertEquals(zkServer.getZkAddress(), con.getCatalog());
+
+      assertEquals(collection, con.getSchema());
+      con.setSchema(collection);
       assertEquals(collection, con.getSchema());
 
       DatabaseMetaData databaseMetaData = con.getMetaData();
@@ -390,6 +396,21 @@ public class JdbcTest extends AbstractFullDistribZkTestBase {
       assertEquals(con, databaseMetaData.getConnection());
       assertEquals(connectionString, databaseMetaData.getURL());
 
+      assertEquals(4, databaseMetaData.getJDBCMajorVersion());
+      assertEquals(0, databaseMetaData.getJDBCMinorVersion());
+
+      assertEquals("Apache Solr", databaseMetaData.getDatabaseProductName());
+
+      // The following tests require package information that is not available when running via Maven
+//      assertEquals(this.getClass().getPackage().getSpecificationVersion(), databaseMetaData.getDatabaseProductVersion());
+//      assertEquals(0, databaseMetaData.getDatabaseMajorVersion());
+//      assertEquals(0, databaseMetaData.getDatabaseMinorVersion());
+
+//      assertEquals(this.getClass().getPackage().getSpecificationTitle(), databaseMetaData.getDriverName());
+//      assertEquals(this.getClass().getPackage().getSpecificationVersion(), databaseMetaData.getDriverVersion());
+//      assertEquals(0, databaseMetaData.getDriverMajorVersion());
+//      assertEquals(0, databaseMetaData.getDriverMinorVersion());
+
       try(ResultSet rs = databaseMetaData.getCatalogs()) {
         assertTrue(rs.next());
         assertEquals(zkServer.getZkAddress(), rs.getString("TABLE_CAT"));


[11/21] lucene-solr git commit: SOLR-8652: Lower case the limit clause

Posted by mi...@apache.org.
SOLR-8652: Lower case the limit clause


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/3d47612b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/3d47612b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/3d47612b

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 3d47612b04dae27080a5960088aa5e7303f14874
Parents: 75a8179
Author: jbernste <jb...@apache.org>
Authored: Sat Feb 6 21:42:01 2016 -0500
Committer: jbernste <jb...@apache.org>
Committed: Sat Feb 6 21:42:01 2016 -0500

----------------------------------------------------------------------
 .../java/org/apache/solr/client/solrj/io/sql/StatementImpl.java  | 2 +-
 .../src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java   | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3d47612b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
index e236c83..f859831 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
@@ -361,6 +361,6 @@ class StatementImpl implements Statement {
   private boolean containsLimit(String sql) {
     String[] tokens = sql.split("\\s+");
     String secondToLastToken = tokens[tokens.length-2];
-    return ("limit").equals(secondToLastToken);
+    return ("limit").equals(secondToLastToken.toLowerCase(Locale.getDefault()));
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3d47612b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index b3d7ae9..6d9c51a 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -177,8 +177,8 @@ public class JdbcTest extends AbstractFullDistribZkTestBase {
     assert(!rs.next());
     stmt.close();
 
-    //Test simple loop. Since limit is set it will override the statement maxRows
-    rs = stmt.executeQuery("select id, a_i, a_s, a_f from collection1 order by a_i asc limit 100");
+    //Test simple loop. Since limit is set it will override the statement maxRows.
+    rs = stmt.executeQuery("select id, a_i, a_s, a_f from collection1 order by a_i asc    LIMIT   100");
     int count = 0;
     while(rs.next()) {
       ++count;


[21/21] lucene-solr git commit: cutover to 'Directory owns retrying deletes on buggy filesystems, cleaning up a lot of crazy retry logic

Posted by mi...@apache.org.
cutover to 'Directory owns retrying deletes on buggy filesystems, cleaning up a lot of crazy retry logic


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f0f42780
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f0f42780
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f0f42780

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: f0f42780a91852ed05b3793922f73d85d8b3092a
Parents: 9ba62e5
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 14:46:08 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 14:46:08 2016 -0500

----------------------------------------------------------------------
 .../apache/lucene/replicator/nrt/CopyJob.java   |   2 +-
 .../org/apache/lucene/replicator/nrt/Node.java  |   3 +-
 .../replicator/nrt/ReplicaFileDeleter.java      | 102 +++++--------------
 .../lucene/replicator/nrt/ReplicaNode.java      |  21 +---
 .../org/apache/lucene/replicator/nrt/Jobs.java  |   3 +-
 .../lucene/replicator/nrt/SimpleCopyJob.java    |   9 +-
 .../replicator/nrt/SimpleReplicaNode.java       |   4 +-
 lucene/replicator/test.cmd                      |   4 +-
 8 files changed, 41 insertions(+), 107 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/CopyJob.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/CopyJob.java b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/CopyJob.java
index 5baf1d3..217c2c0 100644
--- a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/CopyJob.java
+++ b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/CopyJob.java
@@ -186,7 +186,7 @@ public abstract class CopyJob implements Comparable<CopyJob> {
   /** Use current thread (blocking) to do all copying and then return once done, or throw exception on failure */
   public abstract void runBlocking() throws Exception;
 
-  public void cancel(String reason, Throwable exc) {
+  public void cancel(String reason, Throwable exc) throws IOException {
     if (this.exc != null) {
       // Already cancelled
       return;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/Node.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/Node.java b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/Node.java
index e54c01e..742b19f 100644
--- a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/Node.java
+++ b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/Node.java
@@ -49,8 +49,7 @@ import org.apache.lucene.util.StringHelper;
 abstract class Node implements Closeable {
 
   static boolean VERBOSE_FILES = true;
-  // nocommit
-  static boolean VERBOSE_CONNECTIONS = true;
+  static boolean VERBOSE_CONNECTIONS = false;
 
   // Keys we store into IndexWriter's commit user data:
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
index b15fc05..652b3af 100644
--- a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
+++ b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
@@ -38,7 +38,6 @@ import org.apache.lucene.store.IOContext;
 
 class ReplicaFileDeleter {
   private final Map<String,Integer> refCounts = new HashMap<String,Integer>();
-  private final Set<String> pending = new HashSet<String>();
   private final Directory dir;
   private final Node node;
 
@@ -63,10 +62,6 @@ class ReplicaFileDeleter {
   public synchronized void incRef(Collection<String> fileNames) throws IOException {
     for(String fileName : fileNames) {
 
-      if (pending.contains(fileName)) {
-        throw new IllegalStateException("cannot incRef file \"" + fileName + "\": it is pending delete");
-      }
-
       assert slowFileExists(dir, fileName): "file " + fileName + " does not exist!";
 
       Integer curCount = refCounts.get(fileName);
@@ -78,24 +73,23 @@ class ReplicaFileDeleter {
     }
   }
 
-  public synchronized void decRef(Collection<String> fileNames) {
-    // We don't delete the files immediately when their RC drops to 0; instead, we add to the pending set, and then call deletePending in
-    // the end:
+  public synchronized void decRef(Collection<String> fileNames) throws IOException {
+    Set<String> toDelete = new HashSet<>();
     for(String fileName : fileNames) {
       Integer curCount = refCounts.get(fileName);
       assert curCount != null: "fileName=" + fileName;
       assert curCount.intValue() > 0;
       if (curCount.intValue() == 1) {
         refCounts.remove(fileName);
-        pending.add(fileName);
+        toDelete.add(fileName);
       } else {
         refCounts.put(fileName, curCount.intValue() - 1);
       }
     }
 
-    deletePending();
+    delete(toDelete);
 
-    // TODO: this local IR could incRef files here, like we do now with IW ... then we can assert this again:
+    // TODO: this local IR could incRef files here, like we do now with IW's NRT readers ... then we can assert this again:
 
     // we can't assert this, e.g a search can be running when we switch to a new NRT point, holding a previous IndexReader still open for
     // a bit:
@@ -109,111 +103,69 @@ class ReplicaFileDeleter {
     */
   }
 
-  private synchronized boolean delete(String fileName) {
-    try {
-      if (Node.VERBOSE_FILES) {
-        node.message("file " + fileName + ": now delete");
-      }
-      dir.deleteFile(fileName);
-      pending.remove(fileName);
-      return true;
-    } catch (FileNotFoundException|NoSuchFileException missing) {
-      // This should never happen: we should only be asked to track files that do exist
-      node.message("file " + fileName + ": delete failed: " + missing);
-      throw new IllegalStateException("file " + fileName + ": we attempted delete but the file does not exist?", missing);
-    } catch (IOException ioe) {
-      // nocommit remove this retry logic!  it's Directory's job now...
-      if (Node.VERBOSE_FILES) {
-        node.message("file " + fileName + ": delete failed: " + ioe + "; will retry later");
-      }
-      pending.add(fileName);
-      return false;
-    }
-  }
-
-  public synchronized Integer getRefCount(String fileName) {
-    return refCounts.get(fileName);
-  }
-
-  public synchronized boolean isPending(String fileName) {
-    return pending.contains(fileName);
-  }
-
-  public synchronized void deletePending() {
+  private synchronized void delete(Collection<String> toDelete) throws IOException {
     if (Node.VERBOSE_FILES) {
-      node.message("now deletePending: " + pending.size() + " files to try: " + pending);
+      node.message("now delete " + toDelete.size() + " files: " + toDelete);
     }
 
-    // Clone the set because it will change as we iterate:
-    List<String> toDelete = new ArrayList<>(pending);
-
     // First pass: delete any segments_N files.  We do these first to be certain stale commit points are removed
-    // before we remove any files they reference.  If any delete of segments_N fails, we leave all other files
-    // undeleted so index is never in a corrupt state:
+    // before we remove any files they reference, in case we crash right now:
     for (String fileName : toDelete) {
-      Integer rc = refCounts.get(fileName);
-      if (rc != null && rc > 0) {
-        // Should never happen!  This means we are about to pending-delete a referenced index file
-        throw new IllegalStateException("file \"" + fileName + "\" is in pending delete set but has non-zero refCount=" + rc);
-      } else if (fileName.startsWith(IndexFileNames.SEGMENTS)) {
-        if (delete(fileName) == false) {
-          if (Node.VERBOSE_FILES) {
-            node.message("failed to remove commit point \"" + fileName + "\"; skipping deletion of all other pending files");
-          }
-          return;
-        }
+      assert refCounts.containsKey(fileName) == false;
+      if (fileName.startsWith(IndexFileNames.SEGMENTS)) {
+        delete(fileName);
       }
     }
 
     // Only delete other files if we were able to remove the segments_N files; this way we never
     // leave a corrupt commit in the index even in the presense of virus checkers:
     for(String fileName : toDelete) {
+      assert refCounts.containsKey(fileName) == false;
       if (fileName.startsWith(IndexFileNames.SEGMENTS) == false) {
         delete(fileName);
       }
     }
 
-    Set<String> copy = new HashSet<String>(pending);
-    pending.clear();
-    for(String fileName : copy) {
-      delete(fileName);
-    }
   }
 
-  /** Necessary in case we had tried to delete this fileName before, it failed, but then it was later overwritten (because primary changed
-   *  and new primary didn't know this segment name had been previously attempted) and now has > 0 refCount */
-  public synchronized void clearPending(Collection<String> fileNames) {
-    for(String fileName : fileNames) {
-      if (pending.remove(fileName)) {
-        node.message("file " + fileName + ": deleter.clearPending now clear from pending");
-      }
+  private synchronized void delete(String fileName) throws IOException {
+    if (Node.VERBOSE_FILES) {
+      node.message("file " + fileName + ": now delete");
     }
+    dir.deleteFile(fileName);
+  }
+
+  public synchronized Integer getRefCount(String fileName) {
+    return refCounts.get(fileName);
   }
 
-  public synchronized void deleteIfNoRef(String fileName) {
+  public synchronized void deleteIfNoRef(String fileName) throws IOException {
     if (refCounts.containsKey(fileName) == false) {
       deleteNewFile(fileName);
     }
   }
 
-  public synchronized void deleteNewFile(String fileName) {
+  public synchronized void deleteNewFile(String fileName) throws IOException {
     delete(fileName);
   }
 
+  /*
   public synchronized Set<String> getPending() {
     return new HashSet<String>(pending);
   }
+  */
 
   public synchronized void deleteUnknownFiles(String segmentsFileName) throws IOException {
+    Set<String> toDelete = new HashSet<>();
     for(String fileName : dir.listAll()) {
       if (refCounts.containsKey(fileName) == false &&
           fileName.equals("write.lock") == false &&
           fileName.equals(segmentsFileName) == false) {
         node.message("will delete unknown file \"" + fileName + "\"");
-        pending.add(fileName);
+        toDelete.add(fileName);
       }
     }
 
-    deletePending();
+    delete(toDelete);
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
index 54083b4..e191caf 100644
--- a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
+++ b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
@@ -195,10 +195,13 @@ abstract class ReplicaNode extends Node {
         // If this throws exc (e.g. due to virus checker), we cannot start this replica:
         assert deleter.getRefCount(segmentsFileName) == 1;
         deleter.decRef(Collections.singleton(segmentsFileName));
-        if (deleter.isPending(segmentsFileName)) {
-          // If e.g. virus checker blocks us from deleting, we absolutely cannot start this node else we can cause corruption:
+
+        if (dir instanceof FSDirectory && ((FSDirectory) dir).checkPendingDeletions()) {
+          // If e.g. virus checker blocks us from deleting, we absolutely cannot start this node else there is a definite window during
+          // which if we carsh, we cause corruption:
           throw new RuntimeException("replica cannot start: existing segments file=" + segmentsFileName + " must be removed in order to start, but the file delete failed");
         }
+
         // So we don't later try to decRef it (illegally) again:
         boolean didRemove = lastCommitFiles.remove(segmentsFileName);
         assert didRemove;
@@ -427,9 +430,6 @@ abstract class ReplicaNode extends Node {
       }
 
       lastFileMetaData = copyState.files;
-
-      // It's a good time to delete pending files, since we just refreshed and some previously open files are now closed:
-      deleter.deletePending();
     }
 
     int markerCount;
@@ -720,17 +720,6 @@ abstract class ReplicaNode extends Node {
    * (inclues the segment id), length, footer (including checksum) differ, then this returns false, else true. */
   private boolean fileIsIdentical(String fileName, FileMetaData srcMetaData) throws IOException {
 
-    if (deleter.isPending(fileName)) {
-      // This was a file we had wanted to delete yet a virus checker prevented us, and now we need to overwrite it.
-      // Such files are in an unknown state, and even if their header and footer and length all
-      // match, since they may not have been fsync'd by the previous node instance on this directory,
-      // they could in theory have corruption internally.  So we always force ourselves to copy them here:
-      if (Node.VERBOSE_FILES) {
-        message("file " + fileName + ": will copy [we had wanted to delete this file on init, but failed]");
-      }
-      return false;
-    }
-
     FileMetaData destMetaData = readLocalFileMetaData(fileName);
     if (destMetaData == null) {
       // Something went wrong in reading the file (it's corrupt, truncated, does not exist, etc.):

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
index 3cb2fbb..a0b9535 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
@@ -18,6 +18,7 @@ package org.apache.lucene.replicator.nrt;
  */
 
 import java.io.Closeable;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.PriorityQueue;
@@ -131,7 +132,7 @@ class Jobs extends Thread implements Closeable {
   }
 
   /** Cancels any existing jobs that are copying the same file names as this one */
-  public synchronized void cancelConflictingJobs(CopyJob newJob) {
+  public synchronized void cancelConflictingJobs(CopyJob newJob) throws IOException {
     for (CopyJob job : queue) {
       if (job.conflicts(newJob)) {
         node.message("top: now cancel existing conflicting job=" + job + " due to newJob=" + newJob);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleCopyJob.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleCopyJob.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleCopyJob.java
index 1180967..c8663e2 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleCopyJob.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleCopyJob.java
@@ -173,13 +173,6 @@ class SimpleCopyJob extends CopyJob {
       String tmpFileName = ent.getValue();
       String fileName = ent.getKey();
 
-      // Tricky: if primary crashes while warming (pre-copying) a merged segment _X, the new primary can easily flush or merge to _X (since we don't
-      // have a distributed inflateGens for the new primary) and _X file names will be reused.  In this case, our local deleter will be
-      // thinking it must remove _X's files (from the warmed merge that never went live), but this is dangerous when virus checker is active
-      // since deleter may finally succeed in deleting the file after we have copied the new _X flushed files.  So at this point was ask the
-      // deleter to NOT delete the file anymore:
-      dest.deleter.clearPending(Collections.singleton(fileName));
-
       if (Node.VERBOSE_FILES) {
         dest.message("rename file " + tmpFileName + " to " + fileName);
       }
@@ -241,7 +234,7 @@ class SimpleCopyJob extends CopyJob {
     }
   }
 
-  public synchronized void cancel(String reason, Throwable exc) {
+  public synchronized void cancel(String reason, Throwable exc) throws IOException {
     try {
       super.cancel(reason, exc);
     } finally {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
index 83ce6cb..4868338 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
@@ -135,9 +135,7 @@ class SimpleReplicaNode extends ReplicaNode {
     MockDirectoryWrapper dir = LuceneTestCase.newMockFSDirectory(path);
     
     dir.setAssertNoUnrefencedFilesOnClose(true);
-    // nocommit
-    //dir.setCheckIndexOnClose(doCheckIndexOnClose);
-    dir.setCheckIndexOnClose(true);
+    dir.setCheckIndexOnClose(doCheckIndexOnClose);
 
     // Corrupt any index files not referenced by current commit point; this is important (increases test evilness) because we may have done
     // a hard crash of the previous JVM writing to this directory and so MDW's corrupt-unknown-files-on-close never ran:

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0f42780/lucene/replicator/test.cmd
----------------------------------------------------------------------
diff --git a/lucene/replicator/test.cmd b/lucene/replicator/test.cmd
index c38fc96..f636a61 100644
--- a/lucene/replicator/test.cmd
+++ b/lucene/replicator/test.cmd
@@ -1 +1,3 @@
-python -u /l/util/src/python/repeatLuceneTest.py -tmpDir /b/tmp -logDir /l/logs TestStressNRTReplication -jvms 1 -mult 4 -nightly
+python -u /l/util/src/python/repeatLuceneTest.py -tmpDir /b/tmp -logDir /l/logs TestStressNRTReplication -jvms 3
+
+#  -mult 4 -nightly


[10/21] lucene-solr git commit: SOLR-8652: Check if second to last token is limit to test for limit clause

Posted by mi...@apache.org.
SOLR-8652: Check if second to last token is limit to test for limit clause


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/75a81795
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/75a81795
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/75a81795

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 75a81795b8c8370cc754b60801fc33cc020efb30
Parents: ba20faa
Author: jbernste <jb...@apache.org>
Authored: Sat Feb 6 21:25:05 2016 -0500
Committer: jbernste <jb...@apache.org>
Committed: Sat Feb 6 21:25:05 2016 -0500

----------------------------------------------------------------------
 .../org/apache/solr/client/solrj/io/sql/StatementImpl.java  | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/75a81795/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
index 1927029..e236c83 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Random;
@@ -59,7 +60,7 @@ class StatementImpl implements Statement {
         this.currentResultSet = null;
       }
 
-      if(maxRows > 0 && !(sql.toLowerCase()).contains("limit")) {
+      if(maxRows > 0 && !containsLimit(sql)) {
         sql = sql + " limit "+Integer.toString(maxRows);
       }
 
@@ -356,4 +357,10 @@ class StatementImpl implements Statement {
   public boolean isWrapperFor(Class<?> iface) throws SQLException {
     throw new UnsupportedOperationException();
   }
+
+  private boolean containsLimit(String sql) {
+    String[] tokens = sql.split("\\s+");
+    String secondToLastToken = tokens[tokens.length-2];
+    return ("limit").equals(secondToLastToken);
+  }
 }
\ No newline at end of file


[16/21] lucene-solr git commit: move verbosity to the right place

Posted by mi...@apache.org.
move verbosity to the right place


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/e0ba1e5b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/e0ba1e5b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/e0ba1e5b

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: e0ba1e5bffb304dbb1196782851cf143ec995e97
Parents: 8e8aa08
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 09:26:23 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 09:26:23 2016 -0500

----------------------------------------------------------------------
 .../src/java/org/apache/lucene/store/MockDirectoryWrapper.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0ba1e5b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
index 68bacbd..515f012 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
@@ -726,11 +726,11 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
       randomIOExceptionRateOnOpen = 0.0;
 
       if ((getCheckIndexOnClose() || assertNoUnreferencedFilesOnClose) && DirectoryReader.indexExists(this)) {
-        if (LuceneTestCase.VERBOSE) {
-          System.out.println("\nNOTE: MockDirectoryWrapper: now crush");
-        }
         if (getCheckIndexOnClose()) {
 
+          if (LuceneTestCase.VERBOSE) {
+            System.out.println("\nNOTE: MockDirectoryWrapper: now crush");
+          }
           crash(); // corrupt any unsynced-files
           if (LuceneTestCase.VERBOSE) {
             System.out.println("\nNOTE: MockDirectoryWrapper: now run CheckIndex");


[09/21] lucene-solr git commit: SOLR-8652: Implement Statement.setMaxRows()

Posted by mi...@apache.org.
SOLR-8652: Implement Statement.setMaxRows()


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ba20faa9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ba20faa9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ba20faa9

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: ba20faa9557cdd56d6a696d702fb5a62d9d43f74
Parents: dc6b1a6
Author: jbernste <jb...@apache.org>
Authored: Sat Feb 6 21:03:45 2016 -0500
Committer: jbernste <jb...@apache.org>
Committed: Sat Feb 6 21:03:45 2016 -0500

----------------------------------------------------------------------
 .../org/apache/solr/client/solrj/io/sql/StatementImpl.java  | 9 +++++++--
 .../test/org/apache/solr/client/solrj/io/sql/JdbcTest.java  | 5 +++--
 2 files changed, 10 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ba20faa9/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
index 77cebfe..1927029 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
@@ -45,6 +45,7 @@ class StatementImpl implements Statement {
   private String currentSQL;
   private ResultSetImpl currentResultSet;
   private SQLWarning currentWarning;
+  private int maxRows;
 
   StatementImpl(ConnectionImpl connection) {
     this.connection = connection;
@@ -58,6 +59,10 @@ class StatementImpl implements Statement {
         this.currentResultSet = null;
       }
 
+      if(maxRows > 0 && !(sql.toLowerCase()).contains("limit")) {
+        sql = sql + " limit "+Integer.toString(maxRows);
+      }
+
       closed = false;  // If closed reopen so Statement can be reused.
       this.currentResultSet = new ResultSetImpl(this, constructStream(sql));
       return this.currentResultSet;
@@ -132,12 +137,12 @@ class StatementImpl implements Statement {
 
   @Override
   public int getMaxRows() throws SQLException {
-    throw new UnsupportedOperationException();
+    return this.maxRows;
   }
 
   @Override
   public void setMaxRows(int max) throws SQLException {
-    throw new UnsupportedOperationException();
+    this.maxRows = max;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ba20faa9/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index ba21114..b3d7ae9 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -166,7 +166,8 @@ public class JdbcTest extends AbstractFullDistribZkTestBase {
     stmt.close();
 
     //Test statement reuse
-    rs = stmt.executeQuery("select id, a_i, a_s, a_f from collection1 order by a_i asc limit 2");
+    stmt.setMaxRows(2);
+    rs = stmt.executeQuery("select id, a_i, a_s, a_f from collection1 order by a_i asc");
     assert(rs.next());
     assert(rs.getLong("a_i") == 0);
     assert(rs.getLong(2) == 0);
@@ -176,7 +177,7 @@ public class JdbcTest extends AbstractFullDistribZkTestBase {
     assert(!rs.next());
     stmt.close();
 
-    //Test simple loop
+    //Test simple loop. Since limit is set it will override the statement maxRows
     rs = stmt.executeQuery("select id, a_i, a_s, a_f from collection1 order by a_i asc limit 100");
     int count = 0;
     while(rs.next()) {


[17/21] lucene-solr git commit: LUCENE-6835, LUCENE-6684: move the 'suppress NSFE on windows' hack down lower, out of IFD into FSDir; also fix IFD to remove segments files before others

Posted by mi...@apache.org.
LUCENE-6835, LUCENE-6684: move the 'suppress NSFE on windows' hack down lower, out of IFD into FSDir; also fix IFD to remove segments files before others


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f8bd22e5
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f8bd22e5
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f8bd22e5

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: f8bd22e58c953a5ef27fd4859c91845755ebd490
Parents: e0ba1e5
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 13:21:39 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 13:21:39 2016 -0500

----------------------------------------------------------------------
 .../apache/lucene/index/IndexFileDeleter.java   | 27 ++++---
 .../org/apache/lucene/store/FSDirectory.java    | 15 ++--
 .../lucene/index/TestIndexFileDeleter.java      | 76 ++++++++++++++++++++
 3 files changed, 100 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f8bd22e5/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java b/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
index 6886055..52f0b40 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
@@ -696,24 +696,23 @@ final class IndexFileDeleter implements Closeable {
     ensureOpen();
 
     if (infoStream.isEnabled("IFD")) {
-      infoStream.message("IFD", "delete \"" + names + "\"");
+      infoStream.message("IFD", "delete " + names + "");
     }
 
+    // We make two passes, first deleting any segments_N files, second deleting the rest.  We do this so that if we throw exc or JVM
+    // crashes during deletions, even when not on Windows, we don't leave the index in an "apparently corrupt" state:
     for(String name : names) {
-      try {
-        directory.deleteFile(name);
-      } catch (NoSuchFileException | FileNotFoundException e) {
-        // IndexWriter should only ask us to delete files it knows it wrote, so if we hit this, something is wrong!
-
-        if (Constants.WINDOWS) {
-          // TODO: can we remove this OS-specific hacky logic?  If windows deleteFile is buggy, we should instead contain this workaround in
-          // a WindowsFSDirectory ...
-          // LUCENE-6684: we suppress this assert for Windows, since a file could be in a confusing "pending delete" state, and falsely
-          // return NSFE/FNFE
-        } else {
-          throw e;
-        }
+      if (name.startsWith(IndexFileNames.SEGMENTS) == false) {
+        continue;
+      }
+      directory.deleteFile(name);
+    }
+
+    for(String name : names) {
+      if (name.startsWith(IndexFileNames.SEGMENTS) == true) {
+        continue;
       }
+      directory.deleteFile(name);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f8bd22e5/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java b/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
index 32e078c..26e4553 100644
--- a/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
@@ -327,7 +327,7 @@ public abstract class FSDirectory extends BaseDirectory {
     if (pendingDeletes.contains(name)) {
       throw new NoSuchFileException("file \"" + name + "\" is already pending delete");
     }
-    privateDeleteFile(name);
+    privateDeleteFile(name, false);
     maybeDeletePendingFiles();
   }
 
@@ -347,7 +347,7 @@ public abstract class FSDirectory extends BaseDirectory {
 
       // Clone the set since we mutate it in privateDeleteFile:
       for(String name : new HashSet<>(pendingDeletes)) {
-        privateDeleteFile(name);
+        privateDeleteFile(name, true);
       }
     }
   }
@@ -363,14 +363,21 @@ public abstract class FSDirectory extends BaseDirectory {
     }
   }
 
-  private void privateDeleteFile(String name) throws IOException {
+  private void privateDeleteFile(String name, boolean isPendingDelete) throws IOException {
     try {
       Files.delete(directory.resolve(name));
       pendingDeletes.remove(name);
     } catch (NoSuchFileException | FileNotFoundException e) {
       // We were asked to delete a non-existent file:
       pendingDeletes.remove(name);
-      throw e;
+      if (isPendingDelete && Constants.WINDOWS) {
+        // TODO: can we remove this OS-specific hacky logic?  If windows deleteFile is buggy, we should instead contain this workaround in
+        // a WindowsFSDirectory ...
+        // LUCENE-6684: we suppress this check for Windows, since a file could be in a confusing "pending delete" state, failing the first
+        // delete attempt with access denied and then apparently falsely failing here when we try ot delete it again, with NSFE/FNFE
+      } else {
+        throw e;
+      }
     } catch (IOException ioe) {
       // On windows, a file delete can fail because there's still an open
       // file handle against it.  We record this in pendingDeletes and

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f8bd22e5/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
index 3ea9da0..ecebb18 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
@@ -488,4 +488,80 @@ public class TestIndexFileDeleter extends LuceneTestCase {
     w.close();
     dir.close();
   }
+
+  // LUCENE-6835: make sure best-effort to not create an "apparently but not really" corrupt index is working:
+  public void testExcInDeleteFile() throws Throwable {
+    int iters = atLeast(10);
+    for(int iter=0;iter<iters;iter++) {
+      if (VERBOSE) {
+        System.out.println("TEST: iter=" + iter);
+      }
+      MockDirectoryWrapper dir = newMockDirectory();
+
+      final AtomicBoolean doFailExc = new AtomicBoolean();
+
+      dir.failOn(new MockDirectoryWrapper.Failure() {
+          @Override
+          public void eval(MockDirectoryWrapper dir) throws IOException {
+            if (doFailExc.get() && random().nextInt(4) == 1) {
+              Exception e = new Exception();
+              StackTraceElement stack[] = e.getStackTrace();
+              for (int i = 0; i < stack.length; i++) {
+                if (stack[i].getClassName().equals(MockDirectoryWrapper.class.getName()) && stack[i].getMethodName().equals("deleteFile")) {
+                  throw new MockDirectoryWrapper.FakeIOException();
+                }
+              }
+            }
+          }
+        });
+
+      IndexWriterConfig iwc = newIndexWriterConfig();
+      iwc.setMergeScheduler(new SerialMergeScheduler());
+      RandomIndexWriter w = new RandomIndexWriter(random(), dir, iwc);
+      w.addDocument(new Document());
+
+      // makes segments_1
+      if (VERBOSE) {
+        System.out.println("TEST: now commit");
+      }
+      w.commit();
+
+      w.addDocument(new Document());
+      doFailExc.set(true);
+      if (VERBOSE) {
+        System.out.println("TEST: now close");
+      }
+      try {
+        w.close();
+        if (VERBOSE) {
+          System.out.println("TEST: no exception (ok)");
+        }
+      } catch (RuntimeException re) {
+        assertTrue(re.getCause() instanceof MockDirectoryWrapper.FakeIOException);
+        // good
+        if (VERBOSE) {
+          System.out.println("TEST: got expected exception:");
+          re.printStackTrace(System.out);
+        }
+      } catch (MockDirectoryWrapper.FakeIOException fioe) {
+        // good
+        if (VERBOSE) {
+          System.out.println("TEST: got expected exception:");
+          fioe.printStackTrace(System.out);
+        }
+      }
+      doFailExc.set(false);
+      assertFalse(w.w.isOpen());
+
+      for(String name : dir.listAll()) {
+        if (name.startsWith(IndexFileNames.SEGMENTS)) {
+          if (VERBOSE) {
+            System.out.println("TEST: now read " + name);
+          }
+          SegmentInfos.readCommit(dir, name);
+        }
+      }
+      dir.close();
+    }
+  }
 }


[20/21] lucene-solr git commit: Merge branch 'master' into jira/lucene-5438-nrt-replication

Posted by mi...@apache.org.
Merge branch 'master' into jira/lucene-5438-nrt-replication

Conflicts:
	lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
	lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9ba62e5e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9ba62e5e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9ba62e5e

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 9ba62e5e3833b99fbec4ba1775a5d1c12254556d
Parents: 6369012 1d4d9c5
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 14:03:13 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 14:03:13 2016 -0500

----------------------------------------------------------------------
 .../icu/segmentation/ScriptIterator.java        |   2 +-
 .../apache/lucene/index/IndexFileDeleter.java   |  36 +------
 .../org/apache/lucene/index/IndexWriter.java    |   2 +-
 .../org/apache/lucene/store/FSDirectory.java    |  15 ++-
 .../lucene/store/FileSwitchDirectory.java       |   5 +-
 .../lucene/store/NRTCachingDirectory.java       |   4 +-
 .../lucene/TestMergeSchedulerExternal.java      |  39 ++++---
 .../lucene/index/TestIndexFileDeleter.java      |  76 ++++++++++++++
 .../apache/lucene/index/TestIndexWriter.java    |  11 +-
 .../jaspell/JaspellTernarySearchTrie.java       |   2 +-
 .../lucene/store/BaseDirectoryTestCase.java     |  26 +++++
 .../lucene/store/BaseLockFactoryTestCase.java   |   9 +-
 .../lucene/store/MockDirectoryWrapper.java      | 103 +++++++++----------
 solr/CHANGES.txt                                |   6 ++
 .../solr/update/StreamingSolrClients.java       |   4 +-
 .../solr/client/solrj/io/SolrClientCache.java   |  13 ++-
 .../client/solrj/io/sql/ConnectionImpl.java     |  14 +--
 .../solrj/io/sql/DatabaseMetaDataImpl.java      |  95 ++++++++++++++---
 .../solr/client/solrj/io/sql/StatementImpl.java |  16 ++-
 .../solr/client/solrj/io/sql/JdbcTest.java      |  28 ++++-
 20 files changed, 360 insertions(+), 146 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9ba62e5e/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9ba62e5e/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9ba62e5e/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9ba62e5e/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
----------------------------------------------------------------------
diff --cc lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
index 9e25889,515f012..a36d6d4
--- a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
@@@ -833,12 -721,13 +833,12 @@@ public class MockDirectoryWrapper exten
          }
          throw new RuntimeException("MockDirectoryWrapper: cannot close: there are still open locks: " + openLocks, cause);
        }
 -      
+       randomIOExceptionRate = 0.0;
+       randomIOExceptionRateOnOpen = 0.0;
  
-       if (getCheckIndexOnClose()) {
-         randomIOExceptionRate = 0.0;
-         randomIOExceptionRateOnOpen = 0.0;
+       if ((getCheckIndexOnClose() || assertNoUnreferencedFilesOnClose) && DirectoryReader.indexExists(this)) {
+         if (getCheckIndexOnClose()) {
  
-         if (DirectoryReader.indexExists(this)) {
            if (LuceneTestCase.VERBOSE) {
              System.out.println("\nNOTE: MockDirectoryWrapper: now crush");
            }


[19/21] lucene-solr git commit: fix a few nocommits

Posted by mi...@apache.org.
fix a few nocommits


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6369012d
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6369012d
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6369012d

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 6369012d332431848971c1ba6f8012ae021aa74c
Parents: bd6804b
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 13:58:01 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 13:58:01 2016 -0500

----------------------------------------------------------------------
 .../apache/lucene/index/IndexFileDeleter.java   | 25 ++++++++++++++++++++
 .../replicator/nrt/ReplicaFileDeleter.java      |  1 +
 .../lucene/replicator/nrt/ReplicaNode.java      |  2 --
 .../org/apache/lucene/replicator/nrt/Jobs.java  |  1 +
 .../replicator/nrt/SimpleReplicaNode.java       |  6 ++---
 .../replicator/nrt/TestNRTReplication.java      |  2 --
 .../nrt/TestStressNRTReplication.java           |  9 +++----
 .../lucene/store/MockDirectoryWrapper.java      | 19 +++++++++------
 8 files changed, 47 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java b/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
index 6886055..84e070a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
@@ -699,7 +699,32 @@ final class IndexFileDeleter implements Closeable {
       infoStream.message("IFD", "delete \"" + names + "\"");
     }
 
+    // We make two passes, first deleting any segments_N files, second deleting all the rest.  We do this so that if we throw exc or JVM
+    // crashes during deletions, we don't leave the index in an "apparently corrupt" state:
     for(String name : names) {
+      if (name.startsWith(IndexFileNames.SEGMENTS) == false) {
+        continue;
+      }
+      try {
+        directory.deleteFile(name);
+      } catch (NoSuchFileException | FileNotFoundException e) {
+        // IndexWriter should only ask us to delete files it knows it wrote, so if we hit this, something is wrong!
+
+        if (Constants.WINDOWS) {
+          // TODO: can we remove this OS-specific hacky logic?  If windows deleteFile is buggy, we should instead contain this workaround in
+          // a WindowsFSDirectory ...
+          // LUCENE-6684: we suppress this assert for Windows, since a file could be in a confusing "pending delete" state, and falsely
+          // return NSFE/FNFE
+        } else {
+          throw e;
+        }
+      }
+    }
+
+    for(String name : names) {
+      if (name.startsWith(IndexFileNames.SEGMENTS) == true) {
+        continue;
+      }
       try {
         directory.deleteFile(name);
       } catch (NoSuchFileException | FileNotFoundException e) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
index 005f938..b15fc05 100644
--- a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
+++ b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaFileDeleter.java
@@ -122,6 +122,7 @@ class ReplicaFileDeleter {
       node.message("file " + fileName + ": delete failed: " + missing);
       throw new IllegalStateException("file " + fileName + ": we attempted delete but the file does not exist?", missing);
     } catch (IOException ioe) {
+      // nocommit remove this retry logic!  it's Directory's job now...
       if (Node.VERBOSE_FILES) {
         node.message("file " + fileName + ": delete failed: " + ioe + "; will retry later");
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
index a7adbe2..54083b4 100644
--- a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
+++ b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
@@ -92,8 +92,6 @@ abstract class ReplicaNode extends Node {
       // Obtain a write lock on this index since we "act like" an IndexWriter, to prevent any other IndexWriter or ReplicaNode from using it:
       writeFileLock = dir.obtainLock(IndexWriter.WRITE_LOCK_NAME);
       
-      // nocommit must check for no pending deletes here, like IW does
-
       state = "init";
       deleter = new ReplicaFileDeleter(this, dir);
     } catch (Throwable t) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
index 369414f..3cb2fbb 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/Jobs.java
@@ -84,6 +84,7 @@ class Jobs extends Thread implements Closeable {
           topJob.onceDone.run(topJob);
         } catch (Throwable t2) {
           node.message("ignore exception calling OnceDone: " + t2);
+          t2.printStackTrace(System.out);
         }
         continue;
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
index 2510c40..83ce6cb 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
@@ -135,9 +135,9 @@ class SimpleReplicaNode extends ReplicaNode {
     MockDirectoryWrapper dir = LuceneTestCase.newMockFSDirectory(path);
     
     dir.setAssertNoUnrefencedFilesOnClose(true);
-    if (doCheckIndexOnClose) {
-      dir.setCheckIndexOnClose(false);
-    }
+    // nocommit
+    //dir.setCheckIndexOnClose(doCheckIndexOnClose);
+    dir.setCheckIndexOnClose(true);
 
     // Corrupt any index files not referenced by current commit point; this is important (increases test evilness) because we may have done
     // a hard crash of the previous JVM writing to this directory and so MDW's corrupt-unknown-files-on-close never ran:

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestNRTReplication.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestNRTReplication.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestNRTReplication.java
index cd98b48..2c66994 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestNRTReplication.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestNRTReplication.java
@@ -39,8 +39,6 @@ import org.apache.lucene.util.TestUtil;
 
 import com.carrotsearch.randomizedtesting.SeedUtils;
 
-// nocommit make some explicit failure tests
-
 // MockRandom's .sd file has no index header/footer:
 @SuppressCodecs({"MockRandom", "Memory", "Direct", "SimpleText"})
 @SuppressSysoutChecks(bugUrl = "Stuff gets printed, important stuff for debugging a failure")

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestStressNRTReplication.java
----------------------------------------------------------------------
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestStressNRTReplication.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestStressNRTReplication.java
index 04bbdc1..a765f11 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestStressNRTReplication.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/TestStressNRTReplication.java
@@ -161,7 +161,8 @@ public class TestStressNRTReplication extends LuceneTestCase {
   static final boolean DO_BIT_FLIPS_DURING_COPY = true;
 
   /** Set to a non-null value to force exactly that many nodes; else, it's random. */
-  static final Integer NUM_NODES = null;
+  // nocommit
+  static final Integer NUM_NODES = 2;
 
   final AtomicBoolean failed = new AtomicBoolean();
 
@@ -980,10 +981,10 @@ public class TestStressNRTReplication extends LuceneTestCase {
             continue;
           }
 
-          // nocommit not anymore?
-          // This can be null if we got the new primary after crash and that primary is still catching up (replaying xlog):
+          // This can be null if primary is flushing, has already refreshed its searcher, but is e.g. still notifying replicas and hasn't
+          // yet returned the version to us, in which case this searcher thread can see the version before the main thread has added it to
+          // versionToMarker:
           Integer expectedAtLeastHitCount = versionToMarker.get(version);
-          assertNotNull("version=" + version, expectedAtLeastHitCount);
 
           if (expectedAtLeastHitCount != null && expectedAtLeastHitCount > 0 && random().nextInt(10) == 7) {
             try {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6369012d/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
index a5fc397..9e25889 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
@@ -230,10 +230,6 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
       throw (AssertionError) fillOpenTrace(new AssertionError("MockDirectoryWrapper: dest file \"" + dest + "\" is still open: cannot rename"), dest, true);
     }
 
-    if (createdFiles.contains(dest)) {
-      throw new IOException("MockDirectoryWrapper: dest file \"" + dest + "\" already exists: cannot rename");
-    }
-
     boolean success = false;
     try {
       in.renameFile(source, dest);
@@ -275,7 +271,14 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
     for(String fileName : listAll()) {
       if (fileName.startsWith(IndexFileNames.SEGMENTS)) {
         System.out.println("MDW: read " + fileName + " to gather files it references");
-        knownFiles.addAll(SegmentInfos.readCommit(this, fileName).files(true));
+        SegmentInfos infos;
+        try {
+          infos = SegmentInfos.readCommit(this, fileName);
+        } catch (IOException ioe) {
+          System.out.println("MDW: exception reading segment infos " + fileName + "; files: " + Arrays.toString(listAll()));
+          throw ioe;
+        }
+        knownFiles.addAll(infos.files(true));
       }
     }
 
@@ -438,7 +441,6 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
   /** Simulates a crash of OS or machine by overwriting
    *  unsynced files. */
   public synchronized void crash() throws IOException {
-    crashed = true;
     openFiles = new HashMap<>();
     openFilesForWrite = new HashSet<>();
     openFilesDeleted = new HashSet<>();
@@ -451,6 +453,7 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
       } catch (Exception ignored) {}
     }
     corruptFiles(unSyncedFiles);
+    crashed = true;
     unSyncedFiles = new HashSet<>();
   }
 
@@ -569,6 +572,7 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
 
     unSyncedFiles.remove(name);
     in.deleteFile(name);
+    createdFiles.remove(name);
   }
 
   // sets the cause of the incoming ioe to be the stack
@@ -829,7 +833,7 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
         }
         throw new RuntimeException("MockDirectoryWrapper: cannot close: there are still open locks: " + openLocks, cause);
       }
-      
+
       if (getCheckIndexOnClose()) {
         randomIOExceptionRate = 0.0;
         randomIOExceptionRateOnOpen = 0.0;
@@ -846,6 +850,7 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
           TestUtil.checkIndex(this, getCrossCheckTermVectorsOnClose(), true);
           
           // TODO: factor this out / share w/ TestIW.assertNoUnreferencedFiles
+          // nocommit pull this outside of "getCheckIndexOnClose"
           if (assertNoUnreferencedFilesOnClose) {
 
             // now look for unreferenced files: discount ones that we tried to delete but could not


[14/21] lucene-solr git commit: try to fix test bug, so that on Windows instead of relying on WindowsFS to prevent deletion of open files, we rely on the OS itself

Posted by mi...@apache.org.
try to fix test bug, so that on Windows instead of relying on WindowsFS to prevent deletion of open files, we rely on the OS itself


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/53597e8f
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/53597e8f
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/53597e8f

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 53597e8f8e3fe97ce06cfcb98ab313ee7c9ae45f
Parents: 2a76876
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 07:04:10 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 07:04:10 2016 -0500

----------------------------------------------------------------------
 .../test/org/apache/lucene/index/TestIndexWriter.java    | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/53597e8f/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
index 4f6ef89..b9dd899 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
@@ -78,6 +78,7 @@ import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.store.LockObtainFailedException;
+import org.apache.lucene.store.MMapDirectory;
 import org.apache.lucene.store.MockDirectoryWrapper;
 import org.apache.lucene.store.NIOFSDirectory;
 import org.apache.lucene.store.NoLockFactory;
@@ -1268,8 +1269,14 @@ public class TestIndexWriter extends LuceneTestCase {
       FileSystem fs = new WindowsFS(path.getFileSystem()).getFileSystem(URI.create("file:///"));
       Path indexPath = new FilterPath(path, fs);
 
-      // NOTE: cannot use MMapDir, because WindowsFS doesn't see/think it keeps file handles open?
-      FSDirectory dir = new NIOFSDirectory(indexPath);
+      // NOTE: on Unix, we cannot use MMapDir, because WindowsFS doesn't see/think it keeps file handles open.  Yet, on Windows, we MUST use
+      // MMapDir because the windows OS will in fact prevent file deletion for us, and fails otherwise:
+      FSDirectory dir;
+      if (Constants.WINDOWS) {
+        dir = new MMapDirectory(indexPath);
+      } else {
+        dir = new NIOFSDirectory(indexPath);
+      }
 
       MergePolicy mergePolicy = newLogMergePolicy(true);
       


[15/21] lucene-solr git commit: MDW's assertNoUnreferencedFilesOnClose should still run even if checkIndexOnClose is turned off

Posted by mi...@apache.org.
MDW's assertNoUnreferencedFilesOnClose should still run even if checkIndexOnClose is turned off


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/8e8aa086
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/8e8aa086
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/8e8aa086

Branch: refs/heads/jira/lucene-5438-nrt-replication
Commit: 8e8aa0869e1e419682fd74b0415efa926d1fea87
Parents: 53597e8
Author: Mike McCandless <mi...@apache.org>
Authored: Sun Feb 7 09:19:57 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Sun Feb 7 09:19:57 2016 -0500

----------------------------------------------------------------------
 .../lucene/store/MockDirectoryWrapper.java      | 107 ++++++++++---------
 1 file changed, 54 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8e8aa086/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
index 51dbffe..68bacbd 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
@@ -722,80 +722,81 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
         throw new RuntimeException("MockDirectoryWrapper: cannot close: there are still open locks: " + openLocks, cause);
       }
       
-      if (getCheckIndexOnClose()) {
-        randomIOExceptionRate = 0.0;
-        randomIOExceptionRateOnOpen = 0.0;
+      randomIOExceptionRate = 0.0;
+      randomIOExceptionRateOnOpen = 0.0;
+
+      if ((getCheckIndexOnClose() || assertNoUnreferencedFilesOnClose) && DirectoryReader.indexExists(this)) {
+        if (LuceneTestCase.VERBOSE) {
+          System.out.println("\nNOTE: MockDirectoryWrapper: now crush");
+        }
+        if (getCheckIndexOnClose()) {
 
-        if (DirectoryReader.indexExists(this)) {
-          if (LuceneTestCase.VERBOSE) {
-            System.out.println("\nNOTE: MockDirectoryWrapper: now crush");
-          }
           crash(); // corrupt any unsynced-files
           if (LuceneTestCase.VERBOSE) {
             System.out.println("\nNOTE: MockDirectoryWrapper: now run CheckIndex");
           } 
 
           TestUtil.checkIndex(this, getCrossCheckTermVectorsOnClose(), true);
+        }
           
-          // TODO: factor this out / share w/ TestIW.assertNoUnreferencedFiles
-          if (assertNoUnreferencedFilesOnClose) {
+        // TODO: factor this out / share w/ TestIW.assertNoUnreferencedFiles
+        if (assertNoUnreferencedFilesOnClose) {
 
-            // now look for unreferenced files: discount ones that we tried to delete but could not
-            Set<String> allFiles = new HashSet<>(Arrays.asList(listAll()));
-            String[] startFiles = allFiles.toArray(new String[0]);
-            IndexWriterConfig iwc = new IndexWriterConfig(null);
-            iwc.setIndexDeletionPolicy(NoDeletionPolicy.INSTANCE);
+          // now look for unreferenced files: discount ones that we tried to delete but could not
+          Set<String> allFiles = new HashSet<>(Arrays.asList(listAll()));
+          String[] startFiles = allFiles.toArray(new String[0]);
+          IndexWriterConfig iwc = new IndexWriterConfig(null);
+          iwc.setIndexDeletionPolicy(NoDeletionPolicy.INSTANCE);
 
-            // We must do this before opening writer otherwise writer will be angry if there are pending deletions:
-            TestUtil.disableVirusChecker(in);
+          // We must do this before opening writer otherwise writer will be angry if there are pending deletions:
+          TestUtil.disableVirusChecker(in);
 
-            new IndexWriter(in, iwc).rollback();
-            String[] endFiles = in.listAll();
+          new IndexWriter(in, iwc).rollback();
+          String[] endFiles = in.listAll();
             
-            Set<String> startSet = new TreeSet<>(Arrays.asList(startFiles));
-            Set<String> endSet = new TreeSet<>(Arrays.asList(endFiles));
+          Set<String> startSet = new TreeSet<>(Arrays.asList(startFiles));
+          Set<String> endSet = new TreeSet<>(Arrays.asList(endFiles));
             
-            startFiles = startSet.toArray(new String[0]);
-            endFiles = endSet.toArray(new String[0]);
+          startFiles = startSet.toArray(new String[0]);
+          endFiles = endSet.toArray(new String[0]);
             
-            if (!Arrays.equals(startFiles, endFiles)) {
-              List<String> removed = new ArrayList<>();
-              for(String fileName : startFiles) {
-                if (!endSet.contains(fileName)) {
-                  removed.add(fileName);
-                }
-              }
-              
-              List<String> added = new ArrayList<>();
-              for(String fileName : endFiles) {
-                if (!startSet.contains(fileName)) {
-                  added.add(fileName);
-                }
+          if (!Arrays.equals(startFiles, endFiles)) {
+            List<String> removed = new ArrayList<>();
+            for(String fileName : startFiles) {
+              if (!endSet.contains(fileName)) {
+                removed.add(fileName);
               }
+            }
               
-              String extras;
-              if (removed.size() != 0) {
-                extras = "\n\nThese files were removed: " + removed;
-              } else {
-                extras = "";
+            List<String> added = new ArrayList<>();
+            for(String fileName : endFiles) {
+              if (!startSet.contains(fileName)) {
+                added.add(fileName);
               }
+            }
               
-              if (added.size() != 0) {
-                extras += "\n\nThese files were added (waaaaaaaaaat!): " + added;
-              }
+            String extras;
+            if (removed.size() != 0) {
+              extras = "\n\nThese files were removed: " + removed;
+            } else {
+              extras = "";
+            }
               
-              throw new RuntimeException("unreferenced files: before delete:\n    " + Arrays.toString(startFiles) + "\n  after delete:\n    " + Arrays.toString(endFiles) + extras);
+            if (added.size() != 0) {
+              extras += "\n\nThese files were added (waaaaaaaaaat!): " + added;
             }
-            
-            DirectoryReader ir1 = DirectoryReader.open(this);
-            int numDocs1 = ir1.numDocs();
-            ir1.close();
-            new IndexWriter(this, new IndexWriterConfig(null)).close();
-            DirectoryReader ir2 = DirectoryReader.open(this);
-            int numDocs2 = ir2.numDocs();
-            ir2.close();
-            assert numDocs1 == numDocs2 : "numDocs changed after opening/closing IW: before=" + numDocs1 + " after=" + numDocs2;
+              
+            throw new RuntimeException("unreferenced files: before delete:\n    " + Arrays.toString(startFiles) + "\n  after delete:\n    " + Arrays.toString(endFiles) + extras);
           }
+            
+          DirectoryReader ir1 = DirectoryReader.open(this);
+          int numDocs1 = ir1.numDocs();
+          ir1.close();
+          new IndexWriter(this, new IndexWriterConfig(null)).close();
+          DirectoryReader ir2 = DirectoryReader.open(this);
+          int numDocs2 = ir2.numDocs();
+          ir2.close();
+          assert numDocs1 == numDocs2 : "numDocs changed after opening/closing IW: before=" + numDocs1 + " after=" + numDocs2;
         }
       }
       success = true;