diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2020-10-07 16:58:24 +0200 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2020-10-07 16:58:24 +0200 |
commit | 322f2c1d29e55aa798037193a4f13a48a137484f (patch) | |
tree | 2f51686481fd1d2852b1cbe5175573c701203751 /vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java | |
parent | d8365f1cde0c00a5a671f87c0baad461beff28c2 (diff) |
Destroy visitor session in other thread to avoid deadlock, and 1000 queue size
Diffstat (limited to 'vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java')
-rw-r--r-- | vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java index 7074d363316..79c63522686 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java @@ -40,6 +40,7 @@ import java.util.StringJoiner; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -85,6 +86,7 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor private final DelayQueue throttled; private final DelayQueue timeouts; private final Map<VisitorControlHandler, VisitorSession> visits = new ConcurrentHashMap<>(); + private final Executor visitSessionShutdownExecutor = Executors.newSingleThreadExecutor(); public DocumentOperationExecutorImpl(ClusterListConfig clustersConfig, AllClustersBucketSpacesConfig bucketsConfig, DocumentOperationExecutorConfig executorConfig, DocumentAccess access, Clock clock) { @@ -212,12 +214,18 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor context.error(ERROR, message != null ? message : "Visiting failed"); } done.set(true); // This may be reached before dispatching thread is done putting us in the map. - visits.computeIfPresent(this, (__, session) -> { session.destroy(); return null; }); + visits.computeIfPresent(this, (__, session) -> { + visitSessionShutdownExecutor.execute(() -> session.destroy()); + return null; + }); } }); visits.put(parameters.getControlHandler(), access.createVisitorSession(parameters)); if (done.get()) - visits.computeIfPresent(parameters.getControlHandler(), (__, session) -> { session.destroy(); return null; }); + visits.computeIfPresent(parameters.getControlHandler(), (__, session) -> { + visitSessionShutdownExecutor.execute(() -> session.destroy()); + return null; + }); } catch (IllegalArgumentException | ParseException e) { context.error(BAD_REQUEST, Exceptions.toMessageString(e)); |