• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

grpc / grpc-java / #19793

23 Apr 2025 04:18PM UTC coverage: 88.641% (+0.003%) from 88.638%
#19793

push

github

web-flow
xds: XdsDepManager should ignore updates after shutdown

This prevents a NPE and subsequent channel panic when trying to build a
config (because there are no watchers, so waitingOnResource==false)
without any listener and route.
```
java.lang.NullPointerException: Cannot invoke "io.grpc.xds.XdsDependencyManager$RdsUpdateSupplier.getRdsUpdate()" because "routeSource" is null
    at io.grpc.xds.XdsDependencyManager.buildUpdate(XdsDependencyManager.java:295)
    at io.grpc.xds.XdsDependencyManager.maybePublishConfig(XdsDependencyManager.java:266)
    at io.grpc.xds.XdsDependencyManager$EdsWatcher.onChanged(XdsDependencyManager.java:899)
    at io.grpc.xds.XdsDependencyManager$EdsWatcher.onChanged(XdsDependencyManager.java:888)
    at io.grpc.xds.client.XdsClientImpl$ResourceSubscriber.notifyWatcher(XdsClientImpl.java:929)
    at io.grpc.xds.client.XdsClientImpl$ResourceSubscriber.lambda$onData$0(XdsClientImpl.java:837)
    at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:96)
```

I think this fully-fixes the problem today, but not tomorrow.
subscribeToCluster() is racy as well, but not yet used.

This was noticed when idleTimeout was firing, with some other code
calling getState(true) to wake the channel back up. That may have made
this panic more visible than it would be otherwise, but that has not
been investigated.

b/412474567

34789 of 39247 relevant lines covered (88.64%)

0.89 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.89
/../netty/src/main/java/io/grpc/netty/UdsNameResolver.java
1
/*
2
 * Copyright 2022 The gRPC Authors
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16

17
package io.grpc.netty;
18

19
import static com.google.common.base.Preconditions.checkArgument;
20
import static com.google.common.base.Preconditions.checkNotNull;
21

22
import com.google.common.base.Preconditions;
23
import io.grpc.EquivalentAddressGroup;
24
import io.grpc.NameResolver;
25
import io.grpc.StatusOr;
26
import io.netty.channel.unix.DomainSocketAddress;
27
import java.util.ArrayList;
28
import java.util.List;
29

30
final class UdsNameResolver extends NameResolver {
31
  private NameResolver.Listener2 listener;
32
  private final String authority;
33

34
  UdsNameResolver(String authority, String targetPath, Args args) {
1✔
35
    checkArgument(authority == null, "non-null authority not supported");
1✔
36
    this.authority = targetPath;
1✔
37
  }
1✔
38

39
  @Override
40
  public String getServiceAuthority() {
41
    return this.authority;
1✔
42
  }
43

44
  @Override
45
  public void start(Listener2 listener) {
46
    Preconditions.checkState(this.listener == null, "already started");
1✔
47
    this.listener = checkNotNull(listener, "listener");
1✔
48
    resolve();
1✔
49
  }
1✔
50

51
  @Override
52
  public void refresh() {
53
    resolve();
×
54
  }
×
55

56
  private void resolve() {
57
    ResolutionResult.Builder resolutionResultBuilder = ResolutionResult.newBuilder();
1✔
58
    List<EquivalentAddressGroup> servers = new ArrayList<>(1);
1✔
59
    servers.add(new EquivalentAddressGroup(new DomainSocketAddress(authority)));
1✔
60
    resolutionResultBuilder.setAddressesOrError(StatusOr.fromValue(servers));
1✔
61
    listener.onResult2(resolutionResultBuilder.build());
1✔
62
  }
1✔
63

64
  @Override
65
  public void shutdown() {}
1✔
66
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc