public inbox for pve-devel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal