Re: [PATCH 1/5] python/qemu/machine: add possibility to postpone qmp connect

Thomas Huth <[email protected]>
Newsgroups org.nongnu.qemu-devel
Message-ID <[email protected]>
On 29/07/2026 11.31, Vladimir Sementsov-Ogievskiy wrote:
> This is need to test cpr-transfer migration, as on started
> target QMP is not available until we call "migrate" on
> source.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
> ---
>   python/qemu/machine/machine.py | 53 ++++++++++++++++++----------------
>   1 file changed, 28 insertions(+), 25 deletions(-)
> 
> diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py
> index bfb59d4c0bf..00154b8591f 100644
> --- a/python/qemu/machine/machine.py
> +++ b/python/qemu/machine/machine.py
> @@ -449,17 +449,17 @@ def _post_shutdown(self) -> None:
>           self._user_killed = False
>           self._launched = False
>   
> -    def launch(self) -> None:
> +    def launch(self, do_start_process=True, do_qmp_connect=True) -> None:

Could you drop the "do_" prefix from the parameter names? ... that does not 
provide any additional value here, I think.

>           """
>           Launch the VM and make sure we cleanup and expose the
>           command line/output in case of exception
>           """
>   
> -        if self._launched:
> +        if self._launched and do_start_process:
>               raise QEMUMachineError('VM already launched')
>   
>           try:
> -            self._launch()
> +            self._launch(do_start_process, do_qmp_connect)
>           except BaseException as exc:
>               # We may have launched the process but it may
>               # have exited before we could connect via QMP.
> @@ -482,31 +482,34 @@ def launch(self) -> None:
>               # that exception. However, we still want to clean up.
>               raise
>   
> -    def _launch(self) -> None:
> +    def _launch(self, do_start_process=True, do_qmp_connect=True) -> None:
>           """
>           Launch the VM and establish a QMP connection
>           """
> -        self._pre_launch()
> -        LOG.debug('VM launch command: %r', ' '.join(self._qemu_full_args))
> -        # Log a simplified, developer-runnable command:
> -        # Exclude harness-managed infrastructure args (harness_args)
> -        # and wrapper.
> -        debug_cmd = [self._binary]
> -        debug_cmd.extend(self._console_args(interactive=True))
> -        debug_cmd.extend(self._base_args)
> -        debug_cmd.extend(self._args)
> -        LOG.debug('Developer-runnable command: %r', ' '.join(debug_cmd))
> -
> -        # Cleaning up of this subprocess is guaranteed by _do_shutdown.
> -        # pylint: disable=consider-using-with
> -        self._popen = subprocess.Popen(self._qemu_full_args,
> -                                       stdin=subprocess.DEVNULL,
> -                                       stdout=self._qemu_log_file,
> -                                       stderr=subprocess.STDOUT,
> -                                       shell=False,
> -                                       close_fds=False)
> -        self._launched = True
> -        self._post_launch()
> +        if do_start_process:
> +            self._pre_launch()
> +            LOG.debug('VM launch command: %r', ' '.join(self._qemu_full_args))
> +            # Log a simplified, developer-runnable command:
> +            # Exclude harness-managed infrastructure args (harness_args)
> +            # and wrapper.
> +            debug_cmd = [self._binary]
> +            debug_cmd.extend(self._console_args(interactive=True))
> +            debug_cmd.extend(self._base_args)
> +            debug_cmd.extend(self._args)
> +            LOG.debug('Developer-runnable command: %r', ' '.join(debug_cmd))
> +
> +            # Cleaning up of this subprocess is guaranteed by _do_shutdown.
> +            # pylint: disable=consider-using-with
> +            self._popen = subprocess.Popen(self._qemu_full_args,
> +                                           stdin=subprocess.DEVNULL,
> +                                           stdout=self._qemu_log_file,
> +                                           stderr=subprocess.STDOUT,
> +                                           shell=False,
> +                                           close_fds=False)
> +            self._launched = True
> +
> +        if do_qmp_connect:
> +            self._post_launch()
Honestly, I think this is quite confusing that callers now have to run 
"launch()" twice if they want to have a staged initialization.

Could you maybe drop the do_start_process parameter, just keep the 
qmp_connect parameter here. Then wrap the QMP connection stuff in a new 
separate function. So callers could do:

    vm.launch(qmp_connect=False)
    ... do other stuff ...
    vm.qmp_connect()
    # instead of vm.launch(do_start_process=False, do_qmp_connect=True)

WDYT?

  Thomas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.