all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH pve-storage 1/4] pvestord: setup new pvestord daemon
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 2/4] storage: add extend queue handling Tiago Sousa via pve-devel
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 13672 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-storage 1/4] pvestord: setup new pvestord daemon
Date: Fri, 17 Oct 2025 12:25:26 +0100
Message-ID: <20251017112539.26471-2-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/Makefile                  |   1 +
 src/PVE/Makefile              |   1 +
 src/PVE/Service/Makefile      |  10 ++
 src/PVE/Service/pvestord.pm   | 193 ++++++++++++++++++++++++++++++++++
 src/bin/Makefile              |   3 +
 src/bin/pvestord              |  24 +++++
 src/services/Makefile         |  14 +++
 src/services/pvestord.service |  15 +++
 8 files changed, 261 insertions(+)
 create mode 100644 src/PVE/Service/Makefile
 create mode 100644 src/PVE/Service/pvestord.pm
 create mode 100755 src/bin/pvestord
 create mode 100644 src/services/Makefile
 create mode 100644 src/services/pvestord.service

diff --git a/src/Makefile b/src/Makefile
index a322f46..09777f2 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -9,6 +9,7 @@ all:
 install: PVE bin udev-rbd
 	$(MAKE) -C bin install
 	$(MAKE) -C PVE install
+	$(MAKE) -C services install
 	$(MAKE) -C udev-rbd install
 
 .PHONY: test
diff --git a/src/PVE/Makefile b/src/PVE/Makefile
index 9e9f6aa..01ba360 100644
--- a/src/PVE/Makefile
+++ b/src/PVE/Makefile
@@ -11,6 +11,7 @@ install:
 	make -C API2 install
 	make -C BackupProvider install
 	make -C CLI install
+	make -C Service install
 
 .PHONY: test
 test:
