HDFS-16352. return the real datanode numBlocks in #getDatanodeStorageReport (#3714). Contributed by liubingxing.

Signed-off-by: He Xiaoqiao <hexiaoqiao@apache.org>
(cherry picked from commit d8dea6f52a)
This commit is contained in:
liubingxing 2021-12-16 23:31:28 -06:00 committed by Wei-Chiu Chuang
parent 9b221b9599
commit d6ff60df65
No known key found for this signature in database
GPG Key ID: B362E1C021854B9D
3 changed files with 35 additions and 4 deletions

View File

@ -698,9 +698,10 @@ public class DatanodeInfo extends DatanodeID implements Node {
private long nonDfsUsed = 0L; private long nonDfsUsed = 0L;
private long lastBlockReportTime = 0L; private long lastBlockReportTime = 0L;
private long lastBlockReportMonotonic = 0L; private long lastBlockReportMonotonic = 0L;
private int numBlocks; private int numBlocks = 0;
// Please use setNumBlocks explicitly to set numBlocks as this method doesn't have
// sufficient info about numBlocks
public DatanodeInfoBuilder setFrom(DatanodeInfo from) { public DatanodeInfoBuilder setFrom(DatanodeInfo from) {
this.capacity = from.getCapacity(); this.capacity = from.getCapacity();
this.dfsUsed = from.getDfsUsed(); this.dfsUsed = from.getDfsUsed();
@ -717,7 +718,6 @@ public class DatanodeInfo extends DatanodeID implements Node {
this.upgradeDomain = from.getUpgradeDomain(); this.upgradeDomain = from.getUpgradeDomain();
this.lastBlockReportTime = from.getLastBlockReportTime(); this.lastBlockReportTime = from.getLastBlockReportTime();
this.lastBlockReportMonotonic = from.getLastBlockReportMonotonic(); this.lastBlockReportMonotonic = from.getLastBlockReportMonotonic();
this.numBlocks = from.getNumBlocks();
setNodeID(from); setNodeID(from);
return this; return this;
} }

View File

@ -2182,7 +2182,8 @@ public class DatanodeManager {
for (int i = 0; i < reports.length; i++) { for (int i = 0; i < reports.length; i++) {
final DatanodeDescriptor d = datanodes.get(i); final DatanodeDescriptor d = datanodes.get(i);
reports[i] = new DatanodeStorageReport( reports[i] = new DatanodeStorageReport(
new DatanodeInfoBuilder().setFrom(d).build(), d.getStorageReports()); new DatanodeInfoBuilder().setFrom(d).setNumBlocks(d.numBlocks()).build(),
d.getStorageReports());
} }
return reports; return reports;
} }

View File

@ -20,9 +20,14 @@ package org.apache.hadoop.hdfs.server.namenode;
import java.io.IOException; import java.io.IOException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.UnresolvedLinkException; import org.apache.hadoop.fs.UnresolvedLinkException;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.protocol.HdfsConstants;
import org.apache.hadoop.hdfs.server.protocol.DatanodeStorageReport;
import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocols; import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocols;
import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.AccessControlException;
import org.apache.hadoop.test.GenericTestUtils; import org.apache.hadoop.test.GenericTestUtils;
@ -31,6 +36,8 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestNameNodeRpcServerMethods { public class TestNameNodeRpcServerMethods {
private static NamenodeProtocols nnRpc; private static NamenodeProtocols nnRpc;
private static Configuration conf; private static Configuration conf;
@ -83,4 +90,27 @@ public class TestNameNodeRpcServerMethods {
} }
@Test
public void testGetDatanodeStorageReportWithNumBLocksNotZero() throws Exception {
int buffSize = 1024;
long blockSize = 1024 * 1024;
String file = "/testFile";
DistributedFileSystem dfs = cluster.getFileSystem();
FSDataOutputStream outputStream = dfs.create(
new Path(file), true, buffSize, (short)1, blockSize);
byte[] outBuffer = new byte[buffSize];
for (int i = 0; i < buffSize; i++) {
outBuffer[i] = (byte) (i & 0x00ff);
}
outputStream.write(outBuffer);
outputStream.close();
int numBlocks = 0;
DatanodeStorageReport[] reports
= nnRpc.getDatanodeStorageReport(HdfsConstants.DatanodeReportType.ALL);
for (DatanodeStorageReport r : reports) {
numBlocks += r.getDatanodeInfo().getNumBlocks();
}
assertEquals(1, numBlocks);
}
} }