summaryrefslogtreecommitdiff
path: root/modules/zfssnap/zfssnap.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/zfssnap/zfssnap.py')
-rw-r--r--modules/zfssnap/zfssnap.py9
1 files changed, 8 insertions, 1 deletions
diff --git a/modules/zfssnap/zfssnap.py b/modules/zfssnap/zfssnap.py
index 69ab1ae6..e90ed0db 100644
--- a/modules/zfssnap/zfssnap.py
+++ b/modules/zfssnap/zfssnap.py
@@ -73,11 +73,15 @@ def prune(config, dry_run, keep_newest):
73 73
74 keep = set() 74 keep = set()
75 kept_count = defaultdict(lambda: defaultdict(lambda: 0)) 75 kept_count = defaultdict(lambda: defaultdict(lambda: 0))
76 KeptBecause = namedtuple('KeptBecause', ['rule', 'ix', 'base', 'period'])
77 kept_because = OrderedDict(deque)
76 def keep_because(base, snap, rule, period=None): 78 def keep_because(base, snap, rule, period=None):
77 nonlocal kept_count 79 nonlocal kept_count
78 if snap not in keep: 80 if snap not in keep:
79 kept_count[rule][base] += 1 81 kept_count[rule][base] += 1
80 logger.info(f'Keeping ‘{snap}’ because of rule ‘{rule}’ (#{kept_count[rule][base]} for ‘{base}’, period={period})') 82 if snap not in kept_because:
83 kept_because[snap] = deque()
84 kept_because[snap].append(KeptBecause(rule=rule, ix=kept_count[rule][base], base=base, period=period))
81 keep.add(snap) 85 keep.add(snap)
82 86
83 within = config.gettimedelta('KEEP', 'within') 87 within = config.gettimedelta('KEEP', 'within')
@@ -136,6 +140,9 @@ def prune(config, dry_run, keep_newest):
136 if to_keep > 0: 140 if to_keep > 0:
137 logger.debug(f'Missing {to_keep} to fulfill {rule}={desired_count} for ‘{base}’') 141 logger.debug(f'Missing {to_keep} to fulfill {rule}={desired_count} for ‘{base}’')
138 142
143 for snap, reasons in kept_because:
144 reasons_str = ', '.join(map(str, reasons))
145 logger.info(f'Keeping ‘{snap}’ because: {reasons_str}')
139 all_snaps = {snap.name for _, snaps in items.items() for snap in snaps} 146 all_snaps = {snap.name for _, snaps in items.items() for snap in snaps}
140 to_destroy = all_snaps - keep 147 to_destroy = all_snaps - keep
141 if not to_destroy: 148 if not to_destroy: