Skip to content

Commit 0e8cf58

Browse files
committed
Revert "core: DnsNameResolver caches refresh (grpc#4812)"
This reverts commit 1899910.
1 parent c24f2fd commit 0e8cf58

File tree

3 files changed

+8
-232
lines changed

3 files changed

+8
-232
lines changed

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

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import com.google.common.annotations.VisibleForTesting;
2222
import com.google.common.base.Preconditions;
23-
import com.google.common.base.Stopwatch;
2423
import com.google.common.base.Verify;
2524
import io.grpc.Attributes;
2625
import io.grpc.EquivalentAddressGroup;
@@ -43,7 +42,6 @@
4342
import java.util.Random;
4443
import java.util.Set;
4544
import java.util.concurrent.ExecutorService;
46-
import java.util.concurrent.TimeUnit;
4745
import java.util.concurrent.atomic.AtomicReference;
4846
import java.util.logging.Level;
4947
import java.util.logging.Logger;
@@ -90,19 +88,6 @@ final class DnsNameResolver extends NameResolver {
9088
private static final String JNDI_TXT_PROPERTY =
9189
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_service_config", "false");
9290

93-
/**
94-
* Java networking system properties name for caching DNS result.
95-
*
96-
* <p>Default value is -1 (cache forever) if security manager is installed. If security manager is
97-
* not installed, the ttl value is {@code null} which falls back to {@link
98-
* #DEFAULT_NETWORK_CACHE_TTL_SECONDS gRPC default value}.
99-
*/
100-
@VisibleForTesting
101-
static final String NETWORKADDRESS_CACHE_TTL_PROPERTY = "networkaddress.cache.ttl";
102-
/** Default DNS cache duration if network cache ttl value is not specified ({@code null}). */
103-
@VisibleForTesting
104-
static final long DEFAULT_NETWORK_CACHE_TTL_SECONDS = 30;
105-
10691
@VisibleForTesting
10792
static boolean enableJndi = Boolean.parseBoolean(JNDI_PROPERTY);
10893
@VisibleForTesting
@@ -130,8 +115,6 @@ final class DnsNameResolver extends NameResolver {
130115
private final String host;
131116
private final int port;
132117
private final Resource<ExecutorService> executorResource;
133-
private final long networkAddressCacheTtlNanos;
134-
private final Stopwatch stopwatch;
135118
@GuardedBy("this")
136119
private boolean shutdown;
137120
@GuardedBy("this")
@@ -140,11 +123,10 @@ final class DnsNameResolver extends NameResolver {
140123
private boolean resolving;
141124
@GuardedBy("this")
142125
private Listener listener;
143-
private ResolutionResults cachedResolutionResults;
144126

145127
DnsNameResolver(@Nullable String nsAuthority, String name, Attributes params,
146-
Resource<ExecutorService> executorResource, ProxyDetector proxyDetector,
147-
Stopwatch stopwatch) {
128+
Resource<ExecutorService> executorResource,
129+
ProxyDetector proxyDetector) {
148130
// TODO: if a DNS server is provided as nsAuthority, use it.
149131
// https://www.captechconsulting.com/blogs/accessing-the-dusty-corners-of-dns-with-java
150132
this.executorResource = executorResource;
@@ -167,8 +149,6 @@ final class DnsNameResolver extends NameResolver {
167149
port = nameUri.getPort();
168150
}
169151
this.proxyDetector = proxyDetector;
170-
this.stopwatch = Preconditions.checkNotNull(stopwatch, "stopwatch");
171-
this.networkAddressCacheTtlNanos = getNetworkAddressCacheTtlNanos();
172152
}
173153

174154
@Override
@@ -198,13 +178,6 @@ public void run() {
198178
if (shutdown) {
199179
return;
200180
}
201-
boolean resourceRefreshRequired = cachedResolutionResults == null
202-
|| networkAddressCacheTtlNanos == 0
203-
|| (networkAddressCacheTtlNanos > 0
204-
&& stopwatch.elapsed(TimeUnit.NANOSECONDS) > networkAddressCacheTtlNanos);
205-
if (!resourceRefreshRequired) {
206-
return;
207-
}
208181
savedListener = listener;
209182
resolving = true;
210183
}
@@ -234,10 +207,6 @@ public void run() {
234207
}
235208
resolutionResults =
236209
resolveAll(addressResolver, resourceResolver, enableSrv, enableTxt, host);
237-
cachedResolutionResults = resolutionResults;
238-
if (networkAddressCacheTtlNanos > 0) {
239-
stopwatch.reset().start();
240-
}
241210
} catch (Exception e) {
242211
savedListener.onError(
243212
Status.UNAVAILABLE.withDescription("Unable to resolve host " + host).withCause(e));
@@ -284,23 +253,6 @@ public void run() {
284253
}
285254
};
286255

287-
/** Returns value of network address cache ttl property. */
288-
private static long getNetworkAddressCacheTtlNanos() {
289-
String cacheTtlPropertyValue = System.getProperty(NETWORKADDRESS_CACHE_TTL_PROPERTY);
290-
long cacheTtl = DEFAULT_NETWORK_CACHE_TTL_SECONDS;
291-
if (cacheTtlPropertyValue != null) {
292-
try {
293-
cacheTtl = Long.parseLong(cacheTtlPropertyValue);
294-
} catch (NumberFormatException e) {
295-
logger.log(
296-
Level.WARNING,
297-
"Property({0}) valid is not valid number format({1}), fall back to default({2})",
298-
new Object[] {NETWORKADDRESS_CACHE_TTL_PROPERTY, cacheTtlPropertyValue, cacheTtl});
299-
}
300-
}
301-
return cacheTtl > 0 ? TimeUnit.SECONDS.toNanos(cacheTtl) : cacheTtl;
302-
}
303-
304256
@GuardedBy("this")
305257
private void resolve() {
306258
if (resolving || shutdown) {

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package io.grpc.internal;
1818

1919
import com.google.common.base.Preconditions;
20-
import com.google.common.base.Stopwatch;
2120
import io.grpc.Attributes;
2221
import io.grpc.NameResolverProvider;
2322
import java.net.URI;
@@ -53,8 +52,7 @@ public DnsNameResolver newNameResolver(URI targetUri, Attributes params) {
5352
name,
5453
params,
5554
GrpcUtil.SHARED_CHANNEL_EXECUTOR,
56-
GrpcUtil.getDefaultProxyDetector(),
57-
Stopwatch.createUnstarted());
55+
GrpcUtil.getDefaultProxyDetector());
5856
} else {
5957
return null;
6058
}

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

Lines changed: 5 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,10 @@
2727
import static org.mockito.Mockito.mock;
2828
import static org.mockito.Mockito.times;
2929
import static org.mockito.Mockito.verify;
30-
import static org.mockito.Mockito.verifyNoMoreInteractions;
3130
import static org.mockito.Mockito.when;
3231

33-
import com.google.common.base.Stopwatch;
3432
import com.google.common.collect.Iterables;
3533
import com.google.common.net.InetAddresses;
36-
import com.google.common.testing.FakeTicker;
3734
import io.grpc.Attributes;
3835
import io.grpc.EquivalentAddressGroup;
3936
import io.grpc.NameResolver;
@@ -55,8 +52,6 @@
5552
import java.util.Map;
5653
import java.util.Random;
5754
import java.util.concurrent.ExecutorService;
58-
import java.util.concurrent.TimeUnit;
59-
import javax.annotation.Nullable;
6055
import org.junit.After;
6156
import org.junit.Before;
6257
import org.junit.Rule;
@@ -108,45 +103,28 @@ public void close(ExecutorService instance) {
108103
private NameResolver.Listener mockListener;
109104
@Captor
110105
private ArgumentCaptor<List<EquivalentAddressGroup>> resultCaptor;
111-
@Nullable
112-
private String networkaddressCacheTtlPropertyValue;
113106

114107
private DnsNameResolver newResolver(String name, int port) {
115-
return newResolver(name, port, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted());
108+
return newResolver(name, port, GrpcUtil.NOOP_PROXY_DETECTOR);
116109
}
117110

118111
private DnsNameResolver newResolver(
119112
String name,
120113
int port,
121-
ProxyDetector proxyDetector,
122-
Stopwatch stopwatch) {
114+
ProxyDetector proxyDetector) {
123115
DnsNameResolver dnsResolver = new DnsNameResolver(
124116
null,
125117
name,
126118
Attributes.newBuilder().set(NameResolver.Factory.PARAMS_DEFAULT_PORT, port).build(),
127119
fakeExecutorResource,
128-
proxyDetector,
129-
stopwatch);
120+
proxyDetector);
130121
return dnsResolver;
131122
}
132123

133124
@Before
134125
public void setUp() {
135126
MockitoAnnotations.initMocks(this);
136127
DnsNameResolver.enableJndi = true;
137-
networkaddressCacheTtlPropertyValue =
138-
System.getProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY);
139-
}
140-
141-
@After
142-
public void restoreSystemProperty() {
143-
if (networkaddressCacheTtlPropertyValue == null) {
144-
System.clearProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY);
145-
} else {
146-
System.setProperty(
147-
DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY,
148-
networkaddressCacheTtlPropertyValue);
149-
}
150128
}
151129

152130
@After
@@ -198,8 +176,7 @@ public void invalidDnsName_containsUnderscore() {
198176
}
199177

200178
@Test
201-
public void resolve_neverCache() throws Exception {
202-
System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, "0");
179+
public void resolve() throws Exception {
203180
final List<InetAddress> answer1 = createAddressList(2);
204181
final List<InetAddress> answer2 = createAddressList(1);
205182
String name = "foo.googleapis.com";
@@ -226,156 +203,6 @@ public void resolve_neverCache() throws Exception {
226203
verify(mockResolver, times(2)).resolveAddress(Matchers.anyString());
227204
}
228205

229-
@Test
230-
public void resolve_cacheForever() throws Exception {
231-
System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, "-1");
232-
final List<InetAddress> answer1 = createAddressList(2);
233-
String name = "foo.googleapis.com";
234-
FakeTicker fakeTicker = new FakeTicker();
235-
236-
DnsNameResolver resolver =
237-
newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
238-
AddressResolver mockResolver = mock(AddressResolver.class);
239-
when(mockResolver.resolveAddress(Matchers.anyString()))
240-
.thenReturn(answer1)
241-
.thenThrow(new AssertionError("should not called twice"));
242-
resolver.setAddressResolver(mockResolver);
243-
244-
resolver.start(mockListener);
245-
assertEquals(1, fakeExecutor.runDueTasks());
246-
verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
247-
assertAnswerMatches(answer1, 81, resultCaptor.getValue());
248-
assertEquals(0, fakeClock.numPendingTasks());
249-
250-
fakeTicker.advance(1, TimeUnit.DAYS);
251-
resolver.refresh();
252-
assertEquals(1, fakeExecutor.runDueTasks());
253-
verifyNoMoreInteractions(mockListener);
254-
assertAnswerMatches(answer1, 81, resultCaptor.getValue());
255-
assertEquals(0, fakeClock.numPendingTasks());
256-
257-
resolver.shutdown();
258-
259-
verify(mockResolver).resolveAddress(Matchers.anyString());
260-
}
261-
262-
@Test
263-
public void resolve_usingCache() throws Exception {
264-
long ttl = 60;
265-
System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, Long.toString(ttl));
266-
final List<InetAddress> answer = createAddressList(2);
267-
String name = "foo.googleapis.com";
268-
FakeTicker fakeTicker = new FakeTicker();
269-
270-
DnsNameResolver resolver =
271-
newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
272-
AddressResolver mockResolver = mock(AddressResolver.class);
273-
when(mockResolver.resolveAddress(Matchers.anyString()))
274-
.thenReturn(answer)
275-
.thenThrow(new AssertionError("should not reach here."));
276-
resolver.setAddressResolver(mockResolver);
277-
278-
resolver.start(mockListener);
279-
assertEquals(1, fakeExecutor.runDueTasks());
280-
verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
281-
assertAnswerMatches(answer, 81, resultCaptor.getValue());
282-
assertEquals(0, fakeClock.numPendingTasks());
283-
284-
// this refresh should return cached result
285-
fakeTicker.advance(ttl - 1, TimeUnit.SECONDS);
286-
resolver.refresh();
287-
assertEquals(1, fakeExecutor.runDueTasks());
288-
verifyNoMoreInteractions(mockListener);
289-
assertAnswerMatches(answer, 81, resultCaptor.getValue());
290-
assertEquals(0, fakeClock.numPendingTasks());
291-
292-
resolver.shutdown();
293-
294-
verify(mockResolver).resolveAddress(Matchers.anyString());
295-
}
296-
297-
@Test
298-
public void resolve_cacheExpired() throws Exception {
299-
long ttl = 60;
300-
System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, Long.toString(ttl));
301-
final List<InetAddress> answer1 = createAddressList(2);
302-
final List<InetAddress> answer2 = createAddressList(1);
303-
String name = "foo.googleapis.com";
304-
FakeTicker fakeTicker = new FakeTicker();
305-
306-
DnsNameResolver resolver =
307-
newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
308-
AddressResolver mockResolver = mock(AddressResolver.class);
309-
when(mockResolver.resolveAddress(Matchers.anyString())).thenReturn(answer1).thenReturn(answer2);
310-
resolver.setAddressResolver(mockResolver);
311-
312-
resolver.start(mockListener);
313-
assertEquals(1, fakeExecutor.runDueTasks());
314-
verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
315-
assertAnswerMatches(answer1, 81, resultCaptor.getValue());
316-
assertEquals(0, fakeClock.numPendingTasks());
317-
318-
fakeTicker.advance(ttl + 1, TimeUnit.SECONDS);
319-
resolver.refresh();
320-
assertEquals(1, fakeExecutor.runDueTasks());
321-
verify(mockListener, times(2)).onAddresses(resultCaptor.capture(), any(Attributes.class));
322-
assertAnswerMatches(answer2, 81, resultCaptor.getValue());
323-
assertEquals(0, fakeClock.numPendingTasks());
324-
325-
resolver.shutdown();
326-
327-
verify(mockResolver, times(2)).resolveAddress(Matchers.anyString());
328-
}
329-
330-
@Test
331-
public void resolve_invalidTtlPropertyValue() throws Exception {
332-
System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, "not_a_number");
333-
resolveDefaultValue();
334-
}
335-
336-
@Test
337-
public void resolve_noPropertyValue() throws Exception {
338-
System.clearProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY);
339-
resolveDefaultValue();
340-
}
341-
342-
private void resolveDefaultValue() throws Exception {
343-
final List<InetAddress> answer1 = createAddressList(2);
344-
final List<InetAddress> answer2 = createAddressList(1);
345-
String name = "foo.googleapis.com";
346-
FakeTicker fakeTicker = new FakeTicker();
347-
348-
DnsNameResolver resolver =
349-
newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
350-
AddressResolver mockResolver = mock(AddressResolver.class);
351-
when(mockResolver.resolveAddress(Matchers.anyString())).thenReturn(answer1).thenReturn(answer2);
352-
resolver.setAddressResolver(mockResolver);
353-
354-
resolver.start(mockListener);
355-
assertEquals(1, fakeExecutor.runDueTasks());
356-
verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
357-
assertAnswerMatches(answer1, 81, resultCaptor.getValue());
358-
assertEquals(0, fakeClock.numPendingTasks());
359-
360-
fakeTicker.advance(DnsNameResolver.DEFAULT_NETWORK_CACHE_TTL_SECONDS, TimeUnit.SECONDS);
361-
resolver.refresh();
362-
assertEquals(1, fakeExecutor.runDueTasks());
363-
verifyNoMoreInteractions(mockListener);
364-
assertAnswerMatches(answer1, 81, resultCaptor.getValue());
365-
assertEquals(0, fakeClock.numPendingTasks());
366-
367-
fakeTicker.advance(1, TimeUnit.SECONDS);
368-
resolver.refresh();
369-
assertEquals(1, fakeExecutor.runDueTasks());
370-
verify(mockListener, times(2)).onAddresses(resultCaptor.capture(), any(Attributes.class));
371-
assertAnswerMatches(answer2, 81, resultCaptor.getValue());
372-
assertEquals(0, fakeClock.numPendingTasks());
373-
374-
resolver.shutdown();
375-
376-
verify(mockResolver, times(2)).resolveAddress(Matchers.anyString());
377-
}
378-
379206
@Test
380207
public void resolveAll_nullResourceResolver() throws Exception {
381208
final String hostname = "addr.fake";
@@ -502,8 +329,7 @@ public void doNotResolveWhenProxyDetected() throws Exception {
502329
"password");
503330
when(alwaysDetectProxy.proxyFor(any(SocketAddress.class)))
504331
.thenReturn(proxyParameters);
505-
DnsNameResolver resolver =
506-
newResolver(name, port, alwaysDetectProxy, Stopwatch.createUnstarted());
332+
DnsNameResolver resolver = newResolver(name, port, alwaysDetectProxy);
507333
AddressResolver mockAddressResolver = mock(AddressResolver.class);
508334
when(mockAddressResolver.resolveAddress(Matchers.anyString())).thenThrow(new AssertionError());
509335
resolver.setAddressResolver(mockAddressResolver);

0 commit comments

Comments
 (0)