You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2021/07/22 15:48:43 UTC

[hbase] 08/09: HBASE-24929 Introduce a special CellComparator for master local region (#2378)

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

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

commit ca62baf3ae951d74667d0129d34063a465ec9eb6
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Tue Sep 15 21:11:55 2020 +0800

    HBASE-24929 Introduce a special CellComparator for master local region (#2378)
    
    Signed-off-by: Guanghao Zhang <zg...@apache.org>
---
 .../org/apache/hadoop/hbase/PrivateCellUtil.java   | 13 +++
 .../hadoop/hbase/master/region/MasterRegion.java   |  4 +-
 .../master/region/MasterRegionCellComparator.java  | 92 ++++++++++++++++++++++
 .../hbase/master/region/MasterRegionFactory.java   |  2 +-
 .../hbase/master/region/MasterRegionParams.java    | 11 ---
 .../apache/hadoop/hbase/regionserver/HRegion.java  | 25 ++++--
 6 files changed, 124 insertions(+), 23 deletions(-)

diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java
index 810eb24..fd65980 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java
@@ -722,6 +722,19 @@ public final class PrivateCellUtil {
         length);
   }
 
+  public static boolean rowsStartWith(Cell left, byte[] startsWith) {
+    if (left.getRowLength() < startsWith.length) {
+      return false;
+    }
+    if (left instanceof ByteBufferExtendedCell) {
+      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),
+        ((ByteBufferExtendedCell) left).getRowPosition(), startsWith.length, startsWith, 0,
+        startsWith.length);
+    }
+    return Bytes.equals(left.getRowArray(), left.getRowOffset(), startsWith.length, startsWith, 0,
+      startsWith.length);
+  }
+
   public static boolean matchingFamily(final Cell left, final byte[] buf, final int offset,
       final int length) {
     if (left instanceof ByteBufferExtendedCell) {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java
index c2188b4..c1d9f47 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java
@@ -284,9 +284,7 @@ public final class MasterRegion {
     if (params.useHsync() != null) {
       conf.setBoolean(HRegion.WAL_HSYNC_CONF_KEY, params.useHsync());
     }
-    if (params.useMetaCellComparator() != null) {
-      conf.setBoolean(HRegion.USE_META_CELL_COMPARATOR, params.useMetaCellComparator());
-    }
+    conf.setBoolean(HRegion.USE_MASTER_REGION_CELL_COMPARATOR, true);
     conf.setInt(AbstractFSWAL.RING_BUFFER_SLOT_COUNT,
       IntMath.ceilingPowerOfTwo(params.ringBufferSlotCount()));
 
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionCellComparator.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionCellComparator.java
new file mode 100644
index 0000000..3960c41
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionCellComparator.java
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.master.region;
+
+import java.util.Comparator;
+import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellComparatorImpl;
+import org.apache.hadoop.hbase.MetaCellComparator;
+import org.apache.hadoop.hbase.PrivateCellUtil;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.yetus.audience.InterfaceAudience;
+
+/**
+ * Cell comparator implementation for master local region.
+ * <p/>
+ * In general, for catalog family, we need to use {@link MetaCellComparator} while for other
+ * families, we need to use {@link CellComparatorImpl}.
+ * <p/>
+ * The trick here is to check the row key format, if it is start with 'hbase:meta', we will use
+ * {@link MetaCellComparator}, otherwise we will use {@link CellComparatorImpl}.
+ */
+@InterfaceAudience.Private
+public class MasterRegionCellComparator extends CellComparatorImpl {
+
+  /**
+   * A {@link MasterRegionCellComparator} for {@link MasterRegion} {@link Cell}s.
+   */
+  public static final MasterRegionCellComparator MASTER_REGION_COMPARATOR =
+    new MasterRegionCellComparator();
+
+  private static final byte[] CATALOG_ROW_PREFIX = TableName.META_TABLE_NAME.getName();
+
+  private boolean isCatalogRow(Cell c) {
+    return PrivateCellUtil.rowsStartWith(c, CATALOG_ROW_PREFIX);
+  }
+
+  private boolean isCatalogRow(byte[] row, int off, int len) {
+    if (len < CATALOG_ROW_PREFIX.length) {
+      return false;
+    }
+    return Bytes.equals(row, off, CATALOG_ROW_PREFIX.length, CATALOG_ROW_PREFIX, 0,
+      CATALOG_ROW_PREFIX.length);
+  }
+
+  @Override
+  public int compare(Cell a, Cell b, boolean ignoreSequenceid) {
+    if (isCatalogRow(a) || isCatalogRow(b)) {
+      return MetaCellComparator.META_COMPARATOR.compare(a, b, ignoreSequenceid);
+    } else {
+      return super.compare(a, b, ignoreSequenceid);
+    }
+  }
+
+  @Override
+  public int compareRows(Cell left, Cell right) {
+    if (isCatalogRow(left) || isCatalogRow(right)) {
+      return MetaCellComparator.META_COMPARATOR.compareRows(left, right);
+    } else {
+      return super.compareRows(left, right);
+    }
+  }
+
+  @Override
+  public int compareRows(Cell left, byte[] right, int roffset, int rlength) {
+    if (isCatalogRow(left) || isCatalogRow(right, roffset, rlength)) {
+      return MetaCellComparator.META_COMPARATOR.compareRows(left, right, roffset, rlength);
+    } else {
+      return super.compareRows(left, right, roffset, rlength);
+    }
+  }
+
+  @Override
+  public Comparator getSimpleComparator() {
+    return this;
+  }
+}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFactory.java
index cfa25f5..d70aef6 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFactory.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFactory.java
@@ -107,7 +107,7 @@ public final class MasterRegionFactory {
     params.ringBufferSlotCount(conf.getInt(RING_BUFFER_SLOT_COUNT, DEFAULT_RING_BUFFER_SLOT_COUNT));
     long rollPeriodMs = conf.getLong(ROLL_PERIOD_MS_KEY, DEFAULT_ROLL_PERIOD_MS);
     params.rollPeriodMs(rollPeriodMs).archivedWalSuffix(ARCHIVED_WAL_SUFFIX)
-      .archivedHFileSuffix(ARCHIVED_HFILE_SUFFIX).useMetaCellComparator(true);
+      .archivedHFileSuffix(ARCHIVED_HFILE_SUFFIX);
     return MasterRegion.create(params);
   }
 }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionParams.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionParams.java
index f2a03a4..1bfc84d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionParams.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionParams.java
@@ -53,8 +53,6 @@ public class MasterRegionParams {
 
   private String archivedHFileSuffix;
 
-  private Boolean useMetaCellComparator;
-
   public MasterRegionParams server(Server server) {
     this.server = server;
     return this;
@@ -120,11 +118,6 @@ public class MasterRegionParams {
     return this;
   }
 
-  public MasterRegionParams useMetaCellComparator(boolean useMetaCellComparator) {
-    this.useMetaCellComparator = useMetaCellComparator;
-    return this;
-  }
-
   public Server server() {
     return server;
   }
@@ -176,8 +169,4 @@ public class MasterRegionParams {
   public String archivedHFileSuffix() {
     return archivedHFileSuffix;
   }
-
-  public Boolean useMetaCellComparator() {
-    return useMetaCellComparator;
-  }
 }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index ef1e7ae..61f5833 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -134,6 +134,7 @@ import org.apache.hadoop.hbase.io.hfile.HFile;
 import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;
 import org.apache.hadoop.hbase.ipc.RpcCall;
 import org.apache.hadoop.hbase.ipc.RpcServer;
+import org.apache.hadoop.hbase.master.region.MasterRegionCellComparator;
 import org.apache.hadoop.hbase.mob.MobFileCache;
 import org.apache.hadoop.hbase.monitoring.MonitoredTask;
 import org.apache.hadoop.hbase.monitoring.TaskMonitor;
@@ -251,12 +252,10 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
     "hbase.hregion.special.recovered.edits.dir";
 
   /**
-   * Whether to use {@link MetaCellComparator} even if we are not meta region. Used when creating
-   * master local region.
+   * Whether to use {@link MasterRegionCellComparator}.
    */
-  public static final String USE_META_CELL_COMPARATOR = "hbase.region.use.meta.cell.comparator";
-
-  public static final boolean DEFAULT_USE_META_CELL_COMPARATOR = false;
+  public static final String USE_MASTER_REGION_CELL_COMPARATOR =
+    "hbase.region.use.master.region.cell.comparator";
 
   final AtomicBoolean closed = new AtomicBoolean(false);
 
@@ -736,6 +735,18 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
       wal, confParam, htd, rsServices);
   }
 
+  private CellComparator getCellComparator(Configuration conf, TableDescriptor htd) {
+    boolean useMasterRegionCellComparator =
+      conf.getBoolean(USE_MASTER_REGION_CELL_COMPARATOR, false);
+    if (useMasterRegionCellComparator) {
+      return MasterRegionCellComparator.MASTER_REGION_COMPARATOR;
+    } else if (htd.isMetaTable()) {
+      return MetaCellComparator.META_COMPARATOR;
+    } else {
+      return CellComparatorImpl.COMPARATOR;
+    }
+  }
+
   /**
    * HRegion constructor. This constructor should only be used for testing and
    * extensions.  Instances of HRegion should be instantiated with the
@@ -769,9 +780,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
     // 'conf' renamed to 'confParam' b/c we use this.conf in the constructor
     this.baseConf = confParam;
     this.conf = new CompoundConfiguration().add(confParam).addBytesMap(htd.getValues());
-    this.cellComparator = htd.isMetaTable() ||
-      conf.getBoolean(USE_META_CELL_COMPARATOR, DEFAULT_USE_META_CELL_COMPARATOR) ?
-        MetaCellComparator.META_COMPARATOR : CellComparatorImpl.COMPARATOR;
+    this.cellComparator = getCellComparator(this.conf, htd);
     this.lock = new ReentrantReadWriteLock(conf.getBoolean(FAIR_REENTRANT_CLOSE_LOCK,
         DEFAULT_FAIR_REENTRANT_CLOSE_LOCK));
     this.regionLockHolders = new ConcurrentHashMap<>();