Index: src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java (revision 1213140) +++ src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java (working copy) @@ -186,12 +186,18 @@ new MetricsIntValue("flushQueueSize", registry); /** - * filesystem read latency + * filesystem sequential read latency */ public final MetricsTimeVaryingRate fsReadLatency = new MetricsTimeVaryingRate("fsReadLatency", registry); /** + * filesystem positional read latency + */ + public final MetricsTimeVaryingRate fsPreadLatency = + new MetricsTimeVaryingRate("fsPreadLatency", registry); + + /** * filesystem write latency */ public final MetricsTimeVaryingRate fsWriteLatency = @@ -317,9 +323,12 @@ addHLogMetric(HLog.getWriteTime(), this.fsWriteLatency); addHLogMetric(HLog.getWriteSize(), this.fsWriteSize); addHLogMetric(HLog.getSyncTime(), this.fsSyncLatency); - // HFile metrics - int ops = HFile.getReadOps(); + // HFile metrics, sequential reads + int ops = HFile.getReadOps(); if (ops != 0) this.fsReadLatency.inc(ops, HFile.getReadTimeMs()); + // HFile metrics, positional reads + ops = HFile.getPreadOps(); + if (ops != 0) this.fsPreadLatency.inc(ops, HFile.getPreadTimeMs()); /* NOTE: removed HFile write latency. 2 reasons: * 1) Mixing HLog latencies are far higher priority since they're * on-demand and HFile is used in background (compact/flush) Index: src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV1.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV1.java (revision 1213140) +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV1.java (working copy) @@ -237,8 +237,8 @@ hfileBlock.expectType(BlockType.META); long delta = System.nanoTime() - startTimeNs; - HFile.readTimeNano.addAndGet(delta); - HFile.readOps.incrementAndGet(); + HFile.preadTimeNano.addAndGet(delta); + HFile.preadOps.incrementAndGet(); getSchemaMetrics().updateOnCacheMiss(BlockCategory.META, false, delta); // Cache the block @@ -316,8 +316,13 @@ ByteBuffer buf = hfileBlock.getBufferWithoutHeader(); long delta = System.nanoTime() - startTimeNs; - HFile.readTimeNano.addAndGet(delta); - HFile.readOps.incrementAndGet(); + if (pread) { + HFile.preadTimeNano.addAndGet(delta); + HFile.preadOps.incrementAndGet(); + } else { + HFile.readTimeNano.addAndGet(delta); + HFile.readOps.incrementAndGet(); + } getSchemaMetrics().updateOnCacheMiss(BlockCategory.DATA, isCompaction, delta); Index: src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java (revision 1213140) +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java (working copy) @@ -206,8 +206,8 @@ passSchemaMetricsTo(metaBlock); long delta = System.nanoTime() - startTimeNs; - HFile.readTimeNano.addAndGet(delta); - HFile.readOps.incrementAndGet(); + HFile.preadTimeNano.addAndGet(delta); + HFile.preadOps.incrementAndGet(); getSchemaMetrics().updateOnCacheMiss(BlockCategory.META, false, delta); // Cache the block @@ -283,8 +283,13 @@ BlockCategory blockCategory = dataBlock.getBlockType().getCategory(); long delta = System.nanoTime() - startTimeNs; - HFile.readTimeNano.addAndGet(delta); - HFile.readOps.incrementAndGet(); + if (pread) { + HFile.preadTimeNano.addAndGet(delta); + HFile.preadOps.incrementAndGet(); + } else { + HFile.readTimeNano.addAndGet(delta); + HFile.readOps.incrementAndGet(); + } getSchemaMetrics().updateOnCacheMiss(blockCategory, isCompaction, delta); // Cache the block Index: src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java (revision 1213140) +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java (working copy) @@ -153,15 +153,19 @@ */ public final static int MIN_NUM_HFILE_PATH_LEVELS = 5; - // For measuring latency of "typical" reads and writes + // For measuring latency of "sequential" reads and writes static volatile AtomicInteger readOps = new AtomicInteger(); static volatile AtomicLong readTimeNano = new AtomicLong(); static volatile AtomicInteger writeOps = new AtomicInteger(); static volatile AtomicLong writeTimeNano = new AtomicLong(); + // For measuring latency of pread + static volatile AtomicInteger preadOps = new AtomicInteger(); + static volatile AtomicLong preadTimeNano = new AtomicLong(); // for test purpose public static volatile AtomicLong dataBlockReadCnt = new AtomicLong(0); + // number of sequential reads public static final int getReadOps() { return readOps.getAndSet(0); } @@ -170,6 +174,15 @@ return readTimeNano.getAndSet(0) / 1000000; } + // number of positional reads + public static final int getPreadOps() { + return preadOps.getAndSet(0); + } + + public static final long getPreadTimeMs() { + return preadTimeNano.getAndSet(0) / 1000000; + } + public static final int getWriteOps() { return writeOps.getAndSet(0); }