Ahmed Hussein created HDFS-15644:
------------------------------------

             Summary: Failed volumes can cause DNs to stop block reporting
                 Key: HDFS-15644
                 URL: https://issues.apache.org/jira/browse/HDFS-15644
             Project: Hadoop HDFS
          Issue Type: Bug
          Components: block placement, datanode
            Reporter: Ahmed Hussein
            Assignee: Ahmed Hussein


[~daryn] found a corner case where remove failed volumes can cause a NPE in 
[FsDataSetImpl.getBlockReports()|https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java#L1939].

+Scenario:+
 * Inside {{Datanode#HandleVolumeFailures()}}, removing a failed volume is a 
2-step process.
 ** First it's removed from from the volumes list
 ** Later in time are the replicas scrubbed from the volume map
 * A concurrent thread generating blockReports may access the replicaMap 
accessing a non existing VolumeID.

He made a fix for that and we have been using it on our clusters since 
Hadoop-2.7.

By analyzing the code, the bug is still applicable to Trunk.
 * The path Datanode#removeVolumes() is safe because the two step process in 
{{FsDataImpl.removeVolumes()}} 
[FsDatasetImpl.java#L577|https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java#L577]
 is protected by {{datasetWriteLock}} .
 * The path Datanode#handleVolumeFailures() is not safe because the failed 
volume is removed from the list without acquiring 
{{datasetWriteLock}}.[FsVolumList#239|https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsVolumeList.java#L239]


The race condition can cause the caller of getBlockReports() to throw NPE if 
the RUR is referring to a volume that has already been removed 
[FsDatasetImpl.java#L1976|https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java#L1976].

{code:java}
        case RUR:
          ReplicaInfo orig = b.getOriginalReplica();
          builders.get(volStorageID).add(orig);
          break;
{code}




--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-dev-unsubscr...@hadoop.apache.org
For additional commands, e-mail: hdfs-dev-h...@hadoop.apache.org

Reply via email to