fix(worker): re-exec after install_runtime so imports match the runtime (SIENTIAPDE-2214)

The worker imports sklearn (metrics, evidently) before
PluginStore.install_runtime replaces it on disk with the runtime's pinned
version, the same order that breaks every sklearn prediction in laborious.
After installing the runtime, the worker now replaces its process once
(SIENTIA_RUNTIME_READY=1 skips the second install), so every module is
loaded from the runtime's packages.
This commit is contained in:
PedroHMCosme
2026-10-20 15:40:38 -03:00
parent 49c8942a87
commit 0c9c5f300b
2 changed files with 134 additions and 4 deletions

View File

@@ -84,9 +84,11 @@ async def main():
1. Sets up logging and metadata
2. Starts Prometheus metrics server
3. Initializes notification handler
4. Creates and configures activities
5. Starts Temporal client and workers
6. Manages worker lifecycle and graceful shutdown
4. Installs the PluginStore runtime and re-executes itself once (`SIENTIA_RUNTIME_READY=1`)
so every import loads the runtime's package versions
5. Creates and configures activities
6. Starts Temporal client and workers
7. Manages worker lifecycle and graceful shutdown
The function runs indefinitely until interrupted or an error occurs.
On error, it performs cleanup and exits with a non-zero status code.
@@ -144,7 +146,12 @@ async def main():
metrics_controller=metrics_controller,
)
await plugin_store.install_runtime(runtime_name=runtime)
if os.environ.get('SIENTIA_RUNTIME_READY') != '1':
await plugin_store.install_runtime(runtime_name=runtime)
os.environ['SIENTIA_RUNTIME_READY'] = '1'
logger.custom_info(f'Runtime {runtime} installed, re-executing worker', metadata)
# ponytail: fresh interpreter so loaded modules match the runtime on disk (SIENTIAPDE-2214)
os.execv(sys.executable, [sys.executable, *sys.orig_argv[1:]]) # noqa: S606
activities = Activities(
postgres_config=build_postgres_config(),