From 093bdd1a59bf4d98fda580701314068dbdc27226 Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Fri, 21 Feb 2025 11:48:21 +0100 Subject: [PATCH] Hold store reference in InternalEngine#performActionWithDirectoryReader(...) (#123010) This method gets called from `InternalEngine#resolveDocVersion(...)`, which gets during indexing (via `InternalEngine.index(...)`). When `InternalEngine.index(...)` gets invoked, the InternalEngine only ensures that it holds a ref to the engine via Engine#acquireEnsureOpenRef(), but this doesn't ensure whether it holds a reference to the store. Closes #122974 * Update docs/changelog/123010.yaml --- docs/changelog/123010.yaml | 6 ++++++ .../java/org/elasticsearch/index/engine/InternalEngine.java | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/123010.yaml diff --git a/docs/changelog/123010.yaml b/docs/changelog/123010.yaml new file mode 100644 index 0000000000000..3d95d775b8a54 --- /dev/null +++ b/docs/changelog/123010.yaml @@ -0,0 +1,6 @@ +pr: 123010 +summary: Hold store reference in `InternalEngine#performActionWithDirectoryReader(...)` +area: Engine +type: bug +issues: + - 122974 diff --git a/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java b/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java index a2cc10d417b72..a106893a32b04 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java +++ b/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java @@ -3452,7 +3452,9 @@ protected long getPreCommitSegmentGeneration() { T performActionWithDirectoryReader(SearcherScope scope, CheckedFunction action) throws EngineException { assert scope == SearcherScope.INTERNAL : "performActionWithDirectoryReader(...) isn't prepared for external usage"; - assert store.hasReferences(); + if (store.tryIncRef() == false) { + throw new AlreadyClosedException(shardId + " store is closed", failedEngine.get()); + } try { ReferenceManager referenceManager = getReferenceManager(scope); ElasticsearchDirectoryReader acquire = referenceManager.acquire(); @@ -3468,6 +3470,8 @@ T performActionWithDirectoryReader(SearcherScope scope, CheckedFunction