From nobody Wed May 14 21:33:48 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 151638266599485.36895864173812; Fri, 19 Jan 2018 09:24:25 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 20686CDB; Fri, 19 Jan 2018 17:24:25 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E463060C93; Fri, 19 Jan 2018 17:24:24 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id A966C1800B66; Fri, 19 Jan 2018 17:24:24 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w0JHNOHX003695 for ; Fri, 19 Jan 2018 12:23:24 -0500 Received: by smtp.corp.redhat.com (Postfix) id 1D1985C25E; Fri, 19 Jan 2018 17:23:24 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-93.phx2.redhat.com [10.3.116.93]) by smtp.corp.redhat.com (Postfix) with ESMTP id CE5685C543 for ; Fri, 19 Jan 2018 17:23:23 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Fri, 19 Jan 2018 12:23:09 -0500 Message-Id: <20180119172311.15525-8-jferlan@redhat.com> In-Reply-To: <20180119172311.15525-1-jferlan@redhat.com> References: <20180119172311.15525-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 7/9] rpc: Alter virNetDaemonQuit processing X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 19 Jan 2018 17:24:25 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" When virNetDaemonQuit is called from libvirtd's shutdown handler (daemonShutdownHandler) we need to perform the quit in multiple steps. The first part is to "request" the quit and notify the NetServer's of the impending quit which causes the NetServers to Drain their pending queue and tell workers to quit and the second is wait for any currently running worker jobs to complete. Once the workers are complete, then we can cause the quit to occur. Signed-off-by: John Ferlan --- src/rpc/virnetdaemon.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/rpc/virnetdaemon.c b/src/rpc/virnetdaemon.c index e5b376ced..6aee712a5 100644 --- a/src/rpc/virnetdaemon.c +++ b/src/rpc/virnetdaemon.c @@ -73,6 +73,7 @@ struct _virNetDaemon { virHashTablePtr servers; virJSONValuePtr srvObject; =20 + bool quitRequested; bool quit; =20 unsigned int autoShutdownTimeout; @@ -779,6 +780,32 @@ daemonServerProcessClients(void *payload, return 0; } =20 + +static int +daemonServerWorkerCount(void *payload, + const void *key ATTRIBUTE_UNUSED, + void *opaque) +{ + size_t *workerCount =3D opaque; + virNetServerPtr srv =3D payload; + + *workerCount +=3D virNetServerWorkerCount(srv); + + return 0; +} + + +static bool +daemonServerWorkersDone(virNetDaemonPtr dmn) +{ + size_t workerCount =3D 0; + + virHashForEach(dmn->servers, daemonServerWorkerCount, &workerCount); + + return workerCount =3D=3D 0; +} + + void virNetDaemonRun(virNetDaemonPtr dmn) { @@ -843,6 +870,9 @@ virNetDaemonRun(virNetDaemonPtr dmn) virObjectLock(dmn); =20 virHashForEach(dmn->servers, daemonServerProcessClients, NULL); + + if (dmn->quitRequested && daemonServerWorkersDone(dmn)) + dmn->quit =3D true; } =20 cleanup: @@ -868,7 +898,7 @@ virNetDaemonQuit(virNetDaemonPtr dmn) virObjectLock(dmn); =20 VIR_DEBUG("Quit requested %p", dmn); - dmn->quit =3D true; + dmn->quitRequested =3D true; virHashForEach(dmn->servers, daemonServerQuitRequested, NULL); =20 virObjectUnlock(dmn); --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list