From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1648725593603121.23281422727985; Thu, 31 Mar 2022 04:19:53 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-451-Rpj0wbo2P86pa7emK9BPHg-1; Thu, 31 Mar 2022 07:19:50 -0400 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1990C3800EB4; Thu, 31 Mar 2022 11:19:47 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 03433401E93; Thu, 31 Mar 2022 11:19:47 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 315351940350; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id B41B11940345 for ; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id A64D11417201; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A25161400C2B for ; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 86428185A79C for ; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: from mail-lj1-f169.google.com (mail-lj1-f169.google.com [209.85.208.169]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-472-TMPksKfuO0urRE6wBV1hQA-1; Thu, 31 Mar 2022 07:19:42 -0400 Received: by mail-lj1-f169.google.com with SMTP id by7so1392931ljb.0 for ; Thu, 31 Mar 2022 04:19:40 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:38 -0700 (PDT) X-MC-Unique: Rpj0wbo2P86pa7emK9BPHg-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: TMPksKfuO0urRE6wBV1hQA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=41KS4IDeN1xyWx70w9/3dwuvzIZZuJdJdtR1aHXZVbc=; b=6/3f8VAeb5o/roSkNzTs2k1V+Sfh0jNlEe+NEzHxCXzf5zepCgK7BMcRK/70D251DV bHiiNQP0YqEhwABCAaeXPP9HpF16QIsGC9QFRQLLLagErTfosu1JgRffrP0sUXs2OMZa ioAoIUPcpGySSFAIzrYIAqLtCfjSoE6N28pIMzfw6e5obm3cMUHAd+q5EuJjCwS0VOKN 5KReomxk6vmwt7XxiG24LaxEIVA3QwyJ1B9ERpyhIum9cz9o9SHwA6JIA4aD8A2ItKK+ 70OQXkEUevwaBslSLr6p/4MgNOTxDpG38PdcGIY3CnG9HTfvi8pBo9hxVbax0b9jaE91 pZhA== X-Gm-Message-State: AOAM533S0Lu1uhLNE3OktCcpPevrWXaPsUfruufLlleF5h1XjBTStQUq JP7U42+4yZy5eKBewmVP2P+iEGsTYu1lTg== X-Google-Smtp-Source: ABdhPJwNLdAehEk542yEgu2juNYRPh/E2XMZQJyL0+F6JoUl5Ow+4xmkUX/8DEPwSYI/mB8FKJT+KQ== X-Received: by 2002:a2e:9545:0:b0:249:8221:86d9 with SMTP id t5-20020a2e9545000000b00249822186d9mr10441602ljh.137.1648725579374; Thu, 31 Mar 2022 04:19:39 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 01/11] qemu: add QEMU_CAPS_SNAPSHOT_SAVE capability Date: Thu, 31 Mar 2022 14:19:11 +0300 Message-Id: <20220331111921.450496-2-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725595051100001 Content-Type: text/plain; charset="utf-8"; x-default="true" If it is present then QEMU supports snaphot-{save, load, delete} set of QMP commands. Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml | 1 + 11 files changed, 12 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 6b4ed08499..3acc735e99 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -669,6 +669,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 425 */ "blockdev.nbd.tls-hostname", /* QEMU_CAPS_BLOCKDEV_NBD_TLS_H= OSTNAME */ "memory-backend-file.prealloc-threads", /* QEMU_CAPS_MEMORY_= BACKEND_PREALLOC_THREADS */ + "snapshot-save", /* QEMU_CAPS_SNAPSHOT_SAVE */ ); =20 =20 @@ -1236,6 +1237,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = =3D { { "query-dirty-rate", QEMU_CAPS_QUERY_DIRTY_RATE }, { "sev-inject-launch-secret", QEMU_CAPS_SEV_INJECT_LAUNCH_SECRET }, { "calc-dirty-rate", QEMU_CAPS_CALC_DIRTY_RATE }, + { "snapshot-save", QEMU_CAPS_SNAPSHOT_SAVE }, }; =20 struct virQEMUCapsStringFlags virQEMUCapsMigration[] =3D { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 948029d60d..ff5301a1b4 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -644,6 +644,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ /* 425 */ QEMU_CAPS_BLOCKDEV_NBD_TLS_HOSTNAME, /* tls hostname can be overriden = for NBD clients */ QEMU_CAPS_MEMORY_BACKEND_PREALLOC_THREADS, /* -object memory-backend-*= .prealloc-threads */ + QEMU_CAPS_SNAPSHOT_SAVE, /* supports snapshot-save qmp command */ =20 QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml b/tests/qemu= capabilitiesdata/caps_6.0.0.aarch64.xml index 7557e6ad71..7d1de6c1f7 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml @@ -193,6 +193,7 @@ + 6000000 0 61700242 diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml b/tests/qemuca= pabilitiesdata/caps_6.0.0.s390x.xml index 00009be3dc..7e52c2bad5 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml @@ -150,6 +150,7 @@ + 6000000 0 39100242 diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_6.0.0.x86_64.xml index 61d561dc69..e3ea706b2c 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml @@ -236,6 +236,7 @@ + 6000000 0 43100242 diff --git a/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_6.1.0.x86_64.xml index 0b58210335..2167bfd5ed 100644 --- a/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml @@ -240,6 +240,7 @@ + 6001000 0 43100243 diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml b/tests/qemu= capabilitiesdata/caps_6.2.0.aarch64.xml index d08b2c0213..e2778e6d34 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml @@ -204,6 +204,7 @@ + 6001050 0 61700244 diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml b/tests/qemuca= pabilitiesdata/caps_6.2.0.ppc64.xml index 8c52964ec0..7ffdd4d5fa 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml @@ -202,6 +202,7 @@ + 6002000 0 42900244 diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_6.2.0.x86_64.xml index cdf72b9ebf..ae0fb90df9 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml @@ -242,6 +242,7 @@ + 6002000 0 43100244 diff --git a/tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml b/tests/qemuca= pabilitiesdata/caps_7.0.0.ppc64.xml index 8aba3329ad..e19eef6f8e 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml @@ -203,6 +203,7 @@ + 6002050 0 42900243 diff --git a/tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_7.0.0.x86_64.xml index 5227e3ee0b..5c97fe71b8 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml @@ -245,6 +245,7 @@ + 6002050 0 43100243 --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1648725594409639.8784825405025; Thu, 31 Mar 2022 04:19:54 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-373-QQ1C-u02MayVm-oYQE0huQ-1; Thu, 31 Mar 2022 07:19:50 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 321213800A01; Thu, 31 Mar 2022 11:19:48 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 187F840D2826; Thu, 31 Mar 2022 11:19:48 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 9402E1940340; Thu, 31 Mar 2022 11:19:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 8010F1940359 for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 542AB5B158B; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast09.extmail.prod.ext.rdu2.redhat.com [10.11.55.25]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 504BD5B1588 for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 341F728035FF for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-614-MaG9Io2DMPS_C75qvCOQ2g-1; Thu, 31 Mar 2022 07:19:43 -0400 Received: by mail-lf1-f50.google.com with SMTP id k21so40891999lfe.4 for ; Thu, 31 Mar 2022 04:19:41 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:39 -0700 (PDT) X-MC-Unique: QQ1C-u02MayVm-oYQE0huQ-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: MaG9Io2DMPS_C75qvCOQ2g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rAnscN93vs3QwtWhG6eo7mZJz3pwT/cZXaomylTz6RU=; b=dVqfnGs6x5p32rYFbefSq01Cj4M4xjh8vZlDSk9SaD0pr8WjIEDj6bOUQJKmVhUKcR e/T1s/Dl/g9LcqtYdP2LPLrSWPlAUsfW18vyF/0w2POl2Lex+bK1jJr/xWF6aXuO0J5u KfXJzzi2kh/tNdAIMviLBHlIAgRS/ziPPDCMMCTynazLiaCdpVZ1rM9PUV2/c4gxmiDM hAU2NlwWP14BwO2WJ9aPhqyPPE9SJwORxOEjtF+oTsWjqAEJvvRscMZuI8YqsBO67OJY rDsawIeMehrizNy0Q4/fGE2VslSwnLcnTrRDiDcoCtr/juwfGj4RwbjRprJXtbIqMVCz DVTA== X-Gm-Message-State: AOAM530D98aG57kJ9B/Kzi17X+2C5IFZU9TZBZuvjBcmtf4USEvpTiEm H7vUIxgLaOw4J3JnVNSbz4BL3azmvfEfmg== X-Google-Smtp-Source: ABdhPJxiC1YORi5durdNRwjG0X5zqDWxOJ+7zEbbKoNgQl19Eu/48Anc10ZeKVMCGC7bE+5agEXYXQ== X-Received: by 2002:a05:6512:a89:b0:44a:3936:3a22 with SMTP id m9-20020a0565120a8900b0044a39363a22mr10404476lfu.364.1648725580287; Thu, 31 Mar 2022 04:19:40 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 02/11] qemu: add monitor commands to snapshot-{save, load, delete} Date: Thu, 31 Mar 2022 14:19:12 +0300 Message-Id: <20220331111921.450496-3-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725596618100005 Content-Type: text/plain; charset="utf-8"; x-default="true" Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_monitor.c | 53 ++++++++++++++++++ src/qemu/qemu_monitor.h | 23 ++++++++ src/qemu/qemu_monitor_json.c | 106 +++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 23 ++++++++ 4 files changed, 205 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 316cff5b9b..4b33407e50 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4566,3 +4566,56 @@ qemuMonitorChangeMemoryRequestedSize(qemuMonitor *mo= n, =20 return qemuMonitorJSONChangeMemoryRequestedSize(mon, alias, requesteds= ize); } + + +int +qemuMonitorSnapshotSave(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices) +{ + VIR_DEBUG("jobname=3D%s, snapid=3D%s, vmstateDevice=3D%s, devices=3D%p= , ndevices=3D%zd", + jobname, snapid, vmstateDevice, devices, ndevices); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONSnapshotSave(mon, jobname, snapid, vmstateDevice, + devices, ndevices); +} + + +int +qemuMonitorSnapshotLoad(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices) +{ + VIR_DEBUG("jobname=3D%s, snapid=3D%s, vmstateDevice=3D%s, devices=3D%p= , ndevices=3D%zd", + jobname, snapid, vmstateDevice, devices, ndevices); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONSnapshotLoad(mon, jobname, snapid, vmstateDevice, + devices, ndevices); +} + + +int +qemuMonitorSnapshotDelete(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char **devices, + size_t ndevices) +{ + VIR_DEBUG("jobname=3D%s, snapid=3D%s, devices=3D%p, ndevices=3D%zd", + jobname, snapid, devices, ndevices); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONSnapshotDelete(mon, jobname, snapid, + devices, ndevices); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 5c2a749282..8067236693 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1588,3 +1588,26 @@ int qemuMonitorChangeMemoryRequestedSize(qemuMonitor *mon, const char *alias, unsigned long long requestedsize); + +int +qemuMonitorSnapshotSave(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices); + +int +qemuMonitorSnapshotLoad(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices); + +int +qemuMonitorSnapshotDelete(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char **devices, + size_t ndevices); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index d5622bd6d9..864be427c3 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8966,3 +8966,109 @@ qemuMonitorJSONChangeMemoryRequestedSize(qemuMonito= r *mon, =20 return qemuMonitorJSONSetObjectProperty(mon, path, "requested-size", &= prop); } + + +int +qemuMonitorJSONSnapshotSave(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices) +{ + g_autoptr(virJSONValue) devicesJSON =3D virJSONValueNewArray(); + g_autoptr(virJSONValue) cmd =3D NULL; + g_autoptr(virJSONValue) reply =3D NULL; + size_t i; + + for (i =3D 0; i < ndevices; i++) + if (virJSONValueArrayAppendString(devicesJSON, devices[i]) < 0) + return -1; + + cmd =3D qemuMonitorJSONMakeCommand("snapshot-save", + "s:job-id", jobname, + "s:tag", snapid, + "s:vmstate", vmstateDevice, + "a:devices", &devicesJSON, + NULL); + if (!cmd) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + return 0; +} + + +int +qemuMonitorJSONSnapshotLoad(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices) +{ + g_autoptr(virJSONValue) devicesJSON =3D virJSONValueNewArray(); + g_autoptr(virJSONValue) cmd =3D NULL; + g_autoptr(virJSONValue) reply =3D NULL; + size_t i; + + for (i =3D 0; i < ndevices; i++) + if (virJSONValueArrayAppendString(devicesJSON, devices[i]) < 0) + return -1; + + cmd =3D qemuMonitorJSONMakeCommand("snapshot-load", + "s:job-id", jobname, + "s:tag", snapid, + "s:vmstate", vmstateDevice, + "a:devices", &devicesJSON, + NULL); + if (!cmd) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + return 0; +} + + +int +qemuMonitorJSONSnapshotDelete(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char **devices, + size_t ndevices) +{ + g_autoptr(virJSONValue) devicesJSON =3D virJSONValueNewArray(); + g_autoptr(virJSONValue) cmd =3D NULL; + g_autoptr(virJSONValue) reply =3D NULL; + size_t i; + + for (i =3D 0; i < ndevices; i++) + if (virJSONValueArrayAppendString(devicesJSON, devices[i]) < 0) + return -1; + + cmd =3D qemuMonitorJSONMakeCommand("snapshot-delete", + "s:job-id", jobname, + "s:tag", snapid, + "a:devices", &devicesJSON, + NULL); + if (!cmd) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + return 0; +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 982fbad44e..73849c4a4b 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -873,3 +873,26 @@ int qemuMonitorJSONChangeMemoryRequestedSize(qemuMonitor *mon, const char *alias, unsigned long long requestedsize); + +int +qemuMonitorJSONSnapshotSave(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices); + +int +qemuMonitorJSONSnapshotLoad(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char *vmstateDevice, + const char **devices, + size_t ndevices); + +int +qemuMonitorJSONSnapshotDelete(qemuMonitor *mon, + const char *jobname, + const char *snapid, + const char **devices, + size_t ndevices); --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1648725593595963.8302979331761; Thu, 31 Mar 2022 04:19:53 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-626-Vah-c440MpKmr7_Btg97GA-1; Thu, 31 Mar 2022 07:19:48 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B2F94180075B; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9CCE3400E42D; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id DDE241947BBD; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 950FA1940345 for ; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 783B4400E132; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 73B4440D1B9B for ; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 53FF5805F46 for ; Thu, 31 Mar 2022 11:19:45 +0000 (UTC) Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-608-3CBZ0cv5OfiF2E3_dr5Yyw-1; Thu, 31 Mar 2022 07:19:43 -0400 Received: by mail-lf1-f54.google.com with SMTP id bu29so40991942lfb.0 for ; Thu, 31 Mar 2022 04:19:43 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:40 -0700 (PDT) X-MC-Unique: Vah-c440MpKmr7_Btg97GA-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: 3CBZ0cv5OfiF2E3_dr5Yyw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=LuMVXZxFvxI52RhGfU/tInpdoB0aJ6oBfZi4dl5yDmA=; b=UKw1ti3aUo//u8huuliS5j/ifkZ/lg0btVD7KLtylZf1/w6w1SQLJKY84kOdoKb5EI 2PtJW+xvNZijMNtGOjutmm8a5hxLQvubdzES/B93AjVwKfL9ydEyLRx+k5s4X4wsoUaX CLdEGIiV4nW3m/j3ok0ZXZLXfnrFLQ2s/QZSiGITfaUNszyf/EbbQqea384++ZG3J9sV AVd+SPZKdbcTtEYmwnuK2BvdSl2NvrO5YnmlzkKjO9XJ42x5scUeKrjCsZvHvdCirfiE bEJGubc/GnItWH0q+sXbYtKUYRphs7Pq57Jq6qPlhEzSOvF67qxB0i3TLDQ6mGVeOwP1 OWdg== X-Gm-Message-State: AOAM532fcC3ZxqNnNMu/wQahcothAB9AJSs0CGoA3lqNiCEA+PVEbo/1 oJ6l4oYwe35yVkSYHOETLUHBJ+l4bnByVA== X-Google-Smtp-Source: ABdhPJyH7KgdIzC4JCd6aatELC7y9UMNCmzICdrD0ZQLNOTEJVTKZYokhBzBxf+myi4XX3oRXrMsXQ== X-Received: by 2002:a05:6512:6d:b0:44a:42b7:e775 with SMTP id i13-20020a056512006d00b0044a42b7e775mr10622462lfo.33.1648725581108; Thu, 31 Mar 2022 04:19:41 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 03/11] qemu: move snapshot related funcs from domain.c to snapshot.c Date: Thu, 31 Mar 2022 14:19:13 +0300 Message-Id: <20220331111921.450496-4-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725595093100003 Content-Type: text/plain; charset="utf-8"; x-default="true" These functions mostly used from the qemu_snapshot.c and also semantically they belong to this source file. At the same time rename qemuDomainSnapshot* to qemuSnaphot*. Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_domain.c | 241 +---------------------------------- src/qemu/qemu_domain.h | 19 --- src/qemu/qemu_driver.c | 8 +- src/qemu/qemu_snapshot.c | 268 ++++++++++++++++++++++++++++++++++++--- src/qemu/qemu_snapshot.h | 10 ++ 5 files changed, 269 insertions(+), 277 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 18d403e099..56cf0c3f68 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -38,6 +38,7 @@ #include "qemu_checkpoint.h" #include "qemu_validate.h" #include "qemu_namespace.h" +#include "qemu_snapshot.h" #include "viralloc.h" #include "virlog.h" #include "virerror.h" @@ -64,7 +65,6 @@ #include "virsecret.h" #include "logging/log_manager.h" #include "locking/domain_lock.h" -#include "virdomainsnapshotobjlist.h" #include "virdomaincheckpointobjlist.h" #include "backup_conf.h" #include "virutil.h" @@ -7041,243 +7041,6 @@ qemuFindQemuImgBinary(virQEMUDriver *driver) return driver->qemuImgBinary; } =20 -int -qemuDomainSnapshotWriteMetadata(virDomainObj *vm, - virDomainMomentObj *snapshot, - virDomainXMLOption *xmlopt, - const char *snapshotDir) -{ - g_autofree char *newxml =3D NULL; - g_autofree char *snapDir =3D NULL; - g_autofree char *snapFile =3D NULL; - char uuidstr[VIR_UUID_STRING_BUFLEN]; - unsigned int flags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | - VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL; - virDomainSnapshotDef *def =3D virDomainSnapshotObjGetDef(snapshot); - - if (virDomainSnapshotGetCurrent(vm->snapshots) =3D=3D snapshot) - flags |=3D VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT; - virUUIDFormat(vm->def->uuid, uuidstr); - newxml =3D virDomainSnapshotDefFormat(uuidstr, def, xmlopt, flags); - if (newxml =3D=3D NULL) - return -1; - - snapDir =3D g_strdup_printf("%s/%s", snapshotDir, vm->def->name); - if (g_mkdir_with_parents(snapDir, 0777) < 0) { - virReportSystemError(errno, _("cannot create snapshot directory '%= s'"), - snapDir); - return -1; - } - - snapFile =3D g_strdup_printf("%s/%s.xml", snapDir, def->parent.name); - - return virXMLSaveFile(snapFile, NULL, "snapshot-edit", newxml); -} - - -/* The domain is expected to be locked and inactive. Return -1 on normal - * failure, 1 if we skipped a disk due to try_all. */ -static int -qemuDomainSnapshotForEachQcow2Raw(virQEMUDriver *driver, - virDomainDef *def, - virDomainMomentObj *snap, - const char *op, - bool try_all, - int ndisks) -{ - virDomainSnapshotDef *snapdef =3D virDomainSnapshotObjGetDef(snap); - const char *qemuimgbin; - size_t i; - bool skipped =3D false; - - qemuimgbin =3D qemuFindQemuImgBinary(driver); - if (qemuimgbin =3D=3D NULL) { - /* qemuFindQemuImgBinary set the error */ - return -1; - } - - for (i =3D 0; i < ndisks; i++) { - g_autoptr(virCommand) cmd =3D virCommandNewArgList(qemuimgbin, "sn= apshot", - op, snap->def->na= me, NULL); - int format =3D virDomainDiskGetFormat(def->disks[i]); - - /* FIXME: we also need to handle LVM here */ - if (def->disks[i]->device !=3D VIR_DOMAIN_DISK_DEVICE_DISK || - snapdef->disks[i].snapshot !=3D VIR_DOMAIN_SNAPSHOT_LOCATION_I= NTERNAL) - continue; - - if (!virStorageSourceIsLocalStorage(def->disks[i]->src)) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("can't manipulate inactive snapshots of disk = '%s'"), - def->disks[i]->dst); - return -1; - } - - if (format > 0 && format !=3D VIR_STORAGE_FILE_QCOW2) { - if (try_all) { - /* Continue on even in the face of error, since other - * disks in this VM may have the same snapshot name. - */ - VIR_WARN("skipping snapshot action on %s", - def->disks[i]->dst); - skipped =3D true; - continue; - } else if (STREQ(op, "-c") && i) { - /* We must roll back partial creation by deleting - * all earlier snapshots. */ - qemuDomainSnapshotForEachQcow2Raw(driver, def, snap, - "-d", false, i); - } - virReportError(VIR_ERR_OPERATION_INVALID, - _("Disk device '%s' does not support snapshotti= ng"), - def->disks[i]->dst); - return -1; - } - - virCommandAddArg(cmd, virDomainDiskGetSource(def->disks[i])); - - if (virCommandRun(cmd, NULL) < 0) { - if (try_all) { - VIR_WARN("skipping snapshot action on %s", - def->disks[i]->dst); - skipped =3D true; - continue; - } else if (STREQ(op, "-c") && i) { - /* We must roll back partial creation by deleting - * all earlier snapshots. */ - qemuDomainSnapshotForEachQcow2Raw(driver, def, snap, - "-d", false, i); - } - return -1; - } - } - - return skipped ? 1 : 0; -} - -/* The domain is expected to be locked and inactive. Return -1 on normal - * failure, 1 if we skipped a disk due to try_all. */ -int -qemuDomainSnapshotForEachQcow2(virQEMUDriver *driver, - virDomainDef *def, - virDomainMomentObj *snap, - const char *op, - bool try_all) -{ - return qemuDomainSnapshotForEachQcow2Raw(driver, def, snap, - op, try_all, def->ndisks); -} - -/* Discard one snapshot (or its metadata), without reparenting any childre= n. */ -int -qemuDomainSnapshotDiscard(virQEMUDriver *driver, - virDomainObj *vm, - virDomainMomentObj *snap, - bool update_parent, - bool metadata_only) -{ - g_autofree char *snapFile =3D NULL; - qemuDomainObjPrivate *priv; - virDomainMomentObj *parentsnap =3D NULL; - g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); - - if (!metadata_only) { - if (!virDomainObjIsActive(vm)) { - size_t i; - /* Ignore any skipped disks */ - - /* Prefer action on the disks in use at the time the snapshot = was - * created; but fall back to current definition if dealing wit= h a - * snapshot created prior to libvirt 0.9.5. */ - virDomainDef *def =3D snap->def->dom; - - if (!def) - def =3D vm->def; - - for (i =3D 0; i < def->ndisks; i++) { - if (virDomainDiskTranslateSourcePool(def->disks[i]) < 0) - return -1; - } - - if (qemuDomainSnapshotForEachQcow2(driver, def, snap, "-d", tr= ue) < 0) - return -1; - } else { - priv =3D vm->privateData; - qemuDomainObjEnterMonitor(driver, vm); - /* we continue on even in the face of error */ - qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); - qemuDomainObjExitMonitor(vm); - } - } - - snapFile =3D g_strdup_printf("%s/%s/%s.xml", cfg->snapshotDir, vm->def= ->name, - snap->def->name); - - if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { - virDomainSnapshotSetCurrent(vm->snapshots, NULL); - if (update_parent && snap->def->parent_name) { - parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->parent_nam= e); - if (!parentsnap) { - VIR_WARN("missing parent snapshot matching name '%s'", - snap->def->parent_name); - } else { - virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); - if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, - driver->xmlopt, - cfg->snapshotDir) < 0)= { - VIR_WARN("failed to set parent snapshot '%s' as curren= t", - snap->def->parent_name); - virDomainSnapshotSetCurrent(vm->snapshots, NULL); - } - } - } - } - - if (unlink(snapFile) < 0) - VIR_WARN("Failed to unlink %s", snapFile); - if (update_parent) - virDomainMomentDropParent(snap); - virDomainSnapshotObjListRemove(vm->snapshots, snap); - - return 0; -} - -/* Hash iterator callback to discard multiple snapshots. */ -int qemuDomainMomentDiscardAll(void *payload, - const char *name G_GNUC_UNUSED, - void *data) -{ - virDomainMomentObj *moment =3D payload; - virQEMUMomentRemove *curr =3D data; - int err; - - if (!curr->found && curr->current =3D=3D moment) - curr->found =3D true; - err =3D curr->momentDiscard(curr->driver, curr->vm, moment, false, - curr->metadata_only); - if (err && !curr->err) - curr->err =3D err; - return 0; -} - -int -qemuDomainSnapshotDiscardAllMetadata(virQEMUDriver *driver, - virDomainObj *vm) -{ - virQEMUMomentRemove rem =3D { - .driver =3D driver, - .vm =3D vm, - .metadata_only =3D true, - .momentDiscard =3D qemuDomainSnapshotDiscard, - }; - - virDomainSnapshotForEach(vm->snapshots, qemuDomainMomentDiscardAll, &r= em); - virDomainSnapshotObjListRemoveAll(vm->snapshots); - - return rem.err; -} - =20 static void qemuDomainRemoveInactiveCommon(virQEMUDriver *driver, @@ -7288,7 +7051,7 @@ qemuDomainRemoveInactiveCommon(virQEMUDriver *driver, g_autofree char *chkDir =3D NULL; =20 /* Remove any snapshot metadata prior to removing the domain */ - if (qemuDomainSnapshotDiscardAllMetadata(driver, vm) < 0) { + if (qemuSnapshotDiscardAllMetadata(driver, vm) < 0) { VIR_WARN("unable to remove all snapshots for domain %s", vm->def->name); } else { diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index a41d8308e3..494a276212 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -633,22 +633,6 @@ int qemuDomainLogAppendMessage(virQEMUDriver *driver, =20 const char *qemuFindQemuImgBinary(virQEMUDriver *driver); =20 -int qemuDomainSnapshotWriteMetadata(virDomainObj *vm, - virDomainMomentObj *snapshot, - virDomainXMLOption *xmlopt, - const char *snapshotDir); - -int qemuDomainSnapshotForEachQcow2(virQEMUDriver *driver, - virDomainDef *def, - virDomainMomentObj *snap, - const char *op, - bool try_all); - -int qemuDomainSnapshotDiscard(virQEMUDriver *driver, - virDomainObj *vm, - virDomainMomentObj *snap, - bool update_current, - bool metadata_only); =20 typedef struct _virQEMUMomentRemove virQEMUMomentRemove; struct _virQEMUMomentRemove { @@ -666,9 +650,6 @@ int qemuDomainMomentDiscardAll(void *payload, const char *name, void *data); =20 -int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriver *driver, - virDomainObj *vm); - void qemuDomainRemoveInactive(virQEMUDriver *driver, virDomainObj *vm); =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 77012eb527..74bc2c7bf4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6568,7 +6568,7 @@ qemuDomainUndefineFlags(virDomainPtr dom, nsnapshots); goto endjob; } - if (qemuDomainSnapshotDiscardAllMetadata(driver, vm) < 0) + if (qemuSnapshotDiscardAllMetadata(driver, vm) < 0) goto endjob; } if (!virDomainObjIsActive(vm) && @@ -19132,9 +19132,9 @@ qemuDomainSnapshotWriteMetadataIter(void *payload, virQEMUDriverConfig *cfg =3D virQEMUDriverGetConfig(data->driver); int ret; =20 - ret =3D qemuDomainSnapshotWriteMetadata(data->vm, payload, - data->driver->xmlopt, - cfg->snapshotDir); + ret =3D qemuSnapshotWriteMetadata(data->vm, payload, + data->driver->xmlopt, + cfg->snapshotDir); =20 virObjectUnref(cfg); return ret; diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 5d622592c3..878a0abb34 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -49,6 +49,175 @@ VIR_LOG_INIT("qemu.qemu_snapshot"); =20 =20 +/* The domain is expected to be locked and inactive. Return -1 on normal + * failure, 1 if we skipped a disk due to try_all. */ +static int +qemuSnapshotForEachQcow2Raw(virQEMUDriver *driver, + virDomainDef *def, + virDomainMomentObj *snap, + const char *op, + bool try_all, + int ndisks) +{ + virDomainSnapshotDef *snapdef =3D virDomainSnapshotObjGetDef(snap); + const char *qemuimgbin; + size_t i; + bool skipped =3D false; + + qemuimgbin =3D qemuFindQemuImgBinary(driver); + if (qemuimgbin =3D=3D NULL) { + /* qemuFindQemuImgBinary set the error */ + return -1; + } + + for (i =3D 0; i < ndisks; i++) { + g_autoptr(virCommand) cmd =3D virCommandNewArgList(qemuimgbin, "sn= apshot", + op, snap->def->na= me, NULL); + int format =3D virDomainDiskGetFormat(def->disks[i]); + + /* FIXME: we also need to handle LVM here */ + if (def->disks[i]->device !=3D VIR_DOMAIN_DISK_DEVICE_DISK || + snapdef->disks[i].snapshot !=3D VIR_DOMAIN_SNAPSHOT_LOCATION_I= NTERNAL) + continue; + + if (!virStorageSourceIsLocalStorage(def->disks[i]->src)) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("can't manipulate inactive snapshots of disk = '%s'"), + def->disks[i]->dst); + return -1; + } + + if (format > 0 && format !=3D VIR_STORAGE_FILE_QCOW2) { + if (try_all) { + /* Continue on even in the face of error, since other + * disks in this VM may have the same snapshot name. + */ + VIR_WARN("skipping snapshot action on %s", + def->disks[i]->dst); + skipped =3D true; + continue; + } else if (STREQ(op, "-c") && i) { + /* We must roll back partial creation by deleting + * all earlier snapshots. */ + qemuSnapshotForEachQcow2Raw(driver, def, snap, "-d", false= , i); + } + virReportError(VIR_ERR_OPERATION_INVALID, + _("Disk device '%s' does not support snapshotti= ng"), + def->disks[i]->dst); + return -1; + } + + virCommandAddArg(cmd, virDomainDiskGetSource(def->disks[i])); + + if (virCommandRun(cmd, NULL) < 0) { + if (try_all) { + VIR_WARN("skipping snapshot action on %s", + def->disks[i]->dst); + skipped =3D true; + continue; + } else if (STREQ(op, "-c") && i) { + /* We must roll back partial creation by deleting + * all earlier snapshots. */ + qemuSnapshotForEachQcow2Raw(driver, def, snap, "-d", false= , i); + } + return -1; + } + } + + return skipped ? 1 : 0; +} + + +/* The domain is expected to be locked and inactive. Return -1 on normal + * failure, 1 if we skipped a disk due to try_all. */ +static int +qemuSnapshotForEachQcow2(virQEMUDriver *driver, + virDomainDef *def, + virDomainMomentObj *snap, + const char *op, + bool try_all) +{ + return qemuSnapshotForEachQcow2Raw(driver, def, snap, + op, try_all, def->ndisks); +} + + +/* Discard one snapshot (or its metadata), without reparenting any childre= n. */ +static int +qemuSnapshotDiscard(virQEMUDriver *driver, + virDomainObj *vm, + virDomainMomentObj *snap, + bool update_parent, + bool metadata_only) +{ + g_autofree char *snapFile =3D NULL; + qemuDomainObjPrivate *priv; + virDomainMomentObj *parentsnap =3D NULL; + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + + if (!metadata_only) { + if (!virDomainObjIsActive(vm)) { + size_t i; + /* Ignore any skipped disks */ + + /* Prefer action on the disks in use at the time the snapshot = was + * created; but fall back to current definition if dealing wit= h a + * snapshot created prior to libvirt 0.9.5. */ + virDomainDef *def =3D snap->def->dom; + + if (!def) + def =3D vm->def; + + for (i =3D 0; i < def->ndisks; i++) { + if (virDomainDiskTranslateSourcePool(def->disks[i]) < 0) + return -1; + } + + if (qemuSnapshotForEachQcow2(driver, def, snap, "-d", true) < = 0) + return -1; + } else { + priv =3D vm->privateData; + qemuDomainObjEnterMonitor(driver, vm); + /* we continue on even in the face of error */ + qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); + qemuDomainObjExitMonitor(vm); + } + } + + snapFile =3D g_strdup_printf("%s/%s/%s.xml", cfg->snapshotDir, vm->def= ->name, + snap->def->name); + + if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { + virDomainSnapshotSetCurrent(vm->snapshots, NULL); + if (update_parent && snap->def->parent_name) { + parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, + snap->def->parent_nam= e); + if (!parentsnap) { + VIR_WARN("missing parent snapshot matching name '%s'", + snap->def->parent_name); + } else { + virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); + if (qemuSnapshotWriteMetadata(vm, parentsnap, + driver->xmlopt, + cfg->snapshotDir) < 0) { + VIR_WARN("failed to set parent snapshot '%s' as curren= t", + snap->def->parent_name); + virDomainSnapshotSetCurrent(vm->snapshots, NULL); + } + } + } + } + + if (unlink(snapFile) < 0) + VIR_WARN("Failed to unlink %s", snapFile); + if (update_parent) + virDomainMomentDropParent(snap); + virDomainSnapshotObjListRemove(vm->snapshots, snap); + + return 0; +} + + /** * qemuSnapshotSetCurrent: Set currently active snapshot * @@ -73,7 +242,7 @@ qemuSnapshotSetCurrent(virDomainObj *vm, * 'active' property */ if (oldcurrent && oldcurrent !=3D newcurrent) { - if (qemuDomainSnapshotWriteMetadata(vm, oldcurrent, driver->xmlopt= , cfg->snapshotDir) < 0) + if (qemuSnapshotWriteMetadata(vm, oldcurrent, driver->xmlopt, cfg-= >snapshotDir) < 0) VIR_WARN("failed to update old current snapshot"); } } @@ -167,7 +336,7 @@ qemuSnapshotCreateInactiveInternal(virQEMUDriver *drive= r, virDomainObj *vm, virDomainMomentObj *snap) { - return qemuDomainSnapshotForEachQcow2(driver, vm->def, snap, "-c", fal= se); + return qemuSnapshotForEachQcow2(driver, vm->def, snap, "-c", false); } =20 =20 @@ -1691,9 +1860,8 @@ qemuSnapshotCreateWriteMetadata(virDomainObj *vm, virQEMUDriver *driver, virQEMUDriverConfig *cfg) { - if (qemuDomainSnapshotWriteMetadata(vm, snap, - driver->xmlopt, - cfg->snapshotDir) < 0) { + if (qemuSnapshotWriteMetadata(vm, snap, driver->xmlopt, + cfg->snapshotDir) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to save metadata for snapshot %s"), snap->def->name); @@ -2005,9 +2173,8 @@ qemuSnapshotRevertWriteMetadata(virDomainObj *vm, bool defined) { qemuSnapshotSetCurrent(vm, snap); - if (qemuDomainSnapshotWriteMetadata(vm, snap, - driver->xmlopt, - cfg->snapshotDir) < 0) { + if (qemuSnapshotWriteMetadata(vm, snap, driver->xmlopt, + cfg->snapshotDir) < 0) { virDomainSnapshotSetCurrent(vm->snapshots, NULL); return -1; } @@ -2146,7 +2313,7 @@ qemuSnapshotInternalRevertInactive(virQEMUDriver *dri= ver, } =20 /* Try all disks, but report failure if we skipped any. */ - if (qemuDomainSnapshotForEachQcow2(driver, def, snap, "-a", true) !=3D= 0) + if (qemuSnapshotForEachQcow2(driver, def, snap, "-a", true) !=3D 0) return -1; =20 return 0; @@ -2415,7 +2582,7 @@ qemuSnapshotDelete(virDomainObj *vm, rem.err =3D 0; rem.current =3D virDomainSnapshotGetCurrent(vm->snapshots); rem.found =3D false; - rem.momentDiscard =3D qemuDomainSnapshotDiscard; + rem.momentDiscard =3D qemuSnapshotDiscard; virDomainMomentForEachDescendant(snap, qemuDomainMomentDiscardAll, &rem); if (rem.err < 0) @@ -2424,9 +2591,8 @@ qemuSnapshotDelete(virDomainObj *vm, qemuSnapshotSetCurrent(vm, snap); =20 if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { - if (qemuDomainSnapshotWriteMetadata(vm, snap, - driver->xmlopt, - cfg->snapshotDir) < 0)= { + if (qemuSnapshotWriteMetadata(vm, snap, driver->xmlopt, + cfg->snapshotDir) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as curre= nt"), snap->def->name); @@ -2441,7 +2607,7 @@ qemuSnapshotDelete(virDomainObj *vm, rep.vm =3D vm; rep.err =3D 0; rep.xmlopt =3D driver->xmlopt; - rep.writeMetadata =3D qemuDomainSnapshotWriteMetadata; + rep.writeMetadata =3D qemuSnapshotWriteMetadata; virDomainMomentForEachChild(snap, qemuSnapshotChildrenReparent, &rep); @@ -2454,7 +2620,7 @@ qemuSnapshotDelete(virDomainObj *vm, virDomainMomentDropChildren(snap); ret =3D 0; } else { - ret =3D qemuDomainSnapshotDiscard(driver, vm, snap, true, metadata= _only); + ret =3D qemuSnapshotDiscard(driver, vm, snap, true, metadata_only); } =20 endjob: @@ -2462,3 +2628,75 @@ qemuSnapshotDelete(virDomainObj *vm, =20 return ret; } + + +int +qemuSnapshotWriteMetadata(virDomainObj *vm, + virDomainMomentObj *snapshot, + virDomainXMLOption *xmlopt, + const char *snapshotDir) +{ + g_autofree char *newxml =3D NULL; + g_autofree char *snapDir =3D NULL; + g_autofree char *snapFile =3D NULL; + char uuidstr[VIR_UUID_STRING_BUFLEN]; + unsigned int flags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | + VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL; + virDomainSnapshotDef *def =3D virDomainSnapshotObjGetDef(snapshot); + + if (virDomainSnapshotGetCurrent(vm->snapshots) =3D=3D snapshot) + flags |=3D VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT; + virUUIDFormat(vm->def->uuid, uuidstr); + newxml =3D virDomainSnapshotDefFormat(uuidstr, def, xmlopt, flags); + if (newxml =3D=3D NULL) + return -1; + + snapDir =3D g_strdup_printf("%s/%s", snapshotDir, vm->def->name); + if (g_mkdir_with_parents(snapDir, 0777) < 0) { + virReportSystemError(errno, _("cannot create snapshot directory '%= s'"), + snapDir); + return -1; + } + + snapFile =3D g_strdup_printf("%s/%s.xml", snapDir, def->parent.name); + + return virXMLSaveFile(snapFile, NULL, "snapshot-edit", newxml); +} + + +/* Hash iterator callback to discard multiple snapshots. */ +int +qemuDomainMomentDiscardAll(void *payload, + const char *name G_GNUC_UNUSED, + void *data) +{ + virDomainMomentObj *moment =3D payload; + virQEMUMomentRemove *curr =3D data; + int err; + + if (!curr->found && curr->current =3D=3D moment) + curr->found =3D true; + err =3D curr->momentDiscard(curr->driver, curr->vm, moment, false, + curr->metadata_only); + if (err && !curr->err) + curr->err =3D err; + return 0; +} + + +int +qemuSnapshotDiscardAllMetadata(virQEMUDriver *driver, + virDomainObj *vm) +{ + virQEMUMomentRemove rem =3D { + .driver =3D driver, + .vm =3D vm, + .metadata_only =3D true, + .momentDiscard =3D qemuSnapshotDiscard, + }; + + virDomainSnapshotForEach(vm->snapshots, qemuDomainMomentDiscardAll, &r= em); + virDomainSnapshotObjListRemoveAll(vm->snapshots); + + return rem.err; +} diff --git a/src/qemu/qemu_snapshot.h b/src/qemu/qemu_snapshot.h index 0cc38c0039..016d18449a 100644 --- a/src/qemu/qemu_snapshot.h +++ b/src/qemu/qemu_snapshot.h @@ -81,3 +81,13 @@ qemuSnapshotDiskCreate(qemuSnapshotDiskContext *snapctxt= ); virDomainSnapshotDiskDef * qemuSnapshotGetTransientDiskDef(virDomainDiskDef *domdisk, const char *suffix); + +int +qemuSnapshotWriteMetadata(virDomainObj *vm, + virDomainMomentObj *snapshot, + virDomainXMLOption *xmlopt, + const char *snapshotDir); + +int +qemuSnapshotDiscardAllMetadata(virQEMUDriver *driver, + virDomainObj *vm); --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1648725596559582.9949210405921; Thu, 31 Mar 2022 04:19:56 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-573-dQ09dVU1Pba03k1Ph9A7wg-1; Thu, 31 Mar 2022 07:19:53 -0400 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8FADD899EC5; Thu, 31 Mar 2022 11:19:50 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7AA525B1588; Thu, 31 Mar 2022 11:19:50 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 493701947BBB; Thu, 31 Mar 2022 11:19:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 46F551940353 for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 32BE7C08090; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast09.extmail.prod.ext.rdu2.redhat.com [10.11.55.25]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2ECCFC08087 for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 149A028035FF for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-349-XGDLXTUAMhudjWIcGPferQ-1; Thu, 31 Mar 2022 07:19:44 -0400 Received: by mail-lf1-f42.google.com with SMTP id d5so40876644lfj.9 for ; Thu, 31 Mar 2022 04:19:43 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:41 -0700 (PDT) X-MC-Unique: dQ09dVU1Pba03k1Ph9A7wg-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: XGDLXTUAMhudjWIcGPferQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mPYENgvRXXlsWI4X8xQyd2q9lq7cajT8xdjZDb2iXTQ=; b=f8ANzWI8g8HbN2hpr92+HANaNTtePGoOaadIgQfPEdBNdxdO6TVV3gAmuDMJs2CSm8 VS7rItvYT4DEIW48aKV7Jh1MyqZhr+PKpXZYbUU9EnnFuo92QY3HB0n5rnnQ1viTsa+A EZS2kw5tOcK2Qpait9cp58jyGeBIUBh+1wxmKAhd9nWWnQWNNHy4/ke5aWzDYkYJVpNT VM5tZvBg9uV6BJ4x1EDvobkYiruQAe2g0CGbt0wAQSIhLTightC2AgOFS8h7XfU5TT/+ QmY0x7C0Ol8UHRuA9osDwlLfWW35phTGv0oub/JiluF//ikvLeBr9fexZcHsIhQ+syDi bfjg== X-Gm-Message-State: AOAM530todTsvsB1ntR1inL+NpTrfmllWfOW2XRxCPHovbGrrgdSsmw5 l6KHVk3gOQrQKyB2FUPFuOjIL2W+UaP75w== X-Google-Smtp-Source: ABdhPJy8aTB/aq3SgR9Hcic8xh0x6/mlFpOr77EMxcGDdTj3go4VK8J2K9JJYu8UnA9dMmqC4fJoMg== X-Received: by 2002:a05:6512:ad5:b0:44a:614e:9d61 with SMTP id n21-20020a0565120ad500b0044a614e9d61mr10531596lfu.677.1648725581884; Thu, 31 Mar 2022 04:19:41 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 04/11] qemu: introduce QEMU_ASYNC_JOB_SNAPSHOT_DELETE Date: Thu, 31 Mar 2022 14:19:14 +0300 Message-Id: <20220331111921.450496-5-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725598626100011 Content-Type: text/plain; charset="utf-8"; x-default="true" We are going to use this job for snapshot delete API. Currently snapshot delete API uses QEMU_JOB_MODIFY. Signed-off-by: Nikolay Shirokovskiy --- src/hypervisor/domain_job.c | 1 + src/hypervisor/domain_job.h | 1 + src/qemu/qemu_domainjob.c | 2 ++ src/qemu/qemu_driver.c | 6 ++++++ src/qemu/qemu_migration.c | 2 ++ src/qemu/qemu_process.c | 3 +++ 6 files changed, 15 insertions(+) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index ff4e008cb5..ad71a77150 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -37,6 +37,7 @@ VIR_ENUM_IMPL(virDomainAsyncJob, "save", "dump", "snapshot", + "snapshot delete", "start", "backup", ); diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index db8b8b1390..cb24e3f743 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -63,6 +63,7 @@ typedef enum { VIR_ASYNC_JOB_SAVE, VIR_ASYNC_JOB_DUMP, VIR_ASYNC_JOB_SNAPSHOT, + VIR_ASYNC_JOB_SNAPSHOT_DELETE, VIR_ASYNC_JOB_START, VIR_ASYNC_JOB_BACKUP, =20 diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index 56a3f6cb19..89f721abc9 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -85,6 +85,7 @@ virDomainAsyncJobPhaseToString(virDomainAsyncJob job, case VIR_ASYNC_JOB_SAVE: case VIR_ASYNC_JOB_DUMP: case VIR_ASYNC_JOB_SNAPSHOT: + case VIR_ASYNC_JOB_SNAPSHOT_DELETE: case VIR_ASYNC_JOB_START: case VIR_ASYNC_JOB_NONE: case VIR_ASYNC_JOB_BACKUP: @@ -111,6 +112,7 @@ virDomainAsyncJobPhaseFromString(virDomainAsyncJob job, case VIR_ASYNC_JOB_SAVE: case VIR_ASYNC_JOB_DUMP: case VIR_ASYNC_JOB_SNAPSHOT: + case VIR_ASYNC_JOB_SNAPSHOT_DELETE: case VIR_ASYNC_JOB_START: case VIR_ASYNC_JOB_NONE: case VIR_ASYNC_JOB_BACKUP: diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 74bc2c7bf4..547cffa1bc 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12741,6 +12741,12 @@ static int qemuDomainAbortJob(virDomainPtr dom) ret =3D 0; break; =20 + case VIR_ASYNC_JOB_SNAPSHOT_DELETE: + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("snapshot deletion expected to be exclusive job")= ); + goto endjob; + break; + case VIR_ASYNC_JOB_LAST: default: virReportEnumRangeError(virDomainAsyncJob, priv->job.asyncJob); diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3e653543c6..cb4c0e544a 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1717,6 +1717,8 @@ qemuMigrationJobName(virDomainObj *vm) return _("snapshot job"); case VIR_ASYNC_JOB_START: return _("start job"); + case VIR_ASYNC_JOB_SNAPSHOT_DELETE: + return _("snapshot delete job"); case VIR_ASYNC_JOB_BACKUP: return _("backup job"); case VIR_ASYNC_JOB_LAST: diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index f110e4f3dd..9918423701 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3648,6 +3648,9 @@ qemuProcessRecoverJob(virQEMUDriver *driver, /* Already handled in VIR_DOMAIN_PAUSED_STARTING_UP check. */ break; =20 + case VIR_ASYNC_JOB_SNAPSHOT_DELETE: + break; + case VIR_ASYNC_JOB_BACKUP: ignore_value(virTimeMillisNow(&now)); =20 --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1648725594908365.19896329015694; Thu, 31 Mar 2022 04:19:54 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-134-CBA3Y1g-OvmSyhKUHEVdxw-1; Thu, 31 Mar 2022 07:19:52 -0400 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 76E892803592; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 30FB9401E67; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id EAD041947BBB; Thu, 31 Mar 2022 11:19:48 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 95BAC19451F3 for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 8B0685B158F; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 873B05B158B for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6E84F82A682 for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-583-XHjp728WNEOz8JuaQxFzZA-1; Thu, 31 Mar 2022 07:19:44 -0400 Received: by mail-lf1-f43.google.com with SMTP id t25so40869964lfg.7 for ; Thu, 31 Mar 2022 04:19:44 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:42 -0700 (PDT) X-MC-Unique: CBA3Y1g-OvmSyhKUHEVdxw-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: XHjp728WNEOz8JuaQxFzZA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AXIZl9qsh06EPXXp7rTaWCYLGqd8QhGF96p2Qupqxio=; b=z8T1ZXI2UW2fizkcnhqYUeGcgPp8ufOQwhOPxcSYieM6xY0rIn0+kBoqawuVSQwIjf TPjULRhoEl0mQT4nHtNgV3uoQTVTvgY5fCQybB5IvcDu1/A4XGBdVsMwkXrrWHdLjyDU cQObUNG9FsFPBFXL+2tZwHmcmDxqu1hWo2whjV5yuIz2QbqhPDaIsP5gAPPHkbmEgXBB 7sDNbwK/A1QdCFL34ebL+TpA7bgsTEFQ8/uH79EwPjLZCl75MA+dYkH5ubefzEYjuGqH HCE9vlG4cOGd7Q2meD6wqUpZ9a76ik4OmENXbN/tCurC/W9B+GWVdoIOmsxuplSm9KMt dVbA== X-Gm-Message-State: AOAM532g8Lon/zxH47ICgBa4QMbubO/I1wVqKp/OyTR1jDXwXcaSZBTL amLKs43FC/2PO+SpDHTnzkr7O4mikh9v7g== X-Google-Smtp-Source: ABdhPJzLCijnKvGuTNuons8BLtzUG9K//1tRpPOlXDYd4Xac/PNb7jsvXcOwA5ztP5zp59EFfOaxTQ== X-Received: by 2002:a05:6512:3e0f:b0:44a:4c09:d506 with SMTP id i15-20020a0565123e0f00b0044a4c09d506mr10614296lfv.598.1648725582650; Thu, 31 Mar 2022 04:19:42 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 05/11] qemu: snapshot: prepare for async snapshot deletion Date: Thu, 31 Mar 2022 14:19:15 +0300 Message-Id: <20220331111921.450496-6-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725596629100006 Content-Type: text/plain; charset="utf-8"; x-default="true" Use async job instead of regular one as we are going to use async job harness to wait for snapshot-delete job completion in QEMU. We can use VIR_DOMAIN_JOB_OPERATION_UNKNOWN because it is used only when reporting job progress and getting job progress is disabled now for snapshot deletion. It is not clear whether we should add VIR_DOMAIN_JOB_OPERATION_SNAPSHOT_DELETE and report job progress in future as snapshot-deletion should not take much time I guess. Yet using VIR_DOMAIN_JOB_OPERATION_UNKNOWN seems to be brittle. Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_snapshot.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 878a0abb34..579d744c60 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -177,10 +177,12 @@ qemuSnapshotDiscard(virQEMUDriver *driver, return -1; } else { priv =3D vm->privateData; - qemuDomainObjEnterMonitor(driver, vm); - /* we continue on even in the face of error */ - qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); - qemuDomainObjExitMonitor(vm); + if (qemuDomainObjEnterMonitorAsync(driver, vm, + VIR_ASYNC_JOB_SNAPSHOT) =3D= =3D 0) { + /* we continue on even in the face of error */ + qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); + qemuDomainObjExitMonitor(vm); + } } } =20 @@ -2551,8 +2553,14 @@ qemuSnapshotDelete(virDomainObj *vm, VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY | VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY, -1); =20 - if (qemuDomainObjBeginJob(driver, vm, VIR_JOB_MODIFY) < 0) + /* + * For snapshot deletion quering stats/aborting is not supported yet + * thus disable any parallels jobs. + */ + if (qemuDomainObjBeginAsyncJob(driver, vm, VIR_ASYNC_JOB_SNAPSHOT_DELE= TE, + VIR_DOMAIN_JOB_OPERATION_UNKNOWN, flags= ) < 0) return -1; + qemuDomainObjSetAsyncJobMask(vm, VIR_JOB_NONE); =20 if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto endjob; @@ -2624,7 +2632,7 @@ qemuSnapshotDelete(virDomainObj *vm, } =20 endjob: - qemuDomainObjEndJob(vm); + qemuDomainObjEndAsyncJob(vm); =20 return ret; } --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1648725597493220.9035638744465; Thu, 31 Mar 2022 04:19:57 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-368-_VzHbHbTOy2L680R1XejIQ-1; Thu, 31 Mar 2022 07:19:52 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id CEA8D899EEF; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id B6B4E40CFD02; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 94FC81947BBC; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 3BEC619451F3 for ; Thu, 31 Mar 2022 11:19:47 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 1AA091457F07; Thu, 31 Mar 2022 11:19:47 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 168B81457F06 for ; Thu, 31 Mar 2022 11:19:47 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id F1CEA83395F for ; Thu, 31 Mar 2022 11:19:46 +0000 (UTC) Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-197-dyVunEUHOHiwSNUvGalKmQ-2; Thu, 31 Mar 2022 07:19:44 -0400 Received: by mail-lj1-f173.google.com with SMTP id a30so24071146ljq.13 for ; Thu, 31 Mar 2022 04:19:44 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:42 -0700 (PDT) X-MC-Unique: _VzHbHbTOy2L680R1XejIQ-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: dyVunEUHOHiwSNUvGalKmQ-2 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2KZzcHKRfY8K3m06CzRz8w1FPVSzA2mpYQNLn5IM0BM=; b=JLLyIoqP7n996sDdgHaOiE1LRxQxFXcby+H8REBk4LQXf3OQ/rp8hLHJSMRxECPOL0 Lf0bnx8Ewk6tDRPFoWmXYlIg1p/TnWgpoSUxHTtVXy940hWvwK1LBVgGM5PKtMcWg0aj AqdDIb6Nj4B4tM/ujdOFe/aIMpe0hmlNiYWtF5oRORfSlyzfoHJNvGbdsnR88NaQdNlC MAhnPqsTkw7vYMLVgAA521rqT1ybHx9+mzsObgSY7V+HeH1S3nOf5D9zzbGDi8IrC9kM jtuSAcs9Vo6vN43FPn4sl3kYu5DvEyaVqk4fI8V3HZWPUApIYGQKfke4o/vwdrVC98Pm GIlw== X-Gm-Message-State: AOAM530b9n3nZDO1XrwyoQMrBx7S6kuAMcYCaU11S4mKNoQGesaEWs9u QhaxJhriorVb9QWkufF3n2zOEWu/O5oUBA== X-Google-Smtp-Source: ABdhPJxQIeM9Vovo8H2isjDH2zmVjQiCV+jycOq5oIYQErFZvGxmnLBIubPp6kv7h+iQtbHkRgnesw== X-Received: by 2002:a05:651c:3cc:b0:249:800d:58ea with SMTP id f12-20020a05651c03cc00b00249800d58eamr9969220ljp.41.1648725583576; Thu, 31 Mar 2022 04:19:43 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 06/11] conf: add memory state disk for internal snapshots Date: Thu, 31 Mar 2022 14:19:16 +0300 Message-Id: <20220331111921.450496-7-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725598601100009 Content-Type: text/plain; charset="utf-8"; x-default="true" This can be used to specify disk where to place vmstate data. Signed-off-by: Nikolay Shirokovskiy --- src/conf/snapshot_conf.c | 13 +++++++++++++ src/conf/snapshot_conf.h | 1 + 2 files changed, 14 insertions(+) diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index 80946beba9..8c9ee03942 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -117,6 +117,7 @@ virDomainSnapshotDefDispose(void *obj) size_t i; =20 g_free(def->memorysnapshotfile); + g_free(def->memorydisk); for (i =3D 0; i < def->ndisks; i++) virDomainSnapshotDiskDefClear(&def->disks[i]); g_free(def->disks); @@ -305,6 +306,7 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, =20 if ((memoryNode =3D virXPathNode("./memory", ctxt))) { def->memorysnapshotfile =3D virXMLPropString(memoryNode, "file"); + def->memorydisk =3D virXMLPropString(memoryNode, "disk"); =20 if (virXMLPropEnumDefault(memoryNode, "snapshot", virDomainSnapshotLocationTypeFromString, @@ -323,6 +325,8 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, if (def->memory =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION_DEFAULT) { if (def->memorysnapshotfile) { def->memory =3D VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL; + } else if (def->memorydisk) { + def->memory =3D VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL; } else if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE) { if (offline) { def->memory =3D VIR_DOMAIN_SNAPSHOT_LOCATION_NO; @@ -347,6 +351,14 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, return NULL; } =20 + if (def->memorydisk && + def->memory !=3D VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL) { + virReportError(VIR_ERR_XML_ERROR, + _("memory disk '%s' requires internal snapshot"), + def->memorydisk); + return NULL; + } + if (offline && def->memory !=3D VIR_DOMAIN_SNAPSHOT_LOCATION_DEFAULT && def->memory !=3D VIR_DOMAIN_SNAPSHOT_LOCATION_NO) { @@ -844,6 +856,7 @@ virDomainSnapshotDefFormatInternal(virBuffer *buf, virBufferAsprintf(buf, "memor= y)); virBufferEscapeString(buf, " file=3D'%s'", def->memorysnapshotfile= ); + virBufferEscapeString(buf, " disk=3D'%s'", def->memorydisk); virBufferAddLit(buf, "/>\n"); } =20 diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index 1f787f1a94..b7b448a071 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -72,6 +72,7 @@ struct _virDomainSnapshotDef { =20 virDomainSnapshotLocation memory; char *memorysnapshotfile; /* memory state file when snapshot is extern= al */ + char *memorydisk; /* memory state disk when snapshot is internal */ =20 size_t ndisks; /* should not exceed dom->ndisks */ virDomainSnapshotDiskDef *disks; --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1648725601281380.0512766806261; Thu, 31 Mar 2022 04:20:01 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-297-yE1mausDPK28rcBjr1wTyA-1; Thu, 31 Mar 2022 07:19:56 -0400 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6027082A682; Thu, 31 Mar 2022 11:19:54 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 485B2401E71; Thu, 31 Mar 2022 11:19:54 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 1670D194034D; Thu, 31 Mar 2022 11:19:54 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 4F8D21947BBC for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 401CBC27D90; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3B432C27D8F for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 21980801E67 for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-621-CwD8F4T3MvKu-uopCB2dkw-1; Thu, 31 Mar 2022 07:19:47 -0400 Received: by mail-lf1-f46.google.com with SMTP id z12so27099022lfu.10 for ; Thu, 31 Mar 2022 04:19:46 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:43 -0700 (PDT) X-MC-Unique: yE1mausDPK28rcBjr1wTyA-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: CwD8F4T3MvKu-uopCB2dkw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3bEZfUiQNmUAefpJNOJu0rfAfgmzSuQbWYYSsPKYGB8=; b=1jOMvWcdD40/ptIIduK6H/ndMfWHjKCsbG+P43FX5xLPpB1qGDlGQM7lPEEPDQmwrk NQzXnpLf1yHBXwJXYg78Tyv2nnjN5CJt4Xfqj6UbiJOOdXTZuUnUEJNnzD2KFT0rkLmy xKMEP6LKF4lexgAbD3xeq9tHLu96M/3hGoSmlCOVMCTEoJFCnWG72sho/eaRGc+fD4+q sF4aZ9K8YGWM6H06B9dW76X1ca/iOMfRs0s4qncvgQv57BePiC4XJ47lPmzXpy3YdvJB gpixalSlZdP+qevs/zSUxdQAcfjFjNlbgwK+evZgJlnc0+BZsvlP92fA26VYEb66mP5M oJuw== X-Gm-Message-State: AOAM531nLw2tEsFvqv4/oN84dqUT/EHiERQrKB6MTa2MmgCaqqZsPGxV 891n3wuLhGZdu8Pfs0LZBQqEa/OfKXNkXw== X-Google-Smtp-Source: ABdhPJyMMeDEOhQLeP/LO6CEyANqm5YiFH8Wa6ew4kpENfTpBmlMMtFMsjR6V40ru6zSeFeilyxc+Q== X-Received: by 2002:a05:6512:4002:b0:44a:53f9:1f21 with SMTP id br2-20020a056512400200b0044a53f91f21mr10207453lfb.400.1648725584378; Thu, 31 Mar 2022 04:19:44 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 07/11] qemu: check internal snaphshot memory disk Date: Thu, 31 Mar 2022 14:19:17 +0300 Message-Id: <20220331111921.450496-8-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725602756100002 Content-Type: text/plain; charset="utf-8"; x-default="true" - check it is supported by the QEMU - check disk itself has internal snapshot - for modern QEMU select it if it is not specified explicitly Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_snapshot.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 579d744c60..54eafb5020 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1852,6 +1852,38 @@ qemuSnapshotCreateAlignDisks(virDomainObj *vm, if (virDomainSnapshotAlignDisks(def, NULL, align_location, true) < 0) return -1; =20 + if (def->memory =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL) { + bool modern =3D virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_= SAVE); + + if (modern) { + size_t i; + + for (i =3D 0; i < def->ndisks; i++) { + if (def->disks[i].snapshot !=3D VIR_DOMAIN_SNAPSHOT_LOCATI= ON_INTERNAL) + continue; + + if (def->memorydisk) { + if (STREQ(def->memorydisk, def->disks[i].name)) + break; + } else { + def->memorydisk =3D g_strdup(def->disks[i].name); + break; + } + } + + if (i =3D=3D def->ndisks && def->memorydisk) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("memory disk '%s' should itself have inte= rnal snapshot"), + def->memorydisk); + return -1; + } + } else if (def->memorydisk) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("specifing memory disk is not supported by th= is QEMU")); + return -1; + } + } + return 0; } =20 --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1648725597982674.0402317280533; Thu, 31 Mar 2022 04:19:57 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-356-VQA1fsk0MoWXV2I9CiqLkg-1; Thu, 31 Mar 2022 07:19:54 -0400 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3096085A5BE; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1CA3940146E; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id E0CB51947BBB; Thu, 31 Mar 2022 11:19:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 737861947BBC for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 62BCF40E80E6; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast08.extmail.prod.ext.rdu2.redhat.com [10.11.55.24]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5C62F40D296C for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3023338009E4 for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-660-KgVIjOXfMAWgDk4KKu0d_A-1; Thu, 31 Mar 2022 07:19:47 -0400 Received: by mail-lf1-f53.google.com with SMTP id p10so35000119lfa.12 for ; Thu, 31 Mar 2022 04:19:47 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:44 -0700 (PDT) X-MC-Unique: VQA1fsk0MoWXV2I9CiqLkg-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: KgVIjOXfMAWgDk4KKu0d_A-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gEhg5I0IK/6WaIUzgBuPRjUjtq1pUo+Jw2+lnm8NRwQ=; b=XvrAQEP3FnEdiUbC2MBSizqzsjz2mwxwasrD543SoCR2oLg7HPeptHskczRtiHZfrN OY437TEXzdh3XOKF1uhxkCbIzbDWdi1hOq1lAyQnwZzum3t5GVM7+l0zbaPErWT8l5vC VKTs9P0kntZqS4xv0baL5nx4rhKPlACXZm7VIcvqxIisrXMFSvO3K+k06FTM6KdxQmA0 hEfb+/mUv9xXCdgGJspHUQq8IOylgHB6MCLm3j5yqEwSfe0gBu3yWZlvsxqMZqLs/sX2 izT6cyPclbmUkwIhI1lwAaS6rxpcn5PeY9v038uQPJuc4s+iaCIw940OyjPZfce+M2DS YFJw== X-Gm-Message-State: AOAM532Ykw6S97QBJ0qj1LgtFMFPFzmotFrZc6YcPN9PDd9xztythAw8 rijboCWH3EskckJKQn+0YNClJFsrCHMKDQ== X-Google-Smtp-Source: ABdhPJwnlPwo0FQuWqB8/ZIrTDqfD11jvU5oXobUFEV+XZqIiOvHz2aNTvQ/utW6buDsJaHRNFu4SQ== X-Received: by 2002:a05:6512:3f90:b0:446:6b95:24aa with SMTP id x16-20020a0565123f9000b004466b9524aamr10614572lfa.610.1648725585188; Thu, 31 Mar 2022 04:19:45 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 08/11] qemu: add snapshot job types to qemuMonitorJobType Date: Thu, 31 Mar 2022 14:19:18 +0300 Message-Id: <20220331111921.450496-9-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725598624100010 Content-Type: text/plain; charset="utf-8"; x-default="true" Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_monitor.c | 3 +++ src/qemu/qemu_monitor.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 4b33407e50..77682f817c 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -119,6 +119,9 @@ VIR_ENUM_IMPL(qemuMonitorJob, "mirror", "backup", "create", + "snapshot-save", + "snapshot-load", + "snapshot-delete", ); =20 VIR_ENUM_IMPL(qemuMonitorJobStatus, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 8067236693..67715ef252 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -139,6 +139,9 @@ typedef enum { QEMU_MONITOR_JOB_TYPE_MIRROR, QEMU_MONITOR_JOB_TYPE_BACKUP, QEMU_MONITOR_JOB_TYPE_CREATE, + QEMU_MONITOR_JOB_TYPE_SNAPSHOT_SAVE, + QEMU_MONITOR_JOB_TYPE_SNAPSHOT_LOAD, + QEMU_MONITOR_JOB_TYPE_SNAPSHOT_DELETE, QEMU_MONITOR_JOB_TYPE_LAST } qemuMonitorJobType; =20 --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1648725601714751.6976378516401; Thu, 31 Mar 2022 04:20:01 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-2-JAI8UgdpOdidxP6AuIi19Q-1; Thu, 31 Mar 2022 07:19:56 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E182F899EE3; Thu, 31 Mar 2022 11:19:53 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id C6C35112131E; Thu, 31 Mar 2022 11:19:53 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 9BB2D1947BBC; Thu, 31 Mar 2022 11:19:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id E0B6B1940344 for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id D33655D9A5F; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CE1435B1588 for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B0392833965 for ; Thu, 31 Mar 2022 11:19:49 +0000 (UTC) Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-361-YMnwRC_uNqOfPLMEhzjpFg-1; Thu, 31 Mar 2022 07:19:47 -0400 Received: by mail-lj1-f181.google.com with SMTP id h11so31522463ljb.2 for ; Thu, 31 Mar 2022 04:19:47 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:45 -0700 (PDT) X-MC-Unique: JAI8UgdpOdidxP6AuIi19Q-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: YMnwRC_uNqOfPLMEhzjpFg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=r642UUARnq9MT2wqLeVeEV49FkAmIgRqHGCb9qVibsw=; b=MB10zeryR/knZQgWh9bM7bPwYkdWSap57Ylq3YChSnNd++iJWC1AlL9gAwNfp6Uojj Wb5glisSVTkUsw/kqcjWKRxGQPWvMMQbXbNy0AeYPQ8YVCs3CpTC8EkMoEmAB+Y9DSzT ZDGAv/ksNIoB9OhISqowlc7T5jJsIT7XA33im1L+wH8Coir6fMwIaOqmeDt/D+3okcDF MbqsfLkY6TGD96N6sDJV9qZwRgmqtSqNaPfjEINoeyVlbCArq8p2mIllng5xkLlV2QDC 7qhR81+t7Y2TN+mSaOWrLRfzAkge+wBRTTO/4CCmjFBUTLBDKmbeBi5zj3U/lTPstp6u n6qA== X-Gm-Message-State: AOAM531KVddaDBxHmJ9Voqp2thjCIisEJerl+fq+fmWHaJoDBbOUU8MH y38i+zfmacS/82hjQEbv8pAfuWh1wxAdZQ== X-Google-Smtp-Source: ABdhPJxVVx2ZBHYDt/MTalQ4Ijrw0yc48LXvvrM2eAxdXDwLZkynVGIGluog5rUvQSQrbyZrYxHSsQ== X-Received: by 2002:a2e:a80e:0:b0:248:5819:b94a with SMTP id l14-20020a2ea80e000000b002485819b94amr10336973ljq.141.1648725585856; Thu, 31 Mar 2022 04:19:45 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 09/11] qemu: use snapshot-save for modern qemu to create snapshot Date: Thu, 31 Mar 2022 14:19:19 +0300 Message-Id: <20220331111921.450496-10-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725602763100003 Content-Type: text/plain; charset="utf-8"; x-default="true" Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_process.c | 11 +++ src/qemu/qemu_snapshot.c | 179 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 182 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9918423701..6ed7eaaa83 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -958,6 +958,17 @@ qemuProcessHandleJobStatusChange(qemuMonitor *mon G_GN= UC_UNUSED, jobname, vm, vm->def->name, qemuMonitorJobStatusTypeToString(status), status); =20 + if (STREQ(jobname, "snapshot-save") || + STREQ(jobname, "snapshot-delete") || + STREQ(jobname, "snapshot-load")) { + if (status =3D=3D QEMU_MONITOR_JOB_STATUS_CONCLUDED && priv->job.c= urrent) { + priv->job.current->status =3D VIR_DOMAIN_JOB_STATUS_COMPLETED; + virDomainObjBroadcast(vm); + } + + goto cleanup; + } + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { VIR_DEBUG("job '%s' handled by old blockjob handler", jobname); goto cleanup; diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 54eafb5020..9f81befe85 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -142,6 +142,131 @@ qemuSnapshotForEachQcow2(virQEMUDriver *driver, } =20 =20 +static GPtrArray * +qemuSnapshotGetDisksNodes(virDomainSnapshotDef *snapdef, + virDomainDef *def, + const char **memoryNode) +{ + g_autoptr(GPtrArray) devices =3D g_ptr_array_new(); + size_t i; + + if (memoryNode) + *memoryNode =3D NULL; + + for (i =3D 0; i < snapdef->ndisks; i++) { + if (snapdef->disks[i].snapshot =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION= _INTERNAL) + g_ptr_array_add(devices, def->disks[i]->src->nodeformat); + + if (memoryNode && STREQ(snapdef->memorydisk, snapdef->disks[i].nam= e)) + *memoryNode =3D def->disks[i]->src->nodeformat; + } + + if (memoryNode && !*memoryNode) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot find vmstate disk '%s'"), snapdef->memory= disk); + return NULL; + } + + return g_steal_pointer(&devices); +} + + +static int +qemuSnapshotDismissJob(virQEMUDriver *driver, + virDomainObj *vm, + virDomainAsyncJob asyncJob, + const char *jobid) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + int rc; + + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) + return -1; + + rc =3D qemuMonitorJobDismiss(priv->mon, jobid); + qemuDomainObjExitMonitor(vm); + if (rc < 0) + return -1; + + return 0; +} + + +static int +qemuSnapshotWaitJob(virQEMUDriver *driver, + virDomainObj *vm, + virDomainAsyncJob asyncJob, + const char *jobid) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + qemuMonitorJobInfo **jobs =3D NULL; + size_t njobs =3D 0; + qemuMonitorJobInfo *job =3D NULL; + int ret =3D -1; + size_t i; + int rc; + + while (priv->job.current->status !=3D VIR_DOMAIN_JOB_STATUS_COMPLETED)= { + /* + * We can't do much if wait fails and if domain is still active as= in + * order to cleanup we need to call job-cancel and again wait for + * concluded state. + */ + if (virDomainObjWait(vm) < 0) + return -1; + } + + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) + goto cleanup; + rc =3D qemuMonitorGetJobInfo(priv->mon, &jobs, &njobs); + qemuDomainObjExitMonitor(vm); + if (rc < 0) + goto cleanup; + + for (i =3D 0; i < njobs; i++) { + if (STREQ_NULLABLE(jobs[i]->id, jobid)) { + job =3D jobs[i]; + break; + } + } + + if (!job) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot obtain status of '%s' job"), jobid); + goto cleanup; + } + if (job->status !=3D QEMU_MONITOR_JOB_STATUS_CONCLUDED) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected '%s' job status '%s'"), jobid, + qemuMonitorJobStatusTypeToString(job->status)); + goto cleanup; + } + if (job->error) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("'%s' job failed '%s'"), jobid, job->error); + goto cleanup; + } + + ret =3D 0; + + cleanup: + if (virDomainObjIsActive(vm)) { + virErrorPtr err; + + virErrorPreserveLast(&err); + if (qemuSnapshotDismissJob(driver, vm, asyncJob, jobid) < 0) + VIR_WARN("failed to dismiss job '%s'", jobid); + virErrorRestore(&err); + } + + for (i =3D 0; i < njobs; i++) + qemuMonitorJobInfoFree(jobs[i]); + g_free(jobs); + + return ret; +} + + /* Discard one snapshot (or its metadata), without reparenting any childre= n. */ static int qemuSnapshotDiscard(virQEMUDriver *driver, @@ -453,6 +578,38 @@ qemuSnapshotCreateInactiveExternal(virQEMUDriver *driv= er, } =20 =20 +static int +qemuSnapshotCreateActiveInternalRun(virQEMUDriver *driver, + virDomainObj *vm, + virDomainMomentObj *snap) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + virDomainSnapshotDef *snapdef =3D virDomainSnapshotObjGetDef(snap); + g_autoptr(GPtrArray) devices =3D g_ptr_array_new(); + const char *memoryNode; + int rc; + + if (!(devices =3D qemuSnapshotGetDisksNodes(snapdef, vm->def, &memoryN= ode))) + return -1; + + if (qemuDomainObjEnterMonitorAsync(driver, vm, + VIR_ASYNC_JOB_SNAPSHOT) < 0) + return -1; + rc =3D qemuMonitorSnapshotSave(priv->mon, + "snapshot-save", + snap->def->name, + memoryNode, + (const char **)devices->pdata, + devices->len); + qemuDomainObjExitMonitor(vm); + if (rc < 0) + return -1; + + return qemuSnapshotWaitJob(driver, vm, VIR_ASYNC_JOB_SNAPSHOT, + "snapshot-save"); +} + + /* The domain is expected to be locked and active. */ static int qemuSnapshotCreateActiveInternal(virQEMUDriver *driver, @@ -465,6 +622,7 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver, bool resume =3D false; virDomainSnapshotDef *snapdef =3D virDomainSnapshotObjGetDef(snap); bool halt =3D !!(flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT); + bool modern =3D virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_SAVE= ); int ret =3D -1; =20 if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0)) @@ -478,14 +636,19 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *drive= r, resume =3D true; } =20 - if (qemuDomainObjEnterMonitorAsync(driver, vm, - VIR_ASYNC_JOB_SNAPSHOT) < 0) - return -1; - - ret =3D qemuMonitorCreateSnapshot(priv->mon, snap->def->name); - qemuDomainObjExitMonitor(vm); - if (ret < 0) - goto cleanup; + if (modern) { + if (qemuSnapshotCreateActiveInternalRun(driver, vm, snap) < 0) + goto cleanup; + ret =3D 0; + } else { + if (qemuDomainObjEnterMonitorAsync(driver, vm, + VIR_ASYNC_JOB_SNAPSHOT) < 0) + return -1; + ret =3D qemuMonitorCreateSnapshot(priv->mon, snap->def->name); + qemuDomainObjExitMonitor(vm); + if (ret < 0) + goto cleanup; + } =20 if (!(snapdef->cookie =3D (virObject *) qemuDomainSaveCookieNew(vm))) goto cleanup; --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1648725605732866.3119696705542; Thu, 31 Mar 2022 04:20:05 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-62-rW9XI-6mMwCmoDG7AKQlNw-1; Thu, 31 Mar 2022 07:20:01 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3CE51801E67; Thu, 31 Mar 2022 11:19:59 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 28AD2C08085; Thu, 31 Mar 2022 11:19:59 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id C416F1940367; Thu, 31 Mar 2022 11:19:58 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id DE12B19451F3 for ; Thu, 31 Mar 2022 11:19:55 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id BA1442166B3F; Thu, 31 Mar 2022 11:19:55 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B547A2166B26 for ; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 667B8100BAC6 for ; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-176-YXl7Pw9lNROU2myHq497Jw-1; Thu, 31 Mar 2022 07:19:48 -0400 Received: by mail-lf1-f46.google.com with SMTP id bq24so24935621lfb.5 for ; Thu, 31 Mar 2022 04:19:48 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:46 -0700 (PDT) X-MC-Unique: rW9XI-6mMwCmoDG7AKQlNw-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: YXl7Pw9lNROU2myHq497Jw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uhITnI96b488vHlzRut0CjehMtHy5FC/1zrB8LtMoc4=; b=zK7sp+knJdQsgmwtMHSi6otSwqbBWR5eyFFWPdrDbHOPUiZvkIwOAaipvMYLHQQ4fT EhskqGLcPtNAnTE7xAt/cD3OPXzZybU0KfXl3yXcKkRO/KYUXto8JLPxU/MinTCsTnwm UOVbcAa6seYqrnn3fQsn+pfu5IAuD99DJylXS7FMZBgLF+wDSopUtr6b0nxeZxC+lctx LEHcD4V9agtw1GMi9FQKsswF7QpQfCUYAj6/n6qYHpSk4I3NErq1aip1crYCkzqw+bYl 0Q8zzyNEHTc3YhhjU0HqJABjXLEztfezaGmN4PFgLbk3jPMddlLaZKv1g81IF3xxzxDu Bb3g== X-Gm-Message-State: AOAM531vZ5Rn6QnIvy0uIFoLBN31Msc3iXD+0bo4/3WIswBrf8KwZ1CO PgC6f3QxWMGRkcRCttZ2OFFi9boexpgRTA== X-Google-Smtp-Source: ABdhPJxyrv6CC1Lg2UZjhU5dcWGindKWHz/pokPZgW3nXickV/UcgaZpGUcUENn4XQviqofD77dj8g== X-Received: by 2002:a05:6512:3f96:b0:445:a191:5d43 with SMTP id x22-20020a0565123f9600b00445a1915d43mr10378822lfa.603.1648725586700; Thu, 31 Mar 2022 04:19:46 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 10/11] qemu: use snapshot-load for modern QEMU to revert to snapshot Date: Thu, 31 Mar 2022 14:19:20 +0300 Message-Id: <20220331111921.450496-11-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725606671100009 Content-Type: text/plain; charset="utf-8"; x-default="true" Note that if snapshot was done using old QEMU API then it is loaded using old QEMU API as well as we don't know on which disk vmstate is. Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_process.c | 8 +++++- src/qemu/qemu_snapshot.c | 54 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 6ed7eaaa83..eac6b00ff4 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -98,6 +98,7 @@ #include "virutil.h" #include "storage_source.h" #include "backup_conf.h" +#include "virdomainsnapshotobjlist.h" =20 #include "logging/log_manager.h" #include "logging/log_protocol.h" @@ -7389,6 +7390,7 @@ qemuProcessLaunch(virConnectPtr conn, size_t nnicindexes =3D 0; g_autofree int *nicindexes =3D NULL; unsigned long long maxMemLock =3D 0; + bool backcompatSnapshot; =20 VIR_DEBUG("conn=3D%p driver=3D%p vm=3D%p name=3D%s if=3D%d asyncJob=3D= %d " "incoming.launchURI=3D%s incoming.deferredURI=3D%s " @@ -7444,11 +7446,15 @@ qemuProcessLaunch(virConnectPtr conn, if (qemuExtDevicesStart(driver, vm, incoming !=3D NULL) < 0) goto cleanup; =20 + if (snapshot) + backcompatSnapshot =3D !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_S= NAPSHOT_SAVE) || + !virDomainSnapshotObjGetDef(snapshot)->memory= disk; + VIR_DEBUG("Building emulator command line"); if (!(cmd =3D qemuBuildCommandLine(driver, vm, incoming ? incoming->launchURI : NULL, - snapshot, vmop, + snapshot && backcompatSnapshot ? snap= shot : NULL, vmop, false, qemuCheckFips(vm), &nnicindexes, &nicindexes, 0))) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 9f81befe85..605288f6c5 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2395,6 +2395,54 @@ qemuSnapshotRevertWriteMetadata(virDomainObj *vm, } =20 =20 +static int +qemuSnapshotLoadState(virQEMUDriver *driver, + virDomainObj *vm, + virDomainMomentObj *snap) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + virDomainSnapshotDef *snapdef =3D virDomainSnapshotObjGetDef(snap); + g_autoptr(GPtrArray) devices =3D g_ptr_array_new(); + const char *memoryNode; + int ret =3D -1; + int rc; + + if (!(devices =3D qemuSnapshotGetDisksNodes(snapdef, vm->def, &memoryN= ode))) + goto cleanup; + + if (qemuDomainObjEnterMonitorAsync(driver, vm, + VIR_ASYNC_JOB_START) < 0) + goto cleanup; + rc =3D qemuMonitorSnapshotLoad(priv->mon, + "snapshot-load", + snap->def->name, + memoryNode, + (const char **)devices->pdata, + devices->len); + qemuDomainObjExitMonitor(vm); + if (rc < 0) + goto cleanup; + + if (qemuSnapshotWaitJob(driver, vm, VIR_ASYNC_JOB_START, + "snapshot-load") < 0) + goto cleanup; + + ret =3D 0; + + cleanup: + if (ret < 0 && virDomainObjIsActive(vm)) { + virErrorPtr err; + + virErrorPreserveLast(&err); + qemuProcessStop(driver, vm, + VIR_DOMAIN_SHUTOFF_FAILED, + VIR_ASYNC_JOB_START, 0); + virErrorRestore(&err); + } + return ret; +} + + static int qemuSnapshotRevertActive(virDomainObj *vm, virDomainSnapshotPtr snapshot, @@ -2407,6 +2455,7 @@ qemuSnapshotRevertActive(virDomainObj *vm, unsigned int start_flags, unsigned int flags) { + qemuDomainObjPrivate *priv =3D vm->privateData; virObjectEvent *event =3D NULL; virObjectEvent *event2 =3D NULL; int detail; @@ -2458,6 +2507,11 @@ qemuSnapshotRevertActive(virDomainObj *vm, if (rc < 0) return -1; =20 + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_SAVE) && + snapdef->memorydisk && + qemuSnapshotLoadState(driver, vm, snap) < 0) + return -1; + /* Touch up domain state. */ if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) && (snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED || --=20 2.35.1 From nobody Fri May 10 18:50:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1648725601586345.8520103198339; Thu, 31 Mar 2022 04:20:01 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-643-GhIu1yIkOBuSEesNGTJg-Q-1; Thu, 31 Mar 2022 07:19:56 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 807FC801E67; Thu, 31 Mar 2022 11:19:53 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6B86BC15D78; Thu, 31 Mar 2022 11:19:53 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 336791947BBB; Thu, 31 Mar 2022 11:19:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id B424B19451F3 for ; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 97D86401E67; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 93BCC401E64 for ; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 798CA899ED2 for ; Thu, 31 Mar 2022 11:19:51 +0000 (UTC) Received: from mail-lj1-f170.google.com (mail-lj1-f170.google.com [209.85.208.170]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-491-OeSDlF1_MzCxUSV5lhQTrw-1; Thu, 31 Mar 2022 07:19:49 -0400 Received: by mail-lj1-f170.google.com with SMTP id bn33so31545680ljb.6 for ; Thu, 31 Mar 2022 04:19:49 -0700 (PDT) Received: from vzbook.. (broadband-90-154-71-96.ip.moscow.rt.ru. [90.154.71.96]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b0044ab702b6acsm695653lfj.238.2022.03.31.04.19.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Mar 2022 04:19:47 -0700 (PDT) X-MC-Unique: GhIu1yIkOBuSEesNGTJg-Q-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: OeSDlF1_MzCxUSV5lhQTrw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dk6AH49QGH7pKABcTMbkix8Yaar9GIodlF2uKU1BmW0=; b=w6G6GSV6uZDZDWDoznS7dX+wUJqU2WJy3WYooGMKWtn6hRQZ/52+Pe2LGEZL/544yS 6g2+PHrH8fmz0s0tY3/V9Kd2zGdOSZH4mnhRnQ+hj5Gjp2yMyV3deUiOm+cH8/UPS7in AFPtwPw0d+omXpusdx8HemaEh+ldaASzysOfG+yBIgSJ3gwtnbf+MKar62DmVHm5NhVA 1A8KSxwIkzQ5bmAE+Qvlb+AA4bX62zHH8K9JAcPIPHL9doNFXvGVAQDY7smz75ClG337 4DD5vz3n+IpATNZIIyKiAfhk5Xb+32Tz3551PgqoDlN7r8zK7zXeFvy8RRo7pbu7UsW/ +3qw== X-Gm-Message-State: AOAM531c7hl5e4vhqUCaEv6IEgLfoUtC1TyvDHl3pg0h6xRPyj8Ytzjs I9VoJjm2tJF00EIeKQkSBOr83f8r8T9NOw== X-Google-Smtp-Source: ABdhPJyykmW15YaMyzbKNN++CZ8VhXJ55Had/rPReFMuwM+MRHmONclvM81Zqg+kbzkQe3DGJiGb5A== X-Received: by 2002:a2e:a7ca:0:b0:249:862b:525 with SMTP id x10-20020a2ea7ca000000b00249862b0525mr10216196ljp.491.1648725587464; Thu, 31 Mar 2022 04:19:47 -0700 (PDT) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Subject: [PATCH 11/11] qemu: use snapshot-delete for modern QEMU to delete snapshot Date: Thu, 31 Mar 2022 14:19:21 +0300 Message-Id: <20220331111921.450496-12-nikolay.shirokovskiy@openvz.org> In-Reply-To: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> References: <20220331111921.450496-1-nikolay.shirokovskiy@openvz.org> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1648725602750100001 Content-Type: text/plain; charset="utf-8"; x-default="true" Signed-off-by: Nikolay Shirokovskiy --- src/qemu/qemu_snapshot.c | 54 ++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 605288f6c5..fb34c21495 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -267,6 +267,50 @@ qemuSnapshotWaitJob(virQEMUDriver *driver, } =20 =20 +static int +qemuSnapshotDiscardDataActive(virQEMUDriver *driver, + virDomainObj *vm, + virDomainMomentObj *snap) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + bool modern =3D virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_SAVE= ); + virDomainSnapshotDef *snapdef =3D virDomainSnapshotObjGetDef(snap); + g_autoptr(GPtrArray) devices =3D g_ptr_array_new(); + int rc; + + if (!modern) { + if (qemuDomainObjEnterMonitorAsync(driver, vm, + VIR_ASYNC_JOB_SNAPSHOT_DELETE) = < 0) + return -1; + + rc =3D qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); + qemuDomainObjExitMonitor(vm); + if (rc < 0) + return -1; + + return 0; + } + + if (!(devices =3D qemuSnapshotGetDisksNodes(snapdef, vm->def, NULL))) + return -1; + + if (qemuDomainObjEnterMonitorAsync(driver, vm, + VIR_ASYNC_JOB_SNAPSHOT_DELETE) < 0) + return -1; + rc =3D qemuMonitorSnapshotDelete(priv->mon, + "snapshot-delete", + snap->def->name, + (const char **)devices->pdata, + devices->len); + qemuDomainObjExitMonitor(vm); + if (rc < 0) + return -1; + + return qemuSnapshotWaitJob(driver, vm, VIR_ASYNC_JOB_SNAPSHOT_DELETE, + "snapshot-delete"); +} + + /* Discard one snapshot (or its metadata), without reparenting any childre= n. */ static int qemuSnapshotDiscard(virQEMUDriver *driver, @@ -276,7 +320,6 @@ qemuSnapshotDiscard(virQEMUDriver *driver, bool metadata_only) { g_autofree char *snapFile =3D NULL; - qemuDomainObjPrivate *priv; virDomainMomentObj *parentsnap =3D NULL; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); =20 @@ -301,13 +344,8 @@ qemuSnapshotDiscard(virQEMUDriver *driver, if (qemuSnapshotForEachQcow2(driver, def, snap, "-d", true) < = 0) return -1; } else { - priv =3D vm->privateData; - if (qemuDomainObjEnterMonitorAsync(driver, vm, - VIR_ASYNC_JOB_SNAPSHOT) =3D= =3D 0) { - /* we continue on even in the face of error */ - qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); - qemuDomainObjExitMonitor(vm); - } + /* we continue on even in the face of error */ + qemuSnapshotDiscardDataActive(driver, vm, snap); } } =20 --=20 2.35.1