提交 7e0ee085 编写于 作者: I igerasim

8075378: JNDI DnsClient Exception Handling

Reviewed-by: vinnie
上级 372f90d0
/* /*
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -184,119 +184,124 @@ public class DnsClient { ...@@ -184,119 +184,124 @@ public class DnsClient {
Exception caughtException = null; Exception caughtException = null;
boolean[] doNotRetry = new boolean[servers.length]; boolean[] doNotRetry = new boolean[servers.length];
// try {
// The UDP retry strategy is to try the 1st server, and then //
// each server in order. If no answer, double the timeout // The UDP retry strategy is to try the 1st server, and then
// and try each server again. // each server in order. If no answer, double the timeout
// // and try each server again.
for (int retry = 0; retry < retries; retry++) { //
for (int retry = 0; retry < retries; retry++) {
// Try each name server.
for (int i = 0; i < servers.length; i++) { // Try each name server.
if (doNotRetry[i]) { for (int i = 0; i < servers.length; i++) {
continue; if (doNotRetry[i]) {
} continue;
// send the request packet and wait for a response.
try {
if (debug) {
dprint("SEND ID (" + (retry + 1) + "): " + xid);
} }
byte[] msg = null; // send the request packet and wait for a response.
msg = doUdpQuery(pkt, servers[i], serverPorts[i], try {
retry, xid); if (debug) {
// dprint("SEND ID (" + (retry + 1) + "): " + xid);
// If the matching response is not got within the
// given timeout, check if the response was enqueued
// by some other thread, if not proceed with the next
// server or retry.
//
if (msg == null) {
if (resps.size() > 0) {
msg = lookupResponse(xid);
}
if (msg == null) { // try next server or retry
continue;
} }
}
Header hdr = new Header(msg, msg.length);
if (auth && !hdr.authoritative) {
caughtException = new NameNotFoundException(
"DNS response not authoritative");
doNotRetry[i] = true;
continue;
}
if (hdr.truncated) { // message is truncated -- try TCP
// Try each server, starting with the one that just byte[] msg = null;
// provided the truncated message. msg = doUdpQuery(pkt, servers[i], serverPorts[i],
for (int j = 0; j < servers.length; j++) { retry, xid);
int ij = (i + j) % servers.length; //
if (doNotRetry[ij]) { // If the matching response is not got within the
// given timeout, check if the response was enqueued
// by some other thread, if not proceed with the next
// server or retry.
//
if (msg == null) {
if (resps.size() > 0) {
msg = lookupResponse(xid);
}
if (msg == null) { // try next server or retry
continue; continue;
} }
try { }
Tcp tcp = Header hdr = new Header(msg, msg.length);
new Tcp(servers[ij], serverPorts[ij]);
byte[] msg2; if (auth && !hdr.authoritative) {
try { caughtException = new NameNotFoundException(
msg2 = doTcpQuery(tcp, pkt); "DNS response not authoritative");
} finally { doNotRetry[i] = true;
tcp.close(); continue;
} }
Header hdr2 = new Header(msg2, msg2.length); if (hdr.truncated) { // message is truncated -- try TCP
if (hdr2.query) {
throw new CommunicationException( // Try each server, starting with the one that just
"DNS error: expecting response"); // provided the truncated message.
for (int j = 0; j < servers.length; j++) {
int ij = (i + j) % servers.length;
if (doNotRetry[ij]) {
continue;
} }
checkResponseCode(hdr2); try {
Tcp tcp =
if (!auth || hdr2.authoritative) { new Tcp(servers[ij], serverPorts[ij]);
// Got a valid response byte[] msg2;
hdr = hdr2; try {
msg = msg2; msg2 = doTcpQuery(tcp, pkt);
break; } finally {
} else { tcp.close();
doNotRetry[ij] = true; }
Header hdr2 = new Header(msg2, msg2.length);
if (hdr2.query) {
throw new CommunicationException(
"DNS error: expecting response");
}
checkResponseCode(hdr2);
if (!auth || hdr2.authoritative) {
// Got a valid response
hdr = hdr2;
msg = msg2;
break;
} else {
doNotRetry[ij] = true;
}
} catch (Exception e) {
// Try next server, or use UDP response
} }
} catch (Exception e) { } // servers
// Try next server, or use UDP response }
} return new ResourceRecords(msg, msg.length, hdr, false);
} // servers
}
return new ResourceRecords(msg, msg.length, hdr, false);
} catch (IOException e) { } catch (IOException e) {
if (debug) { if (debug) {
dprint("Caught IOException:" + e); dprint("Caught IOException:" + e);
} }
if (caughtException == null) { if (caughtException == null) {
caughtException = e; caughtException = e;
} }
// Use reflection to allow pre-1.4 compilation. // Use reflection to allow pre-1.4 compilation.
// This won't be needed much longer. // This won't be needed much longer.
if (e.getClass().getName().equals( if (e.getClass().getName().equals(
"java.net.PortUnreachableException")) { "java.net.PortUnreachableException")) {
doNotRetry[i] = true;
}
} catch (NameNotFoundException e) {
// This is authoritative, so return immediately
throw e;
} catch (CommunicationException e) {
if (caughtException == null) {
caughtException = e;
}
} catch (NamingException e) {
if (caughtException == null) {
caughtException = e;
}
doNotRetry[i] = true; doNotRetry[i] = true;
} }
} catch (NameNotFoundException e) { } // servers
throw e; } // retries
} catch (CommunicationException e) {
if (caughtException == null) { } finally {
caughtException = e; reqs.remove(xid); // cleanup
} }
} catch (NamingException e) {
if (caughtException == null) {
caughtException = e;
}
doNotRetry[i] = true;
}
} // servers
} // retries
reqs.remove(xid);
if (caughtException instanceof NamingException) { if (caughtException instanceof NamingException) {
throw (NamingException) caughtException; throw (NamingException) caughtException;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册