Fix deadlock when restarting scripts (#49410)
parent
7ed8f00075
commit
a5a62154d4
|
@ -1203,12 +1203,9 @@ class Script:
|
|||
self._changed()
|
||||
raise
|
||||
|
||||
async def _async_stop(self, update_state, spare=None):
|
||||
aws = [
|
||||
asyncio.create_task(run.async_stop()) for run in self._runs if run != spare
|
||||
]
|
||||
if not aws:
|
||||
return
|
||||
async def _async_stop(
|
||||
self, aws: list[asyncio.Task], update_state: bool, spare: _ScriptRun | None
|
||||
) -> None:
|
||||
await asyncio.wait(aws)
|
||||
if update_state:
|
||||
self._changed()
|
||||
|
@ -1217,7 +1214,15 @@ class Script:
|
|||
self, update_state: bool = True, spare: _ScriptRun | None = None
|
||||
) -> None:
|
||||
"""Stop running script."""
|
||||
await asyncio.shield(self._async_stop(update_state, spare))
|
||||
# Collect a a list of script runs to stop. This must be done before calling
|
||||
# asyncio.shield as asyncio.shield yields to the event loop, which would cause
|
||||
# us to wait for script runs added after the call to async_stop.
|
||||
aws = [
|
||||
asyncio.create_task(run.async_stop()) for run in self._runs if run != spare
|
||||
]
|
||||
if not aws:
|
||||
return
|
||||
await asyncio.shield(self._async_stop(aws, update_state, spare))
|
||||
|
||||
async def _async_get_condition(self, config):
|
||||
if isinstance(config, template.Template):
|
||||
|
|
Loading…
Reference in New Issue