mirror of https://github.com/apache/lucene.git
LUCENE-8212: Make sure terms hash is always closed
if stored fields writer barfs we still need to close terms hash to close pending files. This is crucial for some tests like TestIndexWriterOnVMError that randomly failed due to this.
This commit is contained in:
parent
a832411844
commit
65559cb94d
|
@ -17,6 +17,7 @@
|
||||||
package org.apache.lucene.index;
|
package org.apache.lucene.index;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -322,11 +323,11 @@ final class DefaultIndexingChain extends DocConsumer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void abort() {
|
@SuppressWarnings("try")
|
||||||
|
public void abort() throws IOException{
|
||||||
|
// finalizer will e.g. close any open files in the term vectors writer:
|
||||||
|
try (Closeable finalizer = termsHash::abort){
|
||||||
storedFieldsConsumer.abort();
|
storedFieldsConsumer.abort();
|
||||||
try {
|
|
||||||
// E.g. close any open files in the term vectors writer:
|
|
||||||
termsHash.abort();
|
|
||||||
} finally {
|
} finally {
|
||||||
Arrays.fill(fieldHash, null);
|
Arrays.fill(fieldHash, null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,5 +22,5 @@ import java.io.IOException;
|
||||||
abstract class DocConsumer {
|
abstract class DocConsumer {
|
||||||
abstract void processDocument() throws IOException;
|
abstract void processDocument() throws IOException;
|
||||||
abstract Sorter.DocMap flush(final SegmentWriteState state) throws IOException;
|
abstract Sorter.DocMap flush(final SegmentWriteState state) throws IOException;
|
||||||
abstract void abort();
|
abstract void abort() throws IOException;
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,7 +221,7 @@ final class DocumentsWriter implements Closeable, Accountable {
|
||||||
* updating the index files) and must discard all
|
* updating the index files) and must discard all
|
||||||
* currently buffered docs. This resets our state,
|
* currently buffered docs. This resets our state,
|
||||||
* discarding any docs added since last flush. */
|
* discarding any docs added since last flush. */
|
||||||
synchronized void abort(IndexWriter writer) {
|
synchronized void abort(IndexWriter writer) throws IOException {
|
||||||
assert !Thread.holdsLock(writer) : "IndexWriter lock should never be hold when aborting";
|
assert !Thread.holdsLock(writer) : "IndexWriter lock should never be hold when aborting";
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
try {
|
try {
|
||||||
|
@ -324,7 +324,7 @@ final class DocumentsWriter implements Closeable, Accountable {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns how many documents were aborted. */
|
/** Returns how many documents were aborted. */
|
||||||
private int abortThreadState(final ThreadState perThread) {
|
private int abortThreadState(final ThreadState perThread) throws IOException {
|
||||||
assert perThread.isHeldByCurrentThread();
|
assert perThread.isHeldByCurrentThread();
|
||||||
if (perThread.isInitialized()) {
|
if (perThread.isInitialized()) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -126,8 +126,7 @@ class DocumentsWriterPerThread {
|
||||||
* updating the index files) and must discard all
|
* updating the index files) and must discard all
|
||||||
* currently buffered docs. This resets our state,
|
* currently buffered docs. This resets our state,
|
||||||
* discarding any docs added since last flush. */
|
* discarding any docs added since last flush. */
|
||||||
void abort() {
|
void abort() throws IOException{
|
||||||
//System.out.println(Thread.currentThread().getName() + ": now abort seg=" + segmentInfo.name);
|
|
||||||
aborted = true;
|
aborted = true;
|
||||||
pendingNumDocs.addAndGet(-numDocsInRAM);
|
pendingNumDocs.addAndGet(-numDocsInRAM);
|
||||||
try {
|
try {
|
||||||
|
@ -513,7 +512,7 @@ class DocumentsWriterPerThread {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void maybeAbort(String location) {
|
private void maybeAbort(String location) throws IOException {
|
||||||
if (hasHitAbortingException() && aborted == false) {
|
if (hasHitAbortingException() && aborted == false) {
|
||||||
// if we are already aborted don't do anything here
|
// if we are already aborted don't do anything here
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in New Issue