@Override public DnsServerAddressStream get(String hostname) { List<? extends DnsCacheEntry> entries = cache.get(hostname, EMPTY); if (entries == null || entries.isEmpty()) { return null; } if (entries.get(0).cause() != null) { return null; } List<InetSocketAddress> addresses = new ArrayList<InetSocketAddress>(entries.size()); int i = 0; do { InetAddress addr = entries.get(i).address(); addresses.add(new InetSocketAddress(addr, DefaultDnsServerAddressStreamProvider.DNS_PORT)); } while (++i < entries.size()); return new SequentialDnsServerAddressStream(addresses, 0); }
@Override public void cache(String hostname, DnsRecord[] additionals, InetAddress address, long originalTtl, EventLoop loop) { checkNotNull(hostname, "hostname"); checkNotNull(address, "address"); checkNotNull(loop, "loop"); if (maxTtl == 0 || !emptyAdditionals(additionals)) { return; } final int ttl = Math.max(minTtl, (int) Math.min(maxTtl, originalTtl)); final List<DnsCacheEntry> entries = cachedEntries(hostname); final DnsCacheEntry e = new DnsCacheEntry(hostname, address); synchronized (entries) { if (!entries.isEmpty()) { final DnsCacheEntry firstEntry = entries.get(0); if (firstEntry.cause() != null) { assert entries.size() == 1; firstEntry.cancelExpiration(); entries.clear(); } } entries.add(e); } scheduleCacheExpiration(entries, e, ttl, loop); }
@Override public void cache(String hostname, DnsRecord[] additionals, Throwable cause, EventLoop loop) { checkNotNull(hostname, "hostname"); checkNotNull(cause, "cause"); checkNotNull(loop, "loop"); if (negativeTtl == 0 || !emptyAdditionals(additionals)) { return; } final List<DnsCacheEntry> entries = cachedEntries(hostname); final DnsCacheEntry e = new DnsCacheEntry(hostname, cause); synchronized (entries) { final int numEntries = entries.size(); for (int i = 0; i < numEntries; i ++) { entries.get(i).cancelExpiration(); } entries.clear(); entries.add(e); } scheduleCacheExpiration(entries, e, negativeTtl, loop); }
private void scheduleCacheExpiration(final List<DnsCacheEntry> entries, final DnsCacheEntry e, int ttl, EventLoop loop) { e.scheduleExpiration(loop, new Runnable() { @Override public void run() { synchronized (entries) { entries.remove(e); if (entries.isEmpty()) { resolveCache.remove(e.hostname()); } } } }, ttl, TimeUnit.SECONDS); }
private static void cancelExpiration(List<DnsCacheEntry> entries) { final int numEntries = entries.size(); for (int i = 0; i < numEntries; i++) { entries.get(i).cancelExpiration(); } }
@Override public void run() { synchronized (entries) { entries.remove(e); if (entries.isEmpty()) { resolveCache.remove(e.hostname()); } } } }, ttl, TimeUnit.SECONDS);
final DnsCacheEntry e = new DnsCacheEntry(hostname, resolved); resolveCache.cache(hostname, additionals, resolved, r.timeToLive(), parent.ch.eventLoop()); resolvedEntries.add(e);
@Override public DnsServerAddressStream get(String hostname) { List<? extends DnsCacheEntry> entries = cache.get(hostname, EMPTY); if (entries == null || entries.isEmpty()) { return null; } if (entries.get(0).cause() != null) { return null; } List<InetSocketAddress> addresses = new ArrayList<InetSocketAddress>(entries.size()); int i = 0; do { InetAddress addr = entries.get(i).address(); addresses.add(new InetSocketAddress(addr, DefaultDnsServerAddressStreamProvider.DNS_PORT)); } while (++i < entries.size()); return new SequentialDnsServerAddressStream(addresses, 0); }
@Override boolean finishResolve( Class<? extends InetAddress> addressType, List<DnsCacheEntry> resolvedEntries, Promise<InetAddress> promise) { final int numEntries = resolvedEntries.size(); for (int i = 0; i < numEntries; i++) { final InetAddress a = resolvedEntries.get(i).address(); if (addressType.isInstance(a)) { trySuccess(promise, a); return true; } } return false; } }
private boolean doResolveCached(String hostname, DnsRecord[] additionals, Promise<InetAddress> promise, DnsCache resolveCache) { final List<? extends DnsCacheEntry> cachedEntries = resolveCache.get(hostname, additionals); if (cachedEntries == null || cachedEntries.isEmpty()) { return false; } Throwable cause = cachedEntries.get(0).cause(); if (cause == null) { final int numEntries = cachedEntries.size(); // Find the first entry with the preferred address type. for (InternetProtocolFamily f : resolvedInternetProtocolFamilies) { for (int i = 0; i < numEntries; i++) { final DnsCacheEntry e = cachedEntries.get(i); if (f.addressType().isInstance(e.address())) { trySuccess(promise, e.address()); return true; } } } return false; } else { tryFailure(promise, cause); return true; } }
private boolean gotPreferredAddress() { if (resolvedEntries == null) { return false; } final int size = resolvedEntries.size(); switch (parent.preferredAddressType()) { case IPv4: for (int i = 0; i < size; i ++) { if (resolvedEntries.get(i).address() instanceof Inet4Address) { return true; } } break; case IPv6: for (int i = 0; i < size; i ++) { if (resolvedEntries.get(i).address() instanceof Inet6Address) { return true; } } break; default: throw new Error(); } return false; }
Throwable cause = cachedEntries.get(0).cause(); if (cause == null) { List<InetAddress> result = null; for (int i = 0; i < numEntries; i++) { final DnsCacheEntry e = cachedEntries.get(i); if (f.addressType().isInstance(e.address())) { if (result == null) { result = new ArrayList<InetAddress>(numEntries); result.add(e.address());
@Override boolean finishResolve( Class<? extends InetAddress> addressType, List<DnsCacheEntry> resolvedEntries, Promise<List<InetAddress>> promise) { List<InetAddress> result = null; final int numEntries = resolvedEntries.size(); for (int i = 0; i < numEntries; i++) { final InetAddress a = resolvedEntries.get(i).address(); if (addressType.isInstance(a)) { if (result == null) { result = new ArrayList<InetAddress>(numEntries); } result.add(a); } } if (result != null) { promise.trySuccess(result); return true; } return false; } }
private boolean doResolveCached(String hostname, DnsRecord[] additionals, Promise<InetAddress> promise, DnsCache resolveCache) { final List<? extends DnsCacheEntry> cachedEntries = resolveCache.get(hostname, additionals); if (cachedEntries == null || cachedEntries.isEmpty()) { return false; } Throwable cause = cachedEntries.get(0).cause(); if (cause == null) { final int numEntries = cachedEntries.size(); // Find the first entry with the preferred address type. for (InternetProtocolFamily f : resolvedInternetProtocolFamilies) { for (int i = 0; i < numEntries; i++) { final DnsCacheEntry e = cachedEntries.get(i); if (f.addressType().isInstance(e.address())) { trySuccess(promise, e.address()); return true; } } } return false; } else { tryFailure(promise, cause); return true; } }
Throwable cause = cachedEntries.get(0).cause(); if (cause == null) { List<InetAddress> result = null; for (int i = 0; i < numEntries; i++) { final DnsCacheEntry e = cachedEntries.get(i); if (f.addressType().isInstance(e.address())) { if (result == null) { result = new ArrayList<InetAddress>(numEntries); result.add(e.address());
@Override public DnsServerAddressStream get(String hostname) { List<? extends DnsCacheEntry> entries = cache.get(hostname, EMPTY); if (entries == null || entries.isEmpty()) { return null; } if (entries.get(0).cause() != null) { return null; } List<InetSocketAddress> addresses = new ArrayList<InetSocketAddress>(entries.size()); int i = 0; do { InetAddress addr = entries.get(i).address(); addresses.add(new InetSocketAddress(addr, DefaultDnsServerAddressStreamProvider.DNS_PORT)); } while (++i < entries.size()); return new SequentialDnsServerAddressStream(addresses, 0); }
private boolean doResolveCached(String hostname, DnsRecord[] additionals, Promise<InetAddress> promise, DnsCache resolveCache) { final List<? extends DnsCacheEntry> cachedEntries = resolveCache.get(hostname, additionals); if (cachedEntries == null || cachedEntries.isEmpty()) { return false; } Throwable cause = cachedEntries.get(0).cause(); if (cause == null) { final int numEntries = cachedEntries.size(); // Find the first entry with the preferred address type. for (InternetProtocolFamily f : resolvedInternetProtocolFamilies) { for (int i = 0; i < numEntries; i++) { final DnsCacheEntry e = cachedEntries.get(i); if (f.addressType().isInstance(e.address())) { trySuccess(promise, e.address()); return true; } } } return false; } else { tryFailure(promise, cause); return true; } }