@@ -893,12 +893,20 @@ def _has_environment_changed() -> bool:
893893 return completion_status
894894
895895 @python_api_analytics
896- def run_janitor (self , ignore_ttl : bool , force_delete : bool = False ) -> bool :
896+ def run_janitor (
897+ self ,
898+ ignore_ttl : bool ,
899+ force_delete : bool = False ,
900+ environment : t .Optional [str ] = None ,
901+ ) -> bool :
902+ if environment is not None :
903+ environment = Environment .sanitize_name (environment )
904+
897905 success = False
898906
899907 if self .console .start_cleanup (ignore_ttl ):
900908 try :
901- self ._run_janitor (ignore_ttl , force_delete = force_delete )
909+ self ._run_janitor (ignore_ttl , force_delete = force_delete , environment = environment )
902910 success = True
903911 finally :
904912 self .console .stop_cleanup (success = success )
@@ -1831,7 +1839,7 @@ def invalidate_environment(self, name: str, sync: bool = False) -> None:
18311839 name = Environment .sanitize_name (name )
18321840 self .state_sync .invalidate_environment (name )
18331841 if sync :
1834- self ._cleanup_environments ()
1842+ self ._cleanup_environments (name = name )
18351843 self .console .log_success (f"Environment '{ name } ' deleted." )
18361844 else :
18371845 self .console .log_success (f"Environment '{ name } ' invalidated." )
@@ -2902,27 +2910,35 @@ def _destroy(self) -> bool:
29022910
29032911 return True
29042912
2905- def _run_janitor (self , ignore_ttl : bool = False , force_delete : bool = False ) -> None :
2913+ def _run_janitor (
2914+ self ,
2915+ ignore_ttl : bool = False ,
2916+ force_delete : bool = False ,
2917+ environment : t .Optional [str ] = None ,
2918+ ) -> None :
29062919 current_ts = now_timestamp ()
29072920 failures : t .List [str ] = []
29082921
29092922 # Clean up expired environments by removing their views and schemas
29102923 failures .extend (
2911- self ._cleanup_environments (current_ts = current_ts , force_delete = force_delete )
2924+ self ._cleanup_environments (
2925+ current_ts = current_ts , force_delete = force_delete , name = environment
2926+ )
29122927 )
29132928
2914- failures .extend (
2915- delete_expired_snapshots (
2916- self .state_sync ,
2917- self .snapshot_evaluator ,
2918- current_ts = current_ts ,
2919- ignore_ttl = ignore_ttl ,
2920- force_delete = force_delete ,
2921- console = self .console ,
2922- batch_size = self .config .janitor .expired_snapshots_batch_size ,
2929+ if environment is None :
2930+ failures .extend (
2931+ delete_expired_snapshots (
2932+ self .state_sync ,
2933+ self .snapshot_evaluator ,
2934+ current_ts = current_ts ,
2935+ ignore_ttl = ignore_ttl ,
2936+ force_delete = force_delete ,
2937+ console = self .console ,
2938+ batch_size = self .config .janitor .expired_snapshots_batch_size ,
2939+ )
29232940 )
2924- )
2925- self .state_sync .compact_intervals ()
2941+ self .state_sync .compact_intervals ()
29262942
29272943 if failures :
29282944 failure_string = "\n - " .join (failures )
@@ -2935,15 +2951,23 @@ def _run_janitor(self, ignore_ttl: bool = False, force_delete: bool = False) ->
29352951 raise SQLMeshError (summary )
29362952
29372953 def _cleanup_environments (
2938- self , current_ts : t .Optional [int ] = None , force_delete : bool = False
2954+ self ,
2955+ current_ts : t .Optional [int ] = None ,
2956+ force_delete : bool = False ,
2957+ name : t .Optional [str ] = None ,
29392958 ) -> t .List [str ]:
29402959 current_ts = current_ts or now_timestamp ()
29412960 failures : t .List [str ] = []
29422961
29432962 expired_environments_summaries = self .state_sync .get_expired_environments (
2944- current_ts = current_ts
2963+ current_ts = current_ts , name = name
29452964 )
29462965
2966+ if name is not None and not expired_environments_summaries :
2967+ self .console .log_warning (
2968+ f"Environment '{ name } ' is not expired or does not exist. Nothing to clean up."
2969+ )
2970+
29472971 for expired_env_summary in expired_environments_summaries :
29482972 expired_env = self .state_reader .get_environment (expired_env_summary .name )
29492973
@@ -2960,7 +2984,7 @@ def _cleanup_environments(
29602984 # we want to retry on the next janitor pass if drops failed, unless
29612985 # force_delete is set in which case we purge state records regardless
29622986 if not failures or force_delete :
2963- self .state_sync .delete_expired_environments (current_ts = current_ts )
2987+ self .state_sync .delete_expired_environments (current_ts = current_ts , name = name )
29642988 return failures
29652989
29662990 def _try_connection (self , connection_name : str , validator : t .Callable [[], None ]) -> None :
0 commit comments