]> git.proxmox.com Git - pve-ha-manager.git/commitdiff
implement 'stopped' state
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 15 Nov 2016 11:11:21 +0000 (12:11 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 15 Nov 2016 15:35:21 +0000 (16:35 +0100)
In stopped state we do not start a service but we recover it on
fencing.
This can be practical for templates or cold standby guests.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/PVE/HA/Manager.pm
src/PVE/HA/Sim/TestHardware.pm

index e58fc0bd0935a7978945132d4295f83ffc871d54..c2fa2c310b018e17fbd95e92212370a13f867aa2 100644 (file)
@@ -290,7 +290,8 @@ my $recover_fenced_service = sub {
 
        # $sd *is normally read-only*, fencing is the exception
        $cd->{node} = $sd->{node} = $recovery_node;
-       &$change_service_state($self, $sid, 'started', node => $recovery_node);
+       my $new_state = ($cd->{state} eq 'enabled') ? 'started' : 'request_stop';
+       &$change_service_state($self, $sid, $new_state, node => $recovery_node);
     } else {
        # no possible node found, cannot recover
        $haenv->log('err', "recovering service '$sid' from fenced node " .
@@ -432,7 +433,8 @@ sub manage {
 
                my $lrm_mode = $sd->{node} ? $lrm_modes->{$sd->{node}} : undef;
                # unfreeze
-               &$change_service_state($self, $sid, 'started') 
+               my $state = ($cd->{state} eq 'enabled') ? 'started' : 'request_stop';
+               &$change_service_state($self, $sid, $state)
                    if $lrm_mode && $lrm_mode eq 'active';
 
            } elsif ($last_state eq 'error') {
@@ -579,6 +581,16 @@ sub next_state_stopped {
        return;
     }
 
+    if ($ns->node_is_offline_delayed($sd->{node})) {
+       &$change_service_state($self, $sid, 'fence');
+       return;
+    }
+
+    if ($cd->{state} eq 'stopped') {
+       # almost the same as 'disabled' state but the service will also get recovered
+       return;
+    }
+
     if ($cd->{state} eq 'enabled') {
        # simply mark it started, if it's on the wrong node
        # next_state_started will fix that for us
@@ -613,7 +625,7 @@ sub next_state_started {
        return;
     }
        
-    if ($cd->{state} eq 'disabled') {
+    if ($cd->{state} eq 'disabled' || $cd->{state} eq 'stopped') {
        &$change_service_state($self, $sid, 'request_stop');
        return;
     }
index 0c7d6cdb86e2927d3a990bf720b837a59a65a979..c6ad23893a85451f0f2831dd01f04db96a863326 100644 (file)
@@ -87,7 +87,7 @@ sub log {
 # reboot <node>
 # shutdown <node>
 # restart-lrm <node>
-# service <sid> <enabled|disabled>
+# service <sid> <enabled|disabled|stopped>
 # service <sid> <migrate|relocate> <target>
 # service <sid> lock/unlock [lockname]
 
@@ -175,7 +175,7 @@ sub sim_hardware_cmd {
            }
 
        } elsif ($cmd eq 'service') {
-           if ($action eq 'enabled' || $action eq 'disabled') {
+           if ($action eq 'enabled' || $action eq 'disabled' || $action eq 'stopped') {
 
                $self->set_service_state($sid, $action);