SAMZA-2463: Duplicate firings of processing timers (#1282)
Remove the keys from the local book keeping map directly instead of using the keySet and removeAll
diff --git a/samza-core/src/main/java/org/apache/samza/scheduler/EpochTimeScheduler.java b/samza-core/src/main/java/org/apache/samza/scheduler/EpochTimeScheduler.java
index ddc5b29..cbebbde 100644
--- a/samza-core/src/main/java/org/apache/samza/scheduler/EpochTimeScheduler.java
+++ b/samza-core/src/main/java/org/apache/samza/scheduler/EpochTimeScheduler.java
@@ -90,7 +90,11 @@
public Map<TimerKey<?>, ScheduledCallback> removeReadyTimers() {
final Map<TimerKey<?>, ScheduledCallback> timers = new TreeMap<>(readyTimers);
- readyTimers.keySet().removeAll(timers.keySet());
+ // Remove keys on the map directly instead of using key set iterator and remove all
+ // on the key set as it results in duplicate firings due to weakly consistent SetView
+ for (TimerKey<?> key : timers.keySet()) {
+ readyTimers.remove(key);
+ }
return timers;
}