btrbk: get_best_parent(): add clone_src argument

pull/274/head
Axel Burri 2019-04-04 17:39:41 +02:00
parent 7cf1bfb354
commit f38c69316f
1 changed files with 9 additions and 8 deletions

17
btrbk
View File

@ -3084,6 +3084,7 @@ sub get_best_parent($$$;@)
my $droot = shift || die; my $droot = shift || die;
my %opts = @_; my %opts = @_;
my $fallback_btrbk_basename = $opts{fallback_btrbk_basename} // 1; # default true, see below my $fallback_btrbk_basename = $opts{fallback_btrbk_basename} // 1; # default true, see below
my $clone_src = $opts{clone_src};
# honor incremental_resolve option # honor incremental_resolve option
my $source_incremental_resolve = config_key($svol, "incremental_resolve"); my $source_incremental_resolve = config_key($svol, "incremental_resolve");
@ -3140,8 +3141,7 @@ sub get_best_parent($$$;@)
} }
# get correlated receive targets of candidates, return first matching within $resolve_droot # get correlated receive targets of candidates, return first matching within $resolve_droot
my $parent; my @resolved;
my $target_node;
my @filtered_nodes; my @filtered_nodes;
my %uniq; my %uniq;
foreach my $cand (@candidate) { foreach my $cand (@candidate) {
@ -3149,9 +3149,8 @@ sub get_best_parent($$$;@)
my $correlated_target = get_best_correlated_target($resolve_droot, $cand, push_filtered_nodes => \@filtered_nodes, fallback_all_mountpoints => $target_fallback_all_mountpoints); my $correlated_target = get_best_correlated_target($resolve_droot, $cand, push_filtered_nodes => \@filtered_nodes, fallback_all_mountpoints => $target_fallback_all_mountpoints);
if($correlated_target) { if($correlated_target) {
TRACE "get_best_parent: common related from root=\"$resolve_droot->{PRINT}\": \"$cand->{PRINT}\", \"$correlated_target->{PRINT}\""; TRACE "get_best_parent: common related from root=\"$resolve_droot->{PRINT}\": \"$cand->{PRINT}\", \"$correlated_target->{PRINT}\"";
$parent = $cand; push @resolved, [ $cand, $correlated_target ];
$target_node = $correlated_target->{node}; last unless($clone_src);
last;
} }
$uniq{$cand->{node}{id}} = 1; $uniq{$cand->{node}{id}} = 1;
} }
@ -3159,9 +3158,11 @@ sub get_best_parent($$$;@)
WARN "Best common parent for \"$svol->{PRINT}\" is not accessible within target $target_incremental_resolve \"$resolve_droot->{PRINT}\", ignoring: " . join(", ", map('"' . _fs_path($_) . '"',@filtered_nodes)); WARN "Best common parent for \"$svol->{PRINT}\" is not accessible within target $target_incremental_resolve \"$resolve_droot->{PRINT}\", ignoring: " . join(", ", map('"' . _fs_path($_) . '"',@filtered_nodes));
} }
if($parent) { if(scalar @resolved) {
DEBUG "Resolved best common parent: " . $parent->{PRINT}; DEBUG "Resolved best common parent (" . (scalar @resolved) . " total): " . $resolved[0][0]->{PRINT};
return ($parent, $target_node); my $parent = shift @resolved;
$$clone_src = \@resolved if($clone_src);
return ($parent->[0], $parent->[1]->{node});
} else { } else {
DEBUG("No common parents of \"$svol->{PRINT}\" found in src=\"$resolve_sroot->{PRINT}/\", target=\"$resolve_droot->{PRINT}/\""); DEBUG("No common parents of \"$svol->{PRINT}\" found in src=\"$resolve_sroot->{PRINT}/\", target=\"$resolve_droot->{PRINT}/\"");
return undef; return undef;