Fix for trace_child_tasks exception handling

I had Claude Fable 5 review our use of contextvar and
it spotted this place where exceptions were not
correctly handled.
This commit is contained in:
Simon Willison 2026-06-12 13:21:58 -07:00
commit d4cb8b464b
2 changed files with 17 additions and 2 deletions

View file

@ -27,8 +27,10 @@ def get_task_id():
@contextmanager
def trace_child_tasks():
token = trace_task_id.set(get_task_id())
yield
trace_task_id.reset(token)
try:
yield
finally:
trace_task_id.reset(token)
@contextmanager

View file

@ -70,6 +70,19 @@ def test_trace_query_errors():
assert trace_info["traces"][-1]["error"] == "no such table: non_existent_table"
@pytest.mark.asyncio
async def test_trace_child_tasks_resets_contextvar_on_exception():
from datasette import tracer
before = tracer.trace_task_id.get()
with pytest.raises(ValueError):
with tracer.trace_child_tasks():
assert tracer.trace_task_id.get() is not None
raise ValueError("simulated error")
# The contextvar must be reset even though the block raised
assert tracer.trace_task_id.get() == before
def test_trace_parallel_queries():
with make_app_client(settings={"trace_debug": True}) as client:
response = client.get("/parallel-queries?_trace=1")