Skip to content

Commit bf0cefb

Browse files
authored
HDFS-16406. ReadsFromLocalClient counts short-circuit reads (#3847)
1 parent 3e7a7c3 commit bf0cefb

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataXceiver.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,9 @@ public void requestShortCircuitFds(final ExtendedBlock blk,
415415
"Not verifying {}", slotId);
416416
}
417417
success = true;
418+
// update metrics
419+
datanode.metrics.addReadBlockOp(elapsed());
420+
datanode.metrics.incrReadsFromClient(true, blk.getNumBytes());
418421
}
419422
} finally {
420423
if ((!success) && (registeredSlotId != null)) {

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMetrics.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static org.junit.Assert.*;
2626

2727
import java.io.Closeable;
28+
import java.io.File;
2829
import java.io.FileNotFoundException;
2930
import java.io.IOException;
3031
import java.io.InputStream;
@@ -38,7 +39,10 @@
3839
import net.jcip.annotations.NotThreadSafe;
3940
import org.apache.hadoop.fs.StorageType;
4041
import org.apache.hadoop.hdfs.MiniDFSNNTopology;
42+
import org.apache.hadoop.net.unix.DomainSocket;
43+
import org.apache.hadoop.net.unix.TemporarySocketDirectory;
4144
import org.apache.hadoop.util.Lists;
45+
import org.junit.Assume;
4246
import org.slf4j.Logger;
4347
import org.slf4j.LoggerFactory;
4448
import org.apache.hadoop.conf.Configuration;
@@ -654,4 +658,38 @@ public void testNNRpcMetricsWithFederationAndHA() throws IOException {
654658
assertCounter("HeartbeatsForns1-nn1NumOps", 1L, rb);
655659
assertCounter("HeartbeatsNumOps", 4L, rb);
656660
}
661+
662+
@Test
663+
public void testNodeLocalMetrics() throws Exception {
664+
Assume.assumeTrue(null == DomainSocket.getLoadingFailureReason());
665+
Configuration conf = new HdfsConfiguration();
666+
conf.setBoolean(HdfsClientConfigKeys.Read.ShortCircuit.KEY, true);
667+
TemporarySocketDirectory sockDir = new TemporarySocketDirectory();
668+
DomainSocket.disableBindPathValidation();
669+
conf.set(DFSConfigKeys.DFS_DOMAIN_SOCKET_PATH_KEY,
670+
new File(sockDir.getDir(),
671+
"testNodeLocalMetrics._PORT.sock").getAbsolutePath());
672+
MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build();
673+
try {
674+
cluster.waitActive();
675+
FileSystem fs = cluster.getFileSystem();
676+
Path testFile = new Path("/testNodeLocalMetrics.txt");
677+
DFSTestUtil.createFile(fs, testFile, 10L, (short)1, 1L);
678+
DFSTestUtil.readFile(fs, testFile);
679+
List<DataNode> datanodes = cluster.getDataNodes();
680+
assertEquals(1, datanodes.size());
681+
682+
DataNode datanode = datanodes.get(0);
683+
MetricsRecordBuilder rb = getMetrics(datanode.getMetrics().name());
684+
685+
// Write related metrics
686+
assertCounter("WritesFromLocalClient", 1L, rb);
687+
// Read related metrics
688+
assertCounter("ReadsFromLocalClient", 1L, rb);
689+
} finally {
690+
if (cluster != null) {
691+
cluster.shutdown();
692+
}
693+
}
694+
}
657695
}

0 commit comments

Comments
 (0)