From nobody Sat Feb 7 08:28:28 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 15807338395421014.0899762005005; Mon, 3 Feb 2020 04:43:59 -0800 (PST) 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-52-zDteTxQTObSk4BGbZFem7w-1; Mon, 03 Feb 2020 07:43:53 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id C190D9EC4D1; Mon, 3 Feb 2020 12:43:47 +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 7EDE465F5D; Mon, 3 Feb 2020 12:43:47 +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 2BF8D18095FF; Mon, 3 Feb 2020 12:43:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 013Chglg006083 for ; Mon, 3 Feb 2020 07:43:42 -0500 Received: by smtp.corp.redhat.com (Postfix) id 74137619E2; Mon, 3 Feb 2020 12:43:42 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-112-57.ams2.redhat.com [10.36.112.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 86FFA6CE60; Mon, 3 Feb 2020 12:43:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580733838; h=from:from:sender:sender: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:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=J1Q9zJdsgVmogfZ5s5lqAMPAt/F5q/bmjFgafsZd1dQ=; b=BunPc4nacZD30eZOdWD4xR90V0uJsI8F27AthanojXbKyfiyR2jFZ5Jv8HVE/9KiCcuak4 w8niVVpNbARBV+3eLock06UuyvI6+nsXypWhX5bbgRdX8n2Gy1+PIgDVHnyXDKwhyoHSp2 9ZTXSjTMK/xBkMXXUE0gk6ur+8XIFFk= From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH 4/6] Modify close callback routines to handle local migration Date: Mon, 3 Feb 2020 12:43:31 +0000 Message-Id: <20200203124333.1925908-5-berrange@redhat.com> In-Reply-To: <20200203124333.1925908-1-berrange@redhat.com> References: <20200203124333.1925908-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Cc: Shaju Abraham 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: , 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-MC-Unique: zDteTxQTObSk4BGbZFem7w-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Shaju Abraham At the time of registration, the close callback routines are inserted to a hash table using the UUID as index. Since UUID is unique in a host, a single hash entry is suffice to represent a domain object. But in the case of local migration, the UUID is shared between the source and destination VMs. This creates hash collision since both source and destination VMs are on same host. Inorder to uniquely identify the source and destination VMs , the domain id is appeneded to the UUID to generate a unique hash key. The routines are modified to handle the above change. Signed-off-by: Shaju Abraham --- src/util/virclosecallbacks.c | 48 +++++++++++++++++++++++++++--------- src/util/virclosecallbacks.h | 3 +++ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/util/virclosecallbacks.c b/src/util/virclosecallbacks.c index 200577e18e..a8ab46d4d7 100644 --- a/src/util/virclosecallbacks.c +++ b/src/util/virclosecallbacks.c @@ -24,6 +24,7 @@ #include "virclosecallbacks.h" #include "virlog.h" #include "virobject.h" +#include "virstring.h" =20 #define VIR_FROM_THIS VIR_FROM_NONE =20 @@ -34,6 +35,7 @@ typedef virDriverCloseDef *virDriverCloseDefPtr; struct _virDriverCloseDef { virConnectPtr conn; virCloseCallback cb; + virDomainObjPtr vm; }; =20 struct _virCloseCallbacks { @@ -85,7 +87,6 @@ virCloseCallbacksDispose(void *obj) =20 virHashFree(closeCallbacks->list); } - int virCloseCallbacksSet(virCloseCallbacksPtr closeCallbacks, virDomainObjPtr vm, @@ -93,6 +94,7 @@ virCloseCallbacksSet(virCloseCallbacksPtr closeCallbacks, virCloseCallback cb) { char uuidstr[VIR_UUID_STRING_BUFLEN]; + char *uniqstr =3D NULL; virDriverCloseDefPtr closeDef; int ret =3D -1; =20 @@ -100,9 +102,10 @@ virCloseCallbacksSet(virCloseCallbacksPtr closeCallbac= ks, VIR_DEBUG("vm=3D%s, uuid=3D%s, conn=3D%p, cb=3D%p", vm->def->name, uuidstr, conn, cb); =20 + uniqstr =3D g_strdup_printf("%s%d", uuidstr, vm->def->id); virObjectLock(closeCallbacks); =20 - closeDef =3D virHashLookup(closeCallbacks->list, uuidstr); + closeDef =3D virHashLookup(closeCallbacks->list, uniqstr); if (closeDef) { if (closeDef->conn !=3D conn) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -125,7 +128,8 @@ virCloseCallbacksSet(virCloseCallbacksPtr closeCallback= s, =20 closeDef->conn =3D conn; closeDef->cb =3D cb; - if (virHashAddEntry(closeCallbacks->list, uuidstr, closeDef) < 0) { + closeDef->vm =3D vm; + if (virHashAddEntry(closeCallbacks->list, uniqstr, closeDef) < 0) { VIR_FREE(closeDef); goto cleanup; } @@ -145,6 +149,7 @@ virCloseCallbacksUnset(virCloseCallbacksPtr closeCallba= cks, virCloseCallback cb) { char uuidstr[VIR_UUID_STRING_BUFLEN]; + char *uniqstr =3D NULL; virDriverCloseDefPtr closeDef; int ret =3D -1; =20 @@ -152,9 +157,10 @@ virCloseCallbacksUnset(virCloseCallbacksPtr closeCallb= acks, VIR_DEBUG("vm=3D%s, uuid=3D%s, cb=3D%p", vm->def->name, uuidstr, cb); =20 + uniqstr =3D g_strdup_printf("%s%d", uuidstr, vm->def->id); virObjectLock(closeCallbacks); =20 - closeDef =3D virHashLookup(closeCallbacks->list, uuidstr); + closeDef =3D virHashLookup(closeCallbacks->list, uniqstr); if (!closeDef) goto cleanup; =20 @@ -165,7 +171,7 @@ virCloseCallbacksUnset(virCloseCallbacksPtr closeCallba= cks, goto cleanup; } =20 - if (virHashRemoveEntry(closeCallbacks->list, uuidstr) < 0) + if (virHashRemoveEntry(closeCallbacks->list, uniqstr) < 0) goto cleanup; =20 virObjectUnref(vm); @@ -183,16 +189,18 @@ virCloseCallbacksGet(virCloseCallbacksPtr closeCallba= cks, virConnectPtr conn) { char uuidstr[VIR_UUID_STRING_BUFLEN]; + char *uniqstr =3D NULL; virDriverCloseDefPtr closeDef; virCloseCallback cb =3D NULL; =20 virUUIDFormat(vm->def->uuid, uuidstr); VIR_DEBUG("vm=3D%s, uuid=3D%s, conn=3D%p", vm->def->name, uuidstr, conn); + uniqstr =3D g_strdup_printf("%s%d", uuidstr, vm->def->id); =20 virObjectLock(closeCallbacks); =20 - closeDef =3D virHashLookup(closeCallbacks->list, uuidstr); + closeDef =3D virHashLookup(closeCallbacks->list, uniqstr); if (closeDef && (!conn || closeDef->conn =3D=3D conn)) cb =3D closeDef->cb; =20 @@ -207,15 +215,17 @@ virCloseCallbacksGetConn(virCloseCallbacksPtr closeCa= llbacks, virDomainObjPtr vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; + char *uniqstr =3D NULL; virDriverCloseDefPtr closeDef; virConnectPtr conn =3D NULL; =20 virUUIDFormat(vm->def->uuid, uuidstr); VIR_DEBUG("vm=3D%s, uuid=3D%s", vm->def->name, uuidstr); =20 + uniqstr =3D g_strdup_printf("%s%d", uuidstr, vm->def->id); virObjectLock(closeCallbacks); =20 - closeDef =3D virHashLookup(closeCallbacks->list, uuidstr); + closeDef =3D virHashLookup(closeCallbacks->list, uniqstr); if (closeDef) conn =3D closeDef->conn; =20 @@ -231,6 +241,7 @@ typedef virCloseCallbacksListEntry *virCloseCallbacksLi= stEntryPtr; struct _virCloseCallbacksListEntry { unsigned char uuid[VIR_UUID_BUFLEN]; virCloseCallback callback; + virDomainObjPtr vm; }; =20 typedef struct _virCloseCallbacksList virCloseCallbacksList; @@ -274,6 +285,7 @@ virCloseCallbacksGetOne(void *payload, memcpy(data->list->entries[data->list->nentries - 1].uuid, uuid, VIR_UUID_BUFLEN); data->list->entries[data->list->nentries - 1].callback =3D closeDef->c= b; + data->list->entries[data->list->nentries - 1].vm =3D closeDef->vm; return 0; } =20 @@ -302,8 +314,18 @@ virCloseCallbacksGetForConn(virCloseCallbacksPtr close= Callbacks, =20 return list; } - - +virDomainObjPtr virGetMatchingDomain(virDomainObjListPtr domains, + unsigned char *uuidstr, virDomainObjP= tr dom) +{ + virDomainObjPtr vm =3D NULL; + vm =3D virDomainObjListFindByUUID(domains, uuidstr); + if (!vm || vm !=3D dom) { + vm =3D virDomainObjListFindByUUIDRemote(domains, uuidstr); + if (!vm || vm !=3D dom) + return NULL; + } + return vm; +} void virCloseCallbacksRun(virCloseCallbacksPtr closeCallbacks, virConnectPtr conn, @@ -329,8 +351,10 @@ virCloseCallbacksRun(virCloseCallbacksPtr closeCallbac= ks, =20 for (i =3D 0; i < list->nentries; i++) { char uuidstr[VIR_UUID_STRING_BUFLEN]; + char *uniqstr =3D NULL; virUUIDFormat(list->entries[i].uuid, uuidstr); - virHashRemoveEntry(closeCallbacks->list, uuidstr); + uniqstr =3D g_strdup_printf("%s%d", uuidstr, list->entries[i].vm->= def->id); + virHashRemoveEntry(closeCallbacks->list, uniqstr); } virObjectUnlock(closeCallbacks); =20 @@ -338,8 +362,8 @@ virCloseCallbacksRun(virCloseCallbacksPtr closeCallback= s, virDomainObjPtr vm; =20 /* Grab a ref and lock to the vm */ - if (!(vm =3D virDomainObjListFindByUUID(domains, - list->entries[i].uuid))) { + if (!(vm =3D virGetMatchingDomain(domains, + list->entries[i].uuid, list->entries[i].vm))) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(list->entries[i].uuid, uuidstr); VIR_DEBUG("No domain object with UUID %s", uuidstr); diff --git a/src/util/virclosecallbacks.h b/src/util/virclosecallbacks.h index 98fc2c4a94..253ecab6bc 100644 --- a/src/util/virclosecallbacks.h +++ b/src/util/virclosecallbacks.h @@ -48,3 +48,6 @@ virCloseCallbacksRun(virCloseCallbacksPtr closeCallbacks, virConnectPtr conn, virDomainObjListPtr domains, void *opaque); + +virDomainObjPtr virGetMatchingDomain(virDomainObjListPtr domains, + unsigned char *uuidstr, virDomainObjP= tr dom); --=20 2.24.1