[pve-devel] [PATCH ha-manager 03/15] usage: add get_service_node and pin_service_node methods

Fiona Ebner f.ebner at proxmox.com
Thu Apr 24 14:29:49 CEST 2025


Am 25.03.25 um 16:12 schrieb Daniel Kral:
> Add methods get_service_node() and pin_service_node() to the Usage class
> to retrieve and pin the current node of a specific service.

Hmm, not sure about calling it "pin", why not "set"?

> 
> This is used to retrieve the current node of a service for colocation
> rules inside of select_service_node(), where there is currently no
> access to the global services state.
> 
> Signed-off-by: Daniel Kral <d.kral at proxmox.com>
> ---
> For me this is more of a temporary change, since I don't think putting
> this information here is very useful in the future. It was more of a
> workaround for the moment, since `select_service_node()` doesn't have
> access to the global service configuration data, which is needed here.
> 
> I would like to give `select_service_node()` the information from e.g.
> $sc directly post-RFC.

Yes, this sounds cleaner than essentially tracking the same things twice
in different places. Can't we do this as preparation to avoid such
temporary workarounds?

>  src/PVE/HA/Usage.pm        | 12 ++++++++++++
>  src/PVE/HA/Usage/Basic.pm  | 15 +++++++++++++++
>  src/PVE/HA/Usage/Static.pm | 14 ++++++++++++++
>  3 files changed, 41 insertions(+)
> 
> diff --git a/src/PVE/HA/Usage.pm b/src/PVE/HA/Usage.pm
> index 66d9572..e4f86d7 100644
> --- a/src/PVE/HA/Usage.pm
> +++ b/src/PVE/HA/Usage.pm
> @@ -27,6 +27,18 @@ sub list_nodes {
>      die "implement in subclass";
>  }
>  
> +sub get_service_node {
> +    my ($self, $sid) = @_;
> +
> +    die "implement in subclass";
> +}
> +
> +sub pin_service_node {
> +    my ($self, $sid, $node) = @_;
> +
> +    die "implement in subclass";
> +}
> +
>  sub contains_node {
>      my ($self, $nodename) = @_;
>  
> diff --git a/src/PVE/HA/Usage/Basic.pm b/src/PVE/HA/Usage/Basic.pm
> index d6b3d6c..50d687b 100644
> --- a/src/PVE/HA/Usage/Basic.pm
> +++ b/src/PVE/HA/Usage/Basic.pm
> @@ -10,6 +10,7 @@ sub new {
>  
>      return bless {
>  	nodes => {},
> +	services => {},

I feel like it would be more natural to also use 'service-nodes' here
like you do for the 'static' plugin [continued below...]

>  	haenv => $haenv,
>      }, $class;
>  }
> @@ -38,11 +39,25 @@ sub contains_node {
>      return defined($self->{nodes}->{$nodename});
>  }
>  
> +sub get_service_node {
> +    my ($self, $sid) = @_;
> +
> +    return $self->{services}->{$sid};

...because these kinds of expressions don't make it clear that this is a
node.

> +}
> +
> +sub pin_service_node {
> +    my ($self, $sid, $node) = @_;
> +
> +    $self->{services}->{$sid} = $node;
> +}
> +
>  sub add_service_usage_to_node {
>      my ($self, $nodename, $sid, $service_node, $migration_target) = @_;
>  
>      if ($self->contains_node($nodename)) {
> +	$self->{total}++;
>  	$self->{nodes}->{$nodename}++;
> +	$self->{services}->{$sid} = $nodename;
>      } else {
>  	$self->{haenv}->log(
>  	    'warning',
> diff --git a/src/PVE/HA/Usage/Static.pm b/src/PVE/HA/Usage/Static.pm
> index 3d0af3a..8db9202 100644
> --- a/src/PVE/HA/Usage/Static.pm
> +++ b/src/PVE/HA/Usage/Static.pm
> @@ -22,6 +22,7 @@ sub new {
>  	'service-stats' => {},
>  	haenv => $haenv,
>  	scheduler => $scheduler,
> +	'service-nodes' => {},
>  	'service-counts' => {}, # Service count on each node. Fallback if scoring calculation fails.
>      }, $class;
>  }
> @@ -85,9 +86,22 @@ my sub get_service_usage {
>      return $service_stats;
>  }
>  
> +sub get_service_node {
> +    my ($self, $sid) = @_;
> +
> +    return $self->{'service-nodes'}->{$sid};
> +}
> +
> +sub pin_service_node {
> +    my ($self, $sid, $node) = @_;
> +
> +    $self->{'service-nodes'}->{$sid} = $node;
> +}
> +
>  sub add_service_usage_to_node {
>      my ($self, $nodename, $sid, $service_node, $migration_target) = @_;
>  
> +    $self->{'service-nodes'}->{$sid} = $nodename;

This is why "pin" feels wrong to me. It will just get overwritten here
next time a usage calculation is made. Can that be problematic?

>      $self->{'service-counts'}->{$nodename}++;
>  
>      eval {





More information about the pve-devel mailing list