From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id DED181FF185 for <inbox@lore.proxmox.com>; Mon, 9 Jun 2025 09:32:21 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A6ADE3756C; Mon, 9 Jun 2025 09:32:31 +0200 (CEST) To: pve-devel@lists.proxmox.com Date: Mon, 9 Jun 2025 10:32:11 +0300 In-Reply-To: <20250609073214.7880-1-denis.kanchev@storpool.com> References: <20250609073214.7880-1-denis.kanchev@storpool.com> MIME-Version: 1.0 Message-ID: <mailman.301.1749454349.395.pve-devel@lists.proxmox.com> List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Post: <mailto:pve-devel@lists.proxmox.com> From: Demayl via pve-devel <pve-devel@lists.proxmox.com> Precedence: list Cc: Demayl <denis.kanchev@storpool.com> X-Mailman-Version: 2.1.29 X-BeenThere: pve-devel@lists.proxmox.com List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> Subject: [pve-devel] [PATCH atomic snapshot 3/4] storage snapshot: add optional atomic snapshot creation in snapshot_create Content-Type: multipart/mixed; boundary="===============0878454063981842412==" Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> --===============0878454063981842412== Content-Type: message/rfc822 Content-Disposition: inline Return-Path: <denis.kanchev@storpool.com> X-Original-To: pve-devel@lists.proxmox.com Delivered-To: pve-devel@lists.proxmox.com Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id D8C83CCD53 for <pve-devel@lists.proxmox.com>; Mon, 9 Jun 2025 09:32:28 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id B962437477 for <pve-devel@lists.proxmox.com>; Mon, 9 Jun 2025 09:32:28 +0200 (CEST) Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for <pve-devel@lists.proxmox.com>; Mon, 9 Jun 2025 09:32:28 +0200 (CEST) Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-3a36748920cso3579237f8f.2 for <pve-devel@lists.proxmox.com>; Mon, 09 Jun 2025 00:32:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=storpool.com; s=google; t=1749454342; x=1750059142; darn=lists.proxmox.com; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nHQsEwNMz/d4VOQxso3XhurihB9i+0GCg/I16l1Aq3o=; b=TaeO2I13UEzpJbbmZB1IEhyZflqlL2bcN6/U1OSUbg2rSWRXbaJRW3m2YpnyyNtDDf VrTjE1PkbXkY7Rze1A+Nm4DP6oYq0jLkK/6kt2pkljqbCwh5BKsi5d3IQbxaN/jQMtJ0 8BQPP0qeYH1DE+NBqFKI1bj1LdV/ovyd65d6HaiYqu9L72py3jvC/T/9NWp0p5wBdrYI e3c5UbAybtqfSnOiIM/dR1klG3QeF4sXfrZ3MlR0T0XC/vBSslHm1Wp3Ja/PqtK8cXnL /0DBSbRfPgn7ATp5JjcPf9QhpLMu4he7aXm7/PyUNvYb+p4iRA5dzzeIIdKiqkVgNH5C EIkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749454342; x=1750059142; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nHQsEwNMz/d4VOQxso3XhurihB9i+0GCg/I16l1Aq3o=; b=hcRcAfzdPkGTLZn5zTTitYpd1VcqpW2r4uQAcVYx07uLdKJpQz5WuaV0/lXqBvIJVk Y+fgWp0Cjgt5QxFE021Lc6WEIl3JV0FmTg+5tPhhd/6DYCH77296J38ijRWqpp6ze+HG LQ1Ywjpmh+nJMFF5YB2Fl5HuH/KhmuzD60qjtX8JHPikua+/hrdw+K4zKs8oblGilauE 3QeWw2kots1eARqTIxrmdYS4NvIH+EPFNPtiZ3EQuZoRIO4nhb+QzdzQfNs7r7kfypGH rKYReoDB/3AJZfkWG3dgXgL07vB0jhCLqgrwA70/fh7LcWcnqxlw+RA5FEFc6IlqRt4P jmqw== X-Gm-Message-State: AOJu0YwUkPKlhASFQNRhn5ULVQyA4UXenk07iINj9JV8v7Zaz5BVxtT8 ja6j8eP2TTzonTohRJEq3x9FW52nhEcbKBvUscCBr1zQzFRhOFc9CLRdXFL5ovWnCm0f938/3RI cT6Jkb0A= X-Gm-Gg: ASbGncvSFdWyABtDVZbe0hByxd8zvxyRBRAKH//wjiVWEo2Z1TJjXg5NivLDKuzzeDv onJN29qsQw9Y9yC6+2htuvfxmbSRGt0bjkxq3aoza+U7XeikPTvNVLGC+HdkRrPCmJDhYtysix0 ahVWcv0U8Gl81Fw+/GqC5YGbmr+EO305unNGMStno7qIHWG70LpRgx4rcMzkNhrApVjhfjjD49u 82zQ83CiZQFA+pqwifO5nKCqDdqu2jrJwQDH7sqKyzMbc5kymTvPDhXjR0olP6M/1xbV2SbH2t7 7Zkas3etKZCcU9crGSQhCDYF1VLFKGZmZHgqwNuskYjeKrpqTYnuob3ybXmqXMnGfGtC4yq4QbN DpPLUGTWSNg== X-Google-Smtp-Source: AGHT+IFb/1Ze91ub6aPU1RWY5rKIKmLgi3OQzkFRVmECvuaajD6QJvxXi1wQppYB/6nx2dkah0T8og== X-Received: by 2002:a5d:64ec:0:b0:3a4:f644:95f0 with SMTP id ffacd0b85a97d-3a531cb2304mr10385968f8f.54.1749454342035; Mon, 09 Jun 2025 00:32:22 -0700 (PDT) Received: from dennis.. (79-100-232-190.ip.btc-net.bg. [79.100.232.190]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4521370961csm102916165e9.22.2025.06.09.00.32.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Jun 2025 00:32:20 -0700 (PDT) From: Demayl <denis.kanchev@storpool.com> To: pve-devel@lists.proxmox.com Subject: [PATCH atomic snapshot 3/4] storage snapshot: add optional atomic snapshot creation in snapshot_create Date: Mon, 9 Jun 2025 10:32:11 +0300 Message-ID: <20250609073214.7880-4-denis.kanchev@storpool.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250609073214.7880-1-denis.kanchev@storpool.com> References: <20250609073214.7880-1-denis.kanchev@storpool.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.000 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Signed-off-by: Demayl <denis.kanchev@storpool.com> --- src/PVE/AbstractConfig.pm | 60 +++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/src/PVE/AbstractConfig.pm b/src/PVE/AbstractConfig.pm index 3d4fcbb..8bb271d 100644 --- a/src/PVE/AbstractConfig.pm +++ b/src/PVE/AbstractConfig.pm @@ -811,10 +811,39 @@ sub __snapshot_activate_storages { return; } +sub get_atomic_snapshot_volumes { + my ($class, $conf) = @_; + my $volumes = {}; + $class->foreach_volume( + $conf, + sub { + my ($key, $volume_string) = @_; + $volumes->{$key} = $volume_string; + } + ); + return $volumes; +} +sub check_atomic_snapshots { + my ($class, $conf) = @_; + return PVE::Storage::volumes_atomic_snapshot_possible( + PVE::Storage::config(), + $class->get_atomic_snapshot_volumes($conf), + ); +} + +sub __snapshot_volumes_atomically { + my ($class, $voldata, $snapname) = @_; + PVE::Storage::volumes_atomic_snapshot($voldata, $snapname); + return { map { $_ => 1 } keys %{$voldata} }; +} + + # Creates a snapshot for the VM/CT. +# Type can be either atomic or sequential sub snapshot_create { - my ($class, $vmid, $snapname, $save_vmstate, $comment) = @_; + my ($class, $vmid, $snapname, $save_vmstate, $comment, $type) = @_; + my $atomic = $type && $type eq 'atomic'; my $snap = $class->__snapshot_prepare($vmid, $snapname, $save_vmstate, $comment); $save_vmstate = 0 if !$snap->{vmstate}; @@ -823,32 +852,45 @@ sub snapshot_create { my ($running, $freezefs) = $class->__snapshot_check_freeze_needed($vmid, $conf, $snap->{vmstate}); + my ($can_atomic, undef, $vol_cfg) = $class->check_atomic_snapshots($snap); + if ($atomic && !$can_atomic) { + warn "snapshot create failed: starting cleanup\n"; + eval { $class->snapshot_delete($vmid, $snapname, 1, {}); }; + warn "$@" if $@; + die "atomic snapshot impossible for mixed storage\n"; + } + my $is_atomic = $atomic && $can_atomic; + my $drivehash = {}; eval { $class->__snapshot_activate_storages($conf, 0); - if ($freezefs) { + if ($freezefs && !$is_atomic) { $class->__snapshot_freeze($vmid, 0); } $class->__snapshot_create_vol_snapshots_hook($vmid, $snap, $running, "before"); - $class->foreach_volume($snap, sub { - my ($vs, $volume) = @_; + if ($is_atomic) { + $drivehash = $class->__snapshot_volumes_atomically($vol_cfg, $snapname); + } else { + $class->foreach_volume($snap, sub { + my ($vs, $volume) = @_; - $class->__snapshot_create_vol_snapshot($vmid, $vs, $volume, $snapname); - $drivehash->{$vs} = 1; - }); + $class->__snapshot_create_vol_snapshot($vmid, $vs, $volume, $snapname); + $drivehash->{$vs} = 1; + }); + } }; my $err = $@; if ($running) { $class->__snapshot_create_vol_snapshots_hook($vmid, $snap, $running, "after"); - if ($freezefs) { + if ($freezefs && !$is_atomic) { $class->__snapshot_freeze($vmid, 1); + $class->__snapshot_create_vol_snapshots_hook($vmid, $snap, $running, "after-unfreeze"); } - $class->__snapshot_create_vol_snapshots_hook($vmid, $snap, $running, "after-unfreeze"); } if ($err) { -- 2.43.0 --===============0878454063981842412== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel --===============0878454063981842412==--