From 22ed1471bd5ef5988432fb4ae8034f4f90185405 Mon Sep 17 00:00:00 2001 From: yliu Date: Thu, 8 Oct 2015 10:26:30 +0800 Subject: [PATCH] HDFS-9137. DeadLock between DataNode#refreshVolumes and BPOfferService#registrationSucceeded. (Uma Maheswara Rao G via yliu) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hadoop/hdfs/server/datanode/DataNode.java | 25 ++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 9250c2b0036..756052c190f 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1169,6 +1169,9 @@ Release 2.8.0 - UNRELEASED HDFS-9211. Fix incorrect version in hadoop-hdfs-native-client/pom.xml from HDFS-9170 branch-2 backport. (Eric Payne via wang) + 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 d1e0160d03d..b9be20e2770 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 @@ -502,12 +502,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( @@ -689,10 +706,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()); } }