fence-agents: RHEL6 - fence_scsi: fix simultaneous unfence operations

rohara rohara at fedoraproject.org
Mon Sep 19 17:34:15 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/fence-agents.git?p=fence-agents.git;a=commitdiff;h=e5bf447139c7ba7c128f615a8bcbf46174d0945a
Commit:        e5bf447139c7ba7c128f615a8bcbf46174d0945a
Parent:        bc5c5b41acb78a6821bf9f2a80d324f433cec26c
Author:        Ryan O'Hara <rohara at redhat.com>
AuthorDate:    Thu Sep 15 13:23:52 2011 -0500
Committer:     Ryan O'Hara <rohara at redhat.com>
CommitterDate: Mon Sep 19 12:29:11 2011 -0500

fence_scsi: fix simultaneous unfence operations

This patch fixes an issue where multiple nodes attempt to unfence at
the same time and fail when attempting to create a reservation. Each
node checks to see if a reservation exists, and if not, it will attempt
to create one. The problem occurs when multiple nodes see that no
reservation exists and attempt to create one.

This patch checks the return code of do_reserve. If this call fails,
check again to see if a reservation was created by another node, in
which case there is no error.

Resolves: rhbz#738384

Signed-off-by: Ryan O'Hara <rohara at redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto at redhat.com>
---
 fence/agents/scsi/fence_scsi.pl |   87 ++++++++++++++++++++-------------------
 1 files changed, 44 insertions(+), 43 deletions(-)

diff --git a/fence/agents/scsi/fence_scsi.pl b/fence/agents/scsi/fence_scsi.pl
index 2751bed..93f5056 100644
--- a/fence/agents/scsi/fence_scsi.pl
+++ b/fence/agents/scsi/fence_scsi.pl
@@ -48,10 +48,16 @@ sub do_action_on ($@)
 	log_error ("device $dev does not exist") if (! -e $dev);
 	log_error ("device $dev is not a block device") if (! -b $dev);
 
-	do_register_ignore ($node_key, $dev);
+	if (do_register_ignore ($node_key, $dev) != 0) {
+	    log_error ("failed to create registration (key=$node_key, device=$dev)");
+	}
 
 	if (!get_reservation_key ($dev)) {
-	    do_reserve ($node_key, $dev);
+	    if (do_reserve ($node_key, $dev) != 0) {
+		if (!get_reservation_key ($dev)) {
+		    log_error ("failed to create reservation (key=$node_key, device=$dev)");
+		}
+	    }
 	}
     }
 
@@ -106,8 +112,7 @@ sub do_action_status ($@)
 
     if ($dev_count != 0) {
 	exit (0);
-    }
-    else {
+    } else {
 	exit (2);
     }
 }
@@ -199,13 +204,13 @@ sub do_register ($$$)
     $out = qx { $cmd 2> /dev/null };
     $err = ($?>>8);
 
-    if ($err != 0) {
-	log_error ("$self (err=$err)");
-    }
+    # if ($err != 0) {
+    # 	log_error ("$self (err=$err)");
+    # }
 
-    # die "[error]: $self\n" if ($?>>8);
+    log_debug ("$self (err=$err)");
 
-    return;
+    return ($err);
 }
 
 sub do_register_ignore ($$)
@@ -236,13 +241,13 @@ sub do_register_ignore ($$)
     $out = qx { $cmd 2> /dev/null };
     $err = ($?>>8);
 
-    if ($err != 0) {
-	log_error ("$self (err=$err)");
-    }
+    # if ($err != 0) {
+    # 	log_error ("$self (err=$err)");
+    # }
 
-    # die "[error]: $self ($dev)\n" if ($?>>8);
+    log_debug ("$self (err=$err)");
 
-    return;
+    return ($err);
 }
 
 sub do_reserve ($$)
@@ -256,13 +261,13 @@ sub do_reserve ($$)
     my $out = qx { $cmd 2> /dev/null };
     my $err = ($?>>8);
 
-    if ($err != 0) {
-	log_error ("$self (err=$err)");
-    }
+    # if ($err != 0) {
+    # 	log_error ("$self (err=$err)");
+    # }
 
-    # die "[error]: $self\n" if ($?>>8);
+    log_debug ("$self (err=$err)");
 
-    return;
+    return ($err);
 }
 
 sub do_release ($$)
@@ -276,13 +281,13 @@ sub do_release ($$)
     my $out = qx { $cmd 2> /dev/null };
     my $err = ($?>>8);
 
-    if ($err != 0) {
-	log_error ("$self (err=$err)");
-    }
+    # if ($err != 0) {
+    # 	log_error ("$self (err=$err)");
+    # }
 
-    # die "[error]: $self\n" if ($?>>8);
+    log_debug ("$self (err=$err)");
 
-    return;
+    return ($err);
 }
 
 sub do_preempt ($$$)
@@ -296,13 +301,13 @@ sub do_preempt ($$$)
     my $out = qx { $cmd 2> /dev/null };
     my $err = ($?>>8);
 
-    if ($err != 0) {
-	log_error ("$self (err=$err)");
-    }
+    # if ($err != 0) {
+    # 	log_error ("$self (err=$err)");
+    # }
 
-    # die "[error]: $self\n" if ($?>>8);
+    log_debug ("$self (err=$err)");
 
-    return;
+    return ($err);
 }
 
 sub do_preempt_abort ($$$)
@@ -316,13 +321,13 @@ sub do_preempt_abort ($$$)
     my $out = qx { $cmd 2> /dev/null };
     my $err = ($?>>8);
 
-    if ($err != 0) {
-	log_error ("$self (err=$err)");
-    }
+    # if ($err != 0) {
+    # 	log_error ("$self (err=$err)");
+    # }
 
-    # die "[error]: $self\n" if ($?>>8);
+    log_debug ("$self (err=$err)");
 
-    return;
+    return ($err);
 }
 
 sub do_reset (S)
@@ -339,7 +344,7 @@ sub do_reset (S)
 
     log_debug ("$self (dev=$dev, status=$err)");
 
-    return;
+    return ($err);
 }
 
 sub dev_unlink ()
@@ -756,8 +761,7 @@ if (@ARGV > 0) {
     if ($opt_o =~ /^metadata$/i) {
 	print_metadata;
     }
-}
-else {
+} else {
     get_options_stdin ();
 }
 
@@ -780,8 +784,7 @@ if ((!defined $opt_n) && (!defined $opt_k)) {
 ##
 if (defined $opt_k) {
     $key = $opt_k;
-}
-else {
+} else {
     $key = get_key ($opt_n);
 }
 
@@ -801,8 +804,7 @@ if ($key =~ /^0/) {
 ##
 if (defined $opt_d) {
     @devices = split (/\s*,\s*/, $opt_d);
-}
-else {
+} else {
     @devices = get_devices_clvm ();
 }
 
@@ -830,8 +832,7 @@ elsif ($opt_o =~ /^off$/i) {
 }
 elsif ($opt_o =~ /^status/i) {
     do_action_status ($key, @devices);
-}
-else {
+} else {
     log_error ("unknown action '$opt_o'");
     exit (1);
 }


More information about the cluster-commits mailing list