mirror of https://github.com/digint/btrbk
btrbk: added vinfo_cache; fixed action "origin"
parent
40d3f27b2e
commit
19c0733471
58
btrbk
58
btrbk
|
@ -82,6 +82,7 @@ my %config_options = (
|
||||||
my @config_target_types = qw(send-receive);
|
my @config_target_types = qw(send-receive);
|
||||||
|
|
||||||
my %vinfo_root;
|
my %vinfo_root;
|
||||||
|
my %vinfo_cache;
|
||||||
my %uuid_info;
|
my %uuid_info;
|
||||||
my %uuid_fs_map;
|
my %uuid_fs_map;
|
||||||
|
|
||||||
|
@ -166,6 +167,16 @@ sub run_cmd($;$)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub vinfo_update_lookup_tables($)
|
||||||
|
{
|
||||||
|
my $vol = shift || die;
|
||||||
|
$vinfo_cache{$vol->{URL}} = $vol;
|
||||||
|
$vinfo_cache{$vol->{REAL_URL}} = $vol if($vol->{REAL_URL});
|
||||||
|
$uuid_fs_map{$vol->{uuid}}->{$vol->{URL}} = $vol if($vol->{uuid});
|
||||||
|
$uuid_fs_map{$vol->{uuid}}->{$vol->{REAL_URL}} = $vol if($vol->{uuid} && $vol->{REAL_URL});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sub vinfo($;$)
|
sub vinfo($;$)
|
||||||
{
|
{
|
||||||
my $root = shift // die; # url or vinfo hash
|
my $root = shift // die; # url or vinfo hash
|
||||||
|
@ -235,10 +246,11 @@ sub vinfo_root($$)
|
||||||
my $btrfs_progs_compat = config_key($config, "btrfs_progs_compat");
|
my $btrfs_progs_compat = config_key($config, "btrfs_progs_compat");
|
||||||
$info{BTRFS_PROGS_COMPAT} = $btrfs_progs_compat if($btrfs_progs_compat);
|
$info{BTRFS_PROGS_COMPAT} = $btrfs_progs_compat if($btrfs_progs_compat);
|
||||||
|
|
||||||
DEBUG "vinfo root created for: $url";
|
|
||||||
TRACE(Data::Dumper->Dump([\%info], ["vinfo{$url}"]));
|
|
||||||
$vinfo_root{$url} = \%info;
|
$vinfo_root{$url} = \%info;
|
||||||
|
vinfo_update_lookup_tables(\%info);
|
||||||
|
|
||||||
|
TRACE "vinfo root created for: $url";
|
||||||
|
TRACE(Data::Dumper->Dump([\%info], ["vinfo{$url}"]));
|
||||||
return \%info;
|
return \%info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,6 +279,7 @@ sub vinfo_child($$)
|
||||||
{
|
{
|
||||||
$info{$_} = $parent->{$_} if(exists $parent->{$_});
|
$info{$_} = $parent->{$_} if(exists $parent->{$_});
|
||||||
}
|
}
|
||||||
|
vinfo_update_lookup_tables(\%info);
|
||||||
|
|
||||||
TRACE "vinfo child \"$rel_path\" created for: $info{URL}";
|
TRACE "vinfo child \"$rel_path\" created for: $info{URL}";
|
||||||
TRACE(Data::Dumper->Dump([\%info], ["vinfo{$info{URL}}"]));
|
TRACE(Data::Dumper->Dump([\%info], ["vinfo{$info{URL}}"]));
|
||||||
|
@ -300,6 +313,7 @@ sub vinfo_set_detail($$)
|
||||||
|
|
||||||
TRACE "vinfo updated for: $vol->{URL}";
|
TRACE "vinfo updated for: $vol->{URL}";
|
||||||
TRACE(Data::Dumper->Dump([$vol], ["vinfo{$vol->{URL}}"]));
|
TRACE(Data::Dumper->Dump([$vol], ["vinfo{$vol->{URL}}"]));
|
||||||
|
vinfo_update_lookup_tables($vol);
|
||||||
return $vol;
|
return $vol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -749,7 +763,6 @@ sub btr_subvolume_list($;@)
|
||||||
$node{path} =~ s/^<FS_TREE>\///; # remove "<FS_TREE>/" portion from "path".
|
$node{path} =~ s/^<FS_TREE>\///; # remove "<FS_TREE>/" portion from "path".
|
||||||
|
|
||||||
push @nodes, \%node;
|
push @nodes, \%node;
|
||||||
# $node{parent_uuid} = undef if($node{parent_uuid} eq '-');
|
|
||||||
}
|
}
|
||||||
DEBUG "Parsed " . scalar(@nodes) . " total subvolumes for filesystem at: $vol_print";
|
DEBUG "Parsed " . scalar(@nodes) . " total subvolumes for filesystem at: $vol_print";
|
||||||
return \@nodes;
|
return \@nodes;
|
||||||
|
@ -895,7 +908,7 @@ sub vinfo_read_subvolumes($)
|
||||||
my $vol = shift || die;
|
my $vol = shift || die;
|
||||||
my $url = $vol->{URL} || die;
|
my $url = $vol->{URL} || die;
|
||||||
|
|
||||||
my $tree = btr_tree($vol);
|
my $tree = btr_tree($vol); # populates %uuid_info
|
||||||
return undef unless($tree);
|
return undef unless($tree);
|
||||||
|
|
||||||
my $tree_root;
|
my $tree_root;
|
||||||
|
@ -904,11 +917,10 @@ sub vinfo_read_subvolumes($)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
die unless $uuid_info{$vol->{uuid}};
|
die unless $uuid_info{$vol->{uuid}};
|
||||||
$uuid_fs_map{$vol->{uuid}}->{$vol->{URL}} = 1;
|
|
||||||
$tree_root = $uuid_info{$vol->{uuid}}->{SUBTREE};
|
$tree_root = $uuid_info{$vol->{uuid}}->{SUBTREE};
|
||||||
unless($tree_root) {
|
unless($tree_root) {
|
||||||
DEBUG "No subvolumes found in: $vol->{PRINT}";
|
DEBUG "No subvolumes found in: $vol->{PRINT}";
|
||||||
$vol->{SUBVOL_INFO} = {};
|
$vol->{SUBVOL_INFO} //= {};
|
||||||
return $vol;
|
return $vol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -931,7 +943,6 @@ sub vinfo_read_subvolumes($)
|
||||||
vinfo_set_detail($subvol, $detail);
|
vinfo_set_detail($subvol, $detail);
|
||||||
vinfo_add_child($vol, $subvol, $subvol_path);
|
vinfo_add_child($vol, $subvol, $subvol_path);
|
||||||
|
|
||||||
$uuid_fs_map{$subvol->{uuid}}->{$subvol->{URL}} = 1;
|
|
||||||
$ret{$subvol_path} = $subvol;
|
$ret{$subvol_path} = $subvol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1169,7 +1180,7 @@ sub get_latest_common($$$;$)
|
||||||
}
|
}
|
||||||
TRACE "get_latest_common: no matching targets found for: $child->{URL}";
|
TRACE "get_latest_common: no matching targets found for: $child->{URL}";
|
||||||
}
|
}
|
||||||
DEBUG("No common snapshots for \"$debug_src\" found in src=$sroot->{URL}/ target=$droot->{URL}/");
|
DEBUG("No common snapshots for \"$debug_src\" found in src=\"$sroot->{URL}/\", target=\"$droot->{URL}/\"");
|
||||||
return (undef, undef);
|
return (undef, undef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1185,9 +1196,7 @@ sub _origin_tree
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if($uuid_fs_map{$uuid}) {
|
if($uuid_fs_map{$uuid}) {
|
||||||
foreach(keys %{$uuid_fs_map{$uuid}}) {
|
push(@$lines, ["$prefix" . join(" === ", sort keys %{$uuid_fs_map{$uuid}}), $uuid]);
|
||||||
push(@$lines, ["$prefix$_", $uuid]);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
push(@$lines, ["$prefix<BTRFS_ROOT>/$node->{path}", $uuid]);
|
push(@$lines, ["$prefix<BTRFS_ROOT>/$node->{path}", $uuid]);
|
||||||
}
|
}
|
||||||
|
@ -1657,24 +1666,27 @@ MAIN:
|
||||||
my $url = $subvol_args[0] || die;
|
my $url = $subvol_args[0] || die;
|
||||||
my $dump_uuid = 0;
|
my $dump_uuid = 0;
|
||||||
|
|
||||||
my $vol = vinfo($url);
|
my $vol = $vinfo_cache{$url};
|
||||||
exit 1 unless($vol);
|
unless($vol) {
|
||||||
|
# specified volume is not in config
|
||||||
|
DEBUG "Subvolume not parsed yet, fetching info: $url";
|
||||||
|
$vol = vinfo_root($url, { CONTEXT => "cmdline" });
|
||||||
|
unless(vinfo_read_detail($vol)) {
|
||||||
|
ERROR "Failed to fetch subvolume detail: $url";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
unless(vinfo_read_subvolumes($vol)) {
|
||||||
|
ERROR "Failed to fetch subvolume list: $url";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if($vol->{is_root}) {
|
if($vol->{is_root}) {
|
||||||
ERROR "Subvolume is btrfs root: $url\n";
|
ERROR "Subvolume is btrfs root: $url\n";
|
||||||
exit 1;
|
exit 1;
|
||||||
}
|
}
|
||||||
my $uuid = $vol->{uuid} || die;
|
|
||||||
my $node = $uuid_info{$uuid};
|
|
||||||
|
|
||||||
unless($node) { # !!! TODO: fix this
|
|
||||||
DEBUG "Subvolume not parsed yet, fetching info: $url";
|
|
||||||
# !!! $vol_info{$url} //= btr_fs_info($vol);
|
|
||||||
$node = $uuid_info{$uuid} || die;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $lines = [];
|
my $lines = [];
|
||||||
_origin_tree("", $uuid, $lines);
|
_origin_tree("", $vol->{uuid}, $lines);
|
||||||
|
|
||||||
print "--------------------------------------------------------------------------------\n";
|
print "--------------------------------------------------------------------------------\n";
|
||||||
print "Origin Tree\n\n";
|
print "Origin Tree\n\n";
|
||||||
|
|
Loading…
Reference in New Issue