@@ -857,8 +857,8 @@ async def test_scheduler_stateful_generator_serializes() -> None:
857857
858858
859859@pytest .mark .asyncio (loop_scope = "session" )
860- async def test_scheduler_bounded_submission () -> None :
861- """Submitted task count respects max_submitted_tasks ."""
860+ async def test_scheduler_bounded_in_flight_tasks () -> None :
861+ """In-flight task count respects max_in_flight_tasks ."""
862862 provider = _mock_provider ()
863863
864864 # Use a pipeline with many cells and low submission limit
@@ -884,7 +884,7 @@ async def test_scheduler_bounded_submission() -> None:
884884 graph = graph ,
885885 tracker = tracker ,
886886 row_groups = row_groups ,
887- max_submitted_tasks = 2 ,
887+ max_in_flight_tasks = 2 ,
888888 )
889889 await scheduler .run ()
890890
@@ -1822,22 +1822,22 @@ async def test_scheduler_llm_bound_one_way_handoff() -> None:
18221822 row_groups = [(0 , 3 )]
18231823 tracker = CompletionTracker .with_graph (graph , row_groups )
18241824
1825- max_submitted = 2
1825+ max_in_flight = 2
18261826 max_llm_wait = 2
18271827 scheduler = AsyncTaskScheduler (
18281828 generators = generators ,
18291829 graph = graph ,
18301830 tracker = tracker ,
18311831 row_groups = row_groups ,
1832- max_submitted_tasks = max_submitted ,
1832+ max_in_flight_tasks = max_in_flight ,
18331833 max_model_task_admission = max_llm_wait ,
18341834 )
18351835 await scheduler .run ()
18361836
18371837 assert tracker .is_row_group_complete (0 , 3 , ["seed" , "llm_col" ])
18381838
18391839 snapshot = scheduler .task_admission_snapshot ()
1840- assert snapshot .resources_available ["submission" ] == max_submitted
1840+ assert snapshot .resources_available ["submission" ] == max_in_flight
18411841 assert snapshot .resources_available ["llm_wait" ] == max_llm_wait
18421842
18431843
@@ -1886,7 +1886,7 @@ async def test_scheduler_non_llm_holds_submission_slot() -> None:
18861886 graph = graph ,
18871887 tracker = tracker ,
18881888 row_groups = row_groups ,
1889- max_submitted_tasks = 2 ,
1889+ max_in_flight_tasks = 2 ,
18901890 max_model_task_admission = max_llm_wait ,
18911891 )
18921892 await scheduler .run ()
@@ -1899,7 +1899,7 @@ async def test_scheduler_non_llm_holds_submission_slot() -> None:
18991899
19001900@pytest .mark .asyncio (loop_scope = "session" )
19011901async def test_scheduler_deadlock_regression () -> None :
1902- """max_submitted_tasks =1, max_model_task_admission=1, two ready LLM tasks completes without deadlock."""
1902+ """max_in_flight_tasks =1, max_model_task_admission=1, two ready LLM tasks completes without deadlock."""
19031903 provider = _mock_provider ()
19041904 configs = [
19051905 SamplerColumnConfig (name = "seed" , sampler_type = SamplerType .CATEGORY , params = {"values" : ["A" ]}),
@@ -1923,7 +1923,7 @@ async def test_scheduler_deadlock_regression() -> None:
19231923 graph = graph ,
19241924 tracker = tracker ,
19251925 row_groups = row_groups ,
1926- max_submitted_tasks = 1 ,
1926+ max_in_flight_tasks = 1 ,
19271927 max_model_task_admission = 1 ,
19281928 )
19291929
@@ -2398,23 +2398,23 @@ async def test_scheduler_llm_bound_429_retried_in_salvage() -> None:
23982398 storage .move_partial_result_to_final_file_path .return_value = "/fake_final.parquet"
23992399 buffer_mgr = RowGroupBufferManager (storage )
24002400
2401- max_submitted = 4
2401+ max_in_flight = 4
24022402 max_llm_wait = 2
24032403 scheduler = AsyncTaskScheduler (
24042404 generators = generators ,
24052405 graph = graph ,
24062406 tracker = tracker ,
24072407 row_groups = row_groups ,
24082408 buffer_manager = buffer_mgr ,
2409- max_submitted_tasks = max_submitted ,
2409+ max_in_flight_tasks = max_in_flight ,
24102410 max_model_task_admission = max_llm_wait ,
24112411 )
24122412 await scheduler .run ()
24132413
24142414 assert tracker .is_row_group_complete (0 , num_records , ["seed" , "llm_col" ])
24152415
24162416 snapshot = scheduler .task_admission_snapshot ()
2417- assert snapshot .resources_available ["submission" ] == max_submitted
2417+ assert snapshot .resources_available ["submission" ] == max_in_flight
24182418 assert snapshot .resources_available ["llm_wait" ] == max_llm_wait
24192419
24202420
@@ -2460,15 +2460,15 @@ async def agenerate(self, data: dict) -> dict:
24602460 row_groups = [(0 , 2 )]
24612461 tracker = CompletionTracker .with_graph (graph , row_groups )
24622462
2463- max_submitted = 4
2463+ max_in_flight = 4
24642464 max_llm_wait = 2
24652465 sink = InMemoryAdmissionEventSink ()
24662466 scheduler = AsyncTaskScheduler (
24672467 generators = generators ,
24682468 graph = graph ,
24692469 tracker = tracker ,
24702470 row_groups = row_groups ,
2471- max_submitted_tasks = max_submitted ,
2471+ max_in_flight_tasks = max_in_flight ,
24722472 max_model_task_admission = max_llm_wait ,
24732473 scheduler_event_sink = sink ,
24742474 )
@@ -2481,7 +2481,7 @@ async def agenerate(self, data: dict) -> dict:
24812481 await run_task
24822482
24832483 snapshot = scheduler .task_admission_snapshot ()
2484- assert snapshot .resources_available ["submission" ] == max_submitted
2484+ assert snapshot .resources_available ["submission" ] == max_in_flight
24852485 assert snapshot .resources_available ["llm_wait" ] == max_llm_wait
24862486 assert "cancelled" in [event .event_kind for event in sink .scheduler_events ]
24872487 assert all (event .snapshot is not None for event in sink .scheduler_events )
@@ -2703,7 +2703,7 @@ async def test_scheduler_fair_admission_across_ready_columns() -> None:
27032703 graph = graph ,
27042704 tracker = tracker ,
27052705 row_groups = row_groups ,
2706- max_submitted_tasks = 4 ,
2706+ max_in_flight_tasks = 4 ,
27072707 trace = True ,
27082708 )
27092709
@@ -2777,7 +2777,7 @@ async def agenerate_from_scratch(self, num_records: int) -> lazy.pd.DataFrame:
27772777 graph = graph ,
27782778 tracker = tracker ,
27792779 row_groups = row_groups ,
2780- max_submitted_tasks = 8 ,
2780+ max_in_flight_tasks = 8 ,
27812781 max_concurrent_row_groups = 2 ,
27822782 trace = True ,
27832783 )
@@ -2825,7 +2825,7 @@ async def test_scheduler_fair_llm_group_cap_preserves_peer_admission() -> None:
28252825 graph = graph ,
28262826 tracker = tracker ,
28272827 row_groups = row_groups ,
2828- max_submitted_tasks = 4 ,
2828+ max_in_flight_tasks = 4 ,
28292829 max_model_task_admission = 4 ,
28302830 trace = True ,
28312831 )
@@ -2896,7 +2896,7 @@ async def test_scheduler_downstream_interleaves_with_upstream() -> None:
28962896 tracker = tracker ,
28972897 row_groups = row_groups ,
28982898 buffer_manager = buffer_manager ,
2899- max_submitted_tasks = 4 ,
2899+ max_in_flight_tasks = 4 ,
29002900 trace = True ,
29012901 )
29022902 await asyncio .wait_for (scheduler .run (), timeout = 10.0 )
@@ -2944,7 +2944,7 @@ async def test_scheduler_capacity_plan_observes_buffer_backpressure() -> None:
29442944 tracker = tracker ,
29452945 row_groups = row_groups ,
29462946 max_concurrent_row_groups = 2 ,
2947- max_submitted_tasks = 2 ,
2947+ max_in_flight_tasks = 2 ,
29482948 trace = True ,
29492949 num_records = 12 ,
29502950 buffer_size = 3 ,
@@ -3042,7 +3042,7 @@ async def test_scheduler_emits_job_health_and_row_group_telemetry() -> None:
30423042 tracker = tracker ,
30433043 row_groups = row_groups ,
30443044 max_concurrent_row_groups = 1 ,
3045- max_submitted_tasks = 2 ,
3045+ max_in_flight_tasks = 2 ,
30463046 max_model_task_admission = 1 ,
30473047 scheduler_event_sink = sink ,
30483048 num_records = 2 ,
@@ -3108,7 +3108,7 @@ async def test_scheduler_adaptive_row_group_admission_expands_target_for_horizon
31083108 tracker = tracker ,
31093109 row_groups = row_groups ,
31103110 max_concurrent_row_groups = 4 ,
3111- max_submitted_tasks = 4 ,
3111+ max_in_flight_tasks = 4 ,
31123112 max_model_task_admission = 4 ,
31133113 adaptive_row_group_admission = True ,
31143114 adaptive_row_group_initial_target = 1 ,
@@ -3208,6 +3208,17 @@ def test_scheduler_adaptive_row_group_block_reason_prefers_llm_saturation() -> N
32083208 assert scheduler ._adaptive_row_group_block_reason () == "llm_wait_saturated"
32093209
32103210
3211+ def test_scheduler_adaptive_row_group_queue_guard_uses_in_flight_task_cap () -> None :
3212+ scheduler , _tracker = _build_simple_pipeline (num_records = 2 , buffer_size = 1 )
3213+ scheduler ._max_in_flight_tasks = 2
3214+ scheduler ._max_model_task_admission = 100
3215+ scheduler ._fair_queue = SimpleNamespace (
3216+ view = lambda : SimpleNamespace (queued_total = 8 , queued_peer_demand_by_resource = {})
3217+ )
3218+
3219+ assert scheduler ._adaptive_row_group_block_reason () == "queued_task_guardrail"
3220+
3221+
32113222@pytest .mark .asyncio (loop_scope = "session" )
32123223async def test_scheduler_raises_when_ready_frontier_blocked_without_in_flight () -> None :
32133224 provider = _mock_provider ()
0 commit comments