From e1dde855bdaf0727026010720b1b6fad4f6f39e9 Mon Sep 17 00:00:00 2001 From: Bohan Yang Date: Thu, 2 Oct 2025 12:27:52 -0700 Subject: [PATCH 1/2] null guards for xds server and channel --- CHANGELOG.md | 6 ++++- .../linkedin/d2/balancer/D2ClientBuilder.java | 25 +++++++++++++++++-- .../com/linkedin/d2/xds/XdsClientImpl.java | 2 ++ gradle.properties | 2 +- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29258cdbac..ddefbb141d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ and what APIs have changed, if applicable. ## [Unreleased] +## [29.79.1] - 2025-10-02 +- null guards for xds server and channel + ## [29.79.0] - 2025-10-01 - Preliminary readiness management @@ -5909,7 +5912,8 @@ patch operations can re-use these classes for generating patch messages. ## [0.14.1] -[Unreleased]: https://github.com/linkedin/rest.li/compare/v29.79.0...master +[Unreleased]: https://github.com/linkedin/rest.li/compare/v29.79.1...master +[29.79.1]: https://github.com/linkedin/rest.li/compare/v29.79.0...v29.79.1 [29.79.0]: https://github.com/linkedin/rest.li/compare/v29.78.0...v29.79.0 [29.78.0]: https://github.com/linkedin/rest.li/compare/v29.77.0...v29.78.0 [29.77.0]: https://github.com/linkedin/rest.li/compare/v29.76.0...v29.77.0 diff --git a/d2/src/main/java/com/linkedin/d2/balancer/D2ClientBuilder.java b/d2/src/main/java/com/linkedin/d2/balancer/D2ClientBuilder.java index 4f972625c5..8bd7b516eb 100644 --- a/d2/src/main/java/com/linkedin/d2/balancer/D2ClientBuilder.java +++ b/d2/src/main/java/com/linkedin/d2/balancer/D2ClientBuilder.java @@ -78,6 +78,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static com.google.common.base.Preconditions.*; + /** * ATTENTION: Using this class MUST be reading from INDIS instead of Zookeeper. ZK read will crash in October 2025. @@ -244,8 +246,7 @@ public D2Client build() ); final LoadBalancerWithFacilitiesFactory loadBalancerFactory = (_config.lbWithFacilitiesFactory == null) ? - new ZKFSLoadBalancerWithFacilitiesFactory() : - _config.lbWithFacilitiesFactory; + new ZKFSLoadBalancerWithFacilitiesFactory() : _config.lbWithFacilitiesFactory; // log error for not using INDIS in raw d2 client if (_config.isLiRawD2Client && !loadBalancerFactory.isIndisOnly()) @@ -261,6 +262,12 @@ public D2Client build() + "Using in stack: {}", stackTrace); } + if (loadBalancerFactory.isIndisOnly() && cfg.xdsServer == null) + { + throw new IllegalStateException("xdsServer is null. Call setXdsServer with a valid indis server address. " + + "Reference go/onboardindis for guidelines."); + } + LoadBalancerWithFacilities loadBalancer = loadBalancerFactory.create(cfg); D2Client d2Client = new DynamicClient(loadBalancer, loadBalancer, _restOverStream); @@ -352,6 +359,7 @@ public D2ClientBuilder setZkHosts(String zkHosts) public D2ClientBuilder setXdsServer(String xdsServer) { + checkNotNull(xdsServer, "xdsServer"); _config.xdsServer = xdsServer; return this; } @@ -869,6 +877,19 @@ public D2ClientBuilder setActionOnPrecheckFailure(XdsClientValidator.ActionOnPre return this; } + /** + * Disable the detection of LI raw D2 client. This is intended for non-LI users who want to use this class to build + * a D2 client. All LI apps/jobs should NEVER set this to true (unless for test apps from service discovery team). + * When hostName and d2JmxManagerPrefix are not set, the app/job will be detected as a LI raw D2 client. + * @param disableDetectLiRawD2Client true to disable the detection, false to enable it. + * @return this builder. + */ + public D2ClientBuilder setDisableDetectLiRawD2Client(boolean disableDetectLiRawD2Client) + { + _config.disableDetectLiRawD2Client = disableDetectLiRawD2Client; + return this; + } + private Map createDefaultTransportClientFactories() { final Map clientFactories = new HashMap<>(); diff --git a/d2/src/main/java/com/linkedin/d2/xds/XdsClientImpl.java b/d2/src/main/java/com/linkedin/d2/xds/XdsClientImpl.java index b05ee55d7c..08b2eaf692 100644 --- a/d2/src/main/java/com/linkedin/d2/xds/XdsClientImpl.java +++ b/d2/src/main/java/com/linkedin/d2/xds/XdsClientImpl.java @@ -67,6 +67,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static com.google.common.base.Preconditions.*; /** * Implementation of {@link XdsClient} interface. @@ -199,6 +200,7 @@ public XdsClientImpl(Node node, { _readyTimeoutMillis = readyTimeoutMillis; _node = node; + checkNotNull(managedChannel, "managedChannel"); _managedChannel = managedChannel; _executorService = executorService; _subscribeToUriGlobCollection = subscribeToUriGlobCollection; diff --git a/gradle.properties b/gradle.properties index d2c3c4d35f..eb17f8d7a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=29.79.0 +version=29.79.1 group=com.linkedin.pegasus org.gradle.configureondemand=true org.gradle.parallel=true From 4dfb9b6642885e77e9b072c5b9f6264a25cdf3b9 Mon Sep 17 00:00:00 2001 From: Bohan Yang Date: Thu, 2 Oct 2025 16:26:13 -0700 Subject: [PATCH 2/2] fix test --- d2/src/test/java/com/linkedin/d2/xds/TestXdsClientImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/d2/src/test/java/com/linkedin/d2/xds/TestXdsClientImpl.java b/d2/src/test/java/com/linkedin/d2/xds/TestXdsClientImpl.java index 8f8e612170..654440d16b 100644 --- a/d2/src/test/java/com/linkedin/d2/xds/TestXdsClientImpl.java +++ b/d2/src/test/java/com/linkedin/d2/xds/TestXdsClientImpl.java @@ -18,6 +18,7 @@ import com.linkedin.util.clock.Time; import indis.XdsD2; import io.envoyproxy.envoy.service.discovery.v3.Resource; +import io.grpc.ManagedChannel; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -1221,7 +1222,7 @@ private static final class XdsClientImplFixture _executorService = spy(Executors.newScheduledThreadPool(1)); - _xdsClientImpl = spy(new XdsClientImpl(null, null, + _xdsClientImpl = spy(new XdsClientImpl(null, mock(ManagedChannel.class), _executorService, 0, useGlobCollections, _serverMetricsProvider, useIRV)); _xdsClientImpl._adsStream = _adsStream;