mirror of https://github.com/digint/btrbk
btrbk: add action "extents-diff"
parent
1a96216e7b
commit
c6375967b8
95
btrbk
95
btrbk
|
@ -239,6 +239,12 @@ my %table_formats = (
|
||||||
long => [ qw( -host mount_source id top cgen gen uuid parent_uuid received_uuid flags path ) ],
|
long => [ qw( -host mount_source id top cgen gen uuid parent_uuid received_uuid flags path ) ],
|
||||||
raw => [ qw( host mount_source mount_subvol mount_point mount_subvolid id top_level cgen gen uuid parent_uuid received_uuid readonly path subvolume_path subvolume_rel_path ) ],
|
raw => [ qw( host mount_source mount_subvol mount_point mount_subvolid id top_level cgen gen uuid parent_uuid received_uuid readonly path subvolume_path subvolume_rel_path ) ],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
extent_diff => { table => [ qw( total diff subvol ) ],
|
||||||
|
long => [ qw( total diff subvol cgen gen ) ],
|
||||||
|
raw => [ qw( total diff subvol cgen gen ) ],
|
||||||
|
RALIGN => { total=>1, diff=>1, cgen=>1, gen=>1 },
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
my %backend_cmd_map = (
|
my %backend_cmd_map = (
|
||||||
|
@ -5177,7 +5183,7 @@ MAIN:
|
||||||
my @exclude_cmdline;
|
my @exclude_cmdline;
|
||||||
my ($config_cmdline, $lockfile_cmdline, $print_schedule,
|
my ($config_cmdline, $lockfile_cmdline, $print_schedule,
|
||||||
$preserve_snapshots, $preserve_backups, $wipe_snapshots, $skip_snapshots, $skip_backups,
|
$preserve_snapshots, $preserve_backups, $wipe_snapshots, $skip_snapshots, $skip_backups,
|
||||||
$archive_raw,
|
$archive_raw, $extents_diff_related,
|
||||||
$resume_only_DEPRECATED, # as of btrbk-v0.26.0
|
$resume_only_DEPRECATED, # as of btrbk-v0.26.0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -5213,6 +5219,7 @@ MAIN:
|
||||||
'wipe' => \$wipe_snapshots,
|
'wipe' => \$wipe_snapshots,
|
||||||
'resume-only|r' => \$resume_only_DEPRECATED,
|
'resume-only|r' => \$resume_only_DEPRECATED,
|
||||||
'progress' => \$show_progress,
|
'progress' => \$show_progress,
|
||||||
|
'related' => \$extents_diff_related,
|
||||||
'table|t' => sub { $output_format = "table" },
|
'table|t' => sub { $output_format = "table" },
|
||||||
'long|L' => sub { $output_format = "long" },
|
'long|L' => sub { $output_format = "long" },
|
||||||
'print-schedule|S' => \$print_schedule,
|
'print-schedule|S' => \$print_schedule,
|
||||||
|
@ -5263,7 +5270,7 @@ MAIN:
|
||||||
WARN 'Found option "--progress", but required executable "mbuffer" does not exist on your system. Please install "mbuffer".';
|
WARN 'Found option "--progress", but required executable "mbuffer" does not exist on your system. Please install "mbuffer".';
|
||||||
$show_progress = 0;
|
$show_progress = 0;
|
||||||
}
|
}
|
||||||
my ($action_run, $action_usage, $action_resolve, $action_diff, $action_origin, $action_config_print, $action_list, $action_clean, $action_archive, $action_ls);
|
my ($action_run, $action_usage, $action_resolve, $action_diff, $action_extents_diff, $action_origin, $action_config_print, $action_list, $action_clean, $action_archive, $action_ls);
|
||||||
my @filter_args;
|
my @filter_args;
|
||||||
my @subvol_args;
|
my @subvol_args;
|
||||||
my $args_expected_min = 0;
|
my $args_expected_min = 0;
|
||||||
|
@ -5321,6 +5328,13 @@ MAIN:
|
||||||
$subvol_args_init = "restrict_same_fs deny_root_subvol";
|
$subvol_args_init = "restrict_same_fs deny_root_subvol";
|
||||||
@subvol_args = @ARGV;
|
@subvol_args = @ARGV;
|
||||||
}
|
}
|
||||||
|
elsif ($command eq "extents-diff") {
|
||||||
|
$action_extents_diff = 1;
|
||||||
|
$fallback_default_config = 1;
|
||||||
|
$args_expected_min = 1;
|
||||||
|
$subvol_args_init = "restrict_same_fs deny_root_subvol";
|
||||||
|
@subvol_args = @ARGV;
|
||||||
|
}
|
||||||
elsif ($command eq "origin") {
|
elsif ($command eq "origin") {
|
||||||
$action_origin = 1;
|
$action_origin = 1;
|
||||||
$args_expected_min = $args_expected_max = 1;
|
$args_expected_min = $args_expected_max = 1;
|
||||||
|
@ -5557,6 +5571,83 @@ MAIN:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if($action_extents_diff)
|
||||||
|
{
|
||||||
|
#
|
||||||
|
# print extents diff (filefrag)
|
||||||
|
#
|
||||||
|
|
||||||
|
# check system requirements
|
||||||
|
unless(check_exe("filefrag")) {
|
||||||
|
ERROR 'Please install "filefrag" (from e2fsprogs package)';
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# resolve related subvolumes
|
||||||
|
my @resolved_vol;
|
||||||
|
$extents_diff_related = 1 if(scalar(@subvol_args) == 1); # single argument: implicit --related
|
||||||
|
if($extents_diff_related) {
|
||||||
|
# add all related subvolumes
|
||||||
|
foreach my $svol (@subvol_args) {
|
||||||
|
# filter gen for r/w subvolumes, cgen on readonly subvolumes
|
||||||
|
# ("gen" is increased on readonly subvolume if it is being snapshotted)
|
||||||
|
my $svol_gen = $svol->{node}{readonly} ? $svol->{node}{cgen} : $svol->{node}{gen};
|
||||||
|
my @related = map({ vinfo_resolved_all_mountpoints($_, $svol->{VINFO_MOUNTPOINT}) // () }
|
||||||
|
grep { ($_->{readonly} ? $_->{cgen} : $_->{gen}) <= $svol_gen } # show only older
|
||||||
|
@{get_related_nodes($svol)}); # includes $svol
|
||||||
|
unless(scalar(@related) > 1) {
|
||||||
|
WARN "Could not resolve any older (by generation) related subvolume for: $svol->{PRINT}";
|
||||||
|
}
|
||||||
|
push @resolved_vol, @related;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
@resolved_vol = @subvol_args;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @data;
|
||||||
|
# print results on ctrl-c
|
||||||
|
$SIG{INT} = sub {
|
||||||
|
print STDERR "\nERROR: Cought SIGINT, dumping incomplete list:\n";
|
||||||
|
print_formatted("extent_diff", \@data);
|
||||||
|
exit 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
my $prev_vol;
|
||||||
|
# sort descending by gen: crawl descending, but display ascending (unshift)
|
||||||
|
foreach (sort { ($b->{node}{readonly} ? $b->{node}{cgen} : $b->{node}{gen}) <=>
|
||||||
|
($a->{node}{readonly} ? $a->{node}{cgen} : $a->{node}{gen}) }
|
||||||
|
@resolved_vol) {
|
||||||
|
next if($prev_vol && ($prev_vol->{node}{id} == $_->{node}{id})); # skip duplicates
|
||||||
|
$_->{EXTENTMAP} = filefrag_extentmap($_);
|
||||||
|
if($prev_vol) {
|
||||||
|
my $diff_map = extentmap_diff($prev_vol->{EXTENTMAP}, $_->{EXTENTMAP});
|
||||||
|
|
||||||
|
unshift @data, {
|
||||||
|
total => print_size(extentmap_size($prev_vol->{EXTENTMAP})),
|
||||||
|
diff => print_size(extentmap_size($diff_map)),
|
||||||
|
cgen => $prev_vol->{node}{cgen},
|
||||||
|
gen => $prev_vol->{node}{gen},
|
||||||
|
subvol => $prev_vol->{PRINT},
|
||||||
|
};
|
||||||
|
|
||||||
|
$prev_vol->{EXTENTMAP} = undef; # release memory
|
||||||
|
}
|
||||||
|
$prev_vol = $_;
|
||||||
|
}
|
||||||
|
unshift @data, {
|
||||||
|
total => print_size(extentmap_size($prev_vol->{EXTENTMAP})),
|
||||||
|
cgen => $prev_vol->{node}{cgen},
|
||||||
|
gen => $prev_vol->{node}{gen},
|
||||||
|
subvol => $prev_vol->{PRINT},
|
||||||
|
};
|
||||||
|
|
||||||
|
INFO "Printing extents map difference (relative complement): (blocks \ blocks_on_prev_line) * blocksize";
|
||||||
|
print_formatted("extent_diff", \@data);
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if($action_ls)
|
if($action_ls)
|
||||||
{
|
{
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue