mirror of https://github.com/jimsalterjrs/sanoid
write cache files in an atomic way to prevent race conditions
This commit is contained in:
parent
6f74c7c4b3
commit
9c0468ee45
9
sanoid
9
sanoid
|
|
@ -868,9 +868,10 @@ sub getsnaps {
|
||||||
@rawsnaps = <FH>;
|
@rawsnaps = <FH>;
|
||||||
close FH;
|
close FH;
|
||||||
|
|
||||||
open FH, "> $cache" or die 'Could not write to $cache!\n';
|
open FH, "> $cache.tmp" or die 'Could not write to $cache.tmp!\n';
|
||||||
print FH @rawsnaps;
|
print FH @rawsnaps;
|
||||||
close FH;
|
close FH;
|
||||||
|
rename("$cache.tmp", "$cache") or die 'Could not rename to $cache!\n';
|
||||||
removelock('sanoid_cacheupdate');
|
removelock('sanoid_cacheupdate');
|
||||||
} else {
|
} else {
|
||||||
if ($args{'verbose'}) { print "INFO: deferring cache update - valid cache update lock held by another sanoid process.\n"; }
|
if ($args{'verbose'}) { print "INFO: deferring cache update - valid cache update lock held by another sanoid process.\n"; }
|
||||||
|
|
@ -1105,9 +1106,10 @@ sub init {
|
||||||
print "INFO: dataset cache expired - updating from zfs list.\n";
|
print "INFO: dataset cache expired - updating from zfs list.\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
open FH, "> $cachedatasetspath" or die 'Could not write to $cachedatasetspath!\n';
|
open FH, "> $cachedatasetspath.tmp" or die 'Could not write to $cachedatasetspath.tmp!\n';
|
||||||
print FH @updatedatasets;
|
print FH @updatedatasets;
|
||||||
close FH;
|
close FH;
|
||||||
|
rename("$cachedatasetspath.tmp", "$cachedatasetspath") or die 'Could not rename to $cachedatasetspath!\n';
|
||||||
removelock('sanoid_cachedatasetupdate');
|
removelock('sanoid_cachedatasetupdate');
|
||||||
} else {
|
} else {
|
||||||
if ($args{'verbose'}) { print "INFO: deferring dataset cache update - valid cache update lock held by another sanoid process.\n"; }
|
if ($args{'verbose'}) { print "INFO: deferring dataset cache update - valid cache update lock held by another sanoid process.\n"; }
|
||||||
|
|
@ -1731,13 +1733,14 @@ sub removecachedsnapshots {
|
||||||
my @rawsnaps = <FH>;
|
my @rawsnaps = <FH>;
|
||||||
close FH;
|
close FH;
|
||||||
|
|
||||||
open FH, "> $cache" or die 'Could not write to $cache!\n';
|
open FH, "> $cache.tmp" or die 'Could not write to $cache.tmp!\n';
|
||||||
foreach my $snapline ( @rawsnaps ) {
|
foreach my $snapline ( @rawsnaps ) {
|
||||||
my @columns = split("\t", $snapline);
|
my @columns = split("\t", $snapline);
|
||||||
my $snap = $columns[0];
|
my $snap = $columns[0];
|
||||||
print FH $snapline unless ( exists($pruned{$snap}) );
|
print FH $snapline unless ( exists($pruned{$snap}) );
|
||||||
}
|
}
|
||||||
close FH;
|
close FH;
|
||||||
|
rename("$cache.tmp", "$cache") or die 'Could not rename to $cache!\n';
|
||||||
|
|
||||||
removelock('sanoid_cacheupdate');
|
removelock('sanoid_cacheupdate');
|
||||||
%snaps = getsnaps(\%config,$cacheTTL,0);
|
%snaps = getsnaps(\%config,$cacheTTL,0);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue