]>
git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/NodeStatus.pm
1 package PVE
::HA
::NodeStatus
;
9 my ($this, $haenv, $status) = @_;
11 my $class = ref($this) || $this;
22 # possible node state:
23 my $valid_node_states = {
24 online
=> "node online and member of quorate partition",
25 unknown
=> "not member of quorate partition, but possibly still running",
26 fence
=> "node needs to be fenced",
30 my ($self, $node) = @_;
32 $self->{status
}->{$node} = 'unknown'
33 if !$self->{status
}->{$node};
35 return $self->{status
}->{$node};
39 my ($self, $node) = @_;
41 return $self->get_node_state($node) eq 'online';
44 sub node_is_offline_delayed
{
45 my ($self, $node, $delay) = @_;
47 my $haenv = $self->{haenv
};
49 return undef if $self->get_node_state($node) eq 'online';
51 my $last_online = $self->{last_online
}->{$node};
53 my $ctime = $haenv->get_time();
55 if (!defined($last_online)) {
56 $self->{last_online
}->{$node} = $ctime;
60 return ($ctime - $last_online) >= $delay;
66 return [sort keys %{$self->{status
}}];
69 sub list_online_nodes
{
74 foreach my $node (sort keys %{$self->{status
}}) {
75 next if $self->{status
}->{$node} ne 'online';
82 my $set_node_state = sub {
83 my ($self, $node, $state) = @_;
85 my $haenv = $self->{haenv
};
87 die "unknown node state '$state'\n"
88 if !defined($valid_node_states->{$state});
90 my $last_state = $self->get_node_state($node);
92 return if $state eq $last_state;
94 $self->{status
}->{$node} = $state;
96 $haenv->log('info', "node '$node': state changed from " .
97 "'$last_state' => '$state'\n");
101 my ($self, $node_info) = @_;
103 my $haenv = $self->{haenv
};
105 foreach my $node (sort keys %$node_info) {
106 my $d = $node_info->{$node};
107 next if !$d->{online
};
109 # record last time the node was online (required to implement fence delay)
110 $self->{last_online
}->{$node} = $haenv->get_time();
112 my $state = $self->get_node_state($node);
114 if ($state eq 'online') {
115 # &$set_node_state($self, $node, 'online');
116 } elsif ($state eq 'unknown') {
117 &$set_node_state($self, $node, 'online');
118 } elsif ($state eq 'fence') {
119 # do nothing, wait until fenced
121 die "detected unknown node state '$state";
125 foreach my $node (keys %{$self->{status
}}) {
126 my $d = $node_info->{$node};
127 next if $d && $d->{online
};
129 my $state = $self->get_node_state($node);
131 # node is not inside quorate partition, possibly not active
133 if ($state eq 'online') {
134 &$set_node_state($self, $node, 'unknown');
135 } elsif ($state eq 'unknown') {
136 # &$set_node_state($self, $node, 'unknown');
137 } elsif ($state eq 'fence') {
138 # do nothing, wait until fenced
140 die "detected unknown node state '$state";
148 my ($self, $node) = @_;
150 my $haenv = $self->{haenv
};
152 my $state = $self->get_node_state($node);
154 if ($state ne 'fence') {
155 &$set_node_state($self, $node, 'fence');
158 my $success = $haenv->get_ha_agent_lock($node);
161 $haenv->log("info", "fencing: acknowleged - got agent lock for node '$node'");
162 &$set_node_state($self, $node, 'unknown');