]> git.proxmox.com Git - pve-ha-manager.git/blobdiff - src/PVE/HA/Manager.pm
cleanup backup & mounted locks after recovery (fixes #1100)
[pve-ha-manager.git] / src / PVE / HA / Manager.pm
index c60df7cc4ab09178be47fb98c2b1aeb34acf15fb..e6dab7a8b90785843df96b901986ae3930fc7d84 100644 (file)
@@ -238,6 +238,26 @@ my $change_service_state = sub {
                " to '${new_state}'$text_state");
 };
 
+# clean up a possible bad state from a recovered service to allow its start
+my $fence_recovery_cleanup = sub {
+    my ($self, $sid, $fenced_node) = @_;
+
+    my $haenv = $self->{haenv};
+
+    my (undef, $type, $id) = PVE::HA::Tools::parse_sid($sid);
+    my $plugin = PVE::HA::Resources->lookup($type);
+
+    # should not happen
+    die "unknown resource type '$type'" if !$plugin;
+
+    # locks may block recovery, cleanup those which are safe to remove after fencing
+    my $removable_locks = ['backup', 'mounted'];
+    if (my $removed_lock = $plugin->remove_locks($haenv, $id, $removable_locks, $fenced_node)) {
+       $haenv->log('warning', "removed leftover lock '$removed_lock' from recovered " .
+                   "service '$sid' to allow its start.");
+    }
+};
+
 # after a node was fenced this recovers the service to a new node
 my $recover_fenced_service = sub {
     my ($self, $sid, $cd) = @_;
@@ -264,6 +284,8 @@ my $recover_fenced_service = sub {
        $haenv->log('info', "recover service '$sid' from fenced node " .
                    "'$fenced_node' to node '$recovery_node'");
 
+       &$fence_recovery_cleanup($self, $sid, $fenced_node);
+
        $haenv->steal_service($sid, $sd->{node}, $recovery_node);
 
        # $sd *is normally read-only*, fencing is the exception