From ab12540a96633ce92abfa11c099a0cfa4ef83950 Mon Sep 17 00:00:00 2001 From: Christoph Klaffl Date: Mon, 7 Jan 2019 18:22:54 +0100 Subject: [PATCH] added message if zfs recursion is used and fixed ordinary recursion in combination with zfs recursion --- sanoid | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/sanoid b/sanoid index db5376b..304f5f6 100755 --- a/sanoid +++ b/sanoid @@ -516,10 +516,12 @@ sub take_snapshots { if ( (scalar(@newsnaps)) > 0) { foreach my $snap ( @newsnaps ) { + my $extraMessage = ""; my @split = split '@', $snap, -1; my $recursiveFlag = 0; if (scalar(@split) == 3) { $recursiveFlag = 1; + $extraMessage = " (zfs recursive)"; chop $snap; } my $dataset = $split[0]; @@ -540,7 +542,7 @@ sub take_snapshots { $presnapshotfailure = 1; } } - if ($args{'verbose'}) { print "taking snapshot $snap\n"; } + if ($args{'verbose'}) { print "taking snapshot $snap$extraMessage\n"; } if (!$args{'readonly'}) { if ($recursiveFlag) { system($zfs, "snapshot", "-r", "$snap") == 0 @@ -862,29 +864,49 @@ sub init { } # how 'bout some recursion? =) + if ($config{$section}{'zfs_recursion'} && $config{$section}{'zfs_recursion'} == 1 && $config{$section}{'autosnap'} == 1) { + warn "ignored autosnap configuration for '$section' because it's part of a zfs recursion.\n"; + $config{$section}{'autosnap'} = 0; + } + my $recursive = $ini{$section}{'recursive'} && grep( /^$ini{$section}{'recursive'}$/, @istrue ); my $zfsRecursive = $ini{$section}{'recursive'} && $ini{$section}{'recursive'} =~ /zfs/i; my $skipChildren = $ini{$section}{'skip_children'} && grep( /^$ini{$section}{'skip_children'}$/, @istrue ); my @datasets; - if ($zfsRecursive) { - $config{$section}{'zfs_recursion'} = 1; - } elsif ($recursive || $skipChildren) { + if ($zfsRecursive || $recursive || $skipChildren) { + if ($zfsRecursive) { + $config{$section}{'zfs_recursion'} = 1; + } + @datasets = getchilddatasets($config{$section}{'path'}); DATASETS: foreach my $dataset(@datasets) { chomp $dataset; - if ($skipChildren) { - if ($args{'debug'}) { print "DEBUG: ignoring $dataset.\n"; } - delete $config{$dataset}; - next DATASETS; - } + if ($zfsRecursive) { + # don't try to take the snapshot ourself, recursive zfs snapshot will take care of that + $config{$dataset}{'autosnap'} = 0; - foreach my $key (keys %{$config{$section}} ) { - if (! ($key =~ /template|recursive|children_only/)) { - if ($args{'debug'}) { print "DEBUG: recursively setting $key from $section to $dataset.\n"; } - $config{$dataset}{$key} = $config{$section}{$key}; + foreach my $key (keys %{$config{$section}} ) { + if (! ($key =~ /template|recursive|children_only|autosnap/)) { + if ($args{'debug'}) { print "DEBUG: recursively setting $key from $section to $dataset.\n"; } + $config{$dataset}{$key} = $config{$section}{$key}; + } + } + } else { + if ($skipChildren) { + if ($args{'debug'}) { print "DEBUG: ignoring $dataset.\n"; } + delete $config{$dataset}; + next DATASETS; + } + + foreach my $key (keys %{$config{$section}} ) { + if (! ($key =~ /template|recursive|children_only/)) { + if ($args{'debug'}) { print "DEBUG: recursively setting $key from $section to $dataset.\n"; } + $config{$dataset}{$key} = $config{$section}{$key}; + } } } + $config{$dataset}{'path'} = $dataset; $config{$dataset}{'initialized'} = 1; }