51
51
import java .util .concurrent .CancellationException ;
52
52
import java .util .concurrent .TimeUnit ;
53
53
import java .util .concurrent .atomic .AtomicReference ;
54
+ import java .util .concurrent .locks .Lock ;
55
+ import java .util .concurrent .locks .ReentrantLock ;
54
56
import java .util .function .BiFunction ;
55
57
import java .util .function .Consumer ;
56
58
import org .apache .thrift .TException ;
59
61
* Implements decider that relies on replay of a workflow code. An instance of this class is created
60
62
* per decision.
61
63
*/
62
- class ReplayDecider implements Decider , Consumer < HistoryEvent > {
64
+ class ReplayDecider implements Decider {
63
65
64
66
private static final int MAXIMUM_PAGE_SIZE = 10000 ;
65
67
@@ -75,6 +77,8 @@ class ReplayDecider implements Decider, Consumer<HistoryEvent> {
75
77
private final Scope metricsScope ;
76
78
private final long wfStartTimeNanos ;
77
79
private final WorkflowExecutionStartedEventAttributes startedEvent ;
80
+ private final Lock lock = new ReentrantLock ();
81
+ private final Consumer <HistoryEvent > localActivityCompletionSink ;
78
82
79
83
ReplayDecider (
80
84
IWorkflowService service ,
@@ -100,6 +104,19 @@ class ReplayDecider implements Decider, Consumer<HistoryEvent> {
100
104
context =
101
105
new DecisionContextImpl (
102
106
decisionsHelper , domain , decisionTask , startedEvent , options , laTaskPoller , this );
107
+ localActivityCompletionSink =
108
+ historyEvent -> {
109
+ lock .lock ();
110
+ try {
111
+ processEvent (historyEvent );
112
+ } finally {
113
+ lock .unlock ();
114
+ }
115
+ };
116
+ }
117
+
118
+ Lock getLock () {
119
+ return lock ;
103
120
}
104
121
105
122
private void handleWorkflowExecutionStarted (HistoryEvent event ) {
@@ -356,8 +373,13 @@ private void handleWorkflowExecutionSignaled(HistoryEvent event) {
356
373
357
374
@ Override
358
375
public DecisionResult decide (PollForDecisionTaskResponse decisionTask ) throws Throwable {
359
- boolean forceCreateNewDecisionTask = decideImpl (decisionTask , null );
360
- return new DecisionResult (decisionsHelper .getDecisions (), forceCreateNewDecisionTask );
376
+ lock .lock ();
377
+ try {
378
+ boolean forceCreateNewDecisionTask = decideImpl (decisionTask , null );
379
+ return new DecisionResult (decisionsHelper .getDecisions (), forceCreateNewDecisionTask );
380
+ } finally {
381
+ lock .unlock ();
382
+ }
361
383
}
362
384
363
385
// Returns boolean to indicate whether we need to force create new decision task for local
@@ -536,19 +558,28 @@ int getDecisionTimeoutSeconds() {
536
558
537
559
@ Override
538
560
public void close () {
539
- workflow .close ();
561
+ lock .lock ();
562
+ try {
563
+ workflow .close ();
564
+ } finally {
565
+ lock .unlock ();
566
+ }
540
567
}
541
568
542
569
@ Override
543
570
public byte [] query (PollForDecisionTaskResponse response , WorkflowQuery query ) throws Throwable {
544
- AtomicReference <byte []> result = new AtomicReference <>();
545
- decideImpl (response , () -> result .set (workflow .query (query )));
546
- return result .get ();
571
+ lock .lock ();
572
+ try {
573
+ AtomicReference <byte []> result = new AtomicReference <>();
574
+ decideImpl (response , () -> result .set (workflow .query (query )));
575
+ return result .get ();
576
+ } finally {
577
+ lock .unlock ();
578
+ }
547
579
}
548
580
549
- @ Override
550
- public void accept (HistoryEvent event ) {
551
- processEvent (event );
581
+ public Consumer <HistoryEvent > getLocalActivityCompletionSink () {
582
+ return localActivityCompletionSink ;
552
583
}
553
584
554
585
private class DecisionTaskWithHistoryIteratorImpl implements DecisionTaskWithHistoryIterator {
@@ -580,7 +611,12 @@ private final Duration retryServiceOperationExpirationInterval() {
580
611
581
612
@ Override
582
613
public PollForDecisionTaskResponse getDecisionTask () {
583
- return task ;
614
+ lock .lock ();
615
+ try {
616
+ return task ;
617
+ } finally {
618
+ lock .unlock ();
619
+ }
584
620
}
585
621
586
622
@ Override
0 commit comments