# abstract out the cluster environment
sub new {
- my ($this, $statusdir) = @_;
+ my ($this, $statusdir, $nodename) = @_;
my $class = ref($this) || $this;
my $self = bless {
statusdir => $statusdir,
+ nodename => $nodename,
}, $class;
return $self;
}
+sub nodename {
+ my ($self) = @_;
+
+ return $self->{nodename};
+}
+
sub read_local_status {
my ($self) = @_;
- return PVE::Tools::file_read_firstline("$self->{statusdir}/status");
+ return PVE::Tools::file_read_firstline("$self->{statusdir}/local_status");
}
sub write_local_status {
my ($self, $status) = @_;
- PVE::Tools::file_set_contents("$self->{statusdir}/status", $status);
+ PVE::Tools::file_set_contents("$self->{statusdir}/local_status", $status);
}
# manager status is stored on cluster, protected by ha_manager_lock
die "implement me";
}
+# we use this to enable/disbale ha
+sub manager_status_exists {
+ my ($self) = @_;
+
+ die "implement me";
+
+ return {};
+}
+
# this should return a hash containing info
# what nodes are members and online.
sub get_node_info {
my $class = ref($this) || $this;
- my $self = $class->SUPER::new($statusdir);
-
- $self->{nodename} = $nodename;
+ my $self = $class->SUPER::new($statusdir, $nodename);
&$compute_node_info();
my $raw = PVE::Tools::file_get_contents($filename);
- my $data = decode_json($raw);
+ my $data = decode_json($raw) || {};
return $data;
}
PVE::Tools::file_set_contents($filename, $data);
}
+sub manager_status_exists {
+ my ($self) = @_;
+
+ my $filename = "$self->{statusdir}/manager_status";
+
+ return -f $filename ? 1 : 0;
+}
+
sub log {
my ($self, $level, $msg) = @_;
my $status;
-sub get_manager_status {
-
- my $status = $haenv->read_local_status();
-
- $status = 'startup' if !$status;
-
- return $status;
-}
-
-sub set_manager_status {
+sub set_local_status {
my ($new_status) = @_;
return if $status eq $new_status;
}
}
-$status = get_manager_status();
+if (!$haenv->manager_status_exists()) {
+ $haenv->log('info', "HA is not enabled");
+ exit(0);
+}
+
+$status = $haenv->read_local_status() || 'wait_for_quorum';
# can happen after crash?
if ($status eq 'master') {
- set_manager_status('recover');
+ set_local_status('recover');
} else {
- set_manager_status('wait_for_quorum');
+ set_local_status('wait_for_quorum');
}
$haenv->log('info', "starting simulation environment (status = $status)");
$haenv->log('info', "waiting for 5 seconds");
$haenv->sleep(5);
- set_manager_status('wait_for_quorum');
+ set_local_status('wait_for_quorum');
} elsif ($status eq 'wait_for_quorum') {
if ($haenv->quorate()) {
if (get_manager_lock()) {
- set_manager_status('master');
+ set_local_status('master');
} else {
- set_manager_status('slave');
+ set_local_status('slave');
}
}
my $max_time = 10;
+
# do work (max_time seconds)
eval {
+ my $ms = $haenv->read_manager_status();
+
+ $ms->{master_node} = $haenv->nodename();
+
# print "DO WORK:$startime\n";
# fixme: set alert timer
my $node_info = $haenv->get_node_info();
$node_status->update($node_info);
+ $haenv->write_manager_status($ms);
};
if (my $err = $@) {
# fixme: cleanup?
$haenv->log('err', "got unexpected error - $err");
- set_manager_status('error');
+ set_local_status('error');
} else {
sleep_until($startime + $max_time);
if (!get_manager_lock()) {
if ($haenv->quorate()) {
- set_manager_status('slave');
+ set_local_status('slave');
} else {
- set_manager_status('wait_for_quorum');
- # set_manager_status('lost_quorum');
+ set_local_status('wait_for_quorum');
+ # set_local_status('lost_quorum');
}
}
} elsif ($status eq 'slave') {
if ($haenv->quorate()) {
if (get_manager_lock()) {
- set_manager_status('master');
+ set_local_status('master');
}
} else {
- set_manager_status('wait_for_quorum');
+ set_local_status('wait_for_quorum');
}
} elsif ($status eq 'error') {