HDFS-9601. NNThroughputBenchmark.BlockReportStats should handle NotReplicatedYetException on adding block (iwasakims)
This commit is contained in:
parent
4d9efaf3b0
commit
245c3728ef
|
@ -54,6 +54,9 @@ Release 2.9.0 - UNRELEASED
|
||||||
|
|
||||||
BUG FIXES
|
BUG FIXES
|
||||||
|
|
||||||
|
HDFS-9601. NNThroughputBenchmark.BlockReportStats should handle
|
||||||
|
NotReplicatedYetException on adding block (iwasakims)
|
||||||
|
|
||||||
HDFS-9621. Consolidate FSDirStatAndListingOp#createFileStatus to let its
|
HDFS-9621. Consolidate FSDirStatAndListingOp#createFileStatus to let its
|
||||||
INodesInPath parameter always include the target INode. (jing9)
|
INodesInPath parameter always include the target INode. (jing9)
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ import org.apache.hadoop.hdfs.server.protocol.StorageBlockReport;
|
||||||
import org.apache.hadoop.hdfs.server.protocol.StorageReceivedDeletedBlocks;
|
import org.apache.hadoop.hdfs.server.protocol.StorageReceivedDeletedBlocks;
|
||||||
import org.apache.hadoop.hdfs.server.protocol.StorageReport;
|
import org.apache.hadoop.hdfs.server.protocol.StorageReport;
|
||||||
import org.apache.hadoop.io.EnumSetWritable;
|
import org.apache.hadoop.io.EnumSetWritable;
|
||||||
|
import org.apache.hadoop.ipc.RemoteException;
|
||||||
import org.apache.hadoop.net.DNS;
|
import org.apache.hadoop.net.DNS;
|
||||||
import org.apache.hadoop.net.NetworkTopology;
|
import org.apache.hadoop.net.NetworkTopology;
|
||||||
import org.apache.hadoop.security.Groups;
|
import org.apache.hadoop.security.Groups;
|
||||||
|
@ -1181,7 +1182,7 @@ public class NNThroughputBenchmark implements Tool {
|
||||||
throws IOException {
|
throws IOException {
|
||||||
ExtendedBlock prevBlock = null;
|
ExtendedBlock prevBlock = null;
|
||||||
for(int jdx = 0; jdx < blocksPerFile; jdx++) {
|
for(int jdx = 0; jdx < blocksPerFile; jdx++) {
|
||||||
LocatedBlock loc = clientProto.addBlock(fileName, clientName,
|
LocatedBlock loc = addBlock(fileName, clientName,
|
||||||
prevBlock, null, HdfsConstants.GRANDFATHER_INODE_ID, null);
|
prevBlock, null, HdfsConstants.GRANDFATHER_INODE_ID, null);
|
||||||
prevBlock = loc.getBlock();
|
prevBlock = loc.getBlock();
|
||||||
for(DatanodeInfo dnInfo : loc.getLocations()) {
|
for(DatanodeInfo dnInfo : loc.getLocations()) {
|
||||||
|
@ -1195,10 +1196,41 @@ public class NNThroughputBenchmark implements Tool {
|
||||||
dataNodeProto.blockReceivedAndDeleted(datanodes[dnIdx].dnRegistration,
|
dataNodeProto.blockReceivedAndDeleted(datanodes[dnIdx].dnRegistration,
|
||||||
bpid, report);
|
bpid, report);
|
||||||
}
|
}
|
||||||
|
// IBRs are asynchronously processed by NameNode. The next
|
||||||
|
// ClientProtocol#addBlock() may throw NotReplicatedYetException.
|
||||||
}
|
}
|
||||||
return prevBlock;
|
return prevBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retry ClientProtocol.addBlock() if it throws NotReplicatedYetException.
|
||||||
|
* Because addBlock() also commits the previous block,
|
||||||
|
* it fails if enough IBRs are not processed by NameNode.
|
||||||
|
*/
|
||||||
|
private LocatedBlock addBlock(String src, String clientName,
|
||||||
|
ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,
|
||||||
|
String[] favoredNodes) throws IOException {
|
||||||
|
for (int i = 0; i < 30; i++) {
|
||||||
|
try {
|
||||||
|
return clientProto.addBlock(src, clientName,
|
||||||
|
previous, excludeNodes, fileId, favoredNodes);
|
||||||
|
} catch (NotReplicatedYetException|RemoteException e) {
|
||||||
|
if (e instanceof RemoteException) {
|
||||||
|
String className = ((RemoteException) e).getClassName();
|
||||||
|
if (!className.equals(NotReplicatedYetException.class.getName())) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
LOG.warn("interrupted while retrying addBlock.", ie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IOException("failed to add block.");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does not require the argument
|
* Does not require the argument
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue