@@ -845,7 +845,13 @@ pub fn watch_object<K: Resource + Clone + DeserializeOwned + Debug + Send + 'sta
845845    // footgun: Api::all may generate events from namespaced objects with the same name in different namespaces 
846846    let  fields = format ! ( "metadata.name={name}" ) ; 
847847    watcher ( api,  Config :: default ( ) . fields ( & fields) ) 
848-         // track whether the object was seen in each initial listing 
848+         // The `obj_seen` state is used to track whether the object exists in each Init / InitApply / InitDone 
849+         // sequence of events. If the object wasn't seen in any particular sequence it is treated as deleted and 
850+         // `None` is emitted when the InitDone event is received. 
851+         // 
852+         // The first check ensures `None` is emitted if the object was already gone (or not found), subsequent 
853+         // checks ensure `None` is emitted even if for some reason the Delete event wasn't received, which 
854+         // could happen given K8S events aren't guaranteed delivery. 
849855        . scan ( false ,  |obj_seen,  event| { 
850856            if  matches ! ( event,  Ok ( Event :: Init ) )  { 
851857                * obj_seen = false ; 
@@ -857,19 +863,13 @@ pub fn watch_object<K: Resource + Clone + DeserializeOwned + Debug + Send + 'sta
857863        . filter_map ( |( obj_seen,  event) | async  move  { 
858864            match  event { 
859865                // Pass up `Some` for Found / Updated 
860-                 Ok ( Event :: Apply ( obj) )  | Ok ( Event :: InitApply ( obj) )  => Some ( Ok ( Some ( obj) ) ) , 
866+                 Ok ( Event :: Apply ( obj)  | Event :: InitApply ( obj) )  => Some ( Ok ( Some ( obj) ) ) , 
861867                // Pass up `None` for Deleted 
862868                Ok ( Event :: Delete ( _) )  => Some ( Ok ( None ) ) , 
863-                 // Ignore marker event 
864-                 Ok ( Event :: Init )  => None , 
865-                 // Pass up `None` if the object wasn't seen in any initial list 
866-                 Ok ( Event :: InitDone )  => { 
867-                     if  obj_seen { 
868-                         None 
869-                     }  else  { 
870-                         Some ( Ok ( None ) ) 
871-                     } 
872-                 } 
869+                 // Pass up `None` if the object wasn't seen in the initial list 
870+                 Ok ( Event :: InitDone )  if  !obj_seen => Some ( Ok ( None ) ) , 
871+                 // Ignore marker events 
872+                 Ok ( Event :: Init  | Event :: InitDone )  => None , 
873873                // Bubble up errors 
874874                Err ( err)  => Some ( Err ( err) ) , 
875875            } 
0 commit comments