diff --git a/src/PVE/Service/Makefile b/src/PVE/Service/Makefile
new file mode 100644
index 0000000..a581f43
--- /dev/null
+++ b/src/PVE/Service/Makefile
@@ -0,0 +1,10 @@
+SOURCES=pvestord.pm
+
+all:
+
+.PHONY: install
+install: $(SOURCES)
+	install -d -m 0755 $(DESTDIR)$(PERLDIR)/PVE/Service
+	for i in $(SOURCES); do install -D -m 0644 $$i $(DESTDIR)$(PERLDIR)/PVE/Service/$$i; done
+
+clean:
diff --git a/src/PVE/Service/pvestord.pm b/src/PVE/Service/pvestord.pm
new file mode 100644
index 0000000..29fe016
--- /dev/null
+++ b/src/PVE/Service/pvestord.pm
@@ -0,0 +1,193 @@
+package PVE::Service::pvestord;
+
+use strict;
+use warnings;
+
+use Time::HiRes qw (gettimeofday);
+use PVE::SafeSyslog;
+use PVE::Daemon;
+use PVE::Cluster qw(cfs_read_file);
+use PVE::Storage;
+use PVE::QemuConfig;
+use PVE::QemuServer;
+use PVE::QemuServer::Drive;
+use PVE::QemuServer::Blockdev;
+use PVE::QemuServer::Helpers;
+use PVE::INotify;
+
+use base qw(PVE::Daemon);
+
+my $cmdline = [$0, @ARGV];
+
+my %daemon_options = (restart_on_error => 5, stop_wait_time => 15);
+my $daemon = __PACKAGE__->new('pvestord', $cmdline, %daemon_options);
+
+my $nodename = PVE::INotify::nodename();
+
+sub init {
+    my ($self) = @_;
+    PVE::Cluster::cfs_update();
+}
+
+my sub get_drive_id {
+    my ($block_stats, $blockdev_nodename) = @_;
+    foreach my $drive_id (keys %$block_stats) {
+        my $entry = $block_stats->{$drive_id};
+        my $file_blockdev = $entry->{parent}->{parent};
+        return $drive_id
+            if ($file_blockdev->{'node-name'} eq $blockdev_nodename);
+    }
+    return undef;
+}
+
+my sub dequeue {
+    my ($queue) = @_;
+    PVE::Storage::lock_extend_queue(
+        sub {
+            # TODO: This will have to have some sort of mechanism
+            # to make sure that the element that is removed is the one
+            # that this node is handling
+            shift @$queue;
+
+            PVE::Storage::write_extend_queue($queue);
+        },
+        "Could not lock extend queue file",
+    );
+}
+
+sub perform_extend {
+    my $storecfg = PVE::Storage::config();
+    my $queue = PVE::Storage::extend_queue();
+
+    my $first_extend_request = @$queue[0];
+    return if !$first_extend_request;
+
+    my ($vmid, $blockdev_nodename) = @$first_extend_request;
+
+    my $vmlist = PVE::Cluster::get_vmlist();
+    my $owner_nodename = $vmlist->{ids}->{$vmid}->{node};
+
+    if ($owner_nodename eq $nodename) {
+        my $running = PVE::QemuServer::Helpers::vm_running_locally($vmid);
+        # NOTE: The block device node name is currently generated using a SHA-256 hash,
+        # which makes it impossible to reverse-engineer and identify the original disk.
+        # As a result, we must rely on `blockstats` to determine which disk corresponds
+        # to a given node name — but these statistics are only available when the machine is running.
+        # Consider updating the `get_node_name()` function to use a reversible encoding
+        # (e.g., Base64) instead of a SHA-256 digest to simplify disk identification.
+
+        my $extend_function = sub {
+            dequeue($queue);
+            syslog("info", "Processsing extend request $vmid: $blockdev_nodename\n");
+
+            my $block_stats = PVE::QemuServer::Blockdev::get_block_stats($vmid);
+
+            my $drive_id = get_drive_id($block_stats, $blockdev_nodename);
+            if (!$drive_id) {
+                syslog("err", "Couldn't find drive_id for blockdev $blockdev_nodename");
+                return;
+            }
+            my $vm_conf = PVE::QemuConfig->load_config($vmid);
+            my $drive = PVE::QemuServer::parse_drive($drive_id, $vm_conf->{$drive_id});
+            my $volid = $drive->{file};
+
+            PVE::QemuServer::Blockdev::underlay_resize(
+                $storecfg, $vmid, $drive_id, $volid
+            );
+        };
+        PVE::QemuConfig->lock_config($vmid, $extend_function);
+    }
+}
+
+my $next_update = 0;
+my $cycle = 0;
+my $restart_request = 0;
+
+my $initial_memory_usage = 0;
+
+# 1 second cycles
+my $updatetime = 1;
+
+sub run {
+    my ($self) = @_;
+    syslog("info", "Running on node $nodename\n");
+
+    for (;;) { # forever
+        # get next extend request
+        $next_update = time() + $updatetime;
+
+        if ($cycle) {
+            my ($ccsec, $cusec) = gettimeofday();
+            eval {
+                # syslog('info', "start status update");
+                PVE::Cluster::cfs_update();
+                perform_extend();
+            };
+            my $err = $@;
+
+            if ($err) {
+                syslog('err', "status update error: $err");
+            }
+
+            my ($ccsec_end, $cusec_end) = gettimeofday();
+            my $cptime = ($ccsec_end - $ccsec) + ($cusec_end - $cusec) / 1000000;
+
+            syslog('info', sprintf("extend process time (%.3f seconds)", $cptime))
+                if ($cptime > 1);
+        }
+
+        $cycle++;
+
+        my $mem = PVE::ProcFSTools::read_memory_usage();
+        my $resident_kb = $mem->{resident} / 1024;
+
+        if (!defined($initial_memory_usage) || ($cycle < 10)) {
+            $initial_memory_usage = $resident_kb;
+        } else {
+            my $diff = $resident_kb - $initial_memory_usage;
+            if ($diff > 15 * 1024) {
+                syslog(
+                    'info',
+                    "restarting server after $cycle cycles to "
+                        . "reduce memory usage (free $resident_kb ($diff) KB)",
+                );
+                $self->restart_daemon();
+            }
+        }
+
+        my $wcount = 0;
+        while (
+            (time() < $next_update)
+            && ($wcount < $updatetime)
+            && # protect against time wrap
+            !$restart_request
+        ) {
+            $wcount++;
+            sleep(1);
+        }
+
+        $self->restart_daemon() if $restart_request;
+    }
+}
+
+sub shutdown {
+    my ($self) = @_;
+
+    syslog('info', "server closing");
+
+    $self->exit_daemon(0);
+}
+
+$daemon->register_start_command();
+$daemon->register_restart_command(1);
+$daemon->register_stop_command();
+$daemon->register_status_command();
+
+our $cmddef = {
+    start => [__PACKAGE__, 'start', []],
+    restart => [__PACKAGE__, 'restart', []],
+    stop => [__PACKAGE__, 'stop', []],
+    status => [__PACKAGE__, 'status', [], undef, sub { print shift . "\n"; }],
+};
+
+1;
diff --git a/src/bin/Makefile b/src/bin/Makefile
index 2e0a080..206c35b 100644
--- a/src/bin/Makefile
+++ b/src/bin/Makefile
@@ -1,5 +1,6 @@
 DESTDIR=
 PREFIX=/usr
+BINDIR=$(PREFIX)/bin
 SBINDIR=$(PREFIX)/sbin
 MANDIR=$(PREFIX)/share/man
 MAN1DIR=$(MANDIR)/man1/
@@ -30,6 +31,8 @@ install: pvesm.1 pvesm.bash-completion pvesm.zsh-completion
 	gzip -9 -n $(DESTDIR)$(MAN1DIR)/pvesm.1
 	install -m 0644 -D pvesm.bash-completion $(DESTDIR)$(BASHCOMPLDIR)/pvesm
 	install -m 0644 -D pvesm.zsh-completion $(DESTDIR)$(ZSHCOMPLDIR)/_pvesm
+	install -d $(DESTDIR)$(BINDIR)
+	install -m 0755 pvestord $(DESTDIR)$(BINDIR)
 
 .PHONY: clean
 clean:
