Commit 953054fadc8d25ddfddb500a355eaf3e70afa648
Committed by
GitHub
1 parent
6789cff8
eval is not thread safe. Added lock to avoid 'No such function invokeInternalXXX' exception (#4211)
* eval is not thread safe. Added lock to avoid 'No such function invokeInternalXXX' exception * License fix
Showing
1 changed file
with
12 additions
and
4 deletions
@@ -40,6 +40,7 @@ import java.util.concurrent.ExecutorService; | @@ -40,6 +40,7 @@ import java.util.concurrent.ExecutorService; | ||
40 | import java.util.concurrent.Executors; | 40 | import java.util.concurrent.Executors; |
41 | import java.util.concurrent.TimeUnit; | 41 | import java.util.concurrent.TimeUnit; |
42 | import java.util.concurrent.atomic.AtomicInteger; | 42 | import java.util.concurrent.atomic.AtomicInteger; |
43 | +import java.util.concurrent.locks.ReentrantLock; | ||
43 | 44 | ||
44 | @Slf4j | 45 | @Slf4j |
45 | public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeService { | 46 | public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeService { |
@@ -56,6 +57,8 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer | @@ -56,6 +57,8 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer | ||
56 | private final FutureCallback<UUID> evalCallback = new JsStatCallback<>(jsEvalMsgs, jsTimeoutMsgs, jsFailedMsgs); | 57 | private final FutureCallback<UUID> evalCallback = new JsStatCallback<>(jsEvalMsgs, jsTimeoutMsgs, jsFailedMsgs); |
57 | private final FutureCallback<Object> invokeCallback = new JsStatCallback<>(jsInvokeMsgs, jsTimeoutMsgs, jsFailedMsgs); | 58 | private final FutureCallback<Object> invokeCallback = new JsStatCallback<>(jsInvokeMsgs, jsTimeoutMsgs, jsFailedMsgs); |
58 | 59 | ||
60 | + private final ReentrantLock evalLock = new ReentrantLock(); | ||
61 | + | ||
59 | @Getter | 62 | @Getter |
60 | private final JsExecutorService jsExecutor; | 63 | private final JsExecutorService jsExecutor; |
61 | 64 | ||
@@ -121,10 +124,15 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer | @@ -121,10 +124,15 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer | ||
121 | jsPushedMsgs.incrementAndGet(); | 124 | jsPushedMsgs.incrementAndGet(); |
122 | ListenableFuture<UUID> result = jsExecutor.executeAsync(() -> { | 125 | ListenableFuture<UUID> result = jsExecutor.executeAsync(() -> { |
123 | try { | 126 | try { |
124 | - if (useJsSandbox()) { | ||
125 | - sandbox.eval(jsScript); | ||
126 | - } else { | ||
127 | - engine.eval(jsScript); | 127 | + evalLock.lock(); |
128 | + try { | ||
129 | + if (useJsSandbox()) { | ||
130 | + sandbox.eval(jsScript); | ||
131 | + } else { | ||
132 | + engine.eval(jsScript); | ||
133 | + } | ||
134 | + } finally { | ||
135 | + evalLock.unlock(); | ||
128 | } | 136 | } |
129 | scriptIdToNameMap.put(scriptId, functionName); | 137 | scriptIdToNameMap.put(scriptId, functionName); |
130 | return scriptId; | 138 | return scriptId; |