Skip to content

Commit 7e14cb9

Browse files
Some minor cleanups
1 parent 4fb421b commit 7e14cb9

File tree

1 file changed

+33
-38
lines changed

1 file changed

+33
-38
lines changed

servicetalk-dns-discovery-netty/src/main/java/io/servicetalk/dns/discovery/netty/DefaultDnsClient.java

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@
5757
import io.netty.util.ReferenceCountUtil;
5858
import io.netty.util.concurrent.Future;
5959
import io.netty.util.concurrent.FutureListener;
60-
import io.netty.util.concurrent.GenericFutureListener;
6160
import io.netty.util.concurrent.Promise;
61+
import io.netty.util.concurrent.PromiseNotifier;
6262
import org.slf4j.Logger;
6363
import org.slf4j.LoggerFactory;
6464

@@ -187,74 +187,69 @@ public long queryTimeoutMillis() {
187187

188188
private static final class BackupRequestResolver implements DnsNameResolverDelegate {
189189

190-
private final DnsNameResolver primary;
191-
private final DnsNameResolver backup;
190+
private final DnsNameResolver primaryResolver;
191+
private final DnsNameResolver backupResolver;
192192
private final EventLoop eventLoop;
193193

194194
// TODO: we'll want to make sure we share the cache, make our backup request interval more flexible, and also
195195
// give ourselves some sort of budget so we don't overload DNS, but these are all possible.
196196
BackupRequestResolver(DnsNameResolverBuilder builder, EventLoop eventLoop) {
197-
primary = builder.build();
198-
backup = builder.consolidateCacheSize(0).build();
197+
primaryResolver = builder.build();
198+
backupResolver = builder.consolidateCacheSize(0).build();
199199
this.eventLoop = eventLoop;
200200
}
201201

202202
@Override
203203
public void close() {
204204
try {
205-
primary.close();
205+
primaryResolver.close();
206206
} finally {
207-
backup.close();
207+
backupResolver.close();
208208
}
209209
}
210210

211211
@Override
212212
public Future<List<InetAddress>> resolveAll(String name) {
213-
return compose(resolver -> resolver.resolveAll(name));
213+
return withBackup(resolver -> resolver.resolveAll(name));
214214
}
215215

216216
@Override
217217
public Future<List<DnsRecord>> resolveAll(DnsQuestion name) {
218-
return compose(resolver -> resolver.resolveAll(name));
218+
return withBackup(resolver -> resolver.resolveAll(name));
219219
}
220220

221221
@Override
222222
public long queryTimeoutMillis() {
223-
return primary.queryTimeoutMillis();
223+
return primaryResolver.queryTimeoutMillis();
224224
}
225225

226-
private <T> Future<T> compose(Function<DnsNameResolver, Future<T>> query) {
226+
private <T> Future<T> withBackup(Function<? super DnsNameResolver, ? extends Future<T>> query) {
227+
Future<T> primaryQuery = query.apply(primaryResolver);
228+
if (primaryQuery.isDone()) {
229+
return primaryQuery;
230+
}
231+
int backupDelay = backupDelayMs();
232+
if (backupDelay <= 0) {
233+
// no backup for this request
234+
return primaryQuery;
235+
}
227236
Promise<T> result = eventLoop.newPromise();
228-
Future<T> r1 = query.apply(primary);
229-
Future<?> timer = eventLoop.schedule(() -> join(query.apply(backup), result, null),
230-
50, MILLISECONDS);
231-
join(r1, result, timer);
237+
Future<?> timer = eventLoop.schedule(() -> {
238+
if (allowBackupRequest()) {
239+
PromiseNotifier.cascade(false, query.apply(backupResolver), result);
240+
}
241+
}, backupDelay, MILLISECONDS);
242+
primaryQuery.addListener(_unused -> timer.cancel(true));
243+
PromiseNotifier.cascade(false, primaryQuery, result);
232244
return result;
233245
}
234246

235-
private static <T> void join(Future<? extends T> future, Promise<T> promise, @Nullable Future<?> timer) {
236-
// transfer results from future to promise and cancellation from promise to future.
237-
future.addListener(new GenericFutureListener<Future<T>>() {
238-
@Override
239-
public void operationComplete(Future<T> future) {
240-
if (timer != null) {
241-
timer.cancel(true);
242-
}
243-
if (future.isSuccess()) {
244-
promise.trySuccess(future.getNow());
245-
} else if (!future.isCancelled()) {
246-
promise.tryFailure(future.cause());
247-
}
248-
}
249-
});
250-
promise.addListener(new GenericFutureListener<Future<T>>() {
251-
@Override
252-
public void operationComplete(Future<T> promise) {
253-
if (promise.isCancelled()) {
254-
future.cancel(true);
255-
}
256-
}
257-
});
247+
private boolean allowBackupRequest() {
248+
return true;
249+
}
250+
251+
private int backupDelayMs() {
252+
return 50;
258253
}
259254
}
260255

0 commit comments

Comments
 (0)