[
https://issues.apache.org/jira/browse/HADOOP-11969?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15204499#comment-15204499
]
Sangjin Lee commented on HADOOP-11969:
--------------------------------------
I also added a comment on HDFS-10183.
I believe that JLS makes it clear that a memory barrier is required for the
static initialization (by the JVM) and is expected from the user standpoint.
This is something we should be able to rely on safely, or we have a bigger
problem. And I don't think there is anything special about {{ThreadLocal}}.
I think it is a good idea to make these static variables final for a semantic
reason and possibly to work around a JVM bug. However, for the record, we
should be able to rely on any initial values of (non-final) static fields in
general.
> ThreadLocal initialization in several classes is not thread safe
> ----------------------------------------------------------------
>
> Key: HADOOP-11969
> URL: https://issues.apache.org/jira/browse/HADOOP-11969
> Project: Hadoop Common
> Issue Type: Bug
> Components: io
> Reporter: Sean Busbey
> Assignee: Sean Busbey
> Priority: Critical
> Labels: thread-safety
> Fix For: 2.8.0
>
> Attachments: HADOOP-11969.1.patch, HADOOP-11969.2.patch,
> HADOOP-11969.3.patch, HADOOP-11969.4.patch, HADOOP-11969.5.patch
>
>
> Right now, the initialization of hte thread local factories for encoder /
> decoder in Text are not marked final. This means they end up with a static
> initializer that is not guaranteed to be finished running before the members
> are visible.
> Under heavy contention, this means during initialization some users will get
> an NPE:
> {code}
> (2015-05-05 08:58:03.974 : solr_server_log.log)
> org.apache.solr.common.SolrException; null:java.lang.NullPointerException
> at org.apache.hadoop.io.Text.decode(Text.java:406)
> at org.apache.hadoop.io.Text.decode(Text.java:389)
> at org.apache.hadoop.io.Text.toString(Text.java:280)
> at org.apache.hadoop.hdfs.protocolPB.PBHelper.convert(PBHelper.java:764)
> at
> org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.buildBaseHeader(DataTransferProtoUtil.java:81)
> at
> org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.buildClientHeader(DataTransferProtoUtil.java:71)
> at
> org.apache.hadoop.hdfs.protocol.datatransfer.Sender.readBlock(Sender.java:101)
> at
> org.apache.hadoop.hdfs.RemoteBlockReader2.newBlockReader(RemoteBlockReader2.java:400)
> at
> org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReader(BlockReaderFactory.java:785)
> at
> org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:663)
> at
> org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:327)
> at
> org.apache.hadoop.hdfs.DFSInputStream.actualGetFromOneDataNode(DFSInputStream.java:1027)
> at
> org.apache.hadoop.hdfs.DFSInputStream.fetchBlockByteRange(DFSInputStream.java:974)
> at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:1305)
> at org.apache.hadoop.fs.FSInputStream.readFully(FSInputStream.java:78)
> at
> org.apache.hadoop.fs.FSDataInputStream.readFully(FSDataInputStream.java:107)
> ... SNIP...
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)