@@ -524,18 +524,26 @@ def _cleanup_old_snapshots(self, vm_mapping: VMMapping):
524524 logger .info (f"Per-host snapshot quota: keeping { vm_mapping .max_snapshots } newest snapshots "
525525 f"for VM { vm_mapping .vmid } , deleting { len (snapshots_to_delete )} older ones" )
526526 else :
527- # Fall back to time-based retention policy
528- retention_days = self .update_config .get ('snapshot_retention_days' , 7 )
529- cutoff_time = datetime .now () - timedelta (days = retention_days )
530-
531- snapshots_to_delete = [
532- snap for snap in automated_snapshots
533- if snap ['time' ] < cutoff_time
534- ]
527+ # Use default snapshot count limit to prevent unbounded growth
528+ default_max_snapshots = 5
529+ if len (automated_snapshots ) > default_max_snapshots :
530+ snapshots_to_delete = automated_snapshots [default_max_snapshots :]
531+ logger .info (f"Default snapshot quota: keeping { default_max_snapshots } newest snapshots "
532+ f"for VM { vm_mapping .vmid } , deleting { len (snapshots_to_delete )} older ones" )
535533
536- if snapshots_to_delete :
537- logger .info (f"Time-based retention: deleting { len (snapshots_to_delete )} snapshots "
538- f"older than { retention_days } days for VM { vm_mapping .vmid } " )
534+ # Also apply time-based retention if configured (for additional cleanup)
535+ if not snapshots_to_delete :
536+ retention_days = self .update_config .get ('snapshot_retention_days' , 7 )
537+ cutoff_time = datetime .now () - timedelta (days = retention_days )
538+
539+ snapshots_to_delete = [
540+ snap for snap in automated_snapshots
541+ if snap ['time' ] < cutoff_time
542+ ]
543+
544+ if snapshots_to_delete :
545+ logger .info (f"Time-based retention: deleting { len (snapshots_to_delete )} snapshots "
546+ f"older than { retention_days } days for VM { vm_mapping .vmid } " )
539547
540548 # Delete the snapshots
541549 for snap in snapshots_to_delete :
0 commit comments