diff --git a/source/net/yacy/cora/protocol/Domains.java b/source/net/yacy/cora/protocol/Domains.java index e13e4840f..3b2956be6 100644 --- a/source/net/yacy/cora/protocol/Domains.java +++ b/source/net/yacy/cora/protocol/Domains.java @@ -59,7 +59,7 @@ public class Domains { // a dns cache private static final ARC NAME_CACHE_HIT = new ConcurrentARC(MAX_NAME_CACHE_HIT_SIZE, CONCURRENCY_LEVEL); private static final ARC NAME_CACHE_MISS = new ConcurrentARC(MAX_NAME_CACHE_MISS_SIZE, CONCURRENCY_LEVEL); - //private static final ConcurrentHashMap LOOKUP_SYNC = new ConcurrentHashMap(); + private static final ConcurrentHashMap LOOKUP_SYNC = new ConcurrentHashMap(100, 0.75f, Runtime.getRuntime().availableProcessors() * 2); private static List nameCacheNoCachingPatterns = Collections.synchronizedList(new LinkedList()); private static final List LOCALHOST_PATTERNS = makePatterns(LOCAL_PATTERNS); public static long cacheHit_Hit = 0, cacheHit_Miss = 0, cacheHit_Insert = 0; // for statistics only; do not write @@ -565,39 +565,40 @@ public class Domains { cacheMiss_Miss++; // call dnsResolveNetBased(host) using concurrency to interrupt execution in case of a time-out - //final Object sync_obj_new = new Object(); - //Object sync_obj = LOOKUP_SYNC.putIfAbsent(host, sync_obj_new); - //if (sync_obj == null) sync_obj = sync_obj_new; - //synchronized (sync_obj) { + final Object sync_obj_new = new Object(); + Object sync_obj = LOOKUP_SYNC.putIfAbsent(host, sync_obj_new); + if (sync_obj == null) sync_obj = sync_obj_new; + synchronized (sync_obj) { // now look again if the host is in the cache where it may be meanwhile because of the synchronization - /* + ip = NAME_CACHE_HIT.get(host); if (ip != null) { //System.out.println("DNSLOOKUP-CACHE-HIT(SYNC) " + host); - //LOOKUP_SYNC.remove(host); + LOOKUP_SYNC.remove(host); cacheHit_Hit++; return ip; } cacheHit_Miss++; if (NAME_CACHE_MISS.containsKey(host)) { //System.out.println("DNSLOOKUP-CACHE-MISS(SYNC) " + host); - //LOOKUP_SYNC.remove(host); + LOOKUP_SYNC.remove(host); cacheMiss_Hit++; return null; } cacheMiss_Miss++; - */ + // do the dns lookup on the dns server //if (!matchesList(host, nameCacheNoCachingPatterns)) System.out.println("DNSLOOKUP " + host); try { - //System.out.println("DNSLOOKUP-*LOOKUP* " + host); + //final long t = System.currentTimeMillis(); ip = InetAddress.getByName(host); //TimeoutRequest.getByName(host, 1000); // this makes the DNS request to backbone + //.out.println("DNSLOOKUP-*LOOKUP* " + host + ", time = " + (System.currentTimeMillis() - t) + "ms"); } catch (final UnknownHostException e) { // add new entries NAME_CACHE_MISS.insertIfAbsent(host, PRESENT); cacheMiss_Insert++; - //LOOKUP_SYNC.remove(host); + LOOKUP_SYNC.remove(host); return null; } @@ -621,9 +622,9 @@ public class Domains { } catch (final IOException e) {} } } - //LOOKUP_SYNC.remove(host); + LOOKUP_SYNC.remove(host); return ip; - //} + } } private final static Pattern dotPattern = Pattern.compile("\\.");