@@ -887,12 +887,20 @@ def _has_environment_changed() -> bool:
887887 return completion_status
888888
889889 @python_api_analytics
890- def run_janitor (self , ignore_ttl : bool , force_delete : bool = False ) -> bool :
890+ def run_janitor (
891+ self ,
892+ ignore_ttl : bool ,
893+ force_delete : bool = False ,
894+ environment : t .Optional [str ] = None ,
895+ ) -> bool :
896+ if environment is not None :
897+ environment = Environment .sanitize_name (environment )
898+
891899 success = False
892900
893901 if self .console .start_cleanup (ignore_ttl ):
894902 try :
895- self ._run_janitor (ignore_ttl , force_delete = force_delete )
903+ self ._run_janitor (ignore_ttl , force_delete = force_delete , environment = environment )
896904 success = True
897905 finally :
898906 self .console .stop_cleanup (success = success )
@@ -1825,7 +1833,7 @@ def invalidate_environment(self, name: str, sync: bool = False) -> None:
18251833 name = Environment .sanitize_name (name )
18261834 self .state_sync .invalidate_environment (name )
18271835 if sync :
1828- self ._cleanup_environments ()
1836+ self ._cleanup_environments (name = name )
18291837 self .console .log_success (f"Environment '{ name } ' deleted." )
18301838 else :
18311839 self .console .log_success (f"Environment '{ name } ' invalidated." )
@@ -2896,27 +2904,35 @@ def _destroy(self) -> bool:
28962904
28972905 return True
28982906
2899- def _run_janitor (self , ignore_ttl : bool = False , force_delete : bool = False ) -> None :
2907+ def _run_janitor (
2908+ self ,
2909+ ignore_ttl : bool = False ,
2910+ force_delete : bool = False ,
2911+ environment : t .Optional [str ] = None ,
2912+ ) -> None :
29002913 current_ts = now_timestamp ()
29012914 failures : t .List [str ] = []
29022915
29032916 # Clean up expired environments by removing their views and schemas
29042917 failures .extend (
2905- self ._cleanup_environments (current_ts = current_ts , force_delete = force_delete )
2918+ self ._cleanup_environments (
2919+ current_ts = current_ts , force_delete = force_delete , name = environment
2920+ )
29062921 )
29072922
2908- failures .extend (
2909- delete_expired_snapshots (
2910- self .state_sync ,
2911- self .snapshot_evaluator ,
2912- current_ts = current_ts ,
2913- ignore_ttl = ignore_ttl ,
2914- force_delete = force_delete ,
2915- console = self .console ,
2916- batch_size = self .config .janitor .expired_snapshots_batch_size ,
2923+ if environment is None :
2924+ failures .extend (
2925+ delete_expired_snapshots (
2926+ self .state_sync ,
2927+ self .snapshot_evaluator ,
2928+ current_ts = current_ts ,
2929+ ignore_ttl = ignore_ttl ,
2930+ force_delete = force_delete ,
2931+ console = self .console ,
2932+ batch_size = self .config .janitor .expired_snapshots_batch_size ,
2933+ )
29172934 )
2918- )
2919- self .state_sync .compact_intervals ()
2935+ self .state_sync .compact_intervals ()
29202936
29212937 if failures :
29222938 failure_string = "\n - " .join (failures )
@@ -2929,15 +2945,23 @@ def _run_janitor(self, ignore_ttl: bool = False, force_delete: bool = False) ->
29292945 raise SQLMeshError (summary )
29302946
29312947 def _cleanup_environments (
2932- self , current_ts : t .Optional [int ] = None , force_delete : bool = False
2948+ self ,
2949+ current_ts : t .Optional [int ] = None ,
2950+ force_delete : bool = False ,
2951+ name : t .Optional [str ] = None ,
29332952 ) -> t .List [str ]:
29342953 current_ts = current_ts or now_timestamp ()
29352954 failures : t .List [str ] = []
29362955
29372956 expired_environments_summaries = self .state_sync .get_expired_environments (
2938- current_ts = current_ts
2957+ current_ts = current_ts , name = name
29392958 )
29402959
2960+ if name is not None and not expired_environments_summaries :
2961+ self .console .log_warning (
2962+ f"Environment '{ name } ' is not expired or does not exist. Nothing to clean up."
2963+ )
2964+
29412965 for expired_env_summary in expired_environments_summaries :
29422966 expired_env = self .state_reader .get_environment (expired_env_summary .name )
29432967
@@ -2954,7 +2978,7 @@ def _cleanup_environments(
29542978 # we want to retry on the next janitor pass if drops failed, unless
29552979 # force_delete is set in which case we purge state records regardless
29562980 if not failures or force_delete :
2957- self .state_sync .delete_expired_environments (current_ts = current_ts )
2981+ self .state_sync .delete_expired_environments (current_ts = current_ts , name = name )
29582982 return failures
29592983
29602984 def _try_connection (self , connection_name : str , validator : t .Callable [[], None ]) -> None :
0 commit comments