|  | @@ -1751,8 +1751,16 @@ XdsClient::~XdsClient() { GRPC_COMBINER_UNREF(combiner_, "xds_client"); }
 | 
	
		
			
				|  |  |  void XdsClient::Orphan() {
 | 
	
		
			
				|  |  |    shutting_down_ = true;
 | 
	
		
			
				|  |  |    chand_.reset();
 | 
	
		
			
				|  |  | -  cluster_map_.clear();
 | 
	
		
			
				|  |  | -  endpoint_map_.clear();
 | 
	
		
			
				|  |  | +  // We do not clear cluster_map_ and endpoint_map_ if the xds client was
 | 
	
		
			
				|  |  | +  // created by the XdsResolver because the maps contain refs for watchers which
 | 
	
		
			
				|  |  | +  // in turn hold refs to the loadbalancing policies. At this point, it is
 | 
	
		
			
				|  |  | +  // possible for ADS calls to be in progress. Unreffing the loadbalancing
 | 
	
		
			
				|  |  | +  // policies before those calls are done would lead to issues such as
 | 
	
		
			
				|  |  | +  // https://github.com/grpc/grpc/issues/20928.
 | 
	
		
			
				|  |  | +  if (service_config_watcher_ != nullptr) {
 | 
	
		
			
				|  |  | +    cluster_map_.clear();
 | 
	
		
			
				|  |  | +    endpoint_map_.clear();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    Unref(DEBUG_LOCATION, "XdsClient::Orphan()");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1902,13 +1910,13 @@ void XdsClient::NotifyOnError(grpc_error* error) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void* XdsClient::ChannelArgCopy(void* p) {
 | 
	
		
			
				|  |  |    XdsClient* xds_client = static_cast<XdsClient*>(p);
 | 
	
		
			
				|  |  | -  xds_client->Ref().release();
 | 
	
		
			
				|  |  | +  xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
 | 
	
		
			
				|  |  |    return p;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void XdsClient::ChannelArgDestroy(void* p) {
 | 
	
		
			
				|  |  |    XdsClient* xds_client = static_cast<XdsClient*>(p);
 | 
	
		
			
				|  |  | -  xds_client->Unref();
 | 
	
		
			
				|  |  | +  xds_client->Unref(DEBUG_LOCATION, "channel arg");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int XdsClient::ChannelArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
 |