Skip to content

Commit 4d515a7

Browse files
committed
fix(test): create ModelTests inside connection cleanup try
Move calling-thread create_test into the same try/finally that closes engine adapters so invalid tests still clean up connections. Add a NOTE about a possible future parallel create stage that must not overlap runs. Signed-off-by: devtechedge <devtechedge@users.noreply.github.com> Signed-off-by: Dev M <devtechedge@gmail.com>
1 parent 21a95a2 commit 4d515a7

1 file changed

Lines changed: 22 additions & 20 deletions

File tree

‎sqlmesh/core/test/runner.py‎

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -125,26 +125,6 @@ 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-
# 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():
133-
test = ModelTest.create_test(
134-
body=metadata.body,
135-
test_name=metadata.test_name,
136-
models=models,
137-
engine_adapter=engine_adapter,
138-
dialect=dialect,
139-
path=metadata.path,
140-
default_catalog=default_catalog,
141-
preserve_fixtures=preserve_fixtures,
142-
concurrency=num_workers > 1,
143-
verbosity=verbosity,
144-
)
145-
if test:
146-
tests.append(test)
147-
148128
def _run_single_test(test: ModelTest) -> ModelTextTestResult:
149129
result = t.cast(
150130
ModelTextTestResult,
@@ -160,6 +140,28 @@ def _run_single_test(test: ModelTest) -> ModelTextTestResult:
160140

161141
start_time = time.perf_counter()
162142
try:
143+
# Build ModelTest instances on the calling thread before workers start. create_test()
144+
# can call to_datetime() / ttl_cache (time.time()), which races with another worker's
145+
# time_machine freeze when execution_time is set under concurrent_tasks > 1.
146+
# NOTE: We can run create_tests in a separate parallel stage for a future optimization.
147+
# We just can't overlap runs/creations.
148+
tests: list[ModelTest] = []
149+
for metadata, engine_adapter in metadata_to_adapter.items():
150+
test = ModelTest.create_test(
151+
body=metadata.body,
152+
test_name=metadata.test_name,
153+
models=models,
154+
engine_adapter=engine_adapter,
155+
dialect=dialect,
156+
path=metadata.path,
157+
default_catalog=default_catalog,
158+
preserve_fixtures=preserve_fixtures,
159+
concurrency=num_workers > 1,
160+
verbosity=verbosity,
161+
)
162+
if test:
163+
tests.append(test)
164+
163165
with ThreadPoolExecutor(max_workers=num_workers) as pool:
164166
futures = [pool.submit(_run_single_test, test) for test in tests]
165167

0 commit comments

Comments
 (0)