@@ -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