@@ -890,12 +890,20 @@ def _has_environment_changed() -> bool:
890890 return completion_status
891891
892892 @python_api_analytics
893- def run_janitor (self , ignore_ttl : bool , force_delete : bool = False ) -> bool :
893+ def run_janitor (
894+ self ,
895+ ignore_ttl : bool ,
896+ force_delete : bool = False ,
897+ environment : t .Optional [str ] = None ,
898+ ) -> bool :
899+ if environment is not None :
900+ environment = Environment .sanitize_name (environment )
901+
894902 success = False
895903
896904 if self .console .start_cleanup (ignore_ttl ):
897905 try :
898- self ._run_janitor (ignore_ttl , force_delete = force_delete )
906+ self ._run_janitor (ignore_ttl , force_delete = force_delete , environment = environment )
899907 success = True
900908 finally :
901909 self .console .stop_cleanup (success = success )
@@ -1828,7 +1836,7 @@ def invalidate_environment(self, name: str, sync: bool = False) -> None:
18281836 name = Environment .sanitize_name (name )
18291837 self .state_sync .invalidate_environment (name )
18301838 if sync :
1831- self ._cleanup_environments ()
1839+ self ._cleanup_environments (name = name )
18321840 self .console .log_success (f"Environment '{ name } ' deleted." )
18331841 else :
18341842 self .console .log_success (f"Environment '{ name } ' invalidated." )
@@ -2899,27 +2907,35 @@ def _destroy(self) -> bool:
28992907
29002908 return True
29012909
2902- def _run_janitor (self , ignore_ttl : bool = False , force_delete : bool = False ) -> None :
2910+ def _run_janitor (
2911+ self ,
2912+ ignore_ttl : bool = False ,
2913+ force_delete : bool = False ,
2914+ environment : t .Optional [str ] = None ,
2915+ ) -> None :
29032916 current_ts = now_timestamp ()
29042917 failures : t .List [str ] = []
29052918
29062919 # Clean up expired environments by removing their views and schemas
29072920 failures .extend (
2908- self ._cleanup_environments (current_ts = current_ts , force_delete = force_delete )
2921+ self ._cleanup_environments (
2922+ current_ts = current_ts , force_delete = force_delete , name = environment
2923+ )
29092924 )
29102925
2911- failures .extend (
2912- delete_expired_snapshots (
2913- self .state_sync ,
2914- self .snapshot_evaluator ,
2915- current_ts = current_ts ,
2916- ignore_ttl = ignore_ttl ,
2917- force_delete = force_delete ,
2918- console = self .console ,
2919- batch_size = self .config .janitor .expired_snapshots_batch_size ,
2926+ if environment is None :
2927+ failures .extend (
2928+ delete_expired_snapshots (
2929+ self .state_sync ,
2930+ self .snapshot_evaluator ,
2931+ current_ts = current_ts ,
2932+ ignore_ttl = ignore_ttl ,
2933+ force_delete = force_delete ,
2934+ console = self .console ,
2935+ batch_size = self .config .janitor .expired_snapshots_batch_size ,
2936+ )
29202937 )
2921- )
2922- self .state_sync .compact_intervals ()
2938+ self .state_sync .compact_intervals ()
29232939
29242940 if failures :
29252941 failure_string = "\n - " .join (failures )
@@ -2932,15 +2948,23 @@ def _run_janitor(self, ignore_ttl: bool = False, force_delete: bool = False) ->
29322948 raise SQLMeshError (summary )
29332949
29342950 def _cleanup_environments (
2935- self , current_ts : t .Optional [int ] = None , force_delete : bool = False
2951+ self ,
2952+ current_ts : t .Optional [int ] = None ,
2953+ force_delete : bool = False ,
2954+ name : t .Optional [str ] = None ,
29362955 ) -> t .List [str ]:
29372956 current_ts = current_ts or now_timestamp ()
29382957 failures : t .List [str ] = []
29392958
29402959 expired_environments_summaries = self .state_sync .get_expired_environments (
2941- current_ts = current_ts
2960+ current_ts = current_ts , name = name
29422961 )
29432962
2963+ if name is not None and not expired_environments_summaries :
2964+ self .console .log_warning (
2965+ f"Environment '{ name } ' is not expired or does not exist. Nothing to clean up."
2966+ )
2967+
29442968 for expired_env_summary in expired_environments_summaries :
29452969 expired_env = self .state_reader .get_environment (expired_env_summary .name )
29462970
@@ -2957,7 +2981,7 @@ def _cleanup_environments(
29572981 # we want to retry on the next janitor pass if drops failed, unless
29582982 # force_delete is set in which case we purge state records regardless
29592983 if not failures or force_delete :
2960- self .state_sync .delete_expired_environments (current_ts = current_ts )
2984+ self .state_sync .delete_expired_environments (current_ts = current_ts , name = name )
29612985 return failures
29622986
29632987 def _try_connection (self , connection_name : str , validator : t .Callable [[], None ]) -> None :
0 commit comments