You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-dev@hadoop.apache.org by "Xiaoqiao He (Jira)" <ji...@apache.org> on 2019/12/17 03:58:00 UTC
[jira] [Created] (HDFS-15068) DataNode could meet deadlock if
invoke refreshVolumes when register
Xiaoqiao He created HDFS-15068:
----------------------------------
Summary: DataNode could meet deadlock if invoke refreshVolumes when register
Key: HDFS-15068
URL: https://issues.apache.org/jira/browse/HDFS-15068
Project: Hadoop HDFS
Issue Type: Bug
Components: datanode
Reporter: Xiaoqiao He
Assignee: Aiphago
DataNode could meet deadlock when invoke `dfsadmin -reconfig datanode ip:host start` to trigger #refreshVolumes.
1. DataNod#refreshVolumes hold datanode instance ownable {{synchronizer}} when enter this method first, then try to hold BPOfferService {{readlock}} when `bpos.getNamespaceInfo()` in following code segment.
{code:java}
for (BPOfferService bpos : blockPoolManager.getAllNamenodeThreads()) {
nsInfos.add(bpos.getNamespaceInfo());
}
{code}
2. BPOfferService#registrationSucceeded (which is invoked by #register when DataNode start or #reregister when processCommandFromActor) hold BPOfferService {{writelock}} first, then try to hold datanode instance ownable {{synchronizer}} in following method.
{code:java}
synchronized void bpRegistrationSucceeded(DatanodeRegistration bpRegistration,
String blockPoolId) throws IOException {
id = bpRegistration;
if(!storage.getDatanodeUuid().equals(bpRegistration.getDatanodeUuid())) {
throw new IOException("Inconsistent Datanode IDs. Name-node returned "
+ bpRegistration.getDatanodeUuid()
+ ". Expecting " + storage.getDatanodeUuid());
}
registerBlockPoolWithSecretManager(bpRegistration, blockPoolId);
}
{code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-dev-unsubscribe@hadoop.apache.org
For additional commands, e-mail: hdfs-dev-help@hadoop.apache.org