diff --git a/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java b/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java index b5ade48b652..02b0f2f19cd 100644 --- a/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java +++ b/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java @@ -18,6 +18,7 @@ import javax.servlet.http.HttpServletRequest; import java.io.Closeable; +import java.io.IOException; import java.lang.invoke.MethodHandles; import java.security.Principal; import java.util.Date; @@ -25,6 +26,7 @@ import java.util.LinkedList; import java.util.List; import java.util.TimeZone; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import org.apache.solr.common.SolrException; @@ -106,9 +108,7 @@ public static void reset() { private static void closeHooks(SolrRequestInfo info) { if (info.closeHooks != null) { - final List oldHooks = info.closeHooks; - info.closeHooks = null; - for (Closeable hook : oldHooks) { + for (Closeable hook : info.closeHooks) { try { hook.close(); } catch (Exception e) { @@ -185,6 +185,11 @@ public void setResponseBuilder(ResponseBuilder rb) { this.rb = rb; } + /** + * adds the hook which will be invoked once or a few times per request completion + * @deprecated {@link #addCloseHookStrict(Closeable)} + * */ + @Deprecated public void addCloseHook(Closeable hook) { // is this better here, or on SolrQueryRequest? synchronized (this) { @@ -194,6 +199,20 @@ public void addCloseHook(Closeable hook) { closeHooks.add(hook); } } + /** + * adds the hook which will be invoked strictly once per request completion + * */ + public void addCloseHookStrict(Closeable hook) { + addCloseHook(new Closeable() { + AtomicBoolean closed = new AtomicBoolean(false); + @Override + public void close() throws IOException { + if (closed.compareAndSet(false, true)) { + hook.close(); + } + } + }); + } public SolrDispatchFilter.Action getAction() { return action; diff --git a/solr/core/src/java/org/apache/solr/search/JoinQuery.java b/solr/core/src/java/org/apache/solr/search/JoinQuery.java index 55b72cae52d..ab79ebeae04 100644 --- a/solr/core/src/java/org/apache/solr/search/JoinQuery.java +++ b/solr/core/src/java/org/apache/solr/search/JoinQuery.java @@ -139,9 +139,9 @@ public JoinQueryWeight(SolrIndexSearcher searcher, ScoreMode scoreMode, float bo if (fromRef != null) { final RefCounted ref = fromRef; - info.addCloseHook(ref::decref); + info.addCloseHookStrict(ref::decref); } - info.addCloseHook(fromCore); + info.addCloseHookStrict(fromCore); } this.toSearcher = searcher; }