diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index a245286708f..9e98357dc6c 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -776,6 +776,9 @@ Release 2.8.0 - UNRELEASED HADOOP-12468. Partial group resolution failure should not result in user lockout. (Wei-Chiu Chuang via Yongjun Zhang) + HADOOP-12656. MiniKdc throws "address in use" BindException. + (Wei-Chiu Chuang via Arpit Agarwal) + OPTIMIZATIONS HADOOP-12051. ProtobufRpcEngine.invoke() should use Exception.toString() diff --git a/hadoop-common-project/hadoop-minikdc/src/main/java/org/apache/hadoop/minikdc/MiniKdc.java b/hadoop-common-project/hadoop-minikdc/src/main/java/org/apache/hadoop/minikdc/MiniKdc.java index 938836051e0..228595d36c8 100644 --- a/hadoop-common-project/hadoop-minikdc/src/main/java/org/apache/hadoop/minikdc/MiniKdc.java +++ b/hadoop-common-project/hadoop-minikdc/src/main/java/org/apache/hadoop/minikdc/MiniKdc.java @@ -41,6 +41,7 @@ import org.apache.directory.server.kerberos.shared.crypto.encryption.KerberosKeyFactory; import org.apache.directory.server.kerberos.shared.keytab.Keytab; import org.apache.directory.server.kerberos.shared.keytab.KeytabEntry; +import org.apache.directory.server.protocol.shared.transport.AbstractTransport; import org.apache.directory.server.protocol.shared.transport.TcpTransport; import org.apache.directory.server.protocol.shared.transport.UdpTransport; import org.apache.directory.server.xdbm.Index; @@ -63,8 +64,7 @@ import java.io.InputStreamReader; import java.io.StringReader; import java.lang.reflect.Method; -import java.net.InetAddress; -import java.net.ServerSocket; +import java.net.InetSocketAddress; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; @@ -264,12 +264,6 @@ public MiniKdc(Properties conf, File workDir) throws Exception { LOG.info("---------------------------------------------------------------"); this.conf = conf; port = Integer.parseInt(conf.getProperty(KDC_PORT)); - if (port == 0) { - ServerSocket ss = new ServerSocket(0, 1, InetAddress.getByName - (conf.getProperty(KDC_BIND_ADDRESS))); - port = ss.getLocalPort(); - ss.close(); - } String orgName= conf.getProperty(ORG_NAME); String orgDomain = conf.getProperty(ORG_DOMAIN); realm = orgName.toUpperCase(Locale.ENGLISH) + "." @@ -432,15 +426,23 @@ private void initKDCServer() throws Exception { // transport String transport = conf.getProperty(TRANSPORT); + AbstractTransport absTransport; if (transport.trim().equals("TCP")) { - kdc.addTransports(new TcpTransport(bindAddress, port, 3, 50)); + absTransport = new TcpTransport(bindAddress, port, 3, 50); } else if (transport.trim().equals("UDP")) { - kdc.addTransports(new UdpTransport(port)); + absTransport = new UdpTransport(port); } else { throw new IllegalArgumentException("Invalid transport: " + transport); } + kdc.addTransports(absTransport); kdc.setServiceName(conf.getProperty(INSTANCE)); kdc.start(); + // if using ephemeral port, update port number for binding + if (port == 0) { + InetSocketAddress addr = + (InetSocketAddress)absTransport.getAcceptor().getLocalAddress(); + port = addr.getPort(); + } StringBuilder sb = new StringBuilder(); InputStream is2 = cl.getResourceAsStream("minikdc-krb5.conf");