Handle closed readers in ShardCoreKeyMap
Fixes an issue caused by trying to add a LeafReader for a closed index to ShardCoreKeyMap. It add itself to the map half way before throwing AlreadyClosedException, leaking some references and causesing Elasticsearch to refuse to shut down cleanly when testing.
This commit is contained in:
parent
abc8c02bed
commit
3896457d84
|
@ -20,9 +20,11 @@
|
|||
package org.elasticsearch.common.lucene;
|
||||
|
||||
import org.apache.lucene.index.LeafReader;
|
||||
import org.apache.lucene.index.LeafReader.CoreClosedListener;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
import org.elasticsearch.index.shard.ShardUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
|
@ -72,7 +74,7 @@ public final class ShardCoreKeyMap {
|
|||
}
|
||||
final boolean added = objects.add(coreKey);
|
||||
assert added;
|
||||
reader.addCoreClosedListener(ownerCoreCacheKey -> {
|
||||
CoreClosedListener listener = ownerCoreCacheKey -> {
|
||||
assert coreKey == ownerCoreCacheKey;
|
||||
synchronized (ShardCoreKeyMap.this) {
|
||||
coreKeyToShard.remove(ownerCoreCacheKey);
|
||||
|
@ -83,7 +85,20 @@ public final class ShardCoreKeyMap {
|
|||
indexToCoreKey.remove(index);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
boolean addedListener = false;
|
||||
try {
|
||||
reader.addCoreClosedListener(listener);
|
||||
addedListener = true;
|
||||
} finally {
|
||||
if (false == addedListener) {
|
||||
try {
|
||||
listener.onClose(coreKey);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Blow up trying to recover from failure to add listener", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,8 +22,10 @@ package org.elasticsearch.common.lucene;
|
|||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.index.DirectoryReader;
|
||||
import org.apache.lucene.index.IndexReader;
|
||||
import org.apache.lucene.index.LeafReader;
|
||||
import org.apache.lucene.index.LeafReaderContext;
|
||||
import org.apache.lucene.index.RandomIndexWriter;
|
||||
import org.apache.lucene.store.AlreadyClosedException;
|
||||
import org.apache.lucene.store.Directory;
|
||||
import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
|
@ -55,6 +57,25 @@ public class ShardCoreKeyMapTests extends ESTestCase {
|
|||
}
|
||||
}
|
||||
|
||||
public void testAddingAClosedReader() throws Exception {
|
||||
LeafReader reader;
|
||||
try (Directory dir = newDirectory();
|
||||
RandomIndexWriter writer = new RandomIndexWriter(random(), dir)) {
|
||||
writer.addDocument(new Document());
|
||||
try (DirectoryReader dirReader = ElasticsearchDirectoryReader.wrap(writer.getReader(), new ShardId("index1", 1))) {
|
||||
reader = dirReader.leaves().get(0).reader();
|
||||
}
|
||||
}
|
||||
ShardCoreKeyMap map = new ShardCoreKeyMap();
|
||||
try {
|
||||
map.add(reader);
|
||||
fail("Expected AlreadyClosedException");
|
||||
} catch (AlreadyClosedException e) {
|
||||
// What we wanted
|
||||
}
|
||||
assertEquals(0, map.size());
|
||||
}
|
||||
|
||||
public void testBasics() throws IOException {
|
||||
Directory dir1 = newDirectory();
|
||||
RandomIndexWriter w1 = new RandomIndexWriter(random(), dir1);
|
||||
|
|
Loading…
Reference in New Issue