[pve-devel] [PATCH ha-manager v5 01/14] introduce PVE::HA::HashTools module
Daniel Kral
d.kral at proxmox.com
Wed Jul 30 20:14:05 CEST 2025
Add a new package PVE::HA::HashTools to provide helpers for the common
operations done on hashes.
These helper subroutines implement basic set operations done on hash
sets, which will be used in an upcoming patch for the resource affinity
rules.
Signed-off-by: Daniel Kral <d.kral at proxmox.com>
---
debian/pve-ha-manager.install | 1 +
src/PVE/HA/HashTools.pm | 90 +++++++++++++++++++++++++++++++++++
src/PVE/HA/Makefile | 4 +-
3 files changed, 93 insertions(+), 2 deletions(-)
create mode 100644 src/PVE/HA/HashTools.pm
diff --git a/debian/pve-ha-manager.install b/debian/pve-ha-manager.install
index b4eff279..79f86d24 100644
--- a/debian/pve-ha-manager.install
+++ b/debian/pve-ha-manager.install
@@ -27,6 +27,7 @@
/usr/share/perl5/PVE/HA/Fence.pm
/usr/share/perl5/PVE/HA/FenceConfig.pm
/usr/share/perl5/PVE/HA/Groups.pm
+/usr/share/perl5/PVE/HA/HashTools.pm
/usr/share/perl5/PVE/HA/LRM.pm
/usr/share/perl5/PVE/HA/Manager.pm
/usr/share/perl5/PVE/HA/NodeStatus.pm
diff --git a/src/PVE/HA/HashTools.pm b/src/PVE/HA/HashTools.pm
new file mode 100644
index 00000000..cf5c7a20
--- /dev/null
+++ b/src/PVE/HA/HashTools.pm
@@ -0,0 +1,90 @@
+package PVE::HA::HashTools;
+
+use strict;
+use warnings;
+
+use base qw(Exporter);
+
+our @EXPORT_OK = qw(
+ set_intersect
+ set_union
+ sets_are_disjoint
+);
+
+=head1 NAME
+
+PVE::HA::HashTools - Helpers for Hashes
+
+=head1 DESCRIPTION
+
+This packages provides helpers for common operations on hashes.
+
+Even though these operations' implementation are often one-liners, they are
+meant to improve code readability by stating a operation name instead of the
+more verbose implementation.
+
+=cut
+
+=head1 FUNCTIONS
+
+=cut
+
+=head3 set_intersect($hash1, $hash2)
+
+Returns a hash set of the intersection of the hash sets C<$hash1> and
+C<$hash2>, i.e. the elements that are both in C<$hash1> and C<$hash2>.
+
+The hashes C<$hash1> and C<$hash2> are expected to be hash sets, i.e.
+key-value pairs are always set to C<1> or another truthy value.
+
+=cut
+
+sub set_intersect : prototype($$) {
+ my ($hash1, $hash2) = @_;
+
+ my $result = { map { $hash1->{$_} && $hash2->{$_} ? ($_ => 1) : () } keys %$hash1 };
+
+ return $result;
+}
+
+=head3 set_union($hash1, $hash2)
+
+Returns a hash set of the union of the hash sets C<$hash1> and C<$hash2>, i.e.
+the elements that are in either C<$hash1> or C<$hash2>.
+
+The hashes C<$hash1> and C<$hash2> are expected to be hash sets, i.e.
+key-value pairs are always set to C<1> or another truthy value.
+
+=cut
+
+sub set_union : prototype($$) {
+ my ($hash1, $hash2) = @_;
+
+ my $result = { map { $_ => 1 } keys %$hash1, keys %$hash2 };
+
+ return $result;
+}
+
+=head3 sets_are_disjoint($hash1, $hash2)
+
+Checks whether the two given hash sets C<$hash1> and C<$hash2> are disjoint,
+i.e. have no common element in both of them.
+
+The hashes C<$hash1> and C<$hash2> are expected to be hash sets, i.e.
+key-value pairs are always set to C<1> or another truthy value.
+
+Returns C<1> if they are disjoint, C<0> otherwise.
+
+=cut
+
+sub sets_are_disjoint : prototype($$) {
+ my ($hash1, $hash2) = @_;
+
+ for my $key (keys %$hash1) {
+ return 0 if $hash2->{$key};
+ }
+
+ return 1;
+}
+
+1;
diff --git a/src/PVE/HA/Makefile b/src/PVE/HA/Makefile
index e386cbfc..88629074 100644
--- a/src/PVE/HA/Makefile
+++ b/src/PVE/HA/Makefile
@@ -1,5 +1,5 @@
-SIM_SOURCES=CRM.pm Env.pm Groups.pm Rules.pm Resources.pm LRM.pm Manager.pm \
- NodeStatus.pm Tools.pm FenceConfig.pm Fence.pm Usage.pm
+SIM_SOURCES=CRM.pm Env.pm Groups.pm HashTools.pm Rules.pm Resources.pm LRM.pm \
+ Manager.pm NodeStatus.pm Tools.pm FenceConfig.pm Fence.pm Usage.pm
SOURCES=${SIM_SOURCES} Config.pm
--
2.47.2
More information about the pve-devel
mailing list