diff --git a/debian/changelog b/debian/changelog index c670721..9ac4178 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,19 @@ +pve-cluster (9.0.6) trixie; urgency=medium + + * rrd: cope with only partially renamed memavailable field when old data was + migrated. + + -- Proxmox Support Team Mon, 04 Aug 2025 12:38:19 +0200 + +pve-cluster (9.0.5) trixie; urgency=medium + + * pmxcfs: remove legacy ipam db and mac cache files. + + * pmxcfs: various internal code clean-ups and fixing some smaller memory + leaks. + + -- Proxmox Support Team Fri, 01 Aug 2025 14:58:03 +0200 + pve-cluster (9.0.4) trixie; urgency=medium * pmxcfs: status: fix create sub directories in /var/lib/rrdcached/db when diff --git a/src/PVE/Cluster.pm b/src/PVE/Cluster.pm index 9380241..233ba69 100644 --- a/src/PVE/Cluster.pm +++ b/src/PVE/Cluster.pm @@ -61,8 +61,6 @@ my $observed = { 'priv/tfa.cfg' => 1, 'priv/token.cfg' => 1, 'priv/acme/plugins.cfg' => 1, - 'priv/ipam.db' => 1, # TODO: replaced by sdn/ipam-pve-db.json, remove in PVE 9+ - 'priv/macs.db' => 1, # TODO: replaced by sdn/mac-cache.json, remove in PVE 9+ '/qemu-server/' => 1, '/openvz/' => 1, '/lxc/' => 1, @@ -89,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 { diff --git a/src/PVE/RRD.pm b/src/PVE/RRD.pm index c95f495..8fe1927 100644 --- a/src/PVE/RRD.pm +++ b/src/PVE/RRD.pm @@ -37,6 +37,7 @@ sub create_rrd_data { $setup = $setup_pve2; $timeframe = "year" if $timeframe eq "decade"; # we only store up to one year in the old format } + my $is_node = !!($rrdname =~ /^pve-node/); my ($reso, $count) = @{ $setup->{$timeframe} }; my $ctime = $reso * int(time() / $reso); @@ -70,6 +71,8 @@ sub create_rrd_data { my $name = $names->[$i]; if (defined(my $val = $line->[$i])) { $entry->{$name} = $val; + $entry->{memavailable} = $val + if $is_node && $name eq 'memfree' && !exists($entry->{memavailable}); } else { # leave empty fields undefined # maybe make this configurable? diff --git a/src/pmxcfs/status.c b/src/pmxcfs/status.c index a00e793..130f08f 100644 --- a/src/pmxcfs/status.c +++ b/src/pmxcfs/status.c @@ -88,8 +88,6 @@ static memdb_change_t memdb_change_array[] = { {.path = "priv/acme/plugins.cfg"}, {.path = "priv/tfa.cfg"}, {.path = "priv/token.cfg"}, - {.path = "priv/ipam.db"}, // TODO: replaced by sdn/ipam-pve-db.json remove with PVE 9 or later - {.path = "priv/macs.db"}, // TODO: replaced by sdn/mac-cache.json remove with PVE 9 or later {.path = "datacenter.cfg"}, {.path = "vzdump.cron"}, {.path = "vzdump.conf"}, @@ -1369,21 +1367,23 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { } else if (g_file_test(filename_pve2, G_FILE_TEST_EXISTS)) { // old file exists, use it use_pve2_file = 1; - filename = g_strdup_printf("%s", filename_pve2); + + g_free(filename); + filename = filename_pve2; + filename_pve2 = NULL; } else { // neither file exists, check for directories to decide and create file - char *dir_pve2 = g_strdup_printf(RRDDIR "/pve2-node"); - char *dir_pve90 = g_strdup_printf(RRDDIR "/pve-node-9.0"); - if (g_file_test(dir_pve90, G_FILE_TEST_IS_DIR)) { + if (g_file_test(RRDDIR "/pve-node-9.0", G_FILE_TEST_IS_DIR)) { int argcount = sizeof(rrd_def_node_pve9_0) / sizeof(void *) - 1; create_rrd_file(filename, argcount, rrd_def_node_pve9_0); - } else if (g_file_test(dir_pve2, G_FILE_TEST_IS_DIR)) { + } else if (g_file_test(RRDDIR "/pve2-node", G_FILE_TEST_IS_DIR)) { use_pve2_file = 1; g_free(filename); - filename = g_strdup_printf("%s", filename_pve2); + filename = filename_pve2; + filename_pve2 = NULL; char *dir = g_path_get_dirname(filename); checked_mkdir(dir, 0755); @@ -1402,8 +1402,6 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { int argcount = sizeof(rrd_def_node_pve9_0) / sizeof(void *) - 1; create_rrd_file(filename, argcount, rrd_def_node_pve9_0); } - g_free(dir_pve2); - g_free(dir_pve90); } skip = 2; // first two columns are live data that isn't archived @@ -1433,7 +1431,7 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { } filename = g_strdup_printf(RRDDIR "/pve-vm-9.0/%s", vmid); - char *filename_pve2 = g_strdup_printf(RRDDIR "/%s/%s", "pve2-vm", vmid); + char *filename_pve2 = g_strdup_printf(RRDDIR "/pve2-vm/%s", vmid); int use_pve2_file = 0; @@ -1445,21 +1443,21 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { // old file exists, use it use_pve2_file = 1; g_free(filename); - filename = g_strdup_printf("%s", filename_pve2); + filename = filename_pve2; + filename_pve2 = NULL; } else { // neither file exists, check for directories to decide and create file - char *dir_pve2 = g_strdup_printf(RRDDIR "/pve2-vm"); - char *dir_pve90 = g_strdup_printf(RRDDIR "/pve-vm-9.0"); - if (g_file_test(dir_pve90, G_FILE_TEST_IS_DIR)) { + if (g_file_test(RRDDIR "/pve-vm-9.0", G_FILE_TEST_IS_DIR)) { int argcount = sizeof(rrd_def_vm_pve9_0) / sizeof(void *) - 1; create_rrd_file(filename, argcount, rrd_def_vm_pve9_0); - } else if (g_file_test(dir_pve2, G_FILE_TEST_IS_DIR)) { + } else if (g_file_test(RRDDIR "/pve2-vm", G_FILE_TEST_IS_DIR)) { use_pve2_file = 1; g_free(filename); - filename = g_strdup_printf("%s", filename_pve2); + filename = filename_pve2; + filename_pve2 = NULL; int argcount = sizeof(rrd_def_vm) / sizeof(void *) - 1; create_rrd_file(filename, argcount, rrd_def_vm); @@ -1470,8 +1468,6 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { int argcount = sizeof(rrd_def_vm_pve9_0) / sizeof(void *) - 1; create_rrd_file(filename, argcount, rrd_def_vm_pve9_0); } - g_free(dir_pve2); - g_free(dir_pve90); } skip = 4; // first 4 columns are live data that isn't archived @@ -1506,7 +1502,7 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { } filename = g_strdup_printf(RRDDIR "/pve-storage-9.0/%s", node); - char *filename_pve2 = g_strdup_printf(RRDDIR "/%s/%s", "pve2-storage", node); + char *filename_pve2 = g_strdup_printf(RRDDIR "/pve2-storage/%s", node); // check existing rrd files and directories if (g_file_test(filename, G_FILE_TEST_EXISTS)) { @@ -1515,22 +1511,22 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { } else if (g_file_test(filename_pve2, G_FILE_TEST_EXISTS)) { // old file exists, use it g_free(filename); - filename = g_strdup_printf("%s", filename_pve2); + filename = filename_pve2; + filename_pve2 = NULL; } else { // neither file exists, check for directories to decide and create file - char *dir_pve2 = g_strdup_printf(RRDDIR "/pve2-storage"); - char *dir_pve90 = g_strdup_printf(RRDDIR "/pve-storage-9.0"); - if (g_file_test(dir_pve90, G_FILE_TEST_IS_DIR)) { + if (g_file_test(RRDDIR "/pve-storage-9.0", G_FILE_TEST_IS_DIR)) { char *dir = g_path_get_dirname(filename); checked_mkdir(dir, 0755); g_free(dir); int argcount = sizeof(rrd_def_storage_pve9_0) / sizeof(void *) - 1; create_rrd_file(filename, argcount, rrd_def_storage_pve9_0); - } else if (g_file_test(dir_pve2, G_FILE_TEST_IS_DIR)) { + } else if (g_file_test(RRDDIR "/pve2-storage", G_FILE_TEST_IS_DIR)) { g_free(filename); - filename = g_strdup_printf("%s", filename_pve2); + filename = filename_pve2; + filename_pve2 = NULL; char *dir = g_path_get_dirname(filename); checked_mkdir(dir, 0755); @@ -1549,8 +1545,6 @@ static void update_rrd_data(const char *key, gconstpointer data, size_t len) { int argcount = sizeof(rrd_def_storage_pve9_0) / sizeof(void *) - 1; create_rrd_file(filename, argcount, rrd_def_storage_pve9_0); } - g_free(dir_pve2); - g_free(dir_pve90); } // actual data columns didn't change between pve2-storage and pve-storage-9.0