mirror of https://github.com/apache/lucene.git
LUCENE-1201: add IndexReader.getIndexCommit to see which index commit a reader is reading
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@634251 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
69f35943bd
commit
c113c6419d
|
@ -110,6 +110,9 @@ New features
|
||||||
and isLocked methods (deprecating the ones in IndexReader). (Mike
|
and isLocked methods (deprecating the ones in IndexReader). (Mike
|
||||||
McCandless)
|
McCandless)
|
||||||
|
|
||||||
|
10. LUCENE-1201: Add IndexReader.getIndexCommit() method. (Tim Brennan
|
||||||
|
via Mike McCandless)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
|
|
||||||
1. LUCENE-705: When building a compound file, use
|
1. LUCENE-705: When building a compound file, use
|
||||||
|
|
|
@ -20,6 +20,8 @@ package org.apache.lucene.index;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
|
@ -96,7 +98,6 @@ abstract class DirectoryIndexReader extends IndexReader {
|
||||||
}.run();
|
}.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public final synchronized IndexReader reopen() throws CorruptIndexException, IOException {
|
public final synchronized IndexReader reopen() throws CorruptIndexException, IOException {
|
||||||
ensureOpen();
|
ensureOpen();
|
||||||
|
|
||||||
|
@ -337,4 +338,42 @@ abstract class DirectoryIndexReader extends IndexReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class ReaderCommit extends IndexCommit {
|
||||||
|
private String segmentsFileName;
|
||||||
|
Collection files;
|
||||||
|
Directory dir;
|
||||||
|
|
||||||
|
ReaderCommit(SegmentInfos infos, Directory dir) throws IOException {
|
||||||
|
segmentsFileName = infos.getCurrentSegmentFileName();
|
||||||
|
this.dir = dir;
|
||||||
|
final int size = infos.size();
|
||||||
|
files = new ArrayList(size);
|
||||||
|
files.add(segmentsFileName);
|
||||||
|
for(int i=0;i<size;i++) {
|
||||||
|
SegmentInfo info = infos.info(i);
|
||||||
|
if (info.dir == dir)
|
||||||
|
files.addAll(info.files());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public String getSegmentsFileName() {
|
||||||
|
return segmentsFileName;
|
||||||
|
}
|
||||||
|
public Collection getFileNames() {
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
public Directory getDirectory() {
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expert: return the IndexCommit that this reader has
|
||||||
|
* opened.
|
||||||
|
*
|
||||||
|
* <p><b>WARNING</b>: this API is new and experimental and
|
||||||
|
* may suddenly change.</p>
|
||||||
|
*/
|
||||||
|
public IndexCommit getIndexCommit() throws IOException {
|
||||||
|
return new ReaderCommit(segmentInfos, directory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
package org.apache.lucene.index;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.io.IOException;
|
||||||
|
import org.apache.lucene.store.Directory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Expert: represents a single commit into an index as seen by the
|
||||||
|
* {@link IndexDeletionPolicy} or {@link IndexReader}.</p>
|
||||||
|
*
|
||||||
|
* <p> Changes to the content of an index are made visible
|
||||||
|
* only after the writer who made that change commits by
|
||||||
|
* writing a new segments file
|
||||||
|
* (<code>segments_N</code>). This point in time, when the
|
||||||
|
* action of writing of a new segments file to the directory
|
||||||
|
* is completed, is an index commit.</p>
|
||||||
|
*
|
||||||
|
* <p>Each index commit point has a unique segments file
|
||||||
|
* associated with it. The segments file associated with a
|
||||||
|
* later index commit point would have a larger N.</p>
|
||||||
|
*
|
||||||
|
* <p><b>WARNING</b>: This API is a new and experimental and
|
||||||
|
* may suddenly change. </p>
|
||||||
|
*/
|
||||||
|
|
||||||
|
public abstract class IndexCommit implements IndexCommitPoint {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the segments file (<code>segments_N</code>) associated
|
||||||
|
* with this commit point.
|
||||||
|
*/
|
||||||
|
public abstract String getSegmentsFileName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all index files referenced by this commit point.
|
||||||
|
*/
|
||||||
|
public abstract Collection getFileNames() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link Directory} for the index.
|
||||||
|
*/
|
||||||
|
public abstract Directory getDirectory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete this commit point. This only applies when using
|
||||||
|
* the commit point in the context of IndexWriter's
|
||||||
|
* IndexDeletionPolicy.
|
||||||
|
* <p>
|
||||||
|
* Upon calling this, the writer is notified that this commit
|
||||||
|
* point should be deleted.
|
||||||
|
* <p>
|
||||||
|
* Decision that a commit-point should be deleted is taken by the {@link IndexDeletionPolicy} in effect
|
||||||
|
* and therefore this should only be called by its {@link IndexDeletionPolicy#onInit onInit()} or
|
||||||
|
* {@link IndexDeletionPolicy#onCommit onCommit()} methods.
|
||||||
|
*/
|
||||||
|
public void delete() {
|
||||||
|
throw new UnsupportedOperationException("This IndexCommit does not support this method.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Two IndexCommits are equal if both their Directory and
|
||||||
|
* segmentsFileName are equal.
|
||||||
|
*/
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (other instanceof IndexCommit) {
|
||||||
|
IndexCommit otherCommit = (IndexCommit) other;
|
||||||
|
return otherCommit.getDirectory().equals(getDirectory()) && otherCommit.getSegmentsFileName().equals(getSegmentsFileName());
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
return getDirectory().hashCode() + getSegmentsFileName().hashCode();
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,24 +17,13 @@ package org.apache.lucene.index;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>Expert: represents a single commit into an index as seen by the
|
|
||||||
* {@link IndexDeletionPolicy}.
|
|
||||||
* <p>
|
|
||||||
* Changes to the content of an index are made visible only
|
|
||||||
* after the writer who made that change had written to the
|
|
||||||
* directory a new segments file (<code>segments_N</code>). This point in
|
|
||||||
* time, when the action of writing of a new segments file to the
|
|
||||||
* directory is completed, is therefore an index commit point.
|
|
||||||
* <p>
|
|
||||||
* Each index commit point has a unique segments file associated
|
|
||||||
* with it. The segments file associated with a later
|
|
||||||
* index commit point would have a larger N.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Please subclass IndexCommit class instead
|
||||||
|
*/
|
||||||
|
|
||||||
public interface IndexCommitPoint {
|
public interface IndexCommitPoint {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -21,12 +21,12 @@ import java.util.List;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Expert: policy for deletion of stale {@link IndexCommitPoint index commits}.
|
* <p>Expert: policy for deletion of stale {@link IndexCommit index commits}.
|
||||||
*
|
*
|
||||||
* <p>Implement this interface, and pass it to one
|
* <p>Implement this interface, and pass it to one
|
||||||
* of the {@link IndexWriter} or {@link IndexReader}
|
* of the {@link IndexWriter} or {@link IndexReader}
|
||||||
* constructors, to customize when older
|
* constructors, to customize when older
|
||||||
* {@link IndexCommitPoint point-in-time commits}
|
* {@link IndexCommit point-in-time commits}
|
||||||
* are deleted from the index directory. The default deletion policy
|
* are deleted from the index directory. The default deletion policy
|
||||||
* is {@link KeepOnlyLastCommitDeletionPolicy}, which always
|
* is {@link KeepOnlyLastCommitDeletionPolicy}, which always
|
||||||
* removes old commits as soon as a new commit is done (this
|
* removes old commits as soon as a new commit is done (this
|
||||||
|
@ -58,8 +58,8 @@ public interface IndexDeletionPolicy {
|
||||||
* <p>The writer locates all index commits present in the
|
* <p>The writer locates all index commits present in the
|
||||||
* index directory and calls this method. The policy may
|
* index directory and calls this method. The policy may
|
||||||
* choose to delete some of the commit points, doing so by
|
* choose to delete some of the commit points, doing so by
|
||||||
* calling method {@link IndexCommitPoint#delete delete()}
|
* calling method {@link IndexCommit#delete delete()}
|
||||||
* of {@link IndexCommitPoint}.</p>
|
* of {@link IndexCommit}.</p>
|
||||||
*
|
*
|
||||||
* <p><u>Note:</u> the last CommitPoint is the most recent one,
|
* <p><u>Note:</u> the last CommitPoint is the most recent one,
|
||||||
* i.e. the "front index state". Be careful not to delete it,
|
* i.e. the "front index state". Be careful not to delete it,
|
||||||
|
@ -67,7 +67,7 @@ public interface IndexDeletionPolicy {
|
||||||
* you can afford to lose the index content while doing that.
|
* you can afford to lose the index content while doing that.
|
||||||
*
|
*
|
||||||
* @param commits List of current
|
* @param commits List of current
|
||||||
* {@link IndexCommitPoint point-in-time commits},
|
* {@link IndexCommit point-in-time commits},
|
||||||
* sorted by age (the 0th one is the oldest commit).
|
* sorted by age (the 0th one is the oldest commit).
|
||||||
*/
|
*/
|
||||||
public void onInit(List commits) throws IOException;
|
public void onInit(List commits) throws IOException;
|
||||||
|
@ -78,8 +78,8 @@ public interface IndexDeletionPolicy {
|
||||||
* with each commit.</p>
|
* with each commit.</p>
|
||||||
*
|
*
|
||||||
* <p>The policy may now choose to delete old commit points
|
* <p>The policy may now choose to delete old commit points
|
||||||
* by calling method {@link IndexCommitPoint#delete delete()}
|
* by calling method {@link IndexCommit#delete delete()}
|
||||||
* of {@link IndexCommitPoint}.</p>
|
* of {@link IndexCommit}.</p>
|
||||||
*
|
*
|
||||||
* <p>If writer has <code>autoCommit = true</code> then
|
* <p>If writer has <code>autoCommit = true</code> then
|
||||||
* this method will in general be called many times during
|
* this method will in general be called many times during
|
||||||
|
@ -94,7 +94,7 @@ public interface IndexDeletionPolicy {
|
||||||
* unless you know for sure what you are doing, and unless
|
* unless you know for sure what you are doing, and unless
|
||||||
* you can afford to lose the index content while doing that.
|
* you can afford to lose the index content while doing that.
|
||||||
*
|
*
|
||||||
* @param commits List of {@link IndexCommitPoint},
|
* @param commits List of {@link IndexCommit},
|
||||||
* sorted by age (the 0th one is the oldest commit).
|
* sorted by age (the 0th one is the oldest commit).
|
||||||
*/
|
*/
|
||||||
public void onCommit(List commits) throws IOException;
|
public void onCommit(List commits) throws IOException;
|
||||||
|
|
|
@ -48,7 +48,7 @@ import java.util.Collection;
|
||||||
* force a blocking commit.
|
* force a blocking commit.
|
||||||
*
|
*
|
||||||
* The same directory file may be referenced by more than
|
* The same directory file may be referenced by more than
|
||||||
* one IndexCommitPoints, i.e. more than one SegmentInfos.
|
* one IndexCommit, i.e. more than one SegmentInfos.
|
||||||
* Therefore we count how many commits reference each file.
|
* Therefore we count how many commits reference each file.
|
||||||
* When all the commits referencing a certain file have been
|
* When all the commits referencing a certain file have been
|
||||||
* deleted, the refcount for that file becomes zero, and the
|
* deleted, the refcount for that file becomes zero, and the
|
||||||
|
@ -569,7 +569,7 @@ final class IndexFileDeleter {
|
||||||
* equals.
|
* equals.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
final private static class CommitPoint implements Comparable, IndexCommitPoint {
|
final private static class CommitPoint extends IndexCommit implements Comparable {
|
||||||
|
|
||||||
long gen;
|
long gen;
|
||||||
List files;
|
List files;
|
||||||
|
@ -594,9 +594,6 @@ final class IndexFileDeleter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the segments_N file for this commit point.
|
|
||||||
*/
|
|
||||||
public String getSegmentsFileName() {
|
public String getSegmentsFileName() {
|
||||||
return segmentsFileName;
|
return segmentsFileName;
|
||||||
}
|
}
|
||||||
|
@ -605,6 +602,10 @@ final class IndexFileDeleter {
|
||||||
return Collections.unmodifiableCollection(files);
|
return Collections.unmodifiableCollection(files);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Directory getDirectory() {
|
||||||
|
return directory;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called only be the deletion policy, to remove this
|
* Called only be the deletion policy, to remove this
|
||||||
* commit point from the index.
|
* commit point from the index.
|
||||||
|
|
|
@ -885,6 +885,19 @@ public abstract class IndexReader {
|
||||||
directory.makeLock(IndexWriter.WRITE_LOCK_NAME).release();
|
directory.makeLock(IndexWriter.WRITE_LOCK_NAME).release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expert: return the IndexCommit that this reader has
|
||||||
|
* opened. This method is only implemented by those
|
||||||
|
* readers that correspond to a Directory with its own
|
||||||
|
* segments_N file.
|
||||||
|
*
|
||||||
|
* <p><b>WARNING</b>: this API is new and experimental and
|
||||||
|
* may suddenly change.</p>
|
||||||
|
*/
|
||||||
|
public IndexCommit getIndexCommit() throws IOException {
|
||||||
|
throw new UnsupportedOperationException("This reader does not support this method.");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prints the filename and size of each file within a given compound file.
|
* Prints the filename and size of each file within a given compound file.
|
||||||
* Add the -extract flag to extract files to the current working directory.
|
* Add the -extract flag to extract files to the current working directory.
|
||||||
|
|
|
@ -187,7 +187,7 @@ import java.util.Iterator;
|
||||||
* modified) directory files, we have a new "check point".
|
* modified) directory files, we have a new "check point".
|
||||||
* If the modified/new SegmentInfos is written to disk - as a new
|
* If the modified/new SegmentInfos is written to disk - as a new
|
||||||
* (generation of) segments_N file - this check point is also an
|
* (generation of) segments_N file - this check point is also an
|
||||||
* IndexCommitPoint.
|
* IndexCommit.
|
||||||
*
|
*
|
||||||
* With autoCommit=true, every checkPoint is also a CommitPoint.
|
* With autoCommit=true, every checkPoint is also a CommitPoint.
|
||||||
* With autoCommit=false, some checkPoints may not be commits.
|
* With autoCommit=false, some checkPoints may not be commits.
|
||||||
|
|
|
@ -44,7 +44,7 @@ public final class KeepOnlyLastCommitDeletionPolicy implements IndexDeletionPoli
|
||||||
// called by onInit above):
|
// called by onInit above):
|
||||||
int size = commits.size();
|
int size = commits.size();
|
||||||
for(int i=0;i<size-1;i++) {
|
for(int i=0;i<size-1;i++) {
|
||||||
((IndexCommitPoint) commits.get(i)).delete();
|
((IndexCommit) commits.get(i)).delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import org.apache.lucene.store.Directory;
|
||||||
|
|
||||||
/** A {@link IndexDeletionPolicy} that wraps around any other
|
/** A {@link IndexDeletionPolicy} that wraps around any other
|
||||||
* {@link IndexDeletionPolicy} and adds the ability to hold and
|
* {@link IndexDeletionPolicy} and adds the ability to hold and
|
||||||
|
@ -35,11 +36,14 @@ import java.io.IOException;
|
||||||
* SnapshotDeletionPolicy across multiple writers as long
|
* SnapshotDeletionPolicy across multiple writers as long
|
||||||
* as they are against the same index Directory. Any
|
* as they are against the same index Directory. Any
|
||||||
* snapshot held when a writer is closed will "survive"
|
* snapshot held when a writer is closed will "survive"
|
||||||
* when the next writer is opened. */
|
* when the next writer is opened.
|
||||||
|
*
|
||||||
|
* <p><b>WARNING</b>: This API is a new and experimental and
|
||||||
|
* may suddenly change.</p> */
|
||||||
|
|
||||||
public class SnapshotDeletionPolicy implements IndexDeletionPolicy {
|
public class SnapshotDeletionPolicy implements IndexDeletionPolicy {
|
||||||
|
|
||||||
private IndexCommitPoint lastCommit;
|
private IndexCommit lastCommit;
|
||||||
private IndexDeletionPolicy primary;
|
private IndexDeletionPolicy primary;
|
||||||
private String snapshot;
|
private String snapshot;
|
||||||
|
|
||||||
|
@ -49,12 +53,12 @@ public class SnapshotDeletionPolicy implements IndexDeletionPolicy {
|
||||||
|
|
||||||
public synchronized void onInit(List commits) throws IOException {
|
public synchronized void onInit(List commits) throws IOException {
|
||||||
primary.onInit(wrapCommits(commits));
|
primary.onInit(wrapCommits(commits));
|
||||||
lastCommit = (IndexCommitPoint) commits.get(commits.size()-1);
|
lastCommit = (IndexCommit) commits.get(commits.size()-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void onCommit(List commits) throws IOException {
|
public synchronized void onCommit(List commits) throws IOException {
|
||||||
primary.onCommit(wrapCommits(commits));
|
primary.onCommit(wrapCommits(commits));
|
||||||
lastCommit = (IndexCommitPoint) commits.get(commits.size()-1);
|
lastCommit = (IndexCommit) commits.get(commits.size()-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Take a snapshot of the most recent commit to the
|
/** Take a snapshot of the most recent commit to the
|
||||||
|
@ -66,6 +70,7 @@ public class SnapshotDeletionPolicy implements IndexDeletionPolicy {
|
||||||
* you call optimize()) then in the worst case this could
|
* you call optimize()) then in the worst case this could
|
||||||
* consume an extra 1X of your total index size, until
|
* consume an extra 1X of your total index size, until
|
||||||
* you release the snapshot. */
|
* you release the snapshot. */
|
||||||
|
// TODO 3.0: change this to return IndexCommit instead
|
||||||
public synchronized IndexCommitPoint snapshot() {
|
public synchronized IndexCommitPoint snapshot() {
|
||||||
if (snapshot == null)
|
if (snapshot == null)
|
||||||
snapshot = lastCommit.getSegmentsFileName();
|
snapshot = lastCommit.getSegmentsFileName();
|
||||||
|
@ -82,9 +87,9 @@ public class SnapshotDeletionPolicy implements IndexDeletionPolicy {
|
||||||
throw new IllegalStateException("snapshot was not set; please call snapshot() first");
|
throw new IllegalStateException("snapshot was not set; please call snapshot() first");
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MyCommitPoint implements IndexCommitPoint {
|
private class MyCommitPoint extends IndexCommit {
|
||||||
IndexCommitPoint cp;
|
IndexCommit cp;
|
||||||
MyCommitPoint(IndexCommitPoint cp) {
|
MyCommitPoint(IndexCommit cp) {
|
||||||
this.cp = cp;
|
this.cp = cp;
|
||||||
}
|
}
|
||||||
public String getSegmentsFileName() {
|
public String getSegmentsFileName() {
|
||||||
|
@ -93,6 +98,9 @@ public class SnapshotDeletionPolicy implements IndexDeletionPolicy {
|
||||||
public Collection getFileNames() throws IOException {
|
public Collection getFileNames() throws IOException {
|
||||||
return cp.getFileNames();
|
return cp.getFileNames();
|
||||||
}
|
}
|
||||||
|
public Directory getDirectory() {
|
||||||
|
return cp.getDirectory();
|
||||||
|
}
|
||||||
public void delete() {
|
public void delete() {
|
||||||
synchronized(SnapshotDeletionPolicy.this) {
|
synchronized(SnapshotDeletionPolicy.this) {
|
||||||
// Suppress the delete request if this commit point is
|
// Suppress the delete request if this commit point is
|
||||||
|
@ -107,7 +115,7 @@ public class SnapshotDeletionPolicy implements IndexDeletionPolicy {
|
||||||
final int count = commits.size();
|
final int count = commits.size();
|
||||||
List myCommits = new ArrayList(count);
|
List myCommits = new ArrayList(count);
|
||||||
for(int i=0;i<count;i++)
|
for(int i=0;i<count;i++)
|
||||||
myCommits.add(new MyCommitPoint((IndexCommitPoint) commits.get(i)));
|
myCommits.add(new MyCommitPoint((IndexCommit) commits.get(i)));
|
||||||
return myCommits;
|
return myCommits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ import org.apache.lucene.store.FSDirectory;
|
||||||
import org.apache.lucene.store.IndexInput;
|
import org.apache.lucene.store.IndexInput;
|
||||||
import org.apache.lucene.store.MockRAMDirectory;
|
import org.apache.lucene.store.MockRAMDirectory;
|
||||||
import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
||||||
import org.apache.lucene.index.IndexCommitPoint;
|
import org.apache.lucene.index.IndexCommit;
|
||||||
import org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy;
|
import org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy;
|
||||||
import org.apache.lucene.index.IndexWriter;
|
import org.apache.lucene.index.IndexWriter;
|
||||||
import org.apache.lucene.index.TestIndexWriter;
|
import org.apache.lucene.index.TestIndexWriter;
|
||||||
|
@ -75,25 +75,25 @@ public class TestSnapshotDeletionPolicy extends LuceneTestCase
|
||||||
doc.add(new Field("content", "aaa", Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
|
doc.add(new Field("content", "aaa", Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
|
||||||
for(int i=0;i<7;i++)
|
for(int i=0;i<7;i++)
|
||||||
writer.addDocument(doc);
|
writer.addDocument(doc);
|
||||||
IndexCommitPoint cp = dp.snapshot();
|
IndexCommit cp = (IndexCommit) dp.snapshot();
|
||||||
copyFiles(dir, dp, cp);
|
copyFiles(dir, cp);
|
||||||
writer.close();
|
writer.close();
|
||||||
copyFiles(dir, dp, cp);
|
copyFiles(dir, cp);
|
||||||
|
|
||||||
writer = new IndexWriter(dir, true, new StandardAnalyzer(), dp,
|
writer = new IndexWriter(dir, true, new StandardAnalyzer(), dp,
|
||||||
IndexWriter.MaxFieldLength.LIMITED);
|
IndexWriter.MaxFieldLength.LIMITED);
|
||||||
copyFiles(dir, dp, cp);
|
copyFiles(dir, cp);
|
||||||
for(int i=0;i<7;i++)
|
for(int i=0;i<7;i++)
|
||||||
writer.addDocument(doc);
|
writer.addDocument(doc);
|
||||||
copyFiles(dir, dp, cp);
|
copyFiles(dir, cp);
|
||||||
writer.close();
|
writer.close();
|
||||||
copyFiles(dir, dp, cp);
|
copyFiles(dir, cp);
|
||||||
dp.release();
|
dp.release();
|
||||||
writer = new IndexWriter(dir, true, new StandardAnalyzer(), dp,
|
writer = new IndexWriter(dir, true, new StandardAnalyzer(), dp,
|
||||||
IndexWriter.MaxFieldLength.LIMITED);
|
IndexWriter.MaxFieldLength.LIMITED);
|
||||||
writer.close();
|
writer.close();
|
||||||
try {
|
try {
|
||||||
copyFiles(dir, dp, cp);
|
copyFiles(dir, cp);
|
||||||
fail("did not hit expected IOException");
|
fail("did not hit expected IOException");
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
// expected
|
// expected
|
||||||
|
@ -177,7 +177,7 @@ public class TestSnapshotDeletionPolicy extends LuceneTestCase
|
||||||
public void backupIndex(Directory dir, SnapshotDeletionPolicy dp) throws IOException {
|
public void backupIndex(Directory dir, SnapshotDeletionPolicy dp) throws IOException {
|
||||||
// To backup an index we first take a snapshot:
|
// To backup an index we first take a snapshot:
|
||||||
try {
|
try {
|
||||||
copyFiles(dir, dp, dp.snapshot());
|
copyFiles(dir, (IndexCommit) dp.snapshot());
|
||||||
} finally {
|
} finally {
|
||||||
// Make sure to release the snapshot, otherwise these
|
// Make sure to release the snapshot, otherwise these
|
||||||
// files will never be deleted during this IndexWriter
|
// files will never be deleted during this IndexWriter
|
||||||
|
@ -186,7 +186,7 @@ public class TestSnapshotDeletionPolicy extends LuceneTestCase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyFiles(Directory dir, SnapshotDeletionPolicy dp, IndexCommitPoint cp) throws IOException {
|
private void copyFiles(Directory dir, IndexCommit cp) throws IOException {
|
||||||
|
|
||||||
// While we hold the snapshot, and nomatter how long
|
// While we hold the snapshot, and nomatter how long
|
||||||
// we take to do the backup, the IndexWriter will
|
// we take to do the backup, the IndexWriter will
|
||||||
|
|
|
@ -43,9 +43,9 @@ import java.util.HashSet;
|
||||||
public class TestDeletionPolicy extends LuceneTestCase
|
public class TestDeletionPolicy extends LuceneTestCase
|
||||||
{
|
{
|
||||||
private void verifyCommitOrder(List commits) {
|
private void verifyCommitOrder(List commits) {
|
||||||
long last = SegmentInfos.generationFromSegmentsFileName(((IndexCommitPoint) commits.get(0)).getSegmentsFileName());
|
long last = SegmentInfos.generationFromSegmentsFileName(((IndexCommit) commits.get(0)).getSegmentsFileName());
|
||||||
for(int i=1;i<commits.size();i++) {
|
for(int i=1;i<commits.size();i++) {
|
||||||
long now = SegmentInfos.generationFromSegmentsFileName(((IndexCommitPoint) commits.get(i)).getSegmentsFileName());
|
long now = SegmentInfos.generationFromSegmentsFileName(((IndexCommit) commits.get(i)).getSegmentsFileName());
|
||||||
assertTrue("SegmentInfos commits are out-of-order", now > last);
|
assertTrue("SegmentInfos commits are out-of-order", now > last);
|
||||||
last = now;
|
last = now;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ public class TestDeletionPolicy extends LuceneTestCase
|
||||||
// On init, delete all commit points:
|
// On init, delete all commit points:
|
||||||
Iterator it = commits.iterator();
|
Iterator it = commits.iterator();
|
||||||
while(it.hasNext()) {
|
while(it.hasNext()) {
|
||||||
((IndexCommitPoint) it.next()).delete();
|
((IndexCommit) it.next()).delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void onCommit(List commits) {
|
public void onCommit(List commits) {
|
||||||
|
@ -85,7 +85,7 @@ public class TestDeletionPolicy extends LuceneTestCase
|
||||||
int size = commits.size();
|
int size = commits.size();
|
||||||
// Delete all but last one:
|
// Delete all but last one:
|
||||||
for(int i=0;i<size-1;i++) {
|
for(int i=0;i<size-1;i++) {
|
||||||
((IndexCommitPoint) commits.get(i)).delete();
|
((IndexCommit) commits.get(i)).delete();
|
||||||
}
|
}
|
||||||
numOnCommit++;
|
numOnCommit++;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ public class TestDeletionPolicy extends LuceneTestCase
|
||||||
// Assert that we really are only called for each new
|
// Assert that we really are only called for each new
|
||||||
// commit:
|
// commit:
|
||||||
if (isCommit) {
|
if (isCommit) {
|
||||||
String fileName = ((IndexCommitPoint) commits.get(commits.size()-1)).getSegmentsFileName();
|
String fileName = ((IndexCommit) commits.get(commits.size()-1)).getSegmentsFileName();
|
||||||
if (seen.contains(fileName)) {
|
if (seen.contains(fileName)) {
|
||||||
throw new RuntimeException("onCommit was called twice on the same commit point: " + fileName);
|
throw new RuntimeException("onCommit was called twice on the same commit point: " + fileName);
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ public class TestDeletionPolicy extends LuceneTestCase
|
||||||
}
|
}
|
||||||
int size = commits.size();
|
int size = commits.size();
|
||||||
for(int i=0;i<size-numToKeep;i++) {
|
for(int i=0;i<size-numToKeep;i++) {
|
||||||
((IndexCommitPoint) commits.get(i)).delete();
|
((IndexCommit) commits.get(i)).delete();
|
||||||
numDelete++;
|
numDelete++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,7 +157,7 @@ public class TestDeletionPolicy extends LuceneTestCase
|
||||||
public void onCommit(List commits) throws IOException {
|
public void onCommit(List commits) throws IOException {
|
||||||
verifyCommitOrder(commits);
|
verifyCommitOrder(commits);
|
||||||
|
|
||||||
IndexCommitPoint lastCommit = (IndexCommitPoint) commits.get(commits.size()-1);
|
IndexCommit lastCommit = (IndexCommit) commits.get(commits.size()-1);
|
||||||
|
|
||||||
// Any commit older than expireTime should be deleted:
|
// Any commit older than expireTime should be deleted:
|
||||||
double expireTime = dir.fileModified(lastCommit.getSegmentsFileName())/1000.0 - expirationTimeSeconds;
|
double expireTime = dir.fileModified(lastCommit.getSegmentsFileName())/1000.0 - expirationTimeSeconds;
|
||||||
|
@ -165,7 +165,7 @@ public class TestDeletionPolicy extends LuceneTestCase
|
||||||
Iterator it = commits.iterator();
|
Iterator it = commits.iterator();
|
||||||
|
|
||||||
while(it.hasNext()) {
|
while(it.hasNext()) {
|
||||||
IndexCommitPoint commit = (IndexCommitPoint) it.next();
|
IndexCommit commit = (IndexCommit) it.next();
|
||||||
double modTime = dir.fileModified(commit.getSegmentsFileName())/1000.0;
|
double modTime = dir.fileModified(commit.getSegmentsFileName())/1000.0;
|
||||||
if (commit != lastCommit && modTime < expireTime) {
|
if (commit != lastCommit && modTime < expireTime) {
|
||||||
commit.delete();
|
commit.delete();
|
||||||
|
|
|
@ -1276,4 +1276,37 @@ public class TestIndexReader extends LuceneTestCase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testGetIndexCommit() throws IOException {
|
||||||
|
|
||||||
|
RAMDirectory d = new MockRAMDirectory();
|
||||||
|
|
||||||
|
// set up writer
|
||||||
|
IndexWriter writer = new IndexWriter(d, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
|
||||||
|
writer.setMaxBufferedDocs(2);
|
||||||
|
for(int i=0;i<27;i++)
|
||||||
|
addDocumentWithFields(writer);
|
||||||
|
writer.close();
|
||||||
|
|
||||||
|
SegmentInfos sis = new SegmentInfos();
|
||||||
|
sis.read(d);
|
||||||
|
IndexReader r = IndexReader.open(d);
|
||||||
|
IndexCommit c = r.getIndexCommit();
|
||||||
|
|
||||||
|
assertEquals(sis.getCurrentSegmentFileName(), c.getSegmentsFileName());
|
||||||
|
|
||||||
|
assertTrue(c.equals(r.getIndexCommit()));
|
||||||
|
|
||||||
|
// Change the index
|
||||||
|
writer = new IndexWriter(d, new StandardAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED);
|
||||||
|
writer.setMaxBufferedDocs(2);
|
||||||
|
for(int i=0;i<7;i++)
|
||||||
|
addDocumentWithFields(writer);
|
||||||
|
writer.close();
|
||||||
|
|
||||||
|
IndexReader r2 = r.reopen();
|
||||||
|
assertFalse(c.equals(r2.getIndexCommit()));
|
||||||
|
r.close();
|
||||||
|
r2.close();
|
||||||
|
d.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue