HDFS-15641. DataNode could meet deadlock if invoke refreshNameNode. Contributed by Hongbing Wang.
(cherry picked from commit 12c908c827
)
This commit is contained in:
parent
66e4a8b1d7
commit
eb909fd726
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue