implemented timeout for pre/post script execution and made sure environment is cleaned up after script failure
This commit is contained in:
parent
84213216ec
commit
fb6608bf47
50
sanoid
50
sanoid
|
@ -458,17 +458,21 @@ sub take_snapshots {
|
||||||
my $dataset = (split '@', $snap)[0];
|
my $dataset = (split '@', $snap)[0];
|
||||||
my $snapname = (split '@', $snap)[1];
|
my $snapname = (split '@', $snap)[1];
|
||||||
my $presnapshotfailure = 0;
|
my $presnapshotfailure = 0;
|
||||||
|
my $timeout = 5;
|
||||||
if ($config{$dataset}{'pre_snapshot_script'} and !$args{'readonly'}) {
|
if ($config{$dataset}{'pre_snapshot_script'} and !$args{'readonly'}) {
|
||||||
$ENV{'SANOID_TARGET'} = $dataset;
|
$ENV{'SANOID_TARGET'} = $dataset;
|
||||||
$ENV{'SANOID_SNAPNAME'} = $snapname;
|
$ENV{'SANOID_SNAPNAME'} = $snapname;
|
||||||
if ($args{'verbose'}) { print "executing pre_snapshot_script '".$config{$dataset}{'pre_snapshot_script'}."' on dataset '$dataset'\n"; }
|
if ($args{'verbose'}) { print "executing pre_snapshot_script '".$config{$dataset}{'pre_snapshot_script'}."' on dataset '$dataset'\n"; }
|
||||||
if (system($config{$dataset}{'pre_snapshot_script'}) != 0) {
|
my $ret = runscript('pre_snapshot_script',$dataset,$timeout);
|
||||||
warn "WARN: pre_snapshot_script failed, $?";
|
|
||||||
|
delete $ENV{'SANOID_TARGET'};
|
||||||
|
delete $ENV{'SANOID_SNAPNAME'};
|
||||||
|
|
||||||
|
if ($ret != 0) {
|
||||||
|
# warning was already thrown by runscript function
|
||||||
$config{$dataset}{'no_inconsistent_snapshot'} and next;
|
$config{$dataset}{'no_inconsistent_snapshot'} and next;
|
||||||
$presnapshotfailure = 1;
|
$presnapshotfailure = 1;
|
||||||
}
|
}
|
||||||
delete $ENV{'SANOID_TARGET'};
|
|
||||||
delete $ENV{'SANOID_SNAPNAME'};
|
|
||||||
}
|
}
|
||||||
if ($args{'verbose'}) { print "taking snapshot $snap\n"; }
|
if ($args{'verbose'}) { print "taking snapshot $snap\n"; }
|
||||||
if (!$args{'readonly'}) {
|
if (!$args{'readonly'}) {
|
||||||
|
@ -482,10 +486,8 @@ sub take_snapshots {
|
||||||
$ENV{'SANOID_TARGET'} = $dataset;
|
$ENV{'SANOID_TARGET'} = $dataset;
|
||||||
$ENV{'SANOID_SNAPNAME'} = $snapname;
|
$ENV{'SANOID_SNAPNAME'} = $snapname;
|
||||||
if ($args{'verbose'}) { print "executing post_snapshot_script '".$config{$dataset}{'post_snapshot_script'}."' on dataset '$dataset'\n"; }
|
if ($args{'verbose'}) { print "executing post_snapshot_script '".$config{$dataset}{'post_snapshot_script'}."' on dataset '$dataset'\n"; }
|
||||||
if (system($config{$dataset}{'post_snapshot_script'}) != 0) {
|
runscript('post_snapshot_script',$dataset,$timeout);
|
||||||
warn "WARN: post_snapshot_script failed, $?";
|
|
||||||
$config{$dataset}{'no_inconsistent_snapshot'} and next;
|
|
||||||
}
|
|
||||||
delete $ENV{'SANOID_TARGET'};
|
delete $ENV{'SANOID_TARGET'};
|
||||||
delete $ENV{'SANOID_SNAPNAME'};
|
delete $ENV{'SANOID_SNAPNAME'};
|
||||||
}
|
}
|
||||||
|
@ -1337,6 +1339,38 @@ sub removecachedsnapshots {
|
||||||
undef %pruned;
|
undef %pruned;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#######################################################################################################################3
|
||||||
|
#######################################################################################################################3
|
||||||
|
#######################################################################################################################3
|
||||||
|
|
||||||
|
sub runscript {
|
||||||
|
my $key=shift;
|
||||||
|
my $dataset=shift;
|
||||||
|
my $timeout=shift;
|
||||||
|
|
||||||
|
my $ret;
|
||||||
|
eval {
|
||||||
|
local $SIG{ALRM} = sub { die "alarm\n" };
|
||||||
|
alarm $timeout;
|
||||||
|
$ret = system($config{$dataset}{$key});
|
||||||
|
alarm 0;
|
||||||
|
};
|
||||||
|
if ($@) {
|
||||||
|
if ($@ eq "alarm\n") {
|
||||||
|
warn "WARN: $key didn't finish in the allowed time!";
|
||||||
|
} else {
|
||||||
|
warn "CRITICAL ERROR: $@";
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if ($ret != 0) {
|
||||||
|
warn "WARN: $key failed, $?";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
Loading…
Reference in New Issue