Search in sources :

Example 1 with Timing

use of org.apache.beam.sdk.transforms.windowing.PaneInfo.Timing in project beam by apache.

the class PaneInfoTest method testEncodingRoundTrip.

@Test
public void testEncodingRoundTrip() throws Exception {
    Coder<PaneInfo> coder = PaneInfo.PaneInfoCoder.INSTANCE;
    for (Timing timing : Timing.values()) {
        long onTimeIndex = timing == Timing.EARLY ? -1 : 37;
        CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(false, false, timing, 389, onTimeIndex));
        CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(false, true, timing, 5077, onTimeIndex));
        CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(true, false, timing, 0, 0));
        CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(true, true, timing, 0, 0));
    }
}
Also used : Timing(org.apache.beam.sdk.transforms.windowing.PaneInfo.Timing) Test(org.junit.Test)

Example 2 with Timing

use of org.apache.beam.sdk.transforms.windowing.PaneInfo.Timing in project beam by apache.

the class PaneInfoTracker method describePane.

private <W> PaneInfo describePane(Object key, Instant windowMaxTimestamp, PaneInfo previousPane, boolean isFinal) {
    boolean isFirst = previousPane == null;
    Timing previousTiming = isFirst ? null : previousPane.getTiming();
    long index = isFirst ? 0 : previousPane.getIndex() + 1;
    long nonSpeculativeIndex = isFirst ? 0 : previousPane.getNonSpeculativeIndex() + 1;
    Instant outputWM = timerInternals.currentOutputWatermarkTime();
    Instant inputWM = timerInternals.currentInputWatermarkTime();
    // True if it is not possible to assign the element representing this pane a timestamp
    // which will make an ON_TIME pane for any following computation.
    // Ie true if the element's latest possible timestamp is before the current output watermark.
    boolean isLateForOutput = outputWM != null && windowMaxTimestamp.isBefore(outputWM);
    // True if all emitted panes (if any) were EARLY panes.
    // Once the ON_TIME pane has fired, all following panes must be considered LATE even
    // if the output watermark is behind the end of the window.
    boolean onlyEarlyPanesSoFar = previousTiming == null || previousTiming == Timing.EARLY;
    // True is the input watermark hasn't passed the window's max timestamp.
    boolean isEarlyForInput = !inputWM.isAfter(windowMaxTimestamp);
    Timing timing;
    if (isLateForOutput || !onlyEarlyPanesSoFar) {
        // The output watermark has already passed the end of this window, or we have already
        // emitted a non-EARLY pane. Irrespective of how this pane was triggered we must
        // consider this pane LATE.
        timing = Timing.LATE;
    } else if (isEarlyForInput) {
        // This is an EARLY firing.
        timing = Timing.EARLY;
        nonSpeculativeIndex = -1;
    } else {
        // This is the unique ON_TIME firing for the window.
        timing = Timing.ON_TIME;
    }
    WindowTracing.debug("describePane: {} pane (prev was {}) for key:{}; windowMaxTimestamp:{}; " + "inputWatermark:{}; outputWatermark:{}; isLateForOutput:{}", timing, previousTiming, key, windowMaxTimestamp, inputWM, outputWM, isLateForOutput);
    if (previousPane != null) {
        // Timing transitions should follow EARLY* ON_TIME? LATE*
        switch(previousTiming) {
            case EARLY:
                checkState(timing == Timing.EARLY || timing == Timing.ON_TIME || timing == Timing.LATE, "EARLY cannot transition to %s", timing);
                break;
            case ON_TIME:
                checkState(timing == Timing.LATE, "ON_TIME cannot transition to %s", timing);
                break;
            case LATE:
                checkState(timing == Timing.LATE, "LATE cannot transtion to %s", timing);
                break;
            case UNKNOWN:
                break;
        }
        checkState(!previousPane.isLast(), "Last pane was not last after all.");
    }
    return PaneInfo.createPane(isFirst, isFinal, timing, index, nonSpeculativeIndex);
}
Also used : Instant(org.joda.time.Instant) Timing(org.apache.beam.sdk.transforms.windowing.PaneInfo.Timing)

Aggregations

Timing (org.apache.beam.sdk.transforms.windowing.PaneInfo.Timing)2 Instant (org.joda.time.Instant)1 Test (org.junit.Test)1