From 4e7f67717033afb46aac045a8ca81dbd2140bc9e Mon Sep 17 00:00:00 2001 From: Vikas Vishwakarma Date: Wed, 23 Aug 2017 11:34:10 +0530 Subject: [PATCH] HBASE-18633 Add more info to understand the source/scenario of large batch requests exceeding threshold --- .../hadoop/hbase/regionserver/RSRpcServices.java | 13 +++++++++---- .../hbase/regionserver/TestMultiLogThreshold.java | 8 ++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 7fc025afd63..707321d229e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -1131,16 +1131,17 @@ public class RSRpcServices implements HBaseRPCErrorHandler, // Exposed for testing static interface LogDelegate { - void logBatchWarning(int sum, int rowSizeWarnThreshold); + void logBatchWarning(String firstRegionName, int sum, int rowSizeWarnThreshold); } private static LogDelegate DEFAULT_LOG_DELEGATE = new LogDelegate() { @Override - public void logBatchWarning(int sum, int rowSizeWarnThreshold) { + public void logBatchWarning(String firstRegionName, int sum, int rowSizeWarnThreshold) { if (LOG.isWarnEnabled()) { LOG.warn("Large batch operation detected (greater than " + rowSizeWarnThreshold + ") (HBASE-18023)." + " Requested Number of Rows: " + sum + " Client: " - + RpcServer.getRequestUserName() + "/" + RpcServer.getRemoteAddress()); + + RpcServer.getRequestUserName() + "/" + RpcServer.getRemoteAddress() + + " first region in multi=" + firstRegionName); } } }; @@ -2513,11 +2514,15 @@ public class RSRpcServices implements HBaseRPCErrorHandler, private void checkBatchSizeAndLogLargeSize(MultiRequest request) { int sum = 0; + String firstRegionName = null; for (RegionAction regionAction : request.getRegionActionList()) { + if (sum == 0) { + firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray()); + } sum += regionAction.getActionCount(); } if (sum > rowSizeWarnThreshold) { - ld.logBatchWarning(sum, rowSizeWarnThreshold); + ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold); } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.java index 6a5dc6495df..e18e8ddad79 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.java @@ -117,25 +117,25 @@ public class TestMultiLogThreshold { @Test public void testMultiLogThresholdRegionActions() throws ServiceException, IOException { sendMultiRequest(THRESHOLD + 1, ActionType.REGION_ACTIONS); - verify(LD, Mockito.times(1)).logBatchWarning(Mockito.anyInt(), Mockito.anyInt()); + verify(LD, Mockito.times(1)).logBatchWarning(Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt()); } @Test public void testMultiNoLogThresholdRegionActions() throws ServiceException, IOException { sendMultiRequest(THRESHOLD, ActionType.REGION_ACTIONS); - verify(LD, Mockito.never()).logBatchWarning(Mockito.anyInt(), Mockito.anyInt()); + verify(LD, Mockito.never()).logBatchWarning(Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt()); } @Test public void testMultiLogThresholdActions() throws ServiceException, IOException { sendMultiRequest(THRESHOLD + 1, ActionType.ACTIONS); - verify(LD, Mockito.times(1)).logBatchWarning(Mockito.anyInt(), Mockito.anyInt()); + verify(LD, Mockito.times(1)).logBatchWarning(Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt()); } @Test public void testMultiNoLogThresholdAction() throws ServiceException, IOException { sendMultiRequest(THRESHOLD, ActionType.ACTIONS); - verify(LD, Mockito.never()).logBatchWarning(Mockito.anyInt(), Mockito.anyInt()); + verify(LD, Mockito.never()).logBatchWarning(Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt()); } }