Before we allow the full separation of starting the server and accepting new connections, make sure that the disconnect cleans up the server and its new state, too.
Signed-off-by: John Snow <js...@redhat.com> Acked-by: Kevin Wolf <kw...@redhat.com> Reviewed-by: Daniel P. Berrangé <berra...@redhat.com> Message-id: 20220225205948.3693480-8-js...@redhat.com Signed-off-by: John Snow <js...@redhat.com> --- python/qemu/aqmp/protocol.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/qemu/aqmp/protocol.py b/python/qemu/aqmp/protocol.py index e2bdad542d..cdbc9cba0d 100644 --- a/python/qemu/aqmp/protocol.py +++ b/python/qemu/aqmp/protocol.py @@ -432,7 +432,7 @@ def _set_state(self, state: Runstate) -> None: self._runstate_event.set() self._runstate_event.clear() - @bottom_half # However, it does not run from the R/W tasks. + @bottom_half async def _stop_server(self) -> None: """ Stop listening for / accepting new incoming connections. @@ -709,6 +709,7 @@ def _paranoid_task_erase(task: Optional['asyncio.Future[_U]'] self._reader = None self._writer = None + self._accepted = None # NB: _runstate_changed cannot be cleared because we still need it to # send the final runstate changed event ...! @@ -732,6 +733,9 @@ async def _bh_disconnect(self) -> None: def _done(task: Optional['asyncio.Future[Any]']) -> bool: return task is not None and task.done() + # If the server is running, stop it. + await self._stop_server() + # Are we already in an error pathway? If either of the tasks are # already done, or if we have no tasks but a reader/writer; we # must be. -- 2.34.1