Skip to content

Commit 4ccdcce

Browse files
[7.17] Handle failure in TransportUpdateAction#handleUpdateFailureWithRetry (#97290) (#97326)
* Handle failure in TransportUpdateAction#handleUpdateFailureWithRetry (#97290) Here executor(request.getShardId()) may throw, but we're already handling a failure so we cannot simply let this exception bubble up. This commit adjusts things to catch the exception, using it to fail the listener. Closes #97286 * Fix --------- Co-authored-by: Iraklis Psaroudakis <[email protected]>
1 parent 3bdd3fc commit 4ccdcce

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

docs/changelog/97290.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 97290
2+
summary: Handle failure in `TransportUpdateAction#handleUpdateFailureWithRetry`
3+
area: CRUD
4+
type: bug
5+
issues:
6+
- 97286

server/src/main/java/org/elasticsearch/action/update/TransportUpdateAction.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.io.IOException;
5555
import java.util.Collections;
5656
import java.util.Map;
57+
import java.util.concurrent.ExecutorService;
5758

5859
import static org.elasticsearch.ExceptionsHelper.unwrapCause;
5960
import static org.elasticsearch.action.bulk.TransportSingleItemBulkWriteAction.toSingleItemBulkRequest;
@@ -325,20 +326,28 @@ private void handleUpdateFailureWithRetry(
325326
int retryCount
326327
) {
327328
final Throwable cause = unwrapCause(failure);
328-
if (cause instanceof VersionConflictEngineException) {
329-
if (retryCount < request.retryOnConflict()) {
330-
logger.trace(
331-
"Retry attempt [{}] of [{}] on version conflict on [{}][{}][{}]",
332-
retryCount + 1,
333-
request.retryOnConflict(),
334-
request.index(),
335-
request.getShardId(),
336-
request.id()
337-
);
338-
threadPool.executor(executor(request.getShardId()))
339-
.execute(ActionRunnable.wrap(listener, l -> shardOperation(request, l, retryCount + 1)));
329+
if (cause instanceof VersionConflictEngineException && retryCount < request.retryOnConflict()) {
330+
VersionConflictEngineException versionConflictEngineException = (VersionConflictEngineException) cause;
331+
logger.trace(
332+
"Retry attempt [{}] of [{}] on version conflict on [{}][{}][{}]",
333+
retryCount + 1,
334+
request.retryOnConflict(),
335+
request.index(),
336+
request.getShardId(),
337+
request.id()
338+
);
339+
340+
final ExecutorService executor;
341+
try {
342+
executor = threadPool.executor(executor(request.getShardId()));
343+
} catch (Exception e) {
344+
// might fail if shard no longer exists locally, in which case we cannot retry
345+
e.addSuppressed(versionConflictEngineException);
346+
listener.onFailure(e);
340347
return;
341348
}
349+
executor.execute(ActionRunnable.wrap(listener, l -> shardOperation(request, l, retryCount + 1)));
350+
return;
342351
}
343352
listener.onFailure(cause instanceof Exception ? (Exception) cause : new NotSerializableExceptionWrapper(cause));
344353
}

0 commit comments

Comments
 (0)