@@ -676,6 +676,8 @@ private final class ResourceSubscriber<T extends ResourceUpdate> {
676676    private  ResourceMetadata  metadata ;
677677    @ Nullable 
678678    private  String  errorDescription ;
679+     @ Nullable 
680+     private  Status  lastError ;
679681
680682    ResourceSubscriber (XdsResourceType <T > type , String  resource ) {
681683      syncContext .throwIfNotInThisSynchronizationContext ();
@@ -712,11 +714,16 @@ void addWatcher(ResourceWatcher<T> watcher, Executor watcherExecutor) {
712714      watchers .put (watcher , watcherExecutor );
713715      T  savedData  = data ;
714716      boolean  savedAbsent  = absent ;
717+       Status  savedError  = lastError ;
715718      watcherExecutor .execute (() -> {
716719        if  (errorDescription  != null ) {
717720          watcher .onError (Status .INVALID_ARGUMENT .withDescription (errorDescription ));
718721          return ;
719722        }
723+         if  (savedError  != null ) {
724+           watcher .onError (savedError );
725+           return ;
726+         }
720727        if  (savedData  != null ) {
721728          notifyWatcher (watcher , savedData );
722729        } else  if  (savedAbsent ) {
@@ -808,6 +815,7 @@ void onData(ParsedResource<T> parsedResource, String version, long updateTime,
808815      this .metadata  = ResourceMetadata 
809816          .newResourceMetadataAcked (parsedResource .getRawResource (), version , updateTime );
810817      absent  = false ;
818+       lastError  = null ;
811819      if  (resourceDeletionIgnored ) {
812820        logger .log (XdsLogLevel .FORCE_INFO , "xds server {0}: server returned new version " 
813821                + "of resource for which we previously ignored a deletion: type {1} name {2}" ,
@@ -857,6 +865,7 @@ void onAbsent(@Nullable ProcessingTracker processingTracker, ServerInfo serverIn
857865      if  (!absent ) {
858866        data  = null ;
859867        absent  = true ;
868+         lastError  = null ;
860869        metadata  = serverInfo .resourceTimerIsTransientError ()
861870            ? ResourceMetadata .newResourceMetadataTimeout ()
862871            : ResourceMetadata .newResourceMetadataDoesNotExist ();
@@ -894,6 +903,7 @@ void onError(Status error, @Nullable ProcessingTracker tracker) {
894903      Status  errorAugmented  = Status .fromCode (error .getCode ())
895904          .withDescription (description  + "nodeID: "  + bootstrapInfo .node ().getId ())
896905          .withCause (error .getCause ());
906+       this .lastError  = errorAugmented ;
897907
898908      for  (ResourceWatcher <T > watcher  : watchers .keySet ()) {
899909        if  (tracker  != null ) {
0 commit comments