diff --git a/src/bin/pvestord b/src/bin/pvestord
new file mode 100755
index 0000000..e88a0b3
--- /dev/null
+++ b/src/bin/pvestord
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use PVE::INotify;
+use PVE::RPCEnvironment;
+use PVE::SafeSyslog;
+use PVE::Service::pvestord;
+
+$SIG{'__WARN__'} = sub {
+    my $err = $@;
+    my $t = $_[0];
+    chomp $t;
+    print STDERR "$t\n";
+    syslog('warning', "%s", $t);
+    $@ = $err;
+};
+
+my $prepare = sub {
+
+};
+
+PVE::Service::pvestord->run_cli_handler(prepare => $prepare);
diff --git a/src/services/Makefile b/src/services/Makefile
new file mode 100644
index 0000000..98db674
--- /dev/null
+++ b/src/services/Makefile
@@ -0,0 +1,14 @@
+SERVICEDIR=$(DESTDIR)/usr/lib/systemd/system
+
+all:
+
+SERVICES= pvestord.service
+
+.PHONY: install
+install: $(SERVICES)
+	install -d $(SERVICEDIR)
+	install -m 0644 $(SERVICES) $(SERVICEDIR)
+
+.PHONY: clean
+clean:
+	rm -rf *~
diff --git a/src/services/pvestord.service b/src/services/pvestord.service
new file mode 100644
index 0000000..310fa91
--- /dev/null
+++ b/src/services/pvestord.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=PVE Storage Monitor Daemon
+ConditionPathExists=/usr/bin/pvestord
+Wants=pve-cluster.service
+After=pve-cluster.service
+
+[Service]
+ExecStart=/usr/bin/pvestord start
+ExecStop=/usr/bin/pvestord stop
+ExecReload=/usr/bin/pvestord restart
+PIDFile=/run/pvestord.pid
+Type=forking
+
+[Install]
+WantedBy=multi-user.target
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH pve-storage 2/4] storage: add extend queue handling
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 1/4] pvestord: setup new pvestord daemon Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 3/4] lvmplugin: add thin volume support for LVM external snapshots Tiago Sousa via pve-devel
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 6119 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-storage 2/4] storage: add extend queue handling
Date: Fri, 17 Oct 2025 12:25:27 +0100
Message-ID: <20251017112539.26471-3-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/PVE/Storage.pm | 72 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 71 insertions(+), 1 deletion(-)

diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 1dde2b7..ebbaf45 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -15,7 +15,7 @@ use Socket;
 use Time::Local qw(timelocal);
 
 use PVE::Tools qw(run_command file_read_firstline dir_glob_foreach $IPV6RE);
-use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
+use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file cfs_register_file);
 use PVE::DataCenterConfig;
 use PVE::Exception qw(raise_param_exc raise);
 use PVE::JSONSchema;
@@ -239,6 +239,76 @@ sub write_config {
     cfs_write_file('storage.cfg', $cfg);
 }
 
+cfs_register_file("extend-queue", \&parser_extend_queue, \&writer_extend_queue);
+
+sub extend_queue {
+    return cfs_read_file("extend-queue");
+}
+
+sub write_extend_queue {
+    my ($extend_queue) = @_;
+    return cfs_write_file("extend-queue",$extend_queue);
+}
+
+sub lock_extend_queue {
+    my ($code, $errmsg) = @_;
+
+    cfs_lock_file("extend-queue", undef, $code);
+    my $err = $@;
+    if ($err) {
+        $errmsg ? die "$errmsg: $err" : die $err;
+    }
+}
+
+sub parser_extend_queue {
+    my ($filename, $raw) = @_;
+
+    my @queue;
+
+    my $lineno = 0;
+    my @lines = split(/\n/, $raw);
+    my $nextline = sub {
+        while (defined(my $line = shift @lines)) {
+            $lineno++;
+            return $line if ($line !~ /^\s*#/);
+        }
+    };
+
+    while (@lines) {
+        my $line = $nextline->();
+        next if !$line;
+        print "Current line $line\n";
+
+        # vmid: nodename
+        if ($line =~ '[1-9][0-9]{2,8}+: [aefz][0-9a-f]{30}') {
+            print "Extend request is valid\n";
+            my ($vmid, $nodename) = split(/:\s/, $line, 2);
+            push @queue, [$vmid, $nodename];
+        }
+    }
+    return \@queue;
+}
+
+sub writer_extend_queue {
+    my ($filename, $queue) = @_;
+
+    my $out = "";
+    foreach my $entry (@$queue) {
+        my ($vmid, $nodename) = @$entry;
+        $out .= format_extend_request($vmid, $nodename) . "\n";
+    }
+
+    return $out;
+}
+
+sub format_extend_request {
+    my ($vmid, $node_name) = @_;
+
+    my $request = $vmid . ': ' . $node_name;
+
+    return $request;
+}
+
 sub lock_storage_config {
     my ($code, $errmsg) = @_;
 
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH pve-storage 3/4] lvmplugin: add thin volume support for LVM external snapshots
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 1/4] pvestord: setup new pvestord daemon Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 2/4] storage: add extend queue handling Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 4/4] plugin: lvmplugin: add underlay functions Tiago Sousa via pve-devel
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 6855 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-storage 3/4] lvmplugin: add thin volume support for LVM external snapshots
Date: Fri, 17 Oct 2025 12:25:28 +0100
Message-ID: <20251017112539.26471-4-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/PVE/Storage/Common.pm    |  4 ++--
 src/PVE/Storage/LVMPlugin.pm | 19 +++++++++++++++----
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/PVE/Storage/Common.pm b/src/PVE/Storage/Common.pm
index 222dc76..1e5d4c6 100644
--- a/src/PVE/Storage/Common.pm
+++ b/src/PVE/Storage/Common.pm
@@ -170,7 +170,7 @@ C<$options> currently allows setting the C<preallocation> value.
 =cut
 
 sub qemu_img_create_qcow2_backed {
-    my ($path, $backing_path, $backing_format, $options) = @_;
+    my ($path, $backing_path, $backing_format, $options, $thin) = @_;
 
     my $cmd = [
         '/usr/bin/qemu-img',
@@ -188,7 +188,7 @@ sub qemu_img_create_qcow2_backed {
     my $opts = ['extended_l2=on', 'cluster_size=128k'];
 
     push @$opts, "preallocation=$options->{preallocation}"
-        if defined($options->{preallocation});
+        if defined($options->{preallocation}) && !$thin;
     push @$cmd, '-o', join(',', @$opts) if @$opts > 0;
 
     run_command($cmd, errmsg => "unable to create image");
diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm
index 0416c9e..dc5e648 100644
--- a/src/PVE/Storage/LVMPlugin.pm
+++ b/src/PVE/Storage/LVMPlugin.pm
@@ -575,7 +575,7 @@ sub lvrename {
 }
 
 my sub lvm_qcow2_format {
-    my ($class, $storeid, $scfg, $name, $fmt, $backing_snap, $size) = @_;
+    my ($class, $storeid, $scfg, $name, $fmt, $backing_snap, $size, $thin) = @_;
 
     $class->activate_volume($storeid, $scfg, $name);
     my $path = $class->path($scfg, $name, $storeid);
@@ -585,7 +585,9 @@ my sub lvm_qcow2_format {
     };
     if ($backing_snap) {
         my $backing_volname = get_snap_name($class, $name, $backing_snap);
-        PVE::Storage::Common::qemu_img_create_qcow2_backed($path, $backing_volname, $fmt, $options);
+        PVE::Storage::Common::qemu_img_create_qcow2_backed(
+            $path, $backing_volname, $fmt, $options, $thin,
+        );
     } else {
         PVE::Storage::Common::qemu_img_create($fmt, $size, $path, $options);
     }
@@ -629,7 +631,16 @@ my sub alloc_lvm_image {
     die "no such volume group '$vg'\n" if !defined($vgs->{$vg});
 
     my $free = int($vgs->{$vg}->{free});
-    my $lvmsize = calculate_lvm_size($size, $fmt, $backing_snap);
+    my $lvmsize;
+
+    # FIX: make this variable a check box when taking a snapshot
+    # right now all snapshots are created thin for testing purposes
+    my $thin = $backing_snap ? 1 : 0;
+    if ($thin) {
+        $lvmsize = 2 * 1024 * 1024;
+    } else {
+        $lvmsize = calculate_lvm_size($size, $fmt, $backing_snap);
+    }
 
     die "not enough free space ($free < $size)\n" if $free < $size;
 
@@ -641,7 +652,7 @@ my sub alloc_lvm_image {
     return if $fmt ne 'qcow2';
 
     #format the lvm volume with qcow2 format
-    eval { lvm_qcow2_format($class, $storeid, $scfg, $name, $fmt, $backing_snap, $size) };
+    eval { lvm_qcow2_format($class, $storeid, $scfg, $name, $fmt, $backing_snap, $size, $thin) };
     if ($@) {
         my $err = $@;
         #no need to safe cleanup as the volume is still empty
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH pve-storage 4/4] plugin: lvmplugin: add underlay functions
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
                   ` (2 preceding siblings ...)
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 3/4] lvmplugin: add thin volume support for LVM external snapshots Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 5/8] qmeventd: add block write threshold event handling Tiago Sousa via pve-devel
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 10214 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-storage 4/4] plugin: lvmplugin: add underlay functions
Date: Fri, 17 Oct 2025 12:25:29 +0100
Message-ID: <20251017112539.26471-5-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/PVE/Storage.pm           | 28 ++++++++++++++++
 src/PVE/Storage/LVMPlugin.pm | 65 +++++++++++++++++++++++++++++++-----
 src/PVE/Storage/Plugin.pm    | 29 +++++++++++++++-
 3 files changed, 113 insertions(+), 9 deletions(-)

diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index ebbaf45..e0b4ba8 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -480,6 +480,34 @@ sub volume_resize {
     }
 }
 
+sub volume_underlay_size_info {
+    my ($cfg, $volid, $timeout) = @_;
+
+    my ($storeid, $volname) = parse_volume_id($volid, 1);
+    if ($storeid) {
+        my $scfg = storage_config($cfg, $storeid);
+        my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+        return $plugin->volume_underlay_size_info($scfg, $storeid, $volname, $timeout);
+    } else {
+        return 0;
+    }
+}
+
+sub volume_underlay_resize {
+    my ($cfg, $volid, $size, $running, $backing_snap) = @_;
+
+    my ($storeid, $volname) = parse_volume_id($volid, 1);
+    if ($storeid) {
+        my $scfg = storage_config($cfg, $storeid);
+        my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+        return $plugin->volume_underlay_resize($scfg, $storeid, $volname, $size, $running, $backing_snap);
+    } elsif ($volid =~ m|^(/.+)$| && -e $volid) {
+        die "resize file/device '$volid' is not possible\n";
+    } else {
+        die "unable to parse volume ID '$volid'\n";
+    }
+}
+
 sub volume_rollback_is_possible {
     my ($cfg, $volid, $snap, $blockers) = @_;
 
diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm
index dc5e648..74366c3 100644
--- a/src/PVE/Storage/LVMPlugin.pm
+++ b/src/PVE/Storage/LVMPlugin.pm
@@ -400,6 +400,8 @@ sub options {
         tagged_only => { optional => 1 },
         bwlimit => { optional => 1 },
         'snapshot-as-volume-chain' => { optional => 1 },
+        chunksize => { optional => 1 },
+        'chunk-percentage' => { optional => 1 },
     };
 }
 
@@ -939,6 +941,44 @@ sub volume_resize {
     $lvmsize = "${lvmsize}k";
 
     my $path = $class->path($scfg, $volname);
+    lv_extend($class, $scfg, $storeid, $lvmsize, $path);
+
+    if (!$running && $format eq 'qcow2') {
+        my $preallocation = PVE::Storage::Plugin::preallocation_cmd_opt($scfg, $format);
+        PVE::Storage::Common::qemu_img_resize($path, $format, $size, $preallocation, 10);
+    }
+
+    return 1;
+}
+
+sub volume_underlay_resize {
+    my ($class, $scfg, $storeid, $volname, $backing_snap) = @_;
+
+    my ($format) = ($class->parse_volname($volname))[6];
+
+    my $path = $class->filesystem_path($scfg, $volname);
+    my $json = PVE::Storage::Common::qemu_img_info($path, undef, 10, 0);
+    my $json_decode = eval { decode_json($json) };
+    if ($@) {
+        die "Can't decode qemu snapshot list. Invalid JSON: $@\n";
+    }
+
+    my $virtual_size = $json_decode->{'virtual-size'} / 1024;
+
+    my $underlay_size = lv_size($path, 10);
+
+    my $updated_underlay_size = ($underlay_size + $scfg->{chunksize}) / 1024;
+    $updated_underlay_size = calculate_lvm_size($virtual_size, $format, $backing_snap)
+        if $updated_underlay_size >= $virtual_size;
+
+    my $lvmsize = "${updated_underlay_size}k";
+    lv_extend($class, $scfg, $storeid, $lvmsize, $path);
+
+    return $updated_underlay_size;
+}
+
+sub lv_extend {
+    my ($class, $scfg, $storeid, $lvmsize, $path) = @_;
     my $cmd = ['/sbin/lvextend', '-L', $lvmsize, $path];
 
     $class->cluster_lock_storage(
@@ -949,13 +989,6 @@ sub volume_resize {
             run_command($cmd, errmsg => "error resizing volume '$path'");
         },
     );
-
-    if (!$running && $format eq 'qcow2') {
-        my $preallocation = PVE::Storage::Plugin::preallocation_cmd_opt($scfg, $format);
-        PVE::Storage::Common::qemu_img_resize($path, $format, $size, $preallocation, 10);
-    }
-
-    return 1;
 }
 
 sub volume_size_info {
@@ -966,6 +999,22 @@ sub volume_size_info {
 
     return PVE::Storage::Plugin::file_size_info($path, $timeout, $format) if $format eq 'qcow2';
 
+    my $size = lv_size($path, $timeout);
+    return wantarray ? ($size, 'raw', 0, undef) : $size;
+}
+
+sub volume_underlay_size_info {
+    my ($class, $scfg, $storeid, $volname, $timeout) = @_;
+
+    my ($format) = ($class->parse_volname($volname))[6];
+    my $path = $class->filesystem_path($scfg, $volname);
+
+    return lv_size($path, $timeout);
+}
+
+sub lv_size {
+    my ($path, $timeout) = @_;
+
     my $cmd = [
         '/sbin/lvs',
         '--separator',
@@ -989,7 +1038,7 @@ sub volume_size_info {
             $size = int(shift);
         },
     );
-    return wantarray ? ($size, 'raw', 0, undef) : $size;
+    return $size;
 }
 
 sub volume_snapshot {
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index 8acd214..f08393b 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -228,6 +228,20 @@ my $defaultData = {
             default => 0,
             optional => 1,
         },
+        chunksize => {
+            type => 'integer',
+            description => 'The chunksize in Bytes to define the write threshold'
+                . 'of thin disks on thick storage.',
+            default => 1073741824, # 1 GiB
+            optional => 1,
+        },
+        'chunk-percentage' => {
+            type => 'number',
+            description => 'The percentage of written disk to define the write'
+                . 'threshold.',
+            default => 0.5,
+            optional => 1,
+        },
     },
 };
 
@@ -1265,7 +1279,6 @@ sub volume_size_info {
     my $format = ($class->parse_volname($volname))[6];
     my $path = $class->filesystem_path($scfg, $volname);
     return file_size_info($path, $timeout, $format);
-
 }
 
 sub volume_resize {
@@ -1285,6 +1298,20 @@ sub volume_resize {
     return undef;
 }
 
+sub volume_underlay_size_info {
+    my ($class, $scfg, $storeid, $volname, $timeout) = @_;
+
+    # Only supported by LVM for now
+    die "volume underlay is not supported for storage type '$scfg->{type}'\n";
+}
+
+sub volume_underlay_resize {
+    my ($class, $scfg, $storeid, $volname, $backing_snap) = @_;
+
+    # Only supported by LVM for now
+    die "volume underlay is not supported for storage type '$scfg->{type}'\n";
+}
+
 sub volume_snapshot {
     my ($class, $scfg, $storeid, $volname, $snap) = @_;
 
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH qemu-server 5/8] qmeventd: add block write threshold event handling
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
                   ` (3 preceding siblings ...)
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 4/4] plugin: lvmplugin: add underlay functions Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 6/8] blockdev: add set write threshold Tiago Sousa via pve-devel
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 5334 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server 5/8] qmeventd: add block write threshold event handling
Date: Fri, 17 Oct 2025 12:25:30 +0100
Message-ID: <20251017112539.26471-6-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/qmeventd/qmeventd.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/qmeventd/qmeventd.c b/src/qmeventd/qmeventd.c
index 1d9eb74a..7bae13f9 100644
--- a/src/qmeventd/qmeventd.c
+++ b/src/qmeventd/qmeventd.c
@@ -43,7 +43,7 @@
 
 #define DEFAULT_KILL_TIMEOUT 60
 
-static int verbose = 0;
+static int verbose = 1;
 static int kill_timeout = DEFAULT_KILL_TIMEOUT;
 static int epoll_fd = 0;
 static const char *progname;
@@ -209,6 +209,25 @@ void handle_qmp_event(struct Client *client, struct json_object *obj) {
 
         // check if a backup is running and kill QEMU process if not
         terminate_check(client);
+    } else if (!strcmp(json_object_get_string(event), "BLOCK_WRITE_THRESHOLD")) {
+        struct json_object *data;
+        struct json_object *nodename;
+        if (json_object_object_get_ex(obj, "data", &data) &&
+            json_object_object_get_ex(data, "node-name", &nodename)) {
+
+            // needs concurrency control
+            char extend_queue_path[] = "/etc/pve/extend-queue";
+            FILE *p_extend_queue = fopen(extend_queue_path, "a");
+            if (p_extend_queue == NULL) {
+                VERBOSE_PRINT(
+                    "%s: Couldn't open extend queue file %s", client->qemu.vmid, extend_queue_path
+                );
+            } else {
+                const char *nodename_string = json_object_get_string(nodename);
+                fprintf(p_extend_queue, "%s: %s\n", client->qemu.vmid, nodename_string);
+            }
+            fclose(p_extend_queue);
+        }
     }
 }
 
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH qemu-server 6/8] blockdev: add set write threshold
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
                   ` (4 preceding siblings ...)
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 5/8] qmeventd: add block write threshold event handling Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 7/8] blockdev: add query-blockstats qmp command Tiago Sousa via pve-devel
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 7867 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server 6/8] blockdev: add set write threshold
Date: Fri, 17 Oct 2025 12:25:31 +0100
Message-ID: <20251017112539.26471-7-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/PVE/QemuServer.pm          | 22 ++++++++++++++++
 src/PVE/QemuServer/Blockdev.pm | 47 ++++++++++++++++++++++++++++++++++
 src/PVE/QemuServer/Drive.pm    |  7 +++++
 3 files changed, 76 insertions(+)

diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 45daa06c..de1c39a5 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -5729,6 +5729,28 @@ sub vm_start_nolock {
         warn $@ if $@;
     }
 
+    # set write threshold for LVM thin provisioning disks
+    PVE::QemuConfig->foreach_volume(
+        $conf,
+        sub {
+            my ($ds, $drive) = @_;
+            return if PVE::QemuServer::drive_is_cdrom($drive, 1);
+            my $volid = $drive->{file};
+            if ( $volid ne 'none') {
+                my $drive_id = PVE::QemuServer::Drive::get_drive_id($drive);
+                my $snapshots = PVE::Storage::volume_snapshot_info($storecfg, $volid);
+                my $parentid = $snapshots->{'current'}->{parent};
+                # for now only set write_threshold for volumes that have snapshots
+                # FIX: Change to only thin drives
+                if ($parentid) {
+                    PVE::QemuServer::Blockdev::set_write_threshold(
+                        $storecfg, $vmid, $drive_id, $volid
+                    );
+                }
+            }
+        },
+    );
+
     #start nbd server for storage migration
     if (my $nbd = $migrate_opts->{nbd}) {
 
diff --git a/src/PVE/QemuServer/Blockdev.pm b/src/PVE/QemuServer/Blockdev.pm
index 8fa5eb51..38a1408a 100644
--- a/src/PVE/QemuServer/Blockdev.pm
+++ b/src/PVE/QemuServer/Blockdev.pm
@@ -830,6 +830,49 @@ sub set_io_throttle {
     }
 }
 
+sub block_set_write_threshold {
+    my ($vmid, $nodename, $threshold) = @_;
+
+    print "set threshold $nodename $threshold\n";
+
+    PVE::QemuServer::mon_cmd(
+        $vmid,
+        "block-set-write-threshold",
+        'node-name' => $nodename,
+        'write-threshold' => int($threshold),
+    );
+}
+
+sub compute_write_threshold {
+    my ($storecfg, $scfg, $volid) = @_;
+
+    my $lv_size = PVE::Storage::volume_size_info($storecfg, $volid, 5);
+
+    my $write_threshold = $lv_size - $scfg->{chunksize} * $scfg->{'chunk-percentage'};
+
+    return $write_threshold;
+}
+
+sub set_write_threshold {
+    my ($storecfg, $vmid, $drive_id, $volid, $options) = @_;
+
+    my ($storeid) = PVE::Storage::parse_volume_id($volid);
+    my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
+    my $support_qemu_snapshots = PVE::Storage::volume_qemu_snapshot_method($storecfg, $volid);
+
+    # set write threshold is only supported for lvm storage using
+    # qcow2+external snapshots
+    return if $scfg->{type} ne 'lvm' || $support_qemu_snapshots ne 'mixed';
+    # return if drive is not set as thin
+    # return if !$drive->{thin};
+
+    my $nodename = get_node_name('file', $drive_id, $volid, $options);
+    my $write_threshold = compute_write_threshold($storecfg, $scfg, $volid);
+
+    print "setting threshold for $volid from $storeid\n";
+    block_set_write_threshold($vmid, $nodename, $write_threshold);
+}
+
 sub blockdev_external_snapshot {
     my ($storecfg, $vmid, $machine_version, $deviceid, $drive, $snap, $parent_snap) = @_;
 
@@ -878,6 +921,10 @@ sub blockdev_external_snapshot {
         node => $snap_fmt_blockdev->{'node-name'},
         overlay => $new_fmt_blockdev->{'node-name'},
     );
+
+    # FIX: only if thin
+    my $drive_id = PVE::QemuServer::Drive::get_drive_id($drive);
+    set_write_threshold($storecfg, $vmid, $drive_id, $volid);
 }
 
 sub blockdev_delete {
diff --git a/src/PVE/QemuServer/Drive.pm b/src/PVE/QemuServer/Drive.pm
index 79dd22e6..44f477a9 100644
--- a/src/PVE/QemuServer/Drive.pm
+++ b/src/PVE/QemuServer/Drive.pm
@@ -253,6 +253,13 @@ my %drivedesc_base = (
         optional => 1,
         default => 0,
     },
+    thin => {
+        type => 'boolean',
+        description =>
+            'Controls whether a drive should be thin provisioned',
+        optional => 1,
+        default => 0,
+    },
 );
 
 my %iothread_fmt = (
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH qemu-server 7/8] blockdev: add query-blockstats qmp command
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
                   ` (5 preceding siblings ...)
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 6/8] blockdev: add set write threshold Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 8/8] blockdev: add underlay resize Tiago Sousa via pve-devel
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 4501 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server 7/8] blockdev: add query-blockstats qmp command
Date: Fri, 17 Oct 2025 12:25:32 +0100
Message-ID: <20251017112539.26471-8-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/PVE/QemuServer/Blockdev.pm | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/PVE/QemuServer/Blockdev.pm b/src/PVE/QemuServer/Blockdev.pm
index 38a1408a..78769198 100644
--- a/src/PVE/QemuServer/Blockdev.pm
+++ b/src/PVE/QemuServer/Blockdev.pm
@@ -113,6 +113,21 @@ sub get_block_info {
     return $block_info;
 }
 
+sub get_block_stats {
+    my ($vmid) = @_;
+
+    my $block_stats = {};
+
+    my $qmp_block_stats = mon_cmd($vmid, "query-blockstats");
+    for my $info ($qmp_block_stats->@*) {
+        my $qdev_id = $info->{qdev} or next;
+        my $drive_id = qdev_id_to_drive_id($qdev_id);
+        $block_stats->{$drive_id} = $info;
+    }
+
+    return $block_stats;
+}
+
 my sub get_node_name {
     my ($type, $drive_id, $volid, $options) = @_;
 
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH qemu-server 8/8] blockdev: add underlay resize
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
                   ` (6 preceding siblings ...)
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 7/8] blockdev: add query-blockstats qmp command Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-cluster 9/9] observe extend queue Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-manager 10/10] services: add pvestord service Tiago Sousa via pve-devel
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 5186 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server 8/8] blockdev: add underlay resize
Date: Fri, 17 Oct 2025 12:25:33 +0100
Message-ID: <20251017112539.26471-9-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/PVE/QemuServer/Blockdev.pm | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/PVE/QemuServer/Blockdev.pm b/src/PVE/QemuServer/Blockdev.pm
index 78769198..5da1abd9 100644
--- a/src/PVE/QemuServer/Blockdev.pm
+++ b/src/PVE/QemuServer/Blockdev.pm
@@ -725,6 +725,24 @@ sub resize {
     );
 }
 
+sub underlay_resize {
+    my ($storecfg, $vmid, $drive_id, $volid) = @_;
+
+    my $running = PVE::QemuServer::Helpers::vm_running_locally($vmid);
+
+    # get backing_snap
+    my $snapshots = PVE::Storage::volume_snapshot_info($storecfg, $volid);
+    my $backing_snap = $snapshots->{current}->{parent};
+    my $size = PVE::Storage::volume_underlay_resize($storecfg, $volid, $backing_snap);
+
+    return if !$running;
+    my $block_info = get_block_info($vmid);
+    my $inserted = $block_info->{$drive_id}->{inserted}
+        or die "no block node inserted for drive '$drive_id'\n";
+
+    set_write_threshold($storecfg, $vmid, $drive_id, $volid);
+}
+
 my sub blockdev_change_medium {
     my ($storecfg, $vmid, $qdev_id, $drive) = @_;
 
@@ -861,7 +879,7 @@ sub block_set_write_threshold {
 sub compute_write_threshold {
     my ($storecfg, $scfg, $volid) = @_;
 
-    my $lv_size = PVE::Storage::volume_size_info($storecfg, $volid, 5);
+    my $lv_size = PVE::Storage::volume_underlay_size_info($storecfg, $volid, 5);
 
     my $write_threshold = $lv_size - $scfg->{chunksize} * $scfg->{'chunk-percentage'};
 
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH pve-cluster 9/9] observe extend queue
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
                   ` (7 preceding siblings ...)
  2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 8/8] blockdev: add underlay resize Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-manager 10/10] services: add pvestord service Tiago Sousa via pve-devel
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 4075 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-cluster 9/9] observe extend queue
Date: Fri, 17 Oct 2025 12:25:34 +0100
Message-ID: <20251017112539.26471-10-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 src/PVE/Cluster.pm | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/PVE/Cluster.pm b/src/PVE/Cluster.pm
index e829687..233ba69 100644
--- a/src/PVE/Cluster.pm
+++ b/src/PVE/Cluster.pm
@@ -87,6 +87,7 @@ my $observed = {
     'mapping/directory.cfg' => 1,
     'mapping/pci.cfg' => 1,
     'mapping/usb.cfg' => 1,
+    'extend-queue' => 1,
 };
 
 sub prepare_observed_file_basedirs {
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH pve-manager 10/10] services: add pvestord service
       [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
                   ` (8 preceding siblings ...)
  2025-10-17 11:25 ` [pve-devel] [PATCH pve-cluster 9/9] observe extend queue Tiago Sousa via pve-devel
@ 2025-10-17 11:25 ` Tiago Sousa via pve-devel
  9 siblings, 0 replies; 10+ messages in thread
From: Tiago Sousa via pve-devel @ 2025-10-17 11:25 UTC (permalink / raw)
  To: pve-devel; +Cc: Tiago Sousa

[-- Attachment #1: Type: message/rfc822, Size: 4074 bytes --]

From: Tiago Sousa <joao.sousa@eurotux.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-manager 10/10] services: add pvestord service
Date: Fri, 17 Oct 2025 12:25:35 +0100
Message-ID: <20251017112539.26471-11-joao.sousa@eurotux.com>

Signed-off-by: Tiago Sousa <joao.sousa@eurotux.com>
---
 PVE/API2/Services.pm | 1 +
 1 file changed, 1 insertion(+)

diff --git a/PVE/API2/Services.pm b/PVE/API2/Services.pm
index b7bae6b5..6946f136 100644
--- a/PVE/API2/Services.pm
+++ b/PVE/API2/Services.pm
@@ -40,6 +40,7 @@ my $service_name_list = [
     'syslog',
     'systemd-journald',
     'systemd-timesyncd',
+    'pvestord',
 ];
 my $essential_services = {
     pveproxy => 1,
-- 
2.47.3



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-10-17 11:35 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20251017112539.26471-1-joao.sousa@eurotux.com>
2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 1/4] pvestord: setup new pvestord daemon Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 2/4] storage: add extend queue handling Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 3/4] lvmplugin: add thin volume support for LVM external snapshots Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH pve-storage 4/4] plugin: lvmplugin: add underlay functions Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 5/8] qmeventd: add block write threshold event handling Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 6/8] blockdev: add set write threshold Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 7/8] blockdev: add query-blockstats qmp command Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH qemu-server 8/8] blockdev: add underlay resize Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH pve-cluster 9/9] observe extend queue Tiago Sousa via pve-devel
2025-10-17 11:25 ` [pve-devel] [PATCH pve-manager 10/10] services: add pvestord service Tiago Sousa via pve-devel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal