diff --git a/btrbk b/btrbk index 2e46fd0..8903909 100755 --- a/btrbk +++ b/btrbk @@ -3107,6 +3107,7 @@ sub get_best_parent($$$;@) my $ret_clone_src = $opts{clone_src}; my $ret_clone_src_extra = $opts{clone_src_extra}; my $ret_target_parent_node = $opts{target_parent_node}; + my $strict_related = $opts{strict_related}; TRACE "get_best_parent: resolving best common parent for subvolume: $svol->{PRINT} (droot=$droot->{PRINT})"; @@ -3229,6 +3230,12 @@ sub get_best_parent($$$;@) DEBUG("No common parents of \"$svol->{PRINT}\" found in src=\"$resolve_sroot->{PRINT}/\", target=\"$resolve_droot->{PRINT}/\""); return undef; } + if($strict_related && (not scalar(@c_related))) { + # all parents come from c_snapdir (btrbk_direct_leaf), no relations by parent_uuid found + WARN "No related common parent found (by parent_uuid relationship) for: $svol->{PRINT}"; + WARN "Hint: setting option \"incremental\" to \"yes\" (instead of \"strict\") will use parent: " . join(", ", map { $_->[0]{PRINT} } @parent); + return undef; + } my @extra_clones; foreach my $cc (@c_related_older, @c_related_newer, grep { not exists($c_rel_id{$_->[0]{node}{id}}) } (@c_snapdir_older, @c_snapdir_newer)) { @@ -4023,6 +4030,7 @@ sub macro_archive_target($$$;$) { my ($clone_src, $clone_src_extra, $target_parent_node); my $parent = get_best_parent($svol, $sroot, $droot, + strict_related => 0, clone_src => \$clone_src, clone_src_extra => \$clone_src_extra, target_parent_node => \$target_parent_node); @@ -6157,6 +6165,7 @@ MAIN: INFO "Creating subvolume backup (send-receive) for: $child->{PRINT}"; my ($clone_src, $clone_src_extra, $target_parent_node); my $parent = get_best_parent($child, $snaproot, $droot, + strict_related => ((config_key($droot, "incremental") // "") eq "strict"), clone_src => \$clone_src, clone_src_extra => \$clone_src_extra, target_parent_node => \$target_parent_node); diff --git a/doc/btrbk.conf.5.asciidoc b/doc/btrbk.conf.5.asciidoc index bf9ee3a..49dc212 100644 --- a/doc/btrbk.conf.5.asciidoc +++ b/doc/btrbk.conf.5.asciidoc @@ -150,9 +150,20 @@ Note that using ``long-iso'' has implications on the scheduling, see snapshot creation). Defaults to ``always''. *incremental* yes|no|strict:: + If set, incremental backups are created. If set to ``strict'', - non-incremental (initial) backups are never created. Defaults to - ``yes''. + non-incremental (initial) backups are never created, and + incremental backups are restricted to 'related parents' (by + parent-uuid relationship). Defaults to ``yes''. ++ +-- +Note that even if the parent-uuid chain is broken, snapshots and +backups can still share data (which is especially true for backups +created with 'incremental' option enabled), and are perfectly suitable +as parents for incremental send-receive operations. But as btrbk can +not be certain about this, such operations are disallowed in +"incremental strict" mode. +-- === Grouping Options