diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index d5c631339b0..9b32aa178aa 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -416,6 +416,9 @@ Release 2.7.0 - UNRELEASED HDFS-7596. NameNode should prune dead storages from storageMap. (Arpit Agarwal via cnauroth) + HDFS-7533. Datanode sometimes does not shutdown on receiving upgrade + shutdown command (Eric Payne via kihwal) + Release 2.6.1 - UNRELEASED INCOMPATIBLE CHANGES 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 586099e2310..6097dd3af92 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 @@ -1625,9 +1625,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. 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 9d594966990..c067b07ae67 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); + } + } }