diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java index 5e994fb..c7404a9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java @@ -1126,26 +1126,29 @@ private DatagramChannel openUDPChannel(InetAddress addr, int port) */ private byte remoteLookup(Message response, Name name, int type, int iterations) { + // If retrieving the root zone, query for NS record types + if (name.toString().equals(".")) { + type = Type.NS; + } // Forward lookup to primary DNS servers Record[] answers = getRecords(name, type); - try { - for (Record r : answers) { - if (r.getType() == Type.SOA) { - response.addRecord(r, Section.AUTHORITY); - } else { - response.addRecord(r, Section.ANSWER); - } - if (r.getType() == Type.CNAME) { - Name cname = ((CNAMERecord) r).getAlias(); - if (iterations < 6) { - remoteLookup(response, cname, Type.CNAME, iterations + 1); - } + if (answers == null || answers.length <= 0) { + return Rcode.NXDOMAIN; + } + for (Record r : answers) { + // Retrieve any cnames and add to the response first + Record[] cnameAnswers = getRecords(name, Type.CNAME); + if (cnameAnswers != null) { + for (Record cnameR : cnameAnswers) { + response.addRecord(cnameR, Section.ANSWER); } } - } catch (NullPointerException e) { - return Rcode.NXDOMAIN; - } catch (Throwable e) { - return Rcode.SERVFAIL; + + if (r.getType() == Type.SOA) { + response.addRecord(r, Section.AUTHORITY); + } else { + response.addRecord(r, Section.ANSWER); + } } return Rcode.NOERROR; }