You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2012/03/29 01:59:18 UTC
svn commit: r1306648 - in /hbase/trunk/src:
main/java/org/apache/hadoop/hbase/regionserver/
test/java/org/apache/hadoop/hbase/coprocessor/
Author: tedyu
Date: Wed Mar 28 23:59:17 2012
New Revision: 1306648
URL: http://svn.apache.org/viewvc?rev=1306648&view=rev
Log:
HBASE-5544 Add metrics to HRegion.processRow() (Scott Chen)
Modified:
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/BaseRowProcessor.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RowProcessor.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.java
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/BaseRowProcessor.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/BaseRowProcessor.java?rev=1306648&r1=1306647&r2=1306648&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/BaseRowProcessor.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/BaseRowProcessor.java Wed Mar 28 23:59:17 2012
@@ -46,4 +46,8 @@ public abstract class BaseRowProcessor<T
return HConstants.DEFAULT_CLUSTER_ID;
}
+ @Override
+ public String getName() {
+ return this.getClass().getSimpleName().toLowerCase();
+ }
}
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1306648&r1=1306647&r2=1306648&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Wed Mar 28 23:59:17 2012
@@ -4264,6 +4264,9 @@ public class HRegion implements HeapSize
public void processRowsWithLocks(RowProcessor<?> processor, long timeout)
throws IOException {
+ final long startNanoTime = System.nanoTime();
+ String metricsName = "rowprocessor." + processor.getName();
+
for (byte[] row : processor.getRowsToLock()) {
checkRow(row, "processRowsWithLocks");
}
@@ -4285,12 +4288,21 @@ public class HRegion implements HeapSize
doProcessRowWithTimeout(
processor, now, this, null, null, timeout);
processor.postProcess(this, walEdit);
+ } catch (IOException e) {
+ long endNanoTime = System.nanoTime();
+ HRegion.incrTimeVaryingMetric(metricsName + ".error.nano",
+ endNanoTime - startNanoTime);
+ throw e;
} finally {
closeRegionOperation();
}
+ final long endNanoTime = System.nanoTime();
+ HRegion.incrTimeVaryingMetric(metricsName + ".nano",
+ endNanoTime - startNanoTime);
return;
}
+ long lockedNanoTime, processDoneNanoTime, unlockedNanoTime = 0;
MultiVersionConsistencyControl.WriteEntry writeEntry = null;
boolean locked = false;
boolean walSyncSuccessful = false;
@@ -4313,6 +4325,7 @@ public class HRegion implements HeapSize
// 3. Region lock
this.updatesLock.readLock().lock();
locked = true;
+ lockedNanoTime = System.nanoTime();
long now = EnvironmentEdgeManager.currentTimeMillis();
try {
@@ -4320,6 +4333,7 @@ public class HRegion implements HeapSize
// waledits
doProcessRowWithTimeout(
processor, now, this, mutations, walEdit, timeout);
+ processDoneNanoTime = System.nanoTime();
if (!mutations.isEmpty()) {
// 5. Get a mvcc write number
@@ -4344,6 +4358,8 @@ public class HRegion implements HeapSize
this.updatesLock.readLock().unlock();
locked = false;
}
+ unlockedNanoTime = System.nanoTime();
+
// 9. Release row lock(s)
if (acquiredLocks != null) {
for (Integer lid : acquiredLocks) {
@@ -4382,11 +4398,18 @@ public class HRegion implements HeapSize
releaseRowLock(lid);
}
}
+ unlockedNanoTime = unlockedNanoTime == 0 ?
+ System.nanoTime() : unlockedNanoTime;
}
// 12. Run post-process hook
processor.postProcess(this, walEdit);
+ } catch (IOException e) {
+ long endNanoTime = System.nanoTime();
+ HRegion.incrTimeVaryingMetric(metricsName + ".error.nano",
+ endNanoTime - startNanoTime);
+ throw e;
} finally {
closeRegionOperation();
if (!mutations.isEmpty() &&
@@ -4394,6 +4417,22 @@ public class HRegion implements HeapSize
requestFlush();
}
}
+ // Populate all metrics
+ long endNanoTime = System.nanoTime();
+ HRegion.incrTimeVaryingMetric(metricsName + ".nano",
+ endNanoTime - startNanoTime);
+
+ HRegion.incrTimeVaryingMetric(metricsName + ".acquirelock.nano",
+ lockedNanoTime - startNanoTime);
+
+ HRegion.incrTimeVaryingMetric(metricsName + ".process.nano",
+ processDoneNanoTime - lockedNanoTime);
+
+ HRegion.incrTimeVaryingMetric(metricsName + ".occupylock.nano",
+ unlockedNanoTime - lockedNanoTime);
+
+ HRegion.incrTimeVaryingMetric(metricsName + ".sync.nano",
+ endNanoTime - unlockedNanoTime);
}
private void doProcessRowWithTimeout(final RowProcessor<?> processor,
@@ -4795,8 +4834,9 @@ public class HRegion implements HeapSize
// Request a cache flush. Do it outside update lock.
requestFlush();
}
- if(wrongLength){
- throw new IOException("Attempted to increment field that isn't 64 bits wide");
+ if (wrongLength) {
+ throw new IOException(
+ "Attempted to increment field that isn't 64 bits wide");
}
return result;
}
@@ -4812,7 +4852,7 @@ public class HRegion implements HeapSize
throw new NoSuchColumnFamilyException("Column family " +
Bytes.toString(family) + " does not exist in region " + this
+ " in table " + this.htableDescriptor);
- }
+ }
}
public static final long FIXED_OVERHEAD = ClassSize.align(
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RowProcessor.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RowProcessor.java?rev=1306648&r1=1306647&r2=1306648&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RowProcessor.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RowProcessor.java Wed Mar 28 23:59:17 2012
@@ -64,7 +64,7 @@ public interface RowProcessor<T> {
/**
* HRegion handles the locks and MVCC and invokes this method properly.
- *
+ *
* You should override this to create your own RowProcessor.
*
* If you are doing read-modify-write here, you should consider using
@@ -103,4 +103,9 @@ public interface RowProcessor<T> {
*/
UUID getClusterId();
+ /**
+ * Human readable name of the processor
+ * @return The name of the processor
+ */
+ String getName();
}
Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.java?rev=1306648&r1=1306647&r2=1306648&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.java Wed Mar 28 23:59:17 2012
@@ -138,7 +138,7 @@ public class TestRowProcessorEndpoint {
prepareTestData();
RowProcessorProtocol protocol =
table.coprocessorProxy(RowProcessorProtocol.class, ROW);
- RowProcessorEndpoint.FriendsOfFriendsProcessor processor =
+ RowProcessorEndpoint.FriendsOfFriendsProcessor processor =
new RowProcessorEndpoint.FriendsOfFriendsProcessor(ROW, A);
Set<String> result = protocol.process(processor);
@@ -176,7 +176,7 @@ public class TestRowProcessorEndpoint {
private int incrementCounter(HTable table) throws Throwable {
RowProcessorProtocol protocol =
table.coprocessorProxy(RowProcessorProtocol.class, ROW);
- RowProcessorEndpoint.IncrementCounterProcessor processor =
+ RowProcessorEndpoint.IncrementCounterProcessor processor =
new RowProcessorEndpoint.IncrementCounterProcessor(ROW);
int counterValue = protocol.process(processor);
return counterValue;
@@ -234,7 +234,7 @@ public class TestRowProcessorEndpoint {
private void swapRows(HTable table) throws Throwable {
RowProcessorProtocol protocol =
table.coprocessorProxy(RowProcessorProtocol.class, ROW);
- RowProcessorEndpoint.RowSwapProcessor processor =
+ RowProcessorEndpoint.RowSwapProcessor processor =
new RowProcessorEndpoint.RowSwapProcessor(ROW, ROW2);
protocol.process(processor);
}
@@ -244,7 +244,7 @@ public class TestRowProcessorEndpoint {
prepareTestData();
RowProcessorProtocol protocol =
table.coprocessorProxy(RowProcessorProtocol.class, ROW);
- RowProcessorEndpoint.TimeoutProcessor processor =
+ RowProcessorEndpoint.TimeoutProcessor processor =
new RowProcessorEndpoint.TimeoutProcessor(ROW);
boolean exceptionCaught = false;
try {
@@ -510,13 +510,18 @@ public class TestRowProcessorEndpoint {
Bytes.writeByteArray(out, row1);
Bytes.writeByteArray(out, row2);
}
+
+ @Override
+ public String getName() {
+ return "swap";
+ }
}
public static class TimeoutProcessor extends
BaseRowProcessor<Void> implements Writable {
byte[] row = new byte[0];
-
+
/**
* Empty constructor for Writable
*/
@@ -556,6 +561,11 @@ public class TestRowProcessorEndpoint {
public void write(DataOutput out) throws IOException {
Bytes.writeByteArray(out, row);
}
+
+ @Override
+ public String getName() {
+ return "timeout";
+ }
}
public static void doScan(