@@ -676,6 +676,8 @@ private final class ResourceSubscriber<T extends ResourceUpdate> {
676
676
private ResourceMetadata metadata ;
677
677
@ Nullable
678
678
private String errorDescription ;
679
+ @ Nullable
680
+ private Status lastError ;
679
681
680
682
ResourceSubscriber (XdsResourceType <T > type , String resource ) {
681
683
syncContext .throwIfNotInThisSynchronizationContext ();
@@ -712,11 +714,16 @@ void addWatcher(ResourceWatcher<T> watcher, Executor watcherExecutor) {
712
714
watchers .put (watcher , watcherExecutor );
713
715
T savedData = data ;
714
716
boolean savedAbsent = absent ;
717
+ Status savedError = lastError ;
715
718
watcherExecutor .execute (() -> {
716
719
if (errorDescription != null ) {
717
720
watcher .onError (Status .INVALID_ARGUMENT .withDescription (errorDescription ));
718
721
return ;
719
722
}
723
+ if (savedError != null ) {
724
+ watcher .onError (savedError );
725
+ return ;
726
+ }
720
727
if (savedData != null ) {
721
728
notifyWatcher (watcher , savedData );
722
729
} else if (savedAbsent ) {
@@ -808,6 +815,7 @@ void onData(ParsedResource<T> parsedResource, String version, long updateTime,
808
815
this .metadata = ResourceMetadata
809
816
.newResourceMetadataAcked (parsedResource .getRawResource (), version , updateTime );
810
817
absent = false ;
818
+ lastError = null ;
811
819
if (resourceDeletionIgnored ) {
812
820
logger .log (XdsLogLevel .FORCE_INFO , "xds server {0}: server returned new version "
813
821
+ "of resource for which we previously ignored a deletion: type {1} name {2}" ,
@@ -857,6 +865,7 @@ void onAbsent(@Nullable ProcessingTracker processingTracker, ServerInfo serverIn
857
865
if (!absent ) {
858
866
data = null ;
859
867
absent = true ;
868
+ lastError = null ;
860
869
metadata = serverInfo .resourceTimerIsTransientError ()
861
870
? ResourceMetadata .newResourceMetadataTimeout ()
862
871
: ResourceMetadata .newResourceMetadataDoesNotExist ();
@@ -894,6 +903,7 @@ void onError(Status error, @Nullable ProcessingTracker tracker) {
894
903
Status errorAugmented = Status .fromCode (error .getCode ())
895
904
.withDescription (description + "nodeID: " + bootstrapInfo .node ().getId ())
896
905
.withCause (error .getCause ());
906
+ this .lastError = errorAugmented ;
897
907
898
908
for (ResourceWatcher <T > watcher : watchers .keySet ()) {
899
909
if (tracker != null ) {
0 commit comments