Prevent pool spinup for snapshot deletion
This commit is contained in:
@@ -122,6 +122,9 @@ def written_since_last(fs, snap):
|
|||||||
return res > 0
|
return res > 0
|
||||||
|
|
||||||
|
|
||||||
|
def get_pool(fs):
|
||||||
|
return fs.split('/')[0]
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
now = datetime.now(timezone.utc).replace(second=0, microsecond=0)
|
now = datetime.now(timezone.utc).replace(second=0, microsecond=0)
|
||||||
if verbose:
|
if verbose:
|
||||||
@@ -133,8 +136,8 @@ def main():
|
|||||||
latest_snaps = find_latest_snapshots(existing_snaps)
|
latest_snaps = find_latest_snapshots(existing_snaps)
|
||||||
fs_to_really_snap = [fs for fs in fs_to_snap if fs not in latest_snaps or
|
fs_to_really_snap = [fs for fs in fs_to_snap if fs not in latest_snaps or
|
||||||
written_since_last(fs, latest_snaps[fs])]
|
written_since_last(fs, latest_snaps[fs])]
|
||||||
|
pools = {get_pool(fs) for fs in fs_to_really_snap}
|
||||||
if fs_to_really_snap:
|
if fs_to_really_snap:
|
||||||
pools = {fs.split('/')[0] for fs in fs_to_really_snap}
|
|
||||||
snapname = 'zfs-smart-snap-' + now.strftime('%Y-%m-%d-%H%M')
|
snapname = 'zfs-smart-snap-' + now.strftime('%Y-%m-%d-%H%M')
|
||||||
snaps_to_create = [f'{fs}@{snapname}' for fs in fs_to_really_snap]
|
snaps_to_create = [f'{fs}@{snapname}' for fs in fs_to_really_snap]
|
||||||
if dry_run or verbose:
|
if dry_run or verbose:
|
||||||
@@ -154,6 +157,12 @@ def main():
|
|||||||
if existing_snaps[fs][-1] not in to_keep:
|
if existing_snaps[fs][-1] not in to_keep:
|
||||||
print(f"Warning: Latest snap {fs}@{existing_snaps[fs][-1]} not preserved by retention policy, keeping anyways", file=sys.stderr)
|
print(f"Warning: Latest snap {fs}@{existing_snaps[fs][-1]} not preserved by retention policy, keeping anyways", file=sys.stderr)
|
||||||
to_keep.add(existing_snaps[fs][-1])
|
to_keep.add(existing_snaps[fs][-1])
|
||||||
|
# Don't cleanup old snapshots if no new snapshots were created on the pool (to prevent disk spinup only for snapshot deletion)
|
||||||
|
# The old snapshots will be cleaned once any dataset on the pool is changed and a new snapshot is created.
|
||||||
|
if get_pool(fs) not in pools:
|
||||||
|
if verbose:
|
||||||
|
print(f"Skipping snapshot cleaning for {fs} because pool {get_pool(fs)} was not written")
|
||||||
|
continue
|
||||||
to_delete += (f'{fs}@{snap}' for snap in set(existing_snaps[fs]).difference(to_keep))
|
to_delete += (f'{fs}@{snap}' for snap in set(existing_snaps[fs]).difference(to_keep))
|
||||||
|
|
||||||
if not dry_run:
|
if not dry_run:
|
||||||
|
|||||||
Reference in New Issue
Block a user