Skip to content

Commit bd14ec8

Browse files
committed
improve setCachePolicy0 method, turn off sun.net.InetAddressCachePolicy.propertySet/propertyNegativeSet #25
1 parent 3818202 commit bd14ec8

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

src/main/java/com/alibaba/dcm/DnsCacheManipulator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ public static int getDnsCachePolicy() {
228228

229229
/**
230230
* Set JVM DNS cache policy
231+
* <p/>
232+
* NOTE: if Security Manage is turn on, JVM DNS cache policy set will not take effective. You can check by method {@link #getDnsCachePolicy()}.
231233
*
232234
* @param cacheSeconds set default dns cache time. Special input case:
233235
* <ul>

src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtil.java

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,19 +323,55 @@ public static int getDnsNegativeCachePolicy()
323323
return InetAddressCachePolicy.getNegative();
324324
}
325325

326+
327+
static volatile Field setFiled$InetAddressCachePolicy = null;
328+
static volatile Field negativeSet$InetAddressCachePolicy = null;
329+
326330
static void setCachePolicy0(boolean isNegative, int seconds)
327331
throws NoSuchFieldException, IllegalAccessException {
328332
if (seconds < 0) {
329333
seconds = -1;
330334
}
331335

332-
Class<?> clazz = InetAddressCachePolicy.class;
333-
Field cachePolicyFiled = clazz.getDeclaredField(
336+
final Class<?> clazz = InetAddressCachePolicy.class;
337+
final Field cachePolicyFiled = clazz.getDeclaredField(
334338
isNegative ? "negativeCachePolicy" : "cachePolicy");
335339
cachePolicyFiled.setAccessible(true);
336340

341+
final Field setField;
342+
if (isNegative) {
343+
if (negativeSet$InetAddressCachePolicy == null) {
344+
synchronized (InetAddressCacheUtil.class) {
345+
if (negativeSet$InetAddressCachePolicy == null) {
346+
try {
347+
negativeSet$InetAddressCachePolicy = clazz.getDeclaredField("propertyNegativeSet");
348+
} catch (NoSuchFieldException e) {
349+
negativeSet$InetAddressCachePolicy = clazz.getDeclaredField("negativeSet");
350+
}
351+
negativeSet$InetAddressCachePolicy.setAccessible(true);
352+
}
353+
}
354+
}
355+
setField = negativeSet$InetAddressCachePolicy;
356+
} else {
357+
if (setFiled$InetAddressCachePolicy == null) {
358+
synchronized (InetAddressCacheUtil.class) {
359+
if (setFiled$InetAddressCachePolicy == null) {
360+
try {
361+
setFiled$InetAddressCachePolicy = clazz.getDeclaredField("propertySet");
362+
} catch (NoSuchFieldException e) {
363+
setFiled$InetAddressCachePolicy = clazz.getDeclaredField("set");
364+
}
365+
setFiled$InetAddressCachePolicy.setAccessible(true);
366+
}
367+
}
368+
}
369+
setField = setFiled$InetAddressCachePolicy;
370+
}
371+
337372
synchronized (InetAddressCachePolicy.class) { // static synchronized method!
338373
cachePolicyFiled.set(null, seconds);
374+
setField.set(null, true);
339375
}
340376
}
341377

0 commit comments

Comments
 (0)