[pve-devel] [RFC v3 pve-ha-manager 3/8] lrm: implement different behavior for shutdown and restart

Dietmar Maurer dietmar at proxmox.com
Wed Dec 16 09:04:45 CET 2015


We want to keep resources running at service restart (freeze), but
want to stop them at them at shutdown.

Actual stoping service will follow in the next patch.

Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
---
 src/PVE/HA/LRM.pm                | 32 +++++++++++++++++++++++---------
 src/PVE/HA/Sim/TestHardware.pm   |  6 ++----
 src/test/test-reboot1/log.expect |  2 +-
 3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/src/PVE/HA/LRM.pm b/src/PVE/HA/LRM.pm
index 89177ee..f428465 100644
--- a/src/PVE/HA/LRM.pm
+++ b/src/PVE/HA/LRM.pm
@@ -43,9 +43,19 @@ sub new {
 sub shutdown_request {
     my ($self) = @_;
 
-    $self->{shutdown_request} = 1;
+    my $haenv = $self->{haenv};
+
+    my $shutdown = $haenv->is_poweroff();
+
+    if ($shutdown) {
+	$haenv->log('info', "shutdown LRM, stop all services");
+	$self->{mode} = 'shutdown';
+    } else {
+	$haenv->log('info', "restart LRM, freeze all services");
+	$self->{mode} = 'restart';
+    }
 
-    $self->{mode} = 'restart'; # fixme: detect shutdown/reboot
+    $self->{shutdown_request} = 1;
 
     eval { $self->update_lrm_status(); };
     if (my $err = $@) {
@@ -241,17 +251,21 @@ sub do_one_iteration {
 
 	    if ($self->{shutdown_request}) {
 
-		# fixme: request service stop or relocate ?
+		if ($self->{mode} eq 'restart') {
 
-		my $service_count = $self->active_service_count();
+		    my $service_count = $self->active_service_count();
 
-		if ($service_count == 0) {
+		    if ($service_count == 0) {
 
-		    if ($self->{ha_agent_wd}) {
-			$haenv->watchdog_close($self->{ha_agent_wd});
-			delete $self->{ha_agent_wd};
-		    }
+			if ($self->{ha_agent_wd}) {
+			    $haenv->watchdog_close($self->{ha_agent_wd});
+			    delete $self->{ha_agent_wd};
+			}
 
+			$shutdown = 1;
+		    }
+		} else {
+		    # fixme: stop all services
 		    $shutdown = 1;
 		}
 	    } else {
diff --git a/src/PVE/HA/Sim/TestHardware.pm b/src/PVE/HA/Sim/TestHardware.pm
index 06a3208..3a06906 100644
--- a/src/PVE/HA/Sim/TestHardware.pm
+++ b/src/PVE/HA/Sim/TestHardware.pm
@@ -138,10 +138,8 @@ sub sim_hardware_cmd {
 
 	    $self->write_hardware_status_nolock($cstatus);
 
-	    if ($d->{lrm}) {
-		$d->{lrm_env}->log('info', "got shutdown request");
-		$d->{lrm}->shutdown_request();
-	    }
+	    $d->{lrm}->shutdown_request() if $d->{lrm};
+
 	} else {
 	    die "sim_hardware_cmd: unknown command '$cmdstr'\n";
 	}
diff --git a/src/test/test-reboot1/log.expect b/src/test/test-reboot1/log.expect
index d9d8771..43e7d0f 100644
--- a/src/test/test-reboot1/log.expect
+++ b/src/test/test-reboot1/log.expect
@@ -21,7 +21,7 @@ info     25    node3/lrm: status change wait_for_agent_lock => active
 info     25    node3/lrm: starting service vm:103
 info     25    node3/lrm: service status vm:103 started
 info    120      cmdlist: execute reboot node3
-info    120    node3/lrm: got shutdown request
+info    120    node3/lrm: restart LRM, freeze all services
 info    120    node1/crm: service 'vm:103': state changed from 'started' to 'freeze' 
 info    126    node3/lrm: exit (loop end)
 info    126       reboot: execute power node3 off
-- 
2.1.4



More information about the pve-devel mailing list