You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by er...@apache.org on 2017/12/05 17:11:29 UTC
[1/2] lucene-solr:master: LUCENE-8048: Filesystems do not guarantee
order of directories updates
Repository: lucene-solr
Updated Branches:
refs/heads/master f78cacf4a -> 0688be6c6
LUCENE-8048: Filesystems do not guarantee order of directories updates
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/4a590072
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4a590072
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4a590072
Branch: refs/heads/master
Commit: 4a5900728db6a84b4aea42545567a393989f25cf
Parents: ccedbdd
Author: Erick Erickson <er...@apache.org>
Authored: Tue Dec 5 09:05:22 2017 -0800
Committer: Erick Erickson <er...@apache.org>
Committed: Tue Dec 5 09:05:22 2017 -0800
----------------------------------------------------------------------
lucene/CHANGES.txt | 3 +++
.../org/apache/lucene/index/SegmentInfos.java | 1 +
.../lucene/index/TestIndexWriterExceptions.java | 28 +++++++++++++-------
3 files changed, 23 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4a590072/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 1ef55cd..f79ad14 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -144,6 +144,9 @@ Optimizations
* LUCENE-8058: Large instances of TermInSetQuery are no longer eligible for
caching as they could break memory accounting of the query cache.
(Adrien Grand)
+
+* LUCENE-8048: Filesystems do not guarantee order of directories updates
+ (Nikolay Martynov, Simon Willnauer, Erick Erickson)
Tests
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4a590072/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
index 008b6e3..ec88fef 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
@@ -747,6 +747,7 @@ public final class SegmentInfos implements Cloneable, Iterable<SegmentCommitInfo
if (pendingCommit) {
throw new IllegalStateException("prepareCommit was already called");
}
+ dir.syncMetaData();
write(dir);
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4a590072/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
index ad35f32..61bf1fc 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
@@ -885,14 +885,16 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
private static class FailOnlyInCommit extends MockDirectoryWrapper.Failure {
- boolean failOnCommit, failOnDeleteFile;
+ boolean failOnCommit, failOnDeleteFile, failOnSyncMetadata;
private final boolean dontFailDuringGlobalFieldMap;
+ private final boolean dontFailDuringSyncMetadata;
private static final String PREPARE_STAGE = "prepareCommit";
private static final String FINISH_STAGE = "finishCommit";
private final String stage;
- public FailOnlyInCommit(boolean dontFailDuringGlobalFieldMap, String stage) {
+ public FailOnlyInCommit(boolean dontFailDuringGlobalFieldMap, boolean dontFailDuringSyncMetadata, String stage) {
this.dontFailDuringGlobalFieldMap = dontFailDuringGlobalFieldMap;
+ this.dontFailDuringSyncMetadata = dontFailDuringSyncMetadata;
this.stage = stage;
}
@@ -901,9 +903,10 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
StackTraceElement[] trace = new Exception().getStackTrace();
boolean isCommit = false;
boolean isDelete = false;
+ boolean isSyncMetadata = false;
boolean isInGlobalFieldMap = false;
for (int i = 0; i < trace.length; i++) {
- if (isCommit && isDelete && isInGlobalFieldMap) {
+ if (isCommit && isDelete && isInGlobalFieldMap && isSyncMetadata) {
break;
}
if (SegmentInfos.class.getName().equals(trace[i].getClassName()) && stage.equals(trace[i].getMethodName())) {
@@ -915,14 +918,20 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
if (SegmentInfos.class.getName().equals(trace[i].getClassName()) && "writeGlobalFieldMap".equals(trace[i].getMethodName())) {
isInGlobalFieldMap = true;
}
-
+ if (MockDirectoryWrapper.class.getName().equals(trace[i].getClassName()) && "syncMetaData".equals(trace[i].getMethodName())) {
+ isSyncMetadata = true;
+ }
}
if (isInGlobalFieldMap && dontFailDuringGlobalFieldMap) {
isCommit = false;
}
+ if (isSyncMetadata && dontFailDuringSyncMetadata) {
+ isCommit = false;
+ }
if (isCommit) {
if (!isDelete) {
failOnCommit = true;
+ failOnSyncMetadata = isSyncMetadata;
throw new RuntimeException("now fail first");
} else {
failOnDeleteFile = true;
@@ -935,9 +944,10 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
public void testExceptionsDuringCommit() throws Throwable {
FailOnlyInCommit[] failures = new FailOnlyInCommit[] {
// LUCENE-1214
- new FailOnlyInCommit(false, FailOnlyInCommit.PREPARE_STAGE), // fail during global field map is written
- new FailOnlyInCommit(true, FailOnlyInCommit.PREPARE_STAGE), // fail after global field map is written
- new FailOnlyInCommit(false, FailOnlyInCommit.FINISH_STAGE) // fail while running finishCommit
+ new FailOnlyInCommit(false, true, FailOnlyInCommit.PREPARE_STAGE), // fail during global field map is written
+ new FailOnlyInCommit(true, false, FailOnlyInCommit.PREPARE_STAGE), // fail during sync metadata
+ new FailOnlyInCommit(true, true, FailOnlyInCommit.PREPARE_STAGE), // fail after global field map is written
+ new FailOnlyInCommit(false, true, FailOnlyInCommit.FINISH_STAGE) // fail while running finishCommit
};
for (FailOnlyInCommit failure : failures) {
@@ -952,8 +962,8 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
expectThrows(RuntimeException.class, () -> {
w.close();
});
-
- assertTrue("failOnCommit=" + failure.failOnCommit + " failOnDeleteFile=" + failure.failOnDeleteFile, failure.failOnCommit && failure.failOnDeleteFile);
+ assertTrue("failOnCommit=" + failure.failOnCommit + " failOnDeleteFile=" + failure.failOnDeleteFile
+ + " failOnSyncMetadata=" + failure.failOnSyncMetadata + "", failure.failOnCommit && (failure.failOnDeleteFile || failure.failOnSyncMetadata));
w.rollback();
String files[] = dir.listAll();
assertTrue(files.length == fileCount || (files.length == fileCount+1 && Arrays.asList(files).contains(IndexWriter.WRITE_LOCK_NAME)));
[2/2] lucene-solr:master: LUCENE-8048: Filesystems do not guarantee
order of directories updates
Posted by er...@apache.org.
LUCENE-8048: Filesystems do not guarantee order of directories updates
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/0688be6c
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/0688be6c
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/0688be6c
Branch: refs/heads/master
Commit: 0688be6c667760c1a636d5426ee4355d878a47a7
Parents: f78cacf 4a59007
Author: Erick Erickson <er...@apache.org>
Authored: Tue Dec 5 09:09:28 2017 -0800
Committer: Erick Erickson <er...@apache.org>
Committed: Tue Dec 5 09:09:28 2017 -0800
----------------------------------------------------------------------
lucene/CHANGES.txt | 3 +++
.../org/apache/lucene/index/SegmentInfos.java | 1 +
.../lucene/index/TestIndexWriterExceptions.java | 28 +++++++++++++-------
3 files changed, 23 insertions(+), 9 deletions(-)
----------------------------------------------------------------------