You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-issues@hadoop.apache.org by "Paul Ward (JIRA)" <ji...@apache.org> on 2019/06/26 00:00:50 UTC
[jira] [Created] (HDFS-14610) HashMap is not thread safe. Field
storageMap is typically synchronized by storageMap. However, in one place,
field storageMap is not protected with synchronized.
Paul Ward created HDFS-14610:
--------------------------------
Summary: HashMap is not thread safe. Field storageMap is typically synchronized by storageMap. However, in one place, field storageMap is not protected with synchronized.
Key: HDFS-14610
URL: https://issues.apache.org/jira/browse/HDFS-14610
Project: Hadoop HDFS
Issue Type: Bug
Reporter: Paul Ward
The field *storageMap* (a *HashMap*)
[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java#L155]
is typically protected by synchronization on *storageMap*, e.g.,
[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java#L294]
[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java#L443]
[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java#L484]
For a total of 9 locations.
The reason is because *HashMap* is not thread safe.
However, here:
[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java#L455]
{{ DatanodeStorageInfo storage =}}
{{ storageMap.get(report.getStorage().getStorageID());}}
It is not synchronized.
Note that in the same method:
[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java#L484]
*storageMap* is again protected by synchronization:
{{ synchronized (storageMap) {}}
{{ storageMapSize = storageMap.size();}}
{{ }}}
I submitted a CR:
[https://github.com/apache/hadoop/pull/1015]
This CR protected the above instance (line 455 ) with synchronization
like in line 484 and in all other occurrences.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: hdfs-issues-help@hadoop.apache.org