]> git.proxmox.com Git - pve-ha-manager.git/commitdiff
implement read/write manager status
authorDietmar Maurer <dietmar@proxmox.com>
Sun, 30 Nov 2014 10:38:55 +0000 (11:38 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Sun, 30 Nov 2014 10:43:34 +0000 (11:43 +0100)
PVE/HA/Env.pm
PVE/HA/SimEnv.pm
pve-ha-manager

index 8816454c7fb0c60f36e753fbf33ebdfb616d2ba0..dd087a3d667b246328c9320b2adb12e6c1cd7557 100644 (file)
@@ -9,27 +9,34 @@ use PVE::Tools;
 # 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
@@ -47,6 +54,15 @@ sub write_manager_status {
     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 {
index 9c6aa486d02ad58b978b58d8e966013610b249b4..92f1785535676cb0041f1dcd73754b52e6588519 100644 (file)
@@ -81,9 +81,7 @@ sub new {
 
     my $class = ref($this) || $this;
 
-    my $self = $class->SUPER::new($statusdir);
-
-    $self->{nodename} = $nodename;
+    my $self = $class->SUPER::new($statusdir, $nodename);
 
     &$compute_node_info();
 
@@ -100,7 +98,7 @@ sub read_manager_status {
 
     my $raw = PVE::Tools::file_get_contents($filename);
 
-    my $data = decode_json($raw);
+    my $data = decode_json($raw) || {};
  
     return $data;
 }
@@ -117,6 +115,14 @@ sub write_manager_status {
     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) = @_;
 
index a0ade25fcbb69d5057685576367a8ee5af59e65f..3f4f6009a53a32389b584172915f36ce2786c72f 100755 (executable)
@@ -17,16 +17,7 @@ my $haenv = PVE::HA::SimEnv->new($statusdir, 'node1');
 
 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;
@@ -60,13 +51,18 @@ sub sleep_until {
    }
 }
 
-$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)");
@@ -84,7 +80,7 @@ eval {
            $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') {
 
@@ -92,9 +88,9 @@ eval {
           
            if ($haenv->quorate()) {
                if (get_manager_lock()) {
-                   set_manager_status('master');
+                   set_local_status('master');
                } else {
-                   set_manager_status('slave');
+                   set_local_status('slave');
                }
            }
 
@@ -104,20 +100,26 @@ eval {
 
            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);
@@ -125,10 +127,10 @@ eval {
 
            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') {
@@ -137,10 +139,10 @@ eval {
 
            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') {