Skip to content

Commit 21a95a2

Browse files
committed
fix(test): create ModelTests before concurrent pool workers
ModelTest.create_test() can call to_datetime()/ttl_cache (time.time()) while another worker freezes time via time_machine for execution_time. Building tests on the main thread removes that race. Fixes #6039 Signed-off-by: devtechedge <devtechedge@users.noreply.github.com>
1 parent c0ae2db commit 21a95a2

1 file changed

Lines changed: 9 additions & 10 deletions

File tree

‎sqlmesh/core/test/runner.py‎

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,11 @@ def run_tests(
125125
# Ensure workers are not greater than the number of tests
126126
num_workers = min(len(model_test_metadata) or 1, default_test_connection.concurrent_tasks)
127127

128-
def _run_single_test(
129-
metadata: ModelTestMetadata, engine_adapter: EngineAdapter
130-
) -> t.Optional[ModelTextTestResult]:
128+
# Build ModelTest instances on the calling thread before workers start. create_test()
129+
# can call to_datetime() / ttl_cache (time.time()), which races with another worker's
130+
# time_machine freeze when execution_time is set under concurrent_tasks > 1.
131+
tests: list[ModelTest] = []
132+
for metadata, engine_adapter in metadata_to_adapter.items():
131133
test = ModelTest.create_test(
132134
body=metadata.body,
133135
test_name=metadata.test_name,
@@ -140,10 +142,10 @@ def _run_single_test(
140142
concurrency=num_workers > 1,
141143
verbosity=verbosity,
142144
)
145+
if test:
146+
tests.append(test)
143147

144-
if not test:
145-
return None
146-
148+
def _run_single_test(test: ModelTest) -> ModelTextTestResult:
147149
result = t.cast(
148150
ModelTextTestResult,
149151
ModelTextTestRunner().run(t.cast(unittest.TestCase, test)),
@@ -159,10 +161,7 @@ def _run_single_test(
159161
start_time = time.perf_counter()
160162
try:
161163
with ThreadPoolExecutor(max_workers=num_workers) as pool:
162-
futures = [
163-
pool.submit(_run_single_test, metadata=metadata, engine_adapter=engine_adapter)
164-
for metadata, engine_adapter in metadata_to_adapter.items()
165-
]
164+
futures = [pool.submit(_run_single_test, test) for test in tests]
166165

167166
for future in concurrent.futures.as_completed(futures):
168167
test_results.append(future.result())

0 commit comments

Comments
 (0)