diff --git a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/mount/MountdBase.java b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/mount/MountdBase.java index d389347161..8d7d6dc83c 100644 --- a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/mount/MountdBase.java +++ b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/mount/MountdBase.java @@ -19,12 +19,16 @@ import java.io.IOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.hadoop.oncrpc.RpcProgram; import org.apache.hadoop.oncrpc.SimpleTcpServer; import org.apache.hadoop.oncrpc.SimpleUdpServer; import org.apache.hadoop.portmap.PortmapMapping; import org.apache.hadoop.util.ShutdownHookManager; +import static org.apache.hadoop.util.ExitUtil.terminate; + /** * Main class for starting mountd daemon. This daemon implements the NFS * mount protocol. When receiving a MOUNT request from an NFS client, it checks @@ -33,6 +37,7 @@ * handle for requested directory and returns it to the client. */ abstract public class MountdBase { + public static final Log LOG = LogFactory.getLog(MountdBase.class); private final RpcProgram rpcProgram; private int udpBoundPort; // Will set after server starts private int tcpBoundPort; // Will set after server starts @@ -40,11 +45,11 @@ abstract public class MountdBase { public RpcProgram getRpcProgram() { return rpcProgram; } - + /** * Constructor * @param program - * @throws IOException + * @throws IOException */ public MountdBase(RpcProgram program) throws IOException { rpcProgram = program; @@ -74,11 +79,16 @@ public void start(boolean register) { if (register) { ShutdownHookManager.get().addShutdownHook(new Unregister(), SHUTDOWN_HOOK_PRIORITY); - rpcProgram.register(PortmapMapping.TRANSPORT_UDP, udpBoundPort); - rpcProgram.register(PortmapMapping.TRANSPORT_TCP, tcpBoundPort); + try { + rpcProgram.register(PortmapMapping.TRANSPORT_UDP, udpBoundPort); + rpcProgram.register(PortmapMapping.TRANSPORT_TCP, tcpBoundPort); + } catch (Throwable e) { + LOG.fatal("Failed to start the server. Cause:", e); + terminate(1, e); + } } } - + /** * Priority of the mountd shutdown hook. */ @@ -91,5 +101,5 @@ public synchronized void run() { rpcProgram.unregister(PortmapMapping.TRANSPORT_TCP, tcpBoundPort); } } - + } diff --git a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/Nfs3Base.java b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/Nfs3Base.java index d1f87cc1e1..b166330c79 100644 --- a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/Nfs3Base.java +++ b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/Nfs3Base.java @@ -25,6 +25,8 @@ import org.apache.hadoop.portmap.PortmapMapping; import org.apache.hadoop.util.ShutdownHookManager; +import static org.apache.hadoop.util.ExitUtil.terminate; + /** * Nfs server. Supports NFS v3 using {@link RpcProgram}. * Currently Mountd program is also started inside this class. @@ -34,7 +36,7 @@ public abstract class Nfs3Base { public static final Log LOG = LogFactory.getLog(Nfs3Base.class); private final RpcProgram rpcProgram; private int nfsBoundPort; // Will set after server starts - + public RpcProgram getRpcProgram() { return rpcProgram; } @@ -46,11 +48,16 @@ protected Nfs3Base(RpcProgram rpcProgram, Configuration conf) { public void start(boolean register) { startTCPServer(); // Start TCP server - + if (register) { ShutdownHookManager.get().addShutdownHook(new Unregister(), SHUTDOWN_HOOK_PRIORITY); - rpcProgram.register(PortmapMapping.TRANSPORT_TCP, nfsBoundPort); + try { + rpcProgram.register(PortmapMapping.TRANSPORT_TCP, nfsBoundPort); + } catch (Throwable e) { + LOG.fatal("Failed to start the server. Cause:", e); + terminate(1, e); + } } } @@ -61,7 +68,7 @@ private void startTCPServer() { tcpServer.run(); nfsBoundPort = tcpServer.getBoundPort(); } - + /** * Priority of the nfsd shutdown hook. */ diff --git a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/RpcProgram.java b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/RpcProgram.java index 89e7173a46..3190603593 100644 --- a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/RpcProgram.java +++ b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/RpcProgram.java @@ -131,7 +131,7 @@ protected void register(PortmapMapping mapEntry, boolean set) { } catch (IOException e) { String request = set ? "Registration" : "Unregistration"; LOG.error(request + " failure with " + host + ":" + port - + ", portmap entry: " + mapEntry, e); + + ", portmap entry: " + mapEntry); throw new RuntimeException(request + " failure", e); } } diff --git a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/SimpleUdpClient.java b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/SimpleUdpClient.java index a221455446..40ecdf5b8d 100644 --- a/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/SimpleUdpClient.java +++ b/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/SimpleUdpClient.java @@ -60,6 +60,7 @@ public void run() throws IOException { DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); socket.send(sendPacket); + socket.setSoTimeout(500); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); socket.receive(receivePacket); diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 132a5c43bf..da1751492d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -825,6 +825,9 @@ Release 2.5.0 - UNRELEASED HDFS-6647. Edit log corruption when pipeline recovery occurs for deleted file present in snapshot (kihwal) + HDFS-6378. NFS registration should timeout instead of hanging when + portmap/rpcbind is not available (Abhiraj Butala via brandonli) + BREAKDOWN OF HDFS-2006 SUBTASKS AND RELATED JIRAS HDFS-6299. Protobuf for XAttr and client-side implementation. (Yi Liu via umamahesh)