The GitHub Actions job "Required Checks" on texera.git/xinyuan-loop-feb has 
failed.
Run started by GitHub user aglinxinyuan (triggered by aglinxinyuan).

Head commit for run:
e61681d6952aac10b6aae2926e52d876db16e7d8 / Xinyuan Lin <[email protected]>
fix+test(loop): reset an inner Loop End's output once per outer iteration

A Loop End's materialized output should accumulate the results of all of
its own iterations; for a nested loop, the inner Loop End should accumulate
only within the current outer iteration and drop its rows when the outer
loop advances. That per-outer-iteration reset was never wired up:

- reset_output_storage() was called from process_input_state, which only
  runs on the matching consume (loop_counter == 0), not the outer
  pass-through (loop_counter > 0) where the "outer advanced" signal arrives.
- Worse, it sat under `if output_state is not None`, and a Loop End's
  generated process_state returns None (produce_state_on_finish is not
  overridden either), so output_state is always None for a Loop End -- the
  reset block was dead. The inner Loop End therefore accumulated across all
  outer iterations (9 rows in the 3x3 nested case instead of 3).

Move the reset to the inner pass-through branch in _process_state_frame
(loop_counter > 0). The input reader replays all states before any data
each region execution, so the result/state tables still hold the previous
outer iteration's rows when the outer boundary state passes through, and
clearing there makes each outer iteration accumulate from empty. It fires
exactly once per outer iteration because the inner LoopStart's output (and
thus this pass-through) is recreated on every inner back-edge -- each loop
operator is its own region, so the inner LoopStart's region does not carry
reusesOutputStorageOnReExecution and its output is recreated per inner
iteration. A single / outermost Loop End never sees loop_counter > 0, so it
never resets and keeps all of its iterations. The Scala controller side
(reusesOutputStorageOnReExecution) is unchanged; it provides the base
per-loop accumulation that this reset carves the nested exception out of.

Remove the dead consume-path reset call, and correct the reset_output_storage
docstring, the call-site comment, and the RegionExecutionCoordinator comment
to describe the actual (inner-Loop-End, per-outer-iteration) behavior.

Tests:
- Unit (test_main_loop): the inner pass-through (loop_counter > 0) triggers
  reset_output_storage once and does not invoke the operator; the consume
  path (loop_counter == 0, single loop) and a LoopStart pass-through never
  reset.
- Integration (LoopIntegrationSpec): assert the materialized result row
  counts -- single loop = 3 (accumulate); nested inner Loop End = 3, not 9
  (resets per outer iteration); nested outer Loop End = 9. The pre-existing
  cumulative output-tuple counts cannot distinguish accumulate from reset.

Report URL: https://github.com/apache/texera/actions/runs/27456439522

With regards,
GitHub Actions via GitBox

Reply via email to