btrbk: tidy parent selection

Preparatory for incremental_prefs feature, no functional changes.
pull/427/head
Axel Burri 2021-08-18 17:34:39 +02:00
parent 10a6f51730
commit 6ca00feeb6
1 changed files with 18 additions and 33 deletions

51
btrbk
View File

@ -3793,40 +3793,25 @@ 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($_) . '"',@inaccessible_nodes)); WARN "Best common parent for \"$svol->{PRINT}\" is not accessible within target $target_incremental_resolve \"$resolve_droot->{PRINT}\", ignoring: " . join(", ", map('"' . _fs_path($_) . '"',@inaccessible_nodes));
} }
# preferences for parent (and required clone sources): # resolve parent (and _required_ clone sources)
# 1. closest older in snapdir (by btrbk timestamp), related
# 2. closest older related (by cgen)
# 3. closest newer related (by cgen)
# 4. closest older in snapdir (by btrbk timestamp)
# 5. closest newer in snapdir (by btrbk timestamp)
#
my @parent; my @parent;
if(my $cc = shift @c_related_older) { my $push_parent = sub {
push @parent, $cc; # 2. closest older related (by cgen) my ($cc, $txt) = @_;
DEBUG "Resolved best common parent (closest older parent_uuid relationship): $cc->[0]{PRINT}"; return unless(defined($cc));
} return if(grep { $_->[0]{node}{id} == $cc->[0]{node}{id} } @parent);
if(my $cc = shift @c_related_newer) { DEBUG "Resolved " . (@parent ? "clone source" : "parent") . " ($txt): $cc->[0]{PRINT}";
DEBUG ((scalar @parent ? "Adding clone source" : "Resolved best common parent") . " (closest newer parent_uuid relationship): $cc->[0]{PRINT}"); push @parent, $cc;
push @parent, $cc; # 3. closest newer related (by cgen) };
}
if(my $cc = shift @c_snapdir_older) { my @c_snapdir_related_older = grep(exists($c_rel_id{$_->[0]{node}{id}}), @c_snapdir_older);
unless(grep { $_->[0]{node}{id} == $cc->[0]{node}{id} } @parent) { my @c_snapdir_related_newer = grep(exists($c_rel_id{$_->[0]{node}{id}}), @c_snapdir_newer);
if($c_rel_id{$cc->[0]{node}{id}}) {
DEBUG "Resolved best common parent (closest older btrbk timestamp, with parent_uuid relationship): $cc->[0]{PRINT}"; $push_parent->($c_snapdir_related_older[0], "closest older by btrbk timestamp in snapdir, with parent_uuid relationship");
unshift @parent, $cc; # 1. closest older in snapdir (by btrbk timestamp), related #$push_parent->($c_snapdir_related_newer[0], "closest newer by btrbk timestamp in snapdir, with parent_uuid relationship");
} $push_parent->($c_related_older[0], "closest older by cgen, with parent_uuid relationship");
else { $push_parent->($c_related_newer[0], "closest newer by cgen, with parent_uuid relationship");
DEBUG ((scalar @parent ? "Adding clone source" : "Resolved best common parent") . " (closest older btrbk timestamp): $cc->[0]{PRINT}"); $push_parent->($c_snapdir_older[0], "closest older by btrbk timestamp in snapdir, regardless of parent_uuid relationship");
push @parent, $cc; # 4. closest older in snapdir (by btrbk timestamp) $push_parent->($c_snapdir_newer[0], "closest newer by btrbk timestamp in snapdir, regardless of parent_uuid relationship");
}
}
}
if(my $cc = shift @c_snapdir_newer) {
unless(grep { $_->[0]{node}{id} == $cc->[0]{node}{id} } @parent) {
DEBUG ((scalar @parent ? "Adding clone source" : "Resolved best common parent") . " (closest newer btrbk timestamp): $cc->[0]{PRINT}");
push @parent, $cc; # 5. closest newer in snapdir (by btrbk timestamp)
}
}
# assemble results # assemble results
unless(scalar @parent) { unless(scalar @parent) {