You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by se...@apache.org on 2019/05/06 22:22:57 UTC

[hbase] 02/02: HBASE-22346 scanner priorities/deadline units are invalid for non-huge scanners - CR feedback

This is an automated email from the ASF dual-hosted git repository.

sershe pushed a commit to branch HBASE-22346
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 0780b8421ea66219f757ce0dec59846967a2b7df
Author: Sergey Shelukhin <se...@apache.org>
AuthorDate: Mon May 6 15:22:30 2019 -0700

    HBASE-22346 scanner priorities/deadline units are invalid for non-huge scanners - CR feedback
---
 .../AnnotationReadingPriorityFunction.java         | 34 ++++++++++++----------
 .../hadoop/hbase/regionserver/TestPriorityRpc.java | 28 +++++++++---------
 2 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
index 65a9d51..aba5e8a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
@@ -80,11 +80,11 @@ public class AnnotationReadingPriorityFunction implements PriorityFunction {
 
   /** When to use the actual time-based deadline for scanners */
   public static final String SCAN_DEADLINE_PRIORITY = "hbase.ipc.server.scan.deadline.only";
-  private static final ScanDeadlineOnly SCAN_DEADLINE_PRIORITY_DEFAULT = ScanDeadlineOnly.NEVER;
+  private static final ScanDeadlineOnly SCAN_DEADLINE_PRIORITY_DEFAULT = ScanDeadlineOnly.NONE;
   enum ScanDeadlineOnly {
-    ALWAYS,
-    META,
-    NEVER
+    ALL,
+    META_ONLY,
+    NONE
   }
 
   private static final ByteString META_PREFIX = ByteString.copyFrom(
@@ -178,11 +178,11 @@ public class AnnotationReadingPriorityFunction implements PriorityFunction {
     } catch (IllegalArgumentException ex) {
       LOG.warn("Invalid value for {} ({}); using the default", SCAN_DEADLINE_PRIORITY, val);
     }
-    if (result == ScanDeadlineOnly.META && LoadBalancer.isTablesOnMaster(conf)
+    if (result == ScanDeadlineOnly.META_ONLY && LoadBalancer.isTablesOnMaster(conf)
         && LoadBalancer.isSystemTablesOnlyOnMaster(conf) && rpcServices.isMaster()) {
-      result = ScanDeadlineOnly.ALWAYS;
+      result = ScanDeadlineOnly.ALL;
     }
-    if (result != ScanDeadlineOnly.NEVER) {
+    if (result != ScanDeadlineOnly.NONE) {
       LOG.info("Using deadline-based scanner priority {}", result);
     }
     return result;
@@ -301,15 +301,17 @@ public class AnnotationReadingPriorityFunction implements PriorityFunction {
     if (param instanceof ScanRequest) {
       ScanRequest request = (ScanRequest)param;
       boolean useDeadline;
-      long addToVTime = 0;
+      long baseTime = 0;
       switch (scanDeadlineOnly) {
-        case ALWAYS: useDeadline = true; break;
-        case NEVER: useDeadline = false; break;
-        case META: {
+        case ALL: useDeadline = true; break;
+        case NONE: useDeadline = false; break;
+        case META_ONLY: {
             useDeadline = isMetaScan(request);
-            // Make sure non-meta scans are generally after meta scans; add the default scanner delay.
+            // If meta regions use real time and non-meta use vtime, make sure they are comparable
+            // and that non-meta scans are generally after meta scans; add the default scanner
+            // delay to map the former to real time.
             if (!useDeadline) {
-              addToVTime = rpcServices.getScannerExpirationDelayMs(null);
+              baseTime = rpcServices.getScannerExpirationDelayMs(null);
             }
             break;
         }
@@ -319,13 +321,13 @@ public class AnnotationReadingPriorityFunction implements PriorityFunction {
         return rpcServices.getScannerExpirationDelayMs(
           request.hasScannerId() ? request.getScannerId() : null);
       } else if (!request.hasScannerId()) {
-        return addToVTime;
+        return baseTime;
       } else {
         // get the 'virtual time' of the scanner, and applies sqrt() to get a
-        // nice curve for the delay. More a scanner is used the less priority it gets.
+        // nice curve for the delay. The more a scanner is used the less priority it gets.
         // The weight is used to have more control on the delay.
         long vtime = rpcServices.getScannerVirtualTime(request.getScannerId());
-        return addToVTime + Math.round(Math.sqrt(vtime * scanVirtualTimeWeight));
+        return baseTime + Math.round(Math.sqrt(vtime * scanVirtualTimeWeight));
       }
     }
     return 0;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestPriorityRpc.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestPriorityRpc.java
index 5bfaafb..5420190 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestPriorityRpc.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestPriorityRpc.java
@@ -250,15 +250,15 @@ public class TestPriorityRpc {
 
     // Test new reqs and non-meta scan here, as well as old non-meta scanner.
     AnnotationReadingPriorityFunction fn = prepareDeadlineTestFn(
-      ScanDeadlineOnly.NEVER, mockRS.getRSRpcServices());
+      ScanDeadlineOnly.NONE, mockRS.getRSRpcServices());
     assertEquals(0L, fn.getDeadline(header, newReqNoMeta));
     assertEquals(0L, fn.getDeadline(header, newReqMeta));
     assertEquals(VTIMESQRT, fn.getDeadline(header, oldReq));
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META, mockRS.getRSRpcServices());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META_ONLY, mockRS.getRSRpcServices());
     assertEquals(DEFAULT_DELAY, fn.getDeadline(header, newReqNoMeta));
     assertEquals(DEFAULT_DELAY, fn.getDeadline(header, newReqMeta));
     assertEquals(DEFAULT_DELAY + VTIMESQRT, fn.getDeadline(header, oldReq));
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.ALWAYS, mockRS.getRSRpcServices());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.ALL, mockRS.getRSRpcServices());
     assertEquals(DEFAULT_DELAY, fn.getDeadline(header, newReqNoMeta));
     assertEquals(DEFAULT_DELAY, fn.getDeadline(header, newReqMeta));
     assertEquals(ACTUAL_DELAY, fn.getDeadline(header, oldReq));
@@ -267,28 +267,28 @@ public class TestPriorityRpc {
     mockRS = prepareDeadlineTest(RegionInfoBuilder.FIRST_META_REGIONINFO.getTable(),
       true, DEFAULT_DELAY);
     addMockScanner(mockRS.getRSRpcServices(), SCANNER_ID, ACTUAL_DELAY, VTIMESQRT * VTIMESQRT);
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.NEVER, mockRS.getRSRpcServices());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.NONE, mockRS.getRSRpcServices());
     assertEquals(VTIMESQRT, fn.getDeadline(header, oldReq));
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META, mockRS.getRSRpcServices());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META_ONLY, mockRS.getRSRpcServices());
     assertEquals(ACTUAL_DELAY, fn.getDeadline(header, oldReq));
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.ALWAYS, mockRS.getRSRpcServices());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.ALL, mockRS.getRSRpcServices());
     assertEquals(ACTUAL_DELAY, fn.getDeadline(header, oldReq));
 
     // Meta on master shortcut - just check the config.
     mockRS = prepareDeadlineTest(RegionInfoBuilder.FIRST_META_REGIONINFO.getTable(),
       true, DEFAULT_DELAY);
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META, mockRS.getRSRpcServices());
-    assertEquals(ScanDeadlineOnly.META, fn.getScanDeadlineOnly());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META_ONLY, mockRS.getRSRpcServices());
+    assertEquals(ScanDeadlineOnly.META_ONLY, fn.getScanDeadlineOnly());
     Configuration conf = mockRS.getRSRpcServices().getConfiguration();
     conf.setBoolean(LoadBalancer.TABLES_ON_MASTER, true);
     conf.setBoolean(LoadBalancer.SYSTEM_TABLES_ON_MASTER, true);
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META, mockRS.getRSRpcServices());
-    assertEquals(ScanDeadlineOnly.META, fn.getScanDeadlineOnly());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META_ONLY, mockRS.getRSRpcServices());
+    assertEquals(ScanDeadlineOnly.META_ONLY, fn.getScanDeadlineOnly());
     Mockito.when(mockRS.getRSRpcServices().isMaster()).thenReturn(true);
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META, mockRS.getRSRpcServices());
-    assertEquals(ScanDeadlineOnly.ALWAYS, fn.getScanDeadlineOnly());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META_ONLY, mockRS.getRSRpcServices());
+    assertEquals(ScanDeadlineOnly.ALL, fn.getScanDeadlineOnly());
     conf.setBoolean(LoadBalancer.TABLES_ON_MASTER, false);
-    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META, mockRS.getRSRpcServices());
-    assertEquals(ScanDeadlineOnly.META, fn.getScanDeadlineOnly());
+    fn = prepareDeadlineTestFn(ScanDeadlineOnly.META_ONLY, mockRS.getRSRpcServices());
+    assertEquals(ScanDeadlineOnly.META_ONLY, fn.getScanDeadlineOnly());
   }
 }