diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index ee6d19dda2..e05a61847c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1983,6 +1983,9 @@ Release 2.8.0 - UNRELEASED HDFS-9176. Fix TestDirectoryScanner#testThrottling often fails. (Daniel Templeton via lei) + HDFS-9137. DeadLock between DataNode#refreshVolumes and + BPOfferService#registrationSucceeded. (Uma Maheswara Rao G via yliu) + Release 2.7.2 - 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 63b8847f49..b2800678a7 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 @@ -497,12 +497,29 @@ public class DataNode extends ReconfigurableBase public void reconfigurePropertyImpl(String property, String newVal) throws ReconfigurationException { if (property.equals(DFS_DATANODE_DATA_DIR_KEY)) { + IOException rootException = null; try { LOG.info("Reconfiguring " + property + " to " + newVal); this.refreshVolumes(newVal); } catch (IOException e) { - throw new ReconfigurationException(property, newVal, - getConf().get(property), e); + rootException = e; + } finally { + // Send a full block report to let NN acknowledge the volume changes. + try { + triggerBlockReport( + new BlockReportOptions.Factory().setIncremental(false).build()); + } catch (IOException e) { + LOG.warn("Exception while sending the block report after refreshing" + + " volumes " + property + " to " + newVal, e); + if (rootException == null) { + rootException = e; + } + } finally { + if (rootException != null) { + throw new ReconfigurationException(property, newVal, + getConf().get(property), rootException); + } + } } } else { throw new ReconfigurationException( @@ -684,10 +701,6 @@ public class DataNode extends ReconfigurableBase conf.set(DFS_DATANODE_DATA_DIR_KEY, Joiner.on(",").join(effectiveVolumes)); dataDirs = getStorageLocations(conf); - - // Send a full block report to let NN acknowledge the volume changes. - triggerBlockReport(new BlockReportOptions.Factory() - .setIncremental(false).build()); } }