Catch AlreadClosedException in RobinSearcher#release()

When we relocate a shard we might still have pending SearchContext
instances hanging around that will be used in "in-flight" searches
on the already relocated shard. This is a valid operation but if
we have already closed the underlying directory which happens during
cleanup concurrently the close call on the IndexReader can trigger
an AlreadyClosedException when the NRT reader tries to cleanup files
via the IndexWriter.

Closes #4273
This commit is contained in:
Simon Willnauer 2013-11-27 15:55:25 +01:00
parent ba3269dedc
commit 71eb4532f8
3 changed files with 7 additions and 7 deletions

View File

@ -1499,6 +1499,11 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
return true;
} catch (IOException e) {
return false;
} catch (AlreadyClosedException e) {
/* this one can happen if we already closed the
* underlying store / directory and we call into the
* IndexWriter to free up pending files. */
return false;
}
}
}

View File

@ -433,11 +433,7 @@ public class SearchService extends AbstractLifecycleComponent<SearchService> {
} catch (Throwable e) {
context.indexShard().searchService().onFailedFetchPhase(context);
logger.trace("Fetch phase failed", e);
try {
freeContext(context); // we just try to make sure this is freed - rethrow orig exception.
} catch(Throwable t) {
logger.trace("Could not free context", t);
}
freeContext(context); // we just try to make sure this is freed - rethrow orig exception.
throw ExceptionsHelper.convertToRuntime(e);
} finally {
cleanContext(context);

View File

@ -57,8 +57,7 @@ public class SearchWhileRelocatingTests extends ElasticsearchIntegrationTest {
private void testSearchAndRelocateConcurrently(int numberOfReplicas) throws Exception {
final int numShards = between(10, 20);
client().admin().indices().prepareCreate("test")
.setSettings(settingsBuilder().put("index.number_of_shards", numShards).put("index.number_of_replicas", numberOfReplicas)
.put("index.store.type", "niofs"))
.setSettings(settingsBuilder().put("index.number_of_shards", numShards).put("index.number_of_replicas", numberOfReplicas))
.addMapping("type1", "loc", "type=geo_point", "test", "type=string").execute().actionGet();
ensureGreen();
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();