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 b166330c79e..40744bc16c4 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 @@ -50,7 +50,7 @@ public abstract class Nfs3Base { startTCPServer(); // Start TCP server if (register) { - ShutdownHookManager.get().addShutdownHook(new Unregister(), + ShutdownHookManager.get().addShutdownHook(new NfsShutdownHook(), SHUTDOWN_HOOK_PRIORITY); try { rpcProgram.register(PortmapMapping.TRANSPORT_TCP, nfsBoundPort); @@ -74,10 +74,11 @@ public abstract class Nfs3Base { */ public static final int SHUTDOWN_HOOK_PRIORITY = 10; - private class Unregister implements Runnable { + private class NfsShutdownHook implements Runnable { @Override public synchronized void run() { rpcProgram.unregister(PortmapMapping.TRANSPORT_TCP, nfsBoundPort); + rpcProgram.stopDaemons(); } } } 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 31906035939..3343c75e1aa 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 @@ -136,8 +136,9 @@ public abstract class RpcProgram extends SimpleChannelUpstreamHandler { } } - // Start extra daemons + // Start extra daemons or services public void startDaemons() {} + public void stopDaemons() {} @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) diff --git a/hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/RpcProgramNfs3.java b/hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/RpcProgramNfs3.java index 40a9043e7c1..b1076f28942 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/RpcProgramNfs3.java +++ b/hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/RpcProgramNfs3.java @@ -126,6 +126,7 @@ import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.authorize.AuthorizationException; +import org.apache.hadoop.util.JvmPauseMonitor; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; @@ -158,6 +159,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface { private String writeDumpDir; // The dir save dump files private final RpcCallCache rpcCallCache; + private JvmPauseMonitor pauseMonitor; public RpcProgramNfs3(NfsConfiguration config, DatagramSocket registrationSocket, boolean allowInsecurePorts) throws IOException { @@ -219,7 +221,21 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface { @Override public void startDaemons() { - writeManager.startAsyncDataSerivce(); + if (pauseMonitor == null) { + pauseMonitor = new JvmPauseMonitor(config); + pauseMonitor.start(); + } + writeManager.startAsyncDataSerivce(); + } + + @Override + public void stopDaemons() { + if (writeManager != null) { + writeManager.shutdownAsyncDataService(); + } + if (pauseMonitor != null) { + pauseMonitor.stop(); + } } // Checks the type of IOException and maps it to appropriate Nfs3Status code. diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index cfe621f92ba..3cee2e8fc30 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -627,6 +627,8 @@ Release 2.6.0 - UNRELEASED HDFS-7259. Unresponseive NFS mount point due to deferred COMMIT response. (brandonli) + HDFS-7215.Add JvmPauseMonitor to NFS gateway (brandonli) + BREAKDOWN OF HDFS-6581 SUBTASKS AND RELATED JIRAS HDFS-6921. Add LazyPersist flag to FileStatus. (Arpit Agarwal) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/site/apt/HdfsNfsGateway.apt.vm b/hadoop-hdfs-project/hadoop-hdfs/src/site/apt/HdfsNfsGateway.apt.vm index 4044ae8d508..0e6c482b78c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/site/apt/HdfsNfsGateway.apt.vm +++ b/hadoop-hdfs-project/hadoop-hdfs/src/site/apt/HdfsNfsGateway.apt.vm @@ -171,7 +171,9 @@ HDFS NFS Gateway ---- - * Customize log settings. To get NFS debug trace, users can edit the log4j.property file + * JVM and log settings. You can export JVM settings (e.g., heap size and GC log) in + HADOOP_NFS3_OPTS. More NFS related settings can be found in hadoop-env.sh. + To get NFS debug trace, you can edit the log4j.property file to add the following. Note, debug trace, especially for ONCRPC, can be very verbose. To change logging level: