Skip to content

Commit d2d8ed8

Browse files
committed
xds: Add logical dns cluster support to XdsDepManager
ClusterResolverLb gets the NameResolverRegistry from LoadBalancer.Helper, so a new API was added in NameResover.Args to propagate the same object to the name resolver tree. RetryingNameResolver was exposed to xds. This is expected to be temporary, as the retrying is being removed from ManagedChannelImpl and moved into the resolvers. At that point, DnsNameResolverProvider would wrap DnsNameResolver with a similar API to RetryingNameResolver and xds would no longer be responsible.
1 parent f07eb47 commit d2d8ed8

File tree

8 files changed

+324
-36
lines changed

8 files changed

+324
-36
lines changed

api/src/main/java/io/grpc/NameResolver.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ public static final class Args {
303303
@Nullable private final Executor executor;
304304
@Nullable private final String overrideAuthority;
305305
@Nullable private final MetricRecorder metricRecorder;
306+
@Nullable private final NameResolverRegistry nameResolverRegistry;
306307
@Nullable private final IdentityHashMap<Key<?>, Object> customArgs;
307308

308309
private Args(Builder builder) {
@@ -316,6 +317,7 @@ private Args(Builder builder) {
316317
this.executor = builder.executor;
317318
this.overrideAuthority = builder.overrideAuthority;
318319
this.metricRecorder = builder.metricRecorder;
320+
this.nameResolverRegistry = builder.nameResolverRegistry;
319321
this.customArgs = cloneCustomArgs(builder.customArgs);
320322
}
321323

@@ -447,6 +449,18 @@ public MetricRecorder getMetricRecorder() {
447449
return metricRecorder;
448450
}
449451

452+
/**
453+
* Returns the {@link NameResolverRegistry} that the Channel uses to look for {@link
454+
* NameResolver}s.
455+
*
456+
* @since 1.74.0
457+
*/
458+
public NameResolverRegistry getNameResolverRegistry() {
459+
if (nameResolverRegistry == null) {
460+
throw new IllegalStateException("NameResolverRegistry is not set in Builder");
461+
}
462+
return nameResolverRegistry;
463+
}
450464

451465
@Override
452466
public String toString() {
@@ -461,6 +475,7 @@ public String toString() {
461475
.add("executor", executor)
462476
.add("overrideAuthority", overrideAuthority)
463477
.add("metricRecorder", metricRecorder)
478+
.add("nameResolverRegistry", nameResolverRegistry)
464479
.toString();
465480
}
466481

@@ -480,6 +495,7 @@ public Builder toBuilder() {
480495
builder.setOffloadExecutor(executor);
481496
builder.setOverrideAuthority(overrideAuthority);
482497
builder.setMetricRecorder(metricRecorder);
498+
builder.setNameResolverRegistry(nameResolverRegistry);
483499
builder.customArgs = cloneCustomArgs(customArgs);
484500
return builder;
485501
}
@@ -508,6 +524,7 @@ public static final class Builder {
508524
private Executor executor;
509525
private String overrideAuthority;
510526
private MetricRecorder metricRecorder;
527+
private NameResolverRegistry nameResolverRegistry;
511528
private IdentityHashMap<Key<?>, Object> customArgs;
512529

513530
Builder() {
@@ -614,6 +631,16 @@ public Builder setMetricRecorder(MetricRecorder metricRecorder) {
614631
return this;
615632
}
616633

634+
/**
635+
* See {@link Args#getNameResolverRegistry}. This is an optional field.
636+
*
637+
* @since 1.74.0
638+
*/
639+
public Builder setNameResolverRegistry(NameResolverRegistry registry) {
640+
this.nameResolverRegistry = registry;
641+
return this;
642+
}
643+
617644
/**
618645
* Builds an {@link Args}.
619646
*

core/src/main/java/io/grpc/internal/ManagedChannelImpl.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,8 @@ ClientStream newSubstream(
597597
.setChannelLogger(channelLogger)
598598
.setOffloadExecutor(this.offloadExecutorHolder)
599599
.setOverrideAuthority(this.authorityOverride)
600-
.setMetricRecorder(this.metricRecorder);
600+
.setMetricRecorder(this.metricRecorder)
601+
.setNameResolverRegistry(builder.nameResolverRegistry);
601602
builder.copyAllNameResolverCustomArgsTo(nameResolverArgsBuilder);
602603
this.nameResolverArgs = nameResolverArgsBuilder.build();
603604
this.nameResolver = getNameResolver(
@@ -685,11 +686,7 @@ static NameResolver getNameResolver(
685686
// We wrap the name resolver in a RetryingNameResolver to give it the ability to retry failures.
686687
// TODO: After a transition period, all NameResolver implementations that need retry should use
687688
// RetryingNameResolver directly and this step can be removed.
688-
NameResolver usedNameResolver = new RetryingNameResolver(resolver,
689-
new BackoffPolicyRetryScheduler(new ExponentialBackoffPolicy.Provider(),
690-
nameResolverArgs.getScheduledExecutorService(),
691-
nameResolverArgs.getSynchronizationContext()),
692-
nameResolverArgs.getSynchronizationContext());
689+
NameResolver usedNameResolver = RetryingNameResolver.wrap(resolver, nameResolverArgs);
693690

694691
if (overrideAuthority == null) {
695692
return usedNameResolver;

core/src/main/java/io/grpc/internal/RetryingNameResolver.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,22 @@
2727
*
2828
* <p>The {@link NameResolver} used with this
2929
*/
30-
final class RetryingNameResolver extends ForwardingNameResolver {
30+
public final class RetryingNameResolver extends ForwardingNameResolver {
31+
public static NameResolver wrap(NameResolver retriedNameResolver, Args args) {
32+
// For migration, this might become conditional
33+
return new RetryingNameResolver(
34+
retriedNameResolver,
35+
new BackoffPolicyRetryScheduler(
36+
new ExponentialBackoffPolicy.Provider(),
37+
args.getScheduledExecutorService(),
38+
args.getSynchronizationContext()),
39+
args.getSynchronizationContext());
40+
}
3141

3242
private final NameResolver retriedNameResolver;
3343
private final RetryScheduler retryScheduler;
3444
private final SynchronizationContext syncContext;
3545

36-
3746
/**
3847
* Creates a new {@link RetryingNameResolver}.
3948
*

core/src/test/java/io/grpc/internal/DnsNameResolverTest.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -207,14 +207,7 @@ private RetryingNameResolver newResolver(
207207

208208
// In practice the DNS name resolver provider always wraps the resolver in a
209209
// RetryingNameResolver which adds retry capabilities to it. We use the same setup here.
210-
return new RetryingNameResolver(
211-
dnsResolver,
212-
new BackoffPolicyRetryScheduler(
213-
new ExponentialBackoffPolicy.Provider(),
214-
fakeExecutor.getScheduledExecutorService(),
215-
syncContext
216-
),
217-
syncContext);
210+
return (RetryingNameResolver) RetryingNameResolver.wrap(dnsResolver, args);
218211
}
219212

220213
@Before

0 commit comments

Comments
 (0)