From nobody Mon Feb 9 14:38:09 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.zoho.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 1491898973811988.8001394765886; Tue, 11 Apr 2017 01:22:53 -0700 (PDT) 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 mx1.redhat.com (Postfix) with ESMTPS id 58C8D7F6C8; Tue, 11 Apr 2017 08:22:52 +0000 (UTC) Received: from colo-mx.corp.redhat.com (unknown [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2CA5C7E4D6; Tue, 11 Apr 2017 08:22:52 +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 D5ABA5EC6A; Tue, 11 Apr 2017 08:22:51 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v3B8Mj4T005459 for ; Tue, 11 Apr 2017 04:22:45 -0400 Received: by smtp.corp.redhat.com (Postfix) id 79FCC1835A; Tue, 11 Apr 2017 08:22:45 +0000 (UTC) Received: from mx1.redhat.com (ext-mx03.extmail.prod.ext.phx2.redhat.com [10.5.110.27]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7299F18357 for ; Tue, 11 Apr 2017 08:22:45 +0000 (UTC) Received: from relay.sw.ru (mailhub.sw.ru [195.214.232.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DD58C787F1 for ; Tue, 11 Apr 2017 08:22:43 +0000 (UTC) Received: from dim-vz7.qa.sw.ru (msk-vpn.virtuozzo.com [195.214.232.6]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id v3B7fYcB009507 for ; Tue, 11 Apr 2017 10:41:35 +0300 (MSK) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 58C8D7F6C8 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=virtuozzo.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 58C8D7F6C8 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DD58C787F1 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=virtuozzo.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=nshirokovskiy@virtuozzo.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com DD58C787F1 From: Nikolay Shirokovskiy To: libvir-list@redhat.com Date: Tue, 11 Apr 2017 10:39:46 +0300 Message-Id: <1491896389-522630-14-git-send-email-nshirokovskiy@virtuozzo.com> In-Reply-To: <1491896389-522630-1-git-send-email-nshirokovskiy@virtuozzo.com> References: <1491896389-522630-1-git-send-email-nshirokovskiy@virtuozzo.com> X-Greylist: Delayed for 00:40:51 by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 11 Apr 2017 08:22:44 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 11 Apr 2017 08:22:44 +0000 (UTC) for IP:'195.214.232.25' DOMAIN:'mailhub.sw.ru' HELO:'relay.sw.ru' FROM:'nshirokovskiy@virtuozzo.com' RCPT:'' X-RedHat-Spam-Score: 0.799 (BAYES_50, SPF_PASS) 195.214.232.25 mailhub.sw.ru 195.214.232.25 mailhub.sw.ru X-Scanned-By: MIMEDefang 2.78 on 10.5.110.27 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v3 13/16] qemu: support getting disks stats during stopping block jobs 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.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 11 Apr 2017 08:22:53 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Let's store disks stats for completed mirror jobs in current job info. So on getting migration job stats thru API we take records for completed jobs from current job info and records for still active jobs by querying qemu process. As we need to keep disks stats for completed mirror jobs in current job let's zero out migration stats conditionally in fetching function. --- src/qemu/qemu_blockjob.c | 1 + src/qemu/qemu_domain.h | 1 + src/qemu/qemu_driver.c | 3 +++ src/qemu/qemu_migration.c | 11 +++++++++++ src/qemu/qemu_monitor.c | 5 +++-- src/qemu/qemu_monitor.h | 4 +++- src/qemu/qemu_monitor_json.c | 4 +--- src/qemu/qemu_process.c | 3 +++ tests/qemumonitorjsontest.c | 1 + 9 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 0601e68..f517999 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -232,6 +232,7 @@ qemuBlockJobSyncBegin(virDomainDiskDefPtr disk) VIR_DEBUG("disk=3D%s", disk->dst); diskPriv->blockJobSync =3D true; diskPriv->blockJobStatus =3D -1; + diskPriv->blockJobLength =3D 0; } =20 =20 diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 564da49..b002184 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -323,6 +323,7 @@ struct _qemuDomainDiskPrivate { /* for some synchronous block jobs, we need to notify the owner */ int blockJobType; /* type of the block job from the event */ int blockJobStatus; /* status of the finished block job */ + unsigned long long blockJobLength; /* length of the finished block job= */ bool blockJobSync; /* the block job needs synchronized termination */ =20 bool migrating; /* the disk is being migrated */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1539e15..9a706d5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12781,6 +12781,9 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driv= er, jobInfo->status =3D=3D QEMU_DOMAIN_JOB_STATUS_MIGRATING || jobInfo->status =3D=3D QEMU_DOMAIN_JOB_STATUS_POSTCOPY) { =20 + /* Disks stats accounting presumes that fetching migration + * stats will not touch disk stats records if disks are migrated v= ia nbd. + */ if (events && jobInfo->status !=3D QEMU_DOMAIN_JOB_STATUS_ACTIVE && qemuMigrationFetchMigrationStats(driver, vm, QEMU_ASYNC_JOB_NO= NE, &jobInfo->stats, false) < 0) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 16f1265..43d87a0 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -654,6 +654,7 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driv= er, size_t active =3D 0; int status; bool failed =3D false; + qemuDomainObjPrivatePtr priv =3D vm->privateData; =20 for (i =3D 0; i < vm->def->ndisks; i++) { virDomainDiskDefPtr disk =3D vm->def->disks[i]; @@ -681,6 +682,13 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr dri= ver, default: active++; } + + if (status =3D=3D VIR_DOMAIN_BLOCK_JOB_COMPLETED) { + qemuMonitorMigrationStatsPtr stats =3D &priv->job.current->sta= ts; + + stats->disk_transferred +=3D diskPriv->blockJobLength; + stats->disk_total +=3D diskPriv->blockJobLength; + } } =20 if (failed) { @@ -1357,6 +1365,9 @@ qemuMigrationFetchMigrationStats(virQEMUDriverPtr dri= ver, if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) return -1; =20 + if (copy) + memset(&statsCopy, 0, sizeof(statsCopy)); + rv =3D qemuMonitorGetMigrationStats(priv->mon, copy ? &statsCopy : sta= ts); =20 if (qemuDomainObjExitMonitor(driver, vm) < 0 || rv < 0) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 1d40d52..06a5cf8 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1504,13 +1504,14 @@ int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, - int status) + int status, + unsigned long long len) { int ret =3D -1; VIR_DEBUG("mon=3D%p", mon); =20 QEMU_MONITOR_CALLBACK(mon, ret, domainBlockJob, mon->vm, - diskAlias, type, status); + diskAlias, type, status, len); return ret; } =20 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 12f98be..a71c344 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -175,6 +175,7 @@ typedef int (*qemuMonitorDomainBlockJobCallback)(qemuMo= nitorPtr mon, const char *diskAlias, int type, int status, + unsigned long long len, void *opaque); typedef int (*qemuMonitorDomainTrayChangeCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, @@ -374,7 +375,8 @@ int qemuMonitorEmitPMSuspend(qemuMonitorPtr mon); int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, - int status); + int status, + unsigned long long len); int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon, unsigned long long actual); int qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index aeb777d..67874ea 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -902,7 +902,7 @@ qemuMonitorJSONHandleBlockJobImpl(qemuMonitorPtr mon, } =20 out: - qemuMonitorEmitBlockJob(mon, device, type, event); + qemuMonitorEmitBlockJob(mon, device, type, event, len); } =20 static void @@ -2965,8 +2965,6 @@ int qemuMonitorJSONGetMigrationStats(qemuMonitorPtr m= on, NULL); virJSONValuePtr reply =3D NULL; =20 - memset(stats, 0, sizeof(*stats)); - if (!cmd) return -1; =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index f5cd00b..283bf83 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -965,6 +965,7 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_= UNUSED, const char *diskAlias, int type, int status, + unsigned long long len, void *opaque) { virQEMUDriverPtr driver =3D opaque; @@ -986,6 +987,8 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_= UNUSED, /* We have a SYNC API waiting for this event, dispatch it back */ diskPriv->blockJobType =3D type; diskPriv->blockJobStatus =3D status; + diskPriv->blockJobLength =3D len; + virDomainObjBroadcast(vm); } else { /* there is no waiting SYNC API, dispatch the update to a thread */ diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index e9f9d47..873fcd7 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1923,6 +1923,7 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationStats(c= onst void *data) "}") < 0) goto cleanup; =20 + memset(&stats, 0, sizeof(stats)); if (qemuMonitorJSONGetMigrationStats(qemuMonitorTestGetMonitor(test), = &stats) < 0) goto cleanup; =20 --=20 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list