From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.4 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLACK, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B265AC433DB for ; Mon, 1 Mar 2021 15:41:33 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2FAD064DDF for ; Mon, 1 Mar 2021 15:41:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2FAD064DDF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:35894 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lGkfr-0001VA-S3 for qemu-devel@archiver.kernel.org; Mon, 01 Mar 2021 10:41:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34134) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGkdo-00087F-7a for qemu-devel@nongnu.org; Mon, 01 Mar 2021 10:39:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:50196) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lGkdm-0005Ee-Ba for qemu-devel@nongnu.org; Mon, 01 Mar 2021 10:39:23 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1614613161; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i6hvHAHKzJiT0t25GvVEqTvjQiPmJHi6C/apWaxLC/8=; b=UmFjcHkR4sMbCSpQEPvvrIismMvKs2TnlxhuilCF28GZY5/FvsWd2rczG3245OoW+/aen1 w1r7xaYuPx5sILg+ZxBcBzpVcyvBaZuKkIh+RqpHp3uwMCIAoysd88lDjBwy69xSS6+Sgv 6dwSAA6+XSMxAMpy6+pHGlAN9ujo9PU= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-302-U_de9E4fPeWZOV0UUhb6dA-1; Mon, 01 Mar 2021 10:39:12 -0500 X-MC-Unique: U_de9E4fPeWZOV0UUhb6dA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3D29E185A0D1; Mon, 1 Mar 2021 15:39:11 +0000 (UTC) Received: from localhost (ovpn-112-87.ams2.redhat.com [10.36.112.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id CA8515C3E4; Mon, 1 Mar 2021 15:39:07 +0000 (UTC) Date: Mon, 1 Mar 2021 15:39:06 +0000 From: "Richard W.M. Jones" To: Stefan Hajnoczi Subject: Re: [PATCH] docs: show how to spawn qemu-storage-daemon with fd passing Message-ID: <20210301153906.GZ30079@redhat.com> References: <20210301153159.35660-1-stefanha@redhat.com> MIME-Version: 1.0 In-Reply-To: <20210301153159.35660-1-stefanha@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=rjones@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=63.128.21.124; envelope-from=rjones@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Daniel P =?iso-8859-1?Q?=2E_Berrang=E9?= , qemu-devel@nongnu.org, qemu-block@nongnu.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" On Mon, Mar 01, 2021 at 03:31:59PM +0000, Stefan Hajnoczi wrote: > The QMP monitor, NBD server, and vhost-user-blk export all support file > descriptor passing. This is a useful technique because it allows the > parent process to spawn and wait for qemu-storage-daemon without busy > waiting, which may delay startup due to arbitrary sleep() calls. > > This Python example is inspired by the test case written for libnbd by > Richard W.M. Jones : > https://gitlab.com/nbdkit/libnbd/-/commit/89113f484effb0e6c322314ba75c1cbe07a04543 > > Thanks to Daniel P. Berrangé for suggestions on > how to get this working. Now let's document it! > > Reported-by: Richard W.M. Jones > Cc: Kevin Wolf > Cc: Daniel P. Berrangé > Signed-off-by: Stefan Hajnoczi > --- > docs/tools/qemu-storage-daemon.rst | 38 ++++++++++++++++++++++++++++-- > 1 file changed, 36 insertions(+), 2 deletions(-) > > diff --git a/docs/tools/qemu-storage-daemon.rst b/docs/tools/qemu-storage-daemon.rst > index f63627eaf6..45854c131e 100644 > --- a/docs/tools/qemu-storage-daemon.rst > +++ b/docs/tools/qemu-storage-daemon.rst > @@ -101,10 +101,12 @@ Standard options: > > .. option:: --nbd-server addr.type=inet,addr.host=,addr.port=[,tls-creds=][,tls-authz=][,max-connections=] > --nbd-server addr.type=unix,addr.path=[,tls-creds=][,tls-authz=][,max-connections=] > + --nbd-server addr.type=fd,addr.str=[,tls-creds=][,tls-authz=][,max-connections=] > > is a server for NBD exports. Both TCP and UNIX domain sockets are supported. > - TLS encryption can be configured using ``--object`` tls-creds-* and authz-* > - secrets (see below). > + A listen socket can be provided via file descriptor passing (see Examples > + below). TLS encryption can be configured using ``--object`` tls-creds-* and > + authz-* secrets (see below). > > To configure an NBD server on UNIX domain socket path ``/tmp/nbd.sock``:: > > @@ -127,6 +129,38 @@ QMP commands:: > --chardev socket,path=qmp.sock,server,nowait,id=char1 \ > --monitor chardev=char1 > > +Launch the daemon from Python with a QMP monitor socket using file descriptor > +passing so there is no need to busy wait for the QMP monitor to become > +available:: > + > + #!/usr/bin/env python3 > + import os > + import subprocess > + import socket > + > + sock_path = '/tmp/qmp-{}.sock'.format(os.getpid()) Not sure how much you worry about the insecure / easily guessable tmp path here. I notice that there's already one in the surrounding documentation (/tmp/nbd.sock) so maybe it's not a problem :-) > + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as listen_sock: > + listen_sock.bind(sock_path) > + listen_sock.listen() > + > + fd = listen_sock.fileno() > + > + subprocess.Popen( > + ['qemu-storage-daemon', > + '--chardev', f'socket,fd={fd},server=on,id=char1', > + '--monitor', 'chardev=char1'], > + pass_fds=[fd], > + ) > + > + qmp_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) > + qmp_sock.connect(sock_path) A note that the order of opening the sockets is slightly different from how I did it in the interop test. But I believe it makes no difference, as long as you don't connect to the socket until it's in the listening state, which is what you're doing here. So it should be fine. > + ...QMP interaction... > + > +The same socket spawning approach also works with the ``--nbd-server > +addr.type=fd,addr.str=`` and ``--export > +type=vhost-user-blk,addr.type=fd,addr.str=`` options. > + > Export raw image file ``disk.img`` over NBD UNIX domain socket ``nbd.sock``:: The patch looks fine in general: Reviewed-by: Richard W.M. Jones Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 100 libraries supported. http://fedoraproject.org/wiki/MinGW