# possible node state:
my $valid_node_states = {
online => "node online and member of quorate partition",
+ maintenance => "node is a member of quorate partition but currently not able to do work",
unknown => "not member of quorate partition, but possibly still running",
fence => "node needs to be fenced",
gone => "node vanished from cluster members list, possibly deleted"
return $self->{status}->{$node};
}
+sub node_is_operational {
+ my ($self, $node) = @_;
+ return $self->node_is_online($node) || $self->get_node_state($node) eq 'maintenance';
+}
+
sub node_is_online {
my ($self, $node) = @_;
};
sub update {
- my ($self, $node_info) = @_;
+ my ($self, $node_info, $lrm_modes) = @_;
my $haenv = $self->{haenv};
foreach my $node (sort keys %$node_info) {
my $d = $node_info->{$node};
+ my $lrm_mode = $lrm_modes->{$node} // 'unkown';
next if !$d->{online};
# record last time the node was online (required to implement fence delay)
my $state = $self->get_node_state($node);
if ($state eq 'online') {
+ if ($lrm_mode eq 'maintenance') {
+ #$haenv->log('info', "update node state maintance");
+ $set_node_state->($self, $node, 'maintenance');
+ }
# &$set_node_state($self, $node, 'online');
} elsif ($state eq 'unknown' || $state eq 'gone') {
&$set_node_state($self, $node, 'online');
} elsif ($state eq 'fence') {
# do nothing, wait until fenced
+ } elsif ($state eq 'maintenance') {
+ if ($lrm_mode ne 'maintenance') {
+ $set_node_state->($self, $node, 'online');
+ }
} else {
die "detected unknown node state '$state";
}
# node is not inside quorate partition, possibly not active
- if ($state eq 'online') {
+ if ($state eq 'online' || $state eq 'maintenance') {
&$set_node_state($self, $node, 'unknown');
} elsif ($state eq 'unknown') {