NIFI-362: Ensure that we synchronize on ScheduleState before modifying it

This commit is contained in:
Mark Payne 2015-02-22 10:59:14 -05:00
parent 4cc106a54d
commit f1e74cc041
1 changed files with 14 additions and 4 deletions

View File

@ -132,8 +132,13 @@ public class TimerDrivenSchedulingAgent implements SchedulingAgent {
final long yieldNanos = TimeUnit.MILLISECONDS.toNanos(yieldMillis);
final ScheduledFuture<?> newFuture = flowEngine.scheduleWithFixedDelay(this, yieldNanos,
connectable.getSchedulingPeriod(TimeUnit.NANOSECONDS), TimeUnit.NANOSECONDS);
scheduleState.replaceFuture(scheduledFuture, newFuture);
futureRef.set(newFuture);
synchronized (scheduleState) {
if ( scheduleState.isScheduled() ) {
scheduleState.replaceFuture(scheduledFuture, newFuture);
futureRef.set(newFuture);
}
}
}
} else if ( shouldYield ) {
// Component itself didn't yield but there was no work to do, so the framework will choose
@ -149,8 +154,13 @@ public class TimerDrivenSchedulingAgent implements SchedulingAgent {
if (scheduledFuture.cancel(false)) {
final ScheduledFuture<?> newFuture = flowEngine.scheduleWithFixedDelay(this, NO_WORK_YIELD_NANOS,
connectable.getSchedulingPeriod(TimeUnit.NANOSECONDS), TimeUnit.NANOSECONDS);
scheduleState.replaceFuture(scheduledFuture, newFuture);
futureRef.set(newFuture);
synchronized (scheduleState) {
if ( scheduleState.isScheduled() ) {
scheduleState.replaceFuture(scheduledFuture, newFuture);
futureRef.set(newFuture);
}
}
}
}
}