mirror of https://github.com/apache/lucene.git
LUCENE-2402: Add an explicit method to invoke IndexDeletionPolicy
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@936605 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4fdba4441f
commit
bd8aebac1c
|
@ -219,6 +219,12 @@ API Changes
|
||||||
expressions).
|
expressions).
|
||||||
(Uwe Schindler, Robert Muir)
|
(Uwe Schindler, Robert Muir)
|
||||||
|
|
||||||
|
* LUCENE-2402: IndexWriter.deleteUnusedFiles now deletes unreferenced commit
|
||||||
|
points too. If you use an IndexDeletionPolicy which holds onto index commits
|
||||||
|
(such as SnapshotDeletionPolicy), you can call this method to remove those
|
||||||
|
commit points when they are not needed anymore (instead of waiting for the
|
||||||
|
next commit). (Shai Erera)
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
|
|
||||||
* LUCENE-2119: Don't throw NegativeArraySizeException if you pass
|
* LUCENE-2119: Don't throw NegativeArraySizeException if you pass
|
||||||
|
|
|
@ -353,6 +353,26 @@ final class IndexFileDeleter {
|
||||||
deletePendingFiles();
|
deletePendingFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revisits the {@link IndexDeletionPolicy} by calling its
|
||||||
|
* {@link IndexDeletionPolicy#onCommit(List)} again with the known commits.
|
||||||
|
* This is useful in cases where a deletion policy which holds onto index
|
||||||
|
* commits is used. The application may know that some commits are not held by
|
||||||
|
* the deletion policy anymore and call
|
||||||
|
* {@link IndexWriter#deleteUnusedFiles()}, which will attempt to delete the
|
||||||
|
* unused commits again.
|
||||||
|
*/
|
||||||
|
void revisitPolicy() throws IOException {
|
||||||
|
if (infoStream != null) {
|
||||||
|
message("now revisitPolicy");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (commits.size() > 0) {
|
||||||
|
policy.onCommit(commits);
|
||||||
|
deleteCommits();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void deletePendingFiles() throws IOException {
|
public void deletePendingFiles() throws IOException {
|
||||||
if (deletable != null) {
|
if (deletable != null) {
|
||||||
List<String> oldDeletable = deletable;
|
List<String> oldDeletable = deletable;
|
||||||
|
|
|
@ -4961,8 +4961,18 @@ public class IndexWriter implements Closeable {
|
||||||
* IndexWriter, you'll see the unused files linger. If
|
* IndexWriter, you'll see the unused files linger. If
|
||||||
* that's a problem, call this method to delete them
|
* that's a problem, call this method to delete them
|
||||||
* (once you've closed the open readers that were
|
* (once you've closed the open readers that were
|
||||||
* preventing their deletion). */
|
* preventing their deletion).
|
||||||
|
*
|
||||||
|
* <p> In addition, you can call this method to delete
|
||||||
|
* unreferenced index commits. This might be useful if you
|
||||||
|
* are using an {@link IndexDeletionPolicy} which holds
|
||||||
|
* onto index commits until some criteria are met, but those
|
||||||
|
* commits are no longer needed. Otherwise, those commits will
|
||||||
|
* be deleted the next time commit() is called.
|
||||||
|
*/
|
||||||
public synchronized void deleteUnusedFiles() throws IOException {
|
public synchronized void deleteUnusedFiles() throws IOException {
|
||||||
deleter.deletePendingFiles();
|
deleter.deletePendingFiles();
|
||||||
|
deleter.revisitPolicy();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4915,6 +4915,40 @@ public class TestIndexWriter extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testDeleteUnsedFiles2() throws Exception {
|
||||||
|
// Validates that iw.deleteUnusedFiles() also deletes unused index commits
|
||||||
|
// in case a deletion policy which holds onto commits is used.
|
||||||
|
Directory dir = new MockRAMDirectory();
|
||||||
|
SnapshotDeletionPolicy sdp = new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy());
|
||||||
|
IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(
|
||||||
|
TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT))
|
||||||
|
.setIndexDeletionPolicy(sdp));
|
||||||
|
|
||||||
|
// First commit
|
||||||
|
Document doc = new Document();
|
||||||
|
doc.add(new Field("c", "val", Store.YES, Index.ANALYZED, TermVector.WITH_POSITIONS_OFFSETS));
|
||||||
|
writer.addDocument(doc);
|
||||||
|
writer.commit();
|
||||||
|
assertEquals(1, IndexReader.listCommits(dir).size());
|
||||||
|
|
||||||
|
// Keep that commit
|
||||||
|
sdp.snapshot();
|
||||||
|
|
||||||
|
// Second commit - now KeepOnlyLastCommit cannot delete the prev commit.
|
||||||
|
doc = new Document();
|
||||||
|
doc.add(new Field("c", "val", Store.YES, Index.ANALYZED, TermVector.WITH_POSITIONS_OFFSETS));
|
||||||
|
writer.addDocument(doc);
|
||||||
|
writer.commit();
|
||||||
|
assertEquals(2, IndexReader.listCommits(dir).size());
|
||||||
|
|
||||||
|
// Should delete the unreferenced commit
|
||||||
|
sdp.release();
|
||||||
|
writer.deleteUnusedFiles();
|
||||||
|
assertEquals(1, IndexReader.listCommits(dir).size());
|
||||||
|
|
||||||
|
writer.close();
|
||||||
|
}
|
||||||
|
|
||||||
private static class FlushCountingIndexWriter extends IndexWriter {
|
private static class FlushCountingIndexWriter extends IndexWriter {
|
||||||
int flushCount;
|
int flushCount;
|
||||||
public FlushCountingIndexWriter(Directory dir, IndexWriterConfig iwc) throws IOException {
|
public FlushCountingIndexWriter(Directory dir, IndexWriterConfig iwc) throws IOException {
|
||||||
|
|
Loading…
Reference in New Issue