From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id B411F1FF183 for ; Wed, 30 Jul 2025 20:13:14 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C69DC17E38; Wed, 30 Jul 2025 20:14:35 +0200 (CEST) From: Daniel Kral To: pve-devel@lists.proxmox.com Date: Wed, 30 Jul 2025 20:14:05 +0200 Message-ID: <20250730181428.392906-2-d.kral@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250730181428.392906-1-d.kral@proxmox.com> References: <20250730181428.392906-1-d.kral@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1753899260789 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.014 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH ha-manager v5 01/14] introduce PVE::HA::HashTools module X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" 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 --- 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 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel