Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalCause;
import com.github.benmanes.caffeine.cache.RemovalListener;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Objects;
Expand Down Expand Up @@ -179,6 +180,17 @@ public void addListener(DnsCacheListener listener) {
listeners.add(listener);
}

@Override
public void removeListener(DnsCacheListener listener) {
requireNonNull(listener, "listener");
listeners.remove(listener);
}

@VisibleForTesting
List<DnsCacheListener> listeners() {
return listeners;
}

private static final class CacheEntry {

@Nullable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,9 @@ default void cache(DnsQuestion question, DnsRecord... records) {
* occurs.
*/
void addListener(DnsCacheListener listener);

/**
* Removes the specified {@link DnsCacheListener} from this {@link DnsCache}.
*/
void removeListener(DnsCacheListener listener);
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ final class RefreshingAddressResolver
@Nullable
private final ToLongFunction<String> autoRefreshTimeoutFunction;
private final boolean autoRefresh;
private final DnsCache dnsResolverCache;

private volatile boolean resolverClosed;

Expand All @@ -78,6 +79,7 @@ final class RefreshingAddressResolver
@Nullable ToLongFunction<String> autoRefreshTimeoutFunction) {
super(eventLoop);
this.addressResolverCache = addressResolverCache;
this.dnsResolverCache = dnsResolverCache;
this.resolver = resolver;
this.dnsRecordTypes = dnsRecordTypes;
this.negativeTtl = negativeTtl;
Expand Down Expand Up @@ -258,6 +260,7 @@ public void onEviction(DnsQuestion question, @Nullable List<DnsRecord> records,
@Override
public void close() {
resolverClosed = true;
dnsResolverCache.removeListener(this);
resolver.close();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,7 @@ public void removeAll() {}

@Override
public void addListener(DnsCacheListener listener) {}

@Override
public void removeListener(DnsCacheListener listener) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -905,6 +905,22 @@ public void onEviction(DnsQuestion question, @Nullable List<DnsRecord> records,
}
}

@Test
void shouldRemoveListenerFromDnsCacheWhenClosed() {
final EventLoop eventLoop = eventLoopExtension.get();
final DnsCache dnsCache = DnsCache.builder()
.executor(eventLoop)
.build();
try (RefreshingAddressResolverGroup group = new DnsResolverGroupBuilder()
.dnsCache(dnsCache)
.build(eventLoop)) {
final AddressResolver<InetSocketAddress> resolver = group.getResolver(eventLoop);
resolver.close();
final DefaultDnsCache defaultDnsCache = (DefaultDnsCache) dnsCache;
assertThat(defaultDnsCache.listeners()).isEmpty();
}
}

private static AbstractStringAssert<?> assertIpAddress(Future<InetSocketAddress> staticAddr) {
await().untilAsserted(() -> assertThat(staticAddr.isSuccess()).isTrue());
return assertThat(NetUtil.bytesToIpAddress(staticAddr.getNow().getAddress().getAddress()));
Expand Down