* [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