[Cluster-devel] [PATCH] fence_scsi: fix simultaneous unfence operations
Fabio M. Di Nitto
fdinitto at redhat.com
Mon Sep 19 15:15:46 UTC 2011
ACK
Fabio
On 9/15/2011 9:20 PM, Ryan O'Hara wrote:
> 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 it 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 checs 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>
> ---
> 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-devel
mailing list