From nobody Mon Feb 9 03:19:59 2026 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; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1535357369279629.6724460019641; Mon, 27 Aug 2018 01:09:29 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.25]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AECDC8762B; Mon, 27 Aug 2018 08:09:27 +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 7176D2010D9B; Mon, 27 Aug 2018 08:09:27 +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 D6279181AC2B; Mon, 27 Aug 2018 08:09:26 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w7R892QZ032491 for ; Mon, 27 Aug 2018 04:09:02 -0400 Received: by smtp.corp.redhat.com (Postfix) id ED1CB2027056; Mon, 27 Aug 2018 08:09:01 +0000 (UTC) Received: from localhost.localdomain (ovpn-204-81.brq.redhat.com [10.40.204.81]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7A182202704E for ; Mon, 27 Aug 2018 08:09:01 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 27 Aug 2018 10:08:29 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v3 16/28] lock_driver: Introduce KEEP_OPEN flags 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.84 on 10.5.11.25 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 27 Aug 2018 08:09:28 +0000 (UTC) X-ZohoMail: RDMRC_0 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This flag causes connection to be opened when needed (e.g. when calling virLockManagerLockDaemonAcquire for the first time) and instead of closing it at the end of such API store it in privateData so that it can be reused by later calls. This is needed because if a resource is acquired and connection is closed then virtlockd kills the registered PID (that's what virtlockd is designed to do). Therefore we will need the connection to open at drvAcquire and close not any sooner than drvRelease. However, as we will be locking files step-by-step we want to avoid opening new connection for every drvAcquire + drvRelease pair, so the connection is going to be shared even more than that. But more on that in next commit. Signed-off-by: Michal Privoznik --- src/locking/lock_driver.h | 7 +++++ src/locking/lock_driver_lockd.c | 68 +++++++++++++++++++++++++++++++++++++= ---- 2 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/locking/lock_driver.h b/src/locking/lock_driver.h index 59c4c3aac7..7e3ffc58b5 100644 --- a/src/locking/lock_driver.h +++ b/src/locking/lock_driver.h @@ -67,8 +67,15 @@ typedef enum { VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY =3D (1 << 0), /* Prevent further lock/unlock calls from this process */ VIR_LOCK_MANAGER_ACQUIRE_RESTRICT =3D (1 << 1), + /* Causes driver to keep connection open and reuse it for further use.= */ + VIR_LOCK_MANAGER_ACQUIRE_KEEP_OPEN =3D (1 << 2), } virLockManagerAcquireFlags; =20 +typedef enum { + /* Reuse previously saved connection. */ + VIR_LOCK_MANAGER_RELEASE_KEEP_OPEN =3D (1 << 0), +} virLockManagerReleaseFlags; + typedef enum { /* virLockManagerNew called for a freshly started domain */ VIR_LOCK_MANAGER_NEW_STARTED =3D (1 << 0), diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lock= d.c index 4883e89ac6..14f9eae760 100644 --- a/src/locking/lock_driver_lockd.c +++ b/src/locking/lock_driver_lockd.c @@ -76,6 +76,11 @@ struct _virLockManagerLockDaemonPrivate { =20 size_t nresources; virLockManagerLockDaemonResourcePtr resources; + + int clientRefs; + virNetClientPtr client; + virNetClientProgramPtr program; + int counter; }; =20 =20 @@ -440,6 +445,13 @@ virLockManagerLockDaemonPrivateFree(virLockManagerLock= DaemonPrivatePtr priv) default: break; } + + if (priv->client) { + virNetClientClose(priv->client); + virObjectUnref(priv->client); + virObjectUnref(priv->program); + } + VIR_FREE(priv); } =20 @@ -770,7 +782,8 @@ static int virLockManagerLockDaemonAcquire(virLockManag= erPtr lock, virLockManagerLockDaemonPrivatePtr priv =3D lock->privateData; =20 virCheckFlags(VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY | - VIR_LOCK_MANAGER_ACQUIRE_RESTRICT, -1); + VIR_LOCK_MANAGER_ACQUIRE_RESTRICT | + VIR_LOCK_MANAGER_ACQUIRE_KEEP_OPEN, -1); =20 if (priv->type =3D=3D VIR_LOCK_MANAGER_OBJECT_TYPE_DOMAIN && priv->nresources =3D=3D 0 && @@ -781,7 +794,14 @@ static int virLockManagerLockDaemonAcquire(virLockMana= gerPtr lock, return -1; } =20 - if (!(client =3D virLockManagerLockDaemonConnect(lock, &program, &coun= ter))) + if (flags & VIR_LOCK_MANAGER_ACQUIRE_KEEP_OPEN) { + client =3D priv->client; + program =3D priv->program; + counter =3D priv->counter; + } + + if (!client && + !(client =3D virLockManagerLockDaemonConnect(lock, &program, &coun= ter))) goto cleanup; =20 if (fd && @@ -814,11 +834,25 @@ static int virLockManagerLockDaemonAcquire(virLockMan= agerPtr lock, virLockManagerLockDaemonConnectionRestrict(lock, client, program, = &counter) < 0) goto cleanup; =20 + if (flags & VIR_LOCK_MANAGER_ACQUIRE_KEEP_OPEN) { + VIR_STEAL_PTR(priv->client, client); + VIR_STEAL_PTR(priv->program, program); + priv->counter =3D counter; + } + rv =3D 0; =20 cleanup: - if (rv !=3D 0 && fd) - VIR_FORCE_CLOSE(*fd); + if (rv < 0) { + if (fd) + VIR_FORCE_CLOSE(*fd); + + priv->client =3D NULL; + priv->program =3D NULL; + priv->counter =3D 0; + priv->clientRefs =3D 0; + } + virNetClientClose(client); virObjectUnref(client); virObjectUnref(program); @@ -837,12 +871,20 @@ static int virLockManagerLockDaemonRelease(virLockMan= agerPtr lock, size_t i; virLockManagerLockDaemonPrivatePtr priv =3D lock->privateData; =20 - virCheckFlags(0, -1); + virCheckFlags(VIR_LOCK_MANAGER_RELEASE_KEEP_OPEN, -1); =20 if (state) *state =3D NULL; =20 - if (!(client =3D virLockManagerLockDaemonConnect(lock, &program, &coun= ter))) + if (flags & VIR_LOCK_MANAGER_RELEASE_KEEP_OPEN) { + client =3D priv->client; + program =3D priv->program; + counter =3D priv->counter; + priv->clientRefs--; + } + + if (!client && + !(client =3D virLockManagerLockDaemonConnect(lock, &program, &coun= ter))) goto cleanup; =20 for (i =3D 0; i < priv->nresources; i++) { @@ -870,9 +912,23 @@ static int virLockManagerLockDaemonRelease(virLockMana= gerPtr lock, goto cleanup; } =20 + if (flags & VIR_LOCK_MANAGER_RELEASE_KEEP_OPEN) { + /* Avoid freeing in cleanup. */ + client =3D NULL; + program =3D NULL; + counter =3D 0; + } + rv =3D 0; =20 cleanup: + if (rv < 0) { + priv->client =3D NULL; + priv->program =3D NULL; + priv->counter =3D 0; + priv->clientRefs =3D 0; + } + virNetClientClose(client); virObjectUnref(client); virObjectUnref(program); --=20 2.16.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list