Skip to content

Commit

Permalink
btrbk: fix scheduler when overriding "target_preserve_min" in combina…
Browse files Browse the repository at this point in the history
…tion with global "target" section

When configuring "target" in a global (or "volume") context, and
overriding target_preserve_min in "subvolume" section, the scheduler
has undefined behavior (mixing up the "min" values).

Fixed by returning a copy of the preserve hash in
config_preserve_hash().
  • Loading branch information
digint committed Mar 4, 2019
1 parent 17957a1 commit 6f68b71
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions btrbk
Original file line number Diff line number Diff line change
Expand Up @@ -3216,22 +3216,24 @@ sub config_preserve_hash($$;@)
if($opts{wipe}) {
return { hod => 0, dow => 'sunday', min => 'latest', min_q => 'latest' };
}
my $ret = config_key($config, $prefix . "_preserve") // {};
my $preserve = config_key($config, $prefix . "_preserve") // {};
my %ret = ( %$preserve, # make a copy (don't pollute config)
hod => config_key($config, "preserve_hour_of_day"),
dow => config_key($config, "preserve_day_of_week")
);
my $preserve_min = config_key($config, $prefix . "_preserve_min");
if(defined($preserve_min)) {
$ret->{min} = $preserve_min; # used for raw schedule output
$ret{min} = $preserve_min; # used for raw schedule output
if(($preserve_min eq 'all') || ($preserve_min eq 'latest')) {
$ret->{min_q} = $preserve_min;
$ret{min_q} = $preserve_min;
}
elsif($preserve_min =~ /^([0-9]+)([hdwmy])$/) {
$ret->{min_n} = $1;
$ret->{min_q} = $2;
$ret{min_n} = $1;
$ret{min_q} = $2;
}
else { die; }
}
$ret->{hod} = config_key($config, "preserve_hour_of_day");
$ret->{dow} = config_key($config, "preserve_day_of_week");
return $ret;
return \%ret;
}


Expand Down

0 comments on commit 6f68b71

Please sign in to comment.