From 3119ca9c30290219e83c04095a2ccca0944d7bae Mon Sep 17 00:00:00 2001 From: Julien Nioche Date: Thu, 2 Apr 2026 18:28:12 +0100 Subject: [PATCH] Fix double-close race on static client in OpenSearch AbstractSpout The static client field is initialized under synchronized(AbstractSpout.class), but close() was unsynchronized, allowing multiple spout instances to close the same client concurrently. Additionally, client was never set to null after closing, so the null check provided no protection against double-close. Synchronize close() on AbstractSpout.class and set client to null after closing. Co-Authored-By: Claude Opus 4.6 --- .../opensearch/persistence/AbstractSpout.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/external/opensearch/src/main/java/org/apache/stormcrawler/opensearch/persistence/AbstractSpout.java b/external/opensearch/src/main/java/org/apache/stormcrawler/opensearch/persistence/AbstractSpout.java index 43b0e4289..21ba324fb 100644 --- a/external/opensearch/src/main/java/org/apache/stormcrawler/opensearch/persistence/AbstractSpout.java +++ b/external/opensearch/src/main/java/org/apache/stormcrawler/opensearch/persistence/AbstractSpout.java @@ -225,11 +225,14 @@ public void fail(Object msgId) { @Override public void close() { - if (client != null) { - try { - client.close(); - } catch (IOException e) { - LOG.error("Exception caught when closing client", e); + synchronized (AbstractSpout.class) { + if (client != null) { + try { + client.close(); + } catch (IOException e) { + LOG.error("Exception caught when closing client", e); + } + client = null; } } }