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==--