Claim only what the cascade pool can run
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UytviPMJbXzD8P84nLvXcq
This commit is contained in:
@@ -333,3 +333,56 @@ def test_work_in_flight_is_touched_until_it_finishes(monkeypatch):
|
||||
finally:
|
||||
release.set()
|
||||
service.stop()
|
||||
|
||||
|
||||
def test_no_more_is_claimed_than_the_pool_can_run():
|
||||
"""A backlog belongs in the queue, not inside the process.
|
||||
|
||||
Claiming ahead of the pool used to leave every waiting item counted as a
|
||||
busy cascade and holding its journal entry open, so four cascade threads
|
||||
reported hundreds in flight on an engine that was merely behind.
|
||||
"""
|
||||
release = threading.Event()
|
||||
|
||||
def slow(reading, params):
|
||||
release.wait(5)
|
||||
return {"doubled": reading * 2}
|
||||
|
||||
source = Node(
|
||||
f=lambda params: None,
|
||||
provides=[MessageSpec(name="reading", dtype=DType.FLOAT)],
|
||||
name="source",
|
||||
)
|
||||
consumer = Node(
|
||||
f=slow,
|
||||
requires=[MessageSpec(name="reading", dtype=DType.FLOAT)],
|
||||
provides=[MessageSpec(name="doubled", dtype=DType.FLOAT)],
|
||||
name="consumer",
|
||||
)
|
||||
source.assign_flow("f", "source")
|
||||
consumer.assign_flow("f", "consumer")
|
||||
|
||||
queue = MemoryWorkQueue()
|
||||
pipeline = Pipeline(nodes=[source, consumer], state=MemoryState(), work_queue=queue)
|
||||
service = ExecutionService(queue)
|
||||
service.bind(pipeline)
|
||||
service.start()
|
||||
try:
|
||||
for i in range(40):
|
||||
queue.add(
|
||||
WorkItem(
|
||||
kind="cascade",
|
||||
node="f.source",
|
||||
flow="f",
|
||||
outputs={"f.reading": float(i)},
|
||||
)
|
||||
)
|
||||
time.sleep(0.5)
|
||||
|
||||
stats = service.stats()
|
||||
assert stats["cascades_busy"] <= executor.MAX_CASCADES
|
||||
# And the journal entries of what is only waiting are still free.
|
||||
assert stats["pending"] <= executor.MAX_CASCADES
|
||||
finally:
|
||||
release.set()
|
||||
service.stop()
|
||||
|
||||
Reference in New Issue
Block a user