diff --git a/server/src/main/java/org/elasticsearch/action/get/TransportGetAction.java b/server/src/main/java/org/elasticsearch/action/get/TransportGetAction.java index 83189198cd4d4..96317069b40f1 100644 --- a/server/src/main/java/org/elasticsearch/action/get/TransportGetAction.java +++ b/server/src/main/java/org/elasticsearch/action/get/TransportGetAction.java @@ -11,6 +11,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.lucene.store.AlreadyClosedException; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.action.ActionListener; @@ -230,7 +231,10 @@ private void getFromTranslog( final var retryingListener = listener.delegateResponse((l, e) -> { final var cause = ExceptionsHelper.unwrapCause(e); logger.debug("get_from_translog failed", cause); - if (cause instanceof ShardNotFoundException || cause instanceof IndexNotFoundException) { + if (cause instanceof ShardNotFoundException + || cause instanceof IndexNotFoundException + || cause instanceof AlreadyClosedException) { + // TODO AlreadyClosedException the engine reset should be fixed by ES-10826 logger.debug("retrying get_from_translog"); observer.waitForNextChange(new ClusterStateObserver.Listener() { @Override @@ -245,7 +249,13 @@ public void onClusterServiceClose() { @Override public void onTimeout(TimeValue timeout) { - l.onFailure(new ElasticsearchException("Timed out retrying get_from_translog", cause)); + // TODO AlreadyClosedException the engine reset should be fixed by ES-10826 + if (cause instanceof AlreadyClosedException) { + // Do an additional retry just in case AlreadyClosedException didn't generate a cluster update + tryGetFromTranslog(request, indexShard, node, l); + } else { + l.onFailure(new ElasticsearchException("Timed out retrying get_from_translog", cause)); + } } }); } else { diff --git a/server/src/main/java/org/elasticsearch/action/get/TransportGetFromTranslogAction.java b/server/src/main/java/org/elasticsearch/action/get/TransportGetFromTranslogAction.java index 3cbd7497dcf39..6fc1ff5300101 100644 --- a/server/src/main/java/org/elasticsearch/action/get/TransportGetFromTranslogAction.java +++ b/server/src/main/java/org/elasticsearch/action/get/TransportGetFromTranslogAction.java @@ -81,7 +81,7 @@ protected void doExecute(Task task, Request request, ActionListener li if (engine == null) { throw new AlreadyClosedException("engine closed"); } - segmentGeneration = ((InternalEngine) engine).getLastUnsafeSegmentGenerationForGets(); + segmentGeneration = engine.getLastUnsafeSegmentGenerationForGets(); } return new Response(result, indexShard.getOperationPrimaryTerm(), segmentGeneration); }); diff --git a/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetAction.java b/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetAction.java index 25061a6f50828..3a66db14decdb 100644 --- a/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetAction.java +++ b/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetAction.java @@ -11,6 +11,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.lucene.store.AlreadyClosedException; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.action.ActionListener; @@ -211,7 +212,10 @@ private void shardMultiGetFromTranslog( final var retryingListener = listener.delegateResponse((l, e) -> { final var cause = ExceptionsHelper.unwrapCause(e); logger.debug("mget_from_translog[shard] failed", cause); - if (cause instanceof ShardNotFoundException || cause instanceof IndexNotFoundException) { + if (cause instanceof ShardNotFoundException + || cause instanceof IndexNotFoundException + || cause instanceof AlreadyClosedException) { + // TODO AlreadyClosedException the engine reset should be fixed by ES-10826 logger.debug("retrying mget_from_translog[shard]"); observer.waitForNextChange(new ClusterStateObserver.Listener() { @Override @@ -226,7 +230,13 @@ public void onClusterServiceClose() { @Override public void onTimeout(TimeValue timeout) { - l.onFailure(new ElasticsearchException("Timed out retrying mget_from_translog[shard]", cause)); + // TODO AlreadyClosedException the engine reset should be fixed by ES-10826 + if (cause instanceof AlreadyClosedException) { + // Do an additional retry just in case AlreadyClosedException didn't generate a cluster update + tryShardMultiGetFromTranslog(request, indexShard, node, l); + } else { + l.onFailure(new ElasticsearchException("Timed out retrying mget_from_translog[shard]", cause)); + } } }); } else { diff --git a/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetFomTranslogAction.java b/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetFomTranslogAction.java index e953ff527f637..ec0b5c6cf143f 100644 --- a/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetFomTranslogAction.java +++ b/server/src/main/java/org/elasticsearch/action/get/TransportShardMultiGetFomTranslogAction.java @@ -23,7 +23,6 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.engine.Engine; -import org.elasticsearch.index.engine.InternalEngine; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.indices.IndicesService; @@ -102,7 +101,7 @@ protected void doExecute(Task task, Request request, ActionListener li if (engine == null) { throw new AlreadyClosedException("engine closed"); } - segmentGeneration = ((InternalEngine) engine).getLastUnsafeSegmentGenerationForGets(); + segmentGeneration = engine.getLastUnsafeSegmentGenerationForGets(); } return new Response(multiGetShardResponse, indexShard.getOperationPrimaryTerm(), segmentGeneration); }); diff --git a/server/src/main/java/org/elasticsearch/index/engine/Engine.java b/server/src/main/java/org/elasticsearch/index/engine/Engine.java index 36fd18144ad6e..0589741a70281 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/Engine.java +++ b/server/src/main/java/org/elasticsearch/index/engine/Engine.java @@ -2346,4 +2346,8 @@ public record FlushResult(boolean flushPerformed, long generation) { public void prepareForEngineReset() throws IOException { throw new UnsupportedOperationException("does not support engine reset"); } + + public long getLastUnsafeSegmentGenerationForGets() { + throw new UnsupportedOperationException("Doesn't support getting the latest segment generation"); + } }