prevent emitting useless error messages in some cases when holding/release/destroying snapshots

This commit is contained in:
Edwin Eefting 2020-02-25 20:15:11 +01:00
parent 56d7f8c754
commit 1d9c25d3b4

View File

@ -26,7 +26,7 @@ except ImportError:
use_color=False use_color=False
VERSION="3.0-rc5" VERSION="3.0-rc5"
HEADER="zfs-autobackup v{} - Copyright 2020 E.H.Eefting (edwin@datux.nl)\n".format(VERSION)
class Log: class Log:
def __init__(self, show_debug=False, show_verbose=False): def __init__(self, show_debug=False, show_verbose=False):
@ -641,9 +641,13 @@ class ZfsDataset():
def destroy(self, fail_exception=False): def destroy(self, fail_exception=False):
"""destroy the dataset. by default failures are not an exception, so we can continue making backups""" """destroy the dataset. by default failures are not an exception, so we can continue making backups"""
self.verbose("Destroying") self.verbose("Destroying")
self.release()
try: try:
self.zfs_node.run(["zfs", "destroy", self.name]) self.zfs_node.run(["zfs", "destroy", "-d", self.name])
self.invalidate() self.invalidate()
self.force_exists=False self.force_exists=False
return(True) return(True)
@ -695,16 +699,35 @@ class ZfsDataset():
return(False) return(False)
@property
def _hold_name(self):
return("zfs_autobackup:"+self.zfs_node.backup_name)
@property
def holds(self):
"""get list of holds for dataset"""
output=self.zfs_node.run([ "zfs" , "holds", "-H", self.name ], valid_exitcodes=[ 0 ], tab_split=True, readonly=True)
return(map(lambda fields: fields[1], output))
def is_hold(self):
"""did we hold this snapshot?"""
return(self._hold_name in self.holds)
def hold(self): def hold(self):
"""hold dataset""" """hold dataset"""
self.debug("holding") self.debug("holding")
self.zfs_node.run([ "zfs" , "hold", "zfs_autobackup:"+self.zfs_node.backup_name, self.name ], valid_exitcodes=[ 0,1 ]) self.zfs_node.run([ "zfs" , "hold", self._hold_name, self.name ], valid_exitcodes=[ 0,1 ])
def release(self): def release(self):
"""release dataset""" """release dataset"""
self.debug("releasing") if self.zfs_node.readonly or self.is_hold():
self.zfs_node.run([ "zfs" , "release", "zfs_autobackup:"+self.zfs_node.backup_name, self.name ], valid_exitcodes=[ 0,1 ]) self.debug("releasing")
self.zfs_node.run([ "zfs" , "release", self._hold_name, self.name ], valid_exitcodes=[ 0,1 ])
@property @property
@ -1324,7 +1347,7 @@ class ZfsAutobackup:
def __init__(self): def __init__(self):
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description='ZFS autobackup '+VERSION, description=HEADER,
epilog='When a filesystem fails, zfs_backup will continue and report the number of failures at that end. Also the exit code will indicate the number of failures.') epilog='When a filesystem fails, zfs_backup will continue and report the number of failures at that end. Also the exit code will indicate the number of failures.')
parser.add_argument('--ssh-source', default=None, help='Source host to get backup from. (user@hostname) Default %(default)s.') parser.add_argument('--ssh-source', default=None, help='Source host to get backup from. (user@hostname) Default %(default)s.')
parser.add_argument('--ssh-target', default=None, help='Target host to push backup to. (user@hostname) Default %(default)s.') parser.add_argument('--ssh-target', default=None, help='Target host to push backup to. (user@hostname) Default %(default)s.')
@ -1394,7 +1417,7 @@ class ZfsAutobackup:
def run(self): def run(self):
self.verbose ("zfs-autobackup v{} - Copyright 2020 E.H.Eefting (edwin@datux.nl)\n".format(VERSION)) self.verbose (HEADER)
if self.args.test: if self.args.test:
self.verbose("TEST MODE - SIMULATING WITHOUT MAKING ANY CHANGES") self.verbose("TEST MODE - SIMULATING WITHOUT MAKING ANY CHANGES")