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 2015/09/09 22:21:05 UTC
svn commit: r1702102 - in /lucene/dev/branches/branch_5x: ./ lucene/
lucene/core/
lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
Author: mikemccand
Date: Wed Sep 9 20:21:04 2015
New Revision: 1702102
URL: http://svn.apache.org/r1702102
Log:
LUCENE-6786: remove IndexFileDeleter.refresh(String), using only the global refresh() to delete newly created (unreferenced) files on rollback
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/lucene/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java?rev=1702102&r1=1702101&r2=1702102&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java Wed Sep 9 20:21:04 2015
@@ -419,36 +419,27 @@ final class IndexFileDeleter implements
* is non-null, we will only delete files corresponding to
* that segment.
*/
- void refresh(String segmentName) throws IOException {
+ void refresh() throws IOException {
assert locked();
+ deletable.clear();
String[] files = directory.listAll();
- String segmentPrefix1;
- String segmentPrefix2;
- if (segmentName != null) {
- segmentPrefix1 = segmentName + ".";
- segmentPrefix2 = segmentName + "_";
- } else {
- segmentPrefix1 = null;
- segmentPrefix2 = null;
- }
Matcher m = IndexFileNames.CODEC_FILE_PATTERN.matcher("");
for(int i=0;i<files.length;i++) {
String fileName = files[i];
m.reset(fileName);
- if ((segmentName == null || fileName.startsWith(segmentPrefix1) || fileName.startsWith(segmentPrefix2)) &&
- !fileName.endsWith("write.lock") &&
+ if (!fileName.endsWith("write.lock") &&
!refCounts.containsKey(fileName) &&
(m.matches() || fileName.startsWith(IndexFileNames.SEGMENTS)
// we only try to clear out pending_segments_N during rollback(), because we don't ref-count it
// TODO: this is sneaky, should we do this, or change TestIWExceptions? rollback closes anyway, and
// any leftover file will be deleted/retried on next IW bootup anyway...
- || (segmentName == null && fileName.startsWith(IndexFileNames.PENDING_SEGMENTS)))) {
+ || fileName.startsWith(IndexFileNames.PENDING_SEGMENTS))) {
// Unreferenced file, so remove it
if (infoStream.isEnabled("IFD")) {
- infoStream.message("IFD", "refresh [prefix=" + segmentName + "]: removing newly created unreferenced file \"" + fileName + "\"");
+ infoStream.message("IFD", "refresh: removing newly created unreferenced file \"" + fileName + "\"");
}
deletable.add(fileName);
}
@@ -457,12 +448,6 @@ final class IndexFileDeleter implements
deletePendingFiles();
}
- void refresh() throws IOException {
- assert locked();
- deletable.clear();
- refresh(null);
- }
-
@Override
public void close() {
// DecRef old files from the last checkpoint, if any:
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1702102&r1=1702101&r2=1702102&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java Wed Sep 9 20:21:04 2015
@@ -2620,17 +2620,7 @@ public class IndexWriter implements Clos
return;
}
- boolean success = false;
- try {
- merger.merge(); // merge 'em
- success = true;
- } finally {
- if (!success) {
- synchronized(this) {
- deleter.refresh(info.name);
- }
- }
- }
+ merger.merge(); // merge 'em
SegmentCommitInfo infoPerCommit = new SegmentCommitInfo(info, 0, -1L, -1L, -1L);
@@ -2671,17 +2661,7 @@ public class IndexWriter implements Clos
// creating CFS so that 1) .si isn't slurped into CFS,
// and 2) .si reflects useCompoundFile=true change
// above:
- success = false;
- try {
- codec.segmentInfoFormat().write(trackingDir, info, context);
- success = true;
- } finally {
- if (!success) {
- synchronized(this) {
- deleter.refresh(info.name);
- }
- }
- }
+ codec.segmentInfoFormat().write(trackingDir, info, context);
info.addFiles(trackingDir.getCreatedFiles());
@@ -3676,9 +3656,6 @@ public class IndexWriter implements Clos
if (infoStream.isEnabled("IW")) {
infoStream.message("IW", "hit exception during merge");
}
- if (merge.info != null && !segmentInfos.contains(merge.info)) {
- deleter.refresh(merge.info.info.name);
- }
} else if (merge.rateLimiter.getAbort() == false && (merge.maxNumSegments != -1 || (!closed && !closing))) {
// This merge (and, generally, any change to the
// segments) may now enable new merges, so we call
@@ -4083,19 +4060,10 @@ public class IndexWriter implements Clos
merge.mergeStartNS = System.nanoTime();
// This is where all the work happens:
- boolean success3 = false;
- try {
- if (merger.shouldMerge()) {
- merger.merge();
- }
- success3 = true;
- } finally {
- if (!success3) {
- synchronized(this) {
- deleter.refresh(merge.info.info.name);
- }
- }
+ if (merger.shouldMerge()) {
+ merger.merge();
}
+
MergeState mergeState = merger.mergeState;
assert mergeState.segmentInfo == merge.info.info;
merge.info.info.setFiles(new HashSet<>(dirWrapper.getCreatedFiles()));
@@ -4702,10 +4670,19 @@ public class IndexWriter implements Clos
/**
* Cleans up residuals from a segment that could not be entirely flushed due to an error
- * @see IndexFileDeleter#refresh(String)
*/
synchronized final void flushFailed(SegmentInfo info) throws IOException {
- deleter.refresh(info.name);
+ // TODO: this really should be a tragic
+ Collection<String> files;
+ try {
+ files = info.files();
+ } catch (IllegalStateException ise) {
+ // OK
+ files = null;
+ }
+ if (files != null) {
+ deleter.deleteNewFiles(files);
+ }
}
final int purge(boolean forced) throws IOException {