@SuppressWarnings("unchecked") <N> InternalTimerServiceImpl<K, N> registerOrGetTimerService(String name, TimerSerializer<K, N> timerSerializer) { InternalTimerServiceImpl<K, N> timerService = (InternalTimerServiceImpl<K, N>) timerServices.get(name); if (timerService == null) { timerService = new InternalTimerServiceImpl<>( localKeyGroupRange, keyContext, processingTimeService, createTimerPriorityQueue(PROCESSING_TIMER_PREFIX + name, timerSerializer), createTimerPriorityQueue(EVENT_TIMER_PREFIX + name, timerSerializer)); timerServices.put(name, timerService); } return timerService; }
@Test public void testCurrentEventTime() throws Exception { @SuppressWarnings("unchecked") Triggerable<Integer, String> mockTriggerable = mock(Triggerable.class); TestKeyContext keyContext = new TestKeyContext(); TestProcessingTimeService processingTimeService = new TestProcessingTimeService(); InternalTimerServiceImpl<Integer, String> timerService = createAndStartInternalTimerService(mockTriggerable, keyContext, processingTimeService, testKeyGroupRange, createQueueFactory()); timerService.advanceWatermark(17); assertEquals(17, timerService.currentWatermark()); timerService.advanceWatermark(42); assertEquals(42, timerService.currentWatermark()); }
@VisibleForTesting public int numEventTimeTimers() { int count = 0; for (InternalTimerServiceImpl<?, ?> timerService : timerServices.values()) { count += timerService.numEventTimeTimers(); } return count; } }
.readTimersSnapshot(new DataInputViewStreamWrapper(inputStream)); service.restoreTimersForKeyGroup(restoredTimersSnapshot, keyGroupIndex); service.startTimerService(IntSerializer.INSTANCE, StringSerializer.INSTANCE, triggerable); return service;
timerService.registerProcessingTimeTimer("ciao", 10); timerService.registerEventTimeTimer("hello", 10); timerService.registerEventTimeTimer("ciao", 10); timerService.registerProcessingTimeTimer("hello", 10); assertEquals(2, timerService.numProcessingTimeTimers()); assertEquals(1, timerService.numProcessingTimeTimers("hello")); assertEquals(1, timerService.numProcessingTimeTimers("ciao")); assertEquals(2, timerService.numEventTimeTimers()); assertEquals(1, timerService.numEventTimeTimers("hello")); assertEquals(1, timerService.numEventTimeTimers("ciao")); InternalTimersSnapshot<?, ?> timersSnapshot = timerService.snapshotTimersForKeyGroup(keyGroupIndex); timerService.advanceWatermark(10); verify(mockTriggerable2, times(1)).onEventTime(eq(new TimerHeapInternalTimer<>(10, key2, "ciao"))); assertEquals(0, timerService.numEventTimeTimers());
timerService.registerEventTimeTimer("ciao", 10); timerService.registerEventTimeTimer("hello", 10); timerService.registerEventTimeTimer("ciao", 10); timerService.registerEventTimeTimer("hello", 10); assertEquals(4, timerService.numEventTimeTimers()); assertEquals(2, timerService.numEventTimeTimers("hello")); assertEquals(2, timerService.numEventTimeTimers("ciao")); timerService.deleteEventTimeTimer("hello", 10); timerService.deleteEventTimeTimer("ciao", 10); assertEquals(2, timerService.numEventTimeTimers()); assertEquals(1, timerService.numEventTimeTimers("hello")); assertEquals(1, timerService.numEventTimeTimers("ciao")); timerService.advanceWatermark(10); verify(mockTriggerable, times(1)).onEventTime(eq(new TimerHeapInternalTimer<>(10, key2, "hello"))); assertEquals(0, timerService.numEventTimeTimers());
timerService.registerProcessingTimeTimer("ciao", 10); timerService.registerProcessingTimeTimer("hello", 10); timerService.registerProcessingTimeTimer("ciao", 10); timerService.registerProcessingTimeTimer("hello", 10); assertEquals(4, timerService.numProcessingTimeTimers()); assertEquals(2, timerService.numProcessingTimeTimers("hello")); assertEquals(2, timerService.numProcessingTimeTimers("ciao")); timerService.deleteProcessingTimeTimer("hello", 10); timerService.deleteProcessingTimeTimer("ciao", 10); assertEquals(2, timerService.numProcessingTimeTimers()); assertEquals(1, timerService.numProcessingTimeTimers("hello")); assertEquals(1, timerService.numProcessingTimeTimers("ciao")); verify(mockTriggerable, times(1)).onProcessingTime(eq(new TimerHeapInternalTimer<>(10, key2, "hello"))); assertEquals(0, timerService.numEventTimeTimers());
timerService.registerEventTimeTimer("ciao", 10); timerService.registerEventTimeTimer("hello", 10); timerService.registerEventTimeTimer("ciao", 10); timerService.registerEventTimeTimer("hello", 10); assertEquals(4, timerService.numEventTimeTimers()); assertEquals(2, timerService.numEventTimeTimers("hello")); assertEquals(2, timerService.numEventTimeTimers("ciao")); timerService.advanceWatermark(10); verify(mockTriggerable, times(1)).onEventTime(eq(new TimerHeapInternalTimer<>(10, key2, "hello"))); assertEquals(0, timerService.numEventTimeTimers());
priorityQueueSetFactory); timerService.startTimerService(IntSerializer.INSTANCE, StringSerializer.INSTANCE, mock(Triggerable.class)); timerService.registerEventTimeTimer(timer.getNamespace(), timer.getTimestamp()); timerService.registerProcessingTimeTimer(timer.getNamespace(), timer.getTimestamp()); timerService.getEventTimeTimersPerKeyGroup(); List<Set<TimerHeapInternalTimer<Integer, String>>> processingTimeTimers = timerService.getProcessingTimeTimersPerKeyGroup();
timerService.registerProcessingTimeTimer("ciao", 10); timerService.registerProcessingTimeTimer("hello", 10); timerService.registerProcessingTimeTimer("ciao", 10); timerService.registerProcessingTimeTimer("hello", 10); assertEquals(4, timerService.numProcessingTimeTimers()); assertEquals(2, timerService.numProcessingTimeTimers("hello")); assertEquals(2, timerService.numProcessingTimeTimers("ciao")); verify(mockTriggerable, times(1)).onProcessingTime(eq(new TimerHeapInternalTimer<>(10, key2, "hello"))); assertEquals(0, timerService.numProcessingTimeTimers());
@SuppressWarnings("unchecked") public <N> InternalTimerService<N> getInternalTimerService( String name, TimerSerializer<K, N> timerSerializer, Triggerable<K, N> triggerable) { InternalTimerServiceImpl<K, N> timerService = registerOrGetTimerService(name, timerSerializer); timerService.startTimerService( timerSerializer.getKeySerializer(), timerSerializer.getNamespaceSerializer(), triggerable); return timerService; }
@VisibleForTesting public int numProcessingTimeTimers() { int count = 0; for (InternalTimerServiceImpl<?, ?> timerService : timerServices.values()) { count += timerService.numProcessingTimeTimers(); } return count; }
public void advanceWatermark(Watermark watermark) throws Exception { for (InternalTimerServiceImpl<?, ?> service : timerServices.values()) { service.advanceWatermark(watermark.getTimestamp()); } }
@Override public void write(DataOutputView out) throws IOException { super.write(out); final Map<String, InternalTimerServiceImpl<K, ?>> registeredTimerServices = timerServicesManager.getRegisteredTimerServices(); out.writeInt(registeredTimerServices.size()); for (Map.Entry<String, InternalTimerServiceImpl<K, ?>> entry : registeredTimerServices.entrySet()) { String serviceName = entry.getKey(); InternalTimerServiceImpl<K, ?> timerService = entry.getValue(); out.writeUTF(serviceName); InternalTimersSnapshotReaderWriters .getWriterForVersion(VERSION, timerService.snapshotTimersForKeyGroup(keyGroupIdx)) .writeTimersSnapshot(out); } }
@Override protected void read(DataInputView in, boolean wasVersioned) throws IOException { int noOfTimerServices = in.readInt(); for (int i = 0; i < noOfTimerServices; i++) { String serviceName = in.readUTF(); int readerVersion = wasVersioned ? getReadVersion() : InternalTimersSnapshotReaderWriters.NO_VERSION; InternalTimersSnapshot<?, ?> restoredTimersSnapshot = InternalTimersSnapshotReaderWriters .getReaderForVersion(readerVersion, userCodeClassLoader) .readTimersSnapshot(in); InternalTimerServiceImpl<K, ?> timerService = registerOrGetTimerService( serviceName, restoredTimersSnapshot); timerService.restoreTimersForKeyGroup(restoredTimersSnapshot, keyGroupIdx); } }
@VisibleForTesting public int numEventTimeTimers(N namespace) { return countTimersInNamespaceInternal(namespace, eventTimeTimersQueue); }
@VisibleForTesting List<Set<TimerHeapInternalTimer<K, N>>> getEventTimeTimersPerKeyGroup() { return partitionElementsByKeyGroup(eventTimeTimersQueue); }
/** * Restore the timers (both processing and event time ones) for a given {@code keyGroupIdx}. * * @param restoredSnapshot the restored snapshot containing the key-group's timers, * and the serializers that were used to write them * @param keyGroupIdx the id of the key-group to be put in the snapshot. */ @SuppressWarnings("unchecked") public void restoreTimersForKeyGroup(InternalTimersSnapshot<?, ?> restoredSnapshot, int keyGroupIdx) { this.restoredTimersSnapshot = (InternalTimersSnapshot<K, N>) restoredSnapshot; if (areSnapshotSerializersIncompatible(restoredSnapshot)) { throw new IllegalArgumentException("Tried to restore timers " + "for the same service with different serializers."); } this.keyDeserializer = restoredTimersSnapshot.getKeySerializer(); this.namespaceDeserializer = restoredTimersSnapshot.getNamespaceSerializer(); checkArgument(localKeyGroupRange.contains(keyGroupIdx), "Key Group " + keyGroupIdx + " does not belong to the local range."); // restore the event time timers eventTimeTimersQueue.addAll(restoredTimersSnapshot.getEventTimeTimers()); // restore the processing time timers processingTimeTimersQueue.addAll(restoredTimersSnapshot.getProcessingTimeTimers()); }
timerService.registerProcessingTimeTimer("ciao", 10); timerService.registerEventTimeTimer("hello", 10); timerService.registerEventTimeTimer("ciao", 10); timerService.registerProcessingTimeTimer("hello", 10); assertEquals(2, timerService.numProcessingTimeTimers()); assertEquals(1, timerService.numProcessingTimeTimers("hello")); assertEquals(1, timerService.numProcessingTimeTimers("ciao")); assertEquals(2, timerService.numEventTimeTimers()); assertEquals(1, timerService.numEventTimeTimers("hello")); assertEquals(1, timerService.numEventTimeTimers("ciao")); for (Integer keyGroupIndex : testKeyGroupRange) { try (ByteArrayOutputStream outStream = new ByteArrayOutputStream()) { InternalTimersSnapshot<?, ?> timersSnapshot = timerService.snapshotTimersForKeyGroup(keyGroupIndex); timerService1.advanceWatermark(10); verify(mockTriggerable1, never()).onEventTime(eq(new TimerHeapInternalTimer<>(10, key2, "ciao"))); assertEquals(0, timerService1.numEventTimeTimers()); timerService2.advanceWatermark(10); verify(mockTriggerable2, times(1)).onEventTime(eq(new TimerHeapInternalTimer<>(10, key2, "ciao"))); assertEquals(0, timerService2.numEventTimeTimers());
keyContext.setCurrentKey(key); timerService.registerProcessingTimeTimer("ciao", 10); timerService.registerProcessingTimeTimer("ciao", 20); timerService.registerProcessingTimeTimer("ciao", 30); timerService.registerProcessingTimeTimer("hello", 10); timerService.registerProcessingTimeTimer("hello", 20); assertEquals(5, timerService.numProcessingTimeTimers()); assertEquals(2, timerService.numProcessingTimeTimers("hello")); assertEquals(3, timerService.numProcessingTimeTimers("ciao")); assertEquals(3, timerService.numProcessingTimeTimers()); assertEquals(1, timerService.numProcessingTimeTimers("hello")); assertEquals(2, timerService.numProcessingTimeTimers("ciao")); assertEquals(1, timerService.numProcessingTimeTimers()); assertEquals(0, timerService.numProcessingTimeTimers("hello")); assertEquals(1, timerService.numProcessingTimeTimers("ciao")); assertEquals(0, timerService.numProcessingTimeTimers()); timerService.registerProcessingTimeTimer("ciao", 40);