HDFS-7533. Datanode sometimes does not shutdown on receiving upgrade shutdown command. Contributed by Eric Payne. (cherry picked from commit 6bbf9fdd041d2413dd78e2bce51abae15f3334c2)
(cherry picked from commit 33534a0c9aef5024aa6f340e7ee24930c8fa8ed5) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/e9a28251 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/e9a28251 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/e9a28251 Branch: refs/heads/sjlee/hdfs-merge Commit: e9a28251ee46e64e1b99b2dd54b0432bdc0b9578 Parents: cc637d6 Author: Kihwal Lee <kih...@apache.org> Authored: Mon Jan 12 15:38:17 2015 -0600 Committer: Sangjin Lee <sj...@apache.org> Committed: Wed Aug 12 22:22:58 2015 -0700 ---------------------------------------------------------------------- .../hadoop/hdfs/server/datanode/DataNode.java | 10 +++++++--- .../hdfs/server/datanode/TestDataNodeExit.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/e9a28251/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java index 3dc0c3b..3ecc4a2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java @@ -1627,9 +1627,13 @@ public class DataNode extends ReconfigurableBase // in order to avoid any further acceptance of requests, but the peers // for block writes are not closed until the clients are notified. if (dataXceiverServer != null) { - xserver.sendOOBToPeers(); - ((DataXceiverServer) this.dataXceiverServer.getRunnable()).kill(); - this.dataXceiverServer.interrupt(); + try { + xserver.sendOOBToPeers(); + ((DataXceiverServer) this.dataXceiverServer.getRunnable()).kill(); + this.dataXceiverServer.interrupt(); + } catch (Throwable e) { + // Ignore, since the out of band messaging is advisory. + } } // Interrupt the checkDiskErrorThread and terminate it. http://git-wip-us.apache.org/repos/asf/hadoop/blob/e9a28251/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeExit.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeExit.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeExit.java index 9d59496..c067b07 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeExit.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeExit.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hdfs.server.datanode; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.IOException; @@ -32,6 +33,7 @@ import org.apache.hadoop.hdfs.MiniDFSNNTopology; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; /** * Tests if DataNode process exits if all Block Pool services exit. @@ -88,4 +90,18 @@ public class TestDataNodeExit { stopBPServiceThreads(2, dn); assertFalse("DataNode should exit", dn.isDatanodeUp()); } + + @Test + public void testSendOOBToPeers() throws Exception { + DataNode dn = cluster.getDataNodes().get(0); + DataXceiverServer spyXserver = Mockito.spy(dn.getXferServer()); + NullPointerException e = new NullPointerException(); + Mockito.doThrow(e).when(spyXserver).sendOOBToPeers(); + dn.xserver = spyXserver; + try { + dn.shutdown(); + } catch (Throwable t) { + fail("DataNode shutdown should not have thrown exception " + t); + } + } }