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;