HDFS-15641. DataNode could meet deadlock if invoke refreshNameNode. Contributed by Hongbing Wang.

(cherry picked from commit 12c908c827)
This commit is contained in:
Hui Fei 2020-10-26 22:12:27 +08:00
parent 66e4a8b1d7
commit eb909fd726
3 changed files with 37 additions and 1 deletions

View File

@ -204,6 +204,7 @@ class BPOfferService {
if (id != null) { if (id != null) {
return id; return id;
} }
DataNodeFaultInjector.get().delayWhenOfferServiceHoldLock();
readLock(); readLock();
try { try {
if (bpNSInfo != null) { if (bpNSInfo != null) {
@ -380,6 +381,7 @@ class BPOfferService {
} }
try { try {
DataNodeFaultInjector.get().delayWhenOfferServiceHoldLock();
if (setNamespaceInfo(nsInfo) == null) { if (setNamespaceInfo(nsInfo) == null) {
boolean success = false; boolean success = false;

View File

@ -545,11 +545,11 @@ class BPServiceActor implements Runnable {
} }
bpThread = new Thread(this); bpThread = new Thread(this);
bpThread.setDaemon(true); // needed for JUnit testing bpThread.setDaemon(true); // needed for JUnit testing
bpThread.start();
if (lifelineSender != null) { if (lifelineSender != null) {
lifelineSender.start(); lifelineSender.start();
} }
bpThread.start();
} }
private String formatThreadName( private String formatThreadName(

View File

@ -26,6 +26,8 @@ import java.net.InetSocketAddress;
import java.util.Set; import java.util.Set;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.DFSConfigKeys;
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.MiniDFSNNTopology; import org.apache.hadoop.hdfs.MiniDFSNNTopology;
import org.apache.hadoop.hdfs.MiniDFSNNTopology.NNConf; import org.apache.hadoop.hdfs.MiniDFSNNTopology.NNConf;
@ -93,4 +95,36 @@ public class TestRefreshNamenodes {
} }
} }
} }
@Test(timeout=10000)
public void testRefreshNameNodeDeadLock() throws Exception {
Configuration conf = new HdfsConfiguration();
MiniDFSCluster cluster = null;
try {
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(3).build();
cluster.waitActive();
DataNodeFaultInjector.set(new DataNodeFaultInjector() {
@Override
public void delayWhenOfferServiceHoldLock() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
DataNode dn = cluster.getDataNodes().get(0);
Configuration dnConf = dn.getConf();
dnConf.set(DFSConfigKeys.DFS_NAMESERVICES, "ns1");
dnConf.set(DFSConfigKeys.DFS_NAMENODE_LIFELINE_RPC_ADDRESS_KEY + ".ns1",
"mock:8022");
dn.refreshNamenodes(dnConf);
} finally {
if (cluster != null) {
cluster.shutdown();
}
}
}
} }