This is an automated email from the ASF dual-hosted git repository. toffer pushed a commit to branch HBASE-11288.branch-2 in repository https://gitbox.apache.org/repos/asf/hbase.git
commit 87e2bb70b680f13e2eddb402f3ed98eeef2cfcb5 Author: Francis Liu <[email protected]> AuthorDate: Fri Aug 7 02:09:51 2020 -0700 Some extra fixes as precaution --- .../org/apache/hadoop/hbase/HTableDescriptor.java | 6 +++- .../hadoop/hbase/client/AsyncClientScanner.java | 4 +-- .../hbase/client/ConnectionImplementation.java | 8 ++++- .../org/apache/hadoop/hbase/client/HBaseAdmin.java | 4 ++- .../apache/hadoop/hbase/client/MasterCallable.java | 8 +++++ .../hadoop/hbase/client/RawAsyncHBaseAdmin.java | 8 ++--- .../hadoop/hbase/client/TableDescriptor.java | 14 +++++++++ .../hbase/client/TableDescriptorBuilder.java | 21 +++++++++++++ .../hbase/snapshot/TestSecureExportSnapshot.java | 2 +- .../hadoop/hbase/master/RegionsRecoveryChore.java | 2 +- .../hadoop/hbase/master/SplitWALManager.java | 2 +- .../hadoop/hbase/master/TableStateManager.java | 2 +- .../hbase/master/assignment/AssignmentManager.java | 9 ++++++ .../hbase/master/balancer/SimpleLoadBalancer.java | 2 +- .../master/procedure/MasterProcedureUtil.java | 4 ++- .../master/procedure/ServerCrashProcedure.java | 6 +++- .../apache/hadoop/hbase/regionserver/HRegion.java | 12 +++++--- .../hadoop/hbase/regionserver/HRegionServer.java | 34 +++++++++++++--------- .../apache/hadoop/hbase/regionserver/HStore.java | 2 +- .../hadoop/hbase/regionserver/MemStoreFlusher.java | 3 +- .../hadoop/hbase/regionserver/RSRpcServices.java | 8 ++--- .../hbase/regionserver/RegionSplitPolicy.java | 4 ++- .../regionserver/StorefileRefresherChore.java | 3 +- .../wal/BoundedRecoveredHFilesOutputSink.java | 2 +- 24 files changed, 128 insertions(+), 42 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java index 77d2b47..3f30af3 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java @@ -131,7 +131,11 @@ public class HTableDescriptor implements TableDescriptor, Comparable<HTableDescr * @return always return the false */ public boolean isRootRegion() { - return false; + return delegatee.isRootRegion(); + } + + public boolean isRootTable() { + return delegatee.isRootTable(); } /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java index 5fd00a5..8664d56 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java @@ -195,8 +195,8 @@ class AsyncClientScanner { } private long getPrimaryTimeoutNs() { - return TableName.isMetaTableName(tableName) ? conn.connConf.getPrimaryMetaScanTimeoutNs() - : conn.connConf.getPrimaryScanTimeoutNs(); + return TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName) ? + conn.connConf.getPrimaryMetaScanTimeoutNs() : conn.connConf.getPrimaryScanTimeoutNs(); } private void openScanner() { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java index 21cedfe..0a525c9 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java @@ -661,6 +661,10 @@ class ConnectionImplementation implements ClusterConnection, Closeable { LOG.debug("Table {} not enabled", tableName); return false; } + if (TableName.isRootTableName(tableName)) { + // meta table is always available + return true; + } if (TableName.isMetaTableName(tableName)) { // meta table is always available return true; @@ -735,7 +739,9 @@ class ConnectionImplementation implements ClusterConnection, Closeable { public List<HRegionLocation> locateRegions(TableName tableName, boolean useCache, boolean offlined) throws IOException { List<RegionInfo> regions; - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName)) { + regions = Collections.singletonList(RegionInfoBuilder.ROOT_REGIONINFO); + } else if (TableName.isMetaTableName(tableName)) { regions = Collections.singletonList(RegionInfoBuilder.FIRST_META_REGIONINFO); } else { regions = MetaTableAccessor.getTableRegions(this, tableName, !offlined); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 4b1a738..c06d275 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -424,7 +424,9 @@ public class HBaseAdmin implements Admin { @Override public List<RegionInfo> getRegions(TableName tableName) throws IOException { - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName)) { + return Arrays.asList(RegionInfoBuilder.ROOT_REGIONINFO); + } else if (TableName.isMetaTableName(tableName)) { return Arrays.asList(RegionInfoBuilder.FIRST_META_REGIONINFO); } else { return MetaTableAccessor.getTableRegions(connection, tableName, true); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java index 7ae9731..1089573 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java @@ -132,11 +132,19 @@ abstract class MasterCallable<V> implements RetryingCallable<V>, Closeable { * @param regionName RegionName. If hbase:meta, we'll set high priority. */ void setPriority(final byte[] regionName) { + if (isRootRegion(regionName)) { + setPriority(TableName.ROOT_TABLE_NAME); + } if (isMetaRegion(regionName)) { setPriority(TableName.META_TABLE_NAME); } } + private static boolean isRootRegion(final byte[] regionName) { + return Bytes.equals(regionName, RegionInfoBuilder.ROOT_REGIONINFO.getRegionName()) || + Bytes.equals(regionName, RegionInfoBuilder.ROOT_REGIONINFO.getEncodedNameAsBytes()); + } + private static boolean isMetaRegion(final byte[] regionName) { return Bytes.equals(regionName, RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName()) || Bytes.equals(regionName, RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedNameAsBytes()); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java index 1091ef6..cba6b18 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java @@ -480,7 +480,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin { @Override public CompletableFuture<Boolean> tableExists(TableName tableName) { - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) { return CompletableFuture.completedFuture(true); } return AsyncMetaTableAccessor.tableExists(metaTable, tableName); @@ -692,7 +692,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin { @Override public CompletableFuture<Boolean> isTableEnabled(TableName tableName) { - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) { return CompletableFuture.completedFuture(true); } CompletableFuture<Boolean> future = new CompletableFuture<>(); @@ -705,7 +705,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin { @Override public CompletableFuture<Boolean> isTableDisabled(TableName tableName) { - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) { return CompletableFuture.completedFuture(false); } CompletableFuture<Boolean> future = new CompletableFuture<>(); @@ -730,7 +730,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin { private CompletableFuture<Boolean> isTableAvailable(TableName tableName, Optional<byte[][]> splitKeys) { - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) { return connection.registry.getMetaRegionLocations().thenApply(locs -> Stream .of(locs.getRegionLocations()).allMatch(loc -> loc != null && loc.getServerName() != null)); } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java index 2ae273d..a97b394 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java @@ -278,6 +278,20 @@ public interface TableDescriptor { * * @return true if this table is <code> hbase:meta </code> region */ + boolean isRootRegion(); + + /** + * Checks if the table is a <code>hbase:meta</code> table + * + * @return true if table is <code> hbase:meta </code> region. + */ + boolean isRootTable(); + + /** + * Checks if this table is <code> hbase:meta </code> region. + * + * @return true if this table is <code> hbase:meta </code> region + */ boolean isMetaRegion(); /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java index d35dd2c..b98c02a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java @@ -642,6 +642,27 @@ public class TableDescriptorBuilder { * @return true if this table is <code> hbase:meta </code> region */ @Override + public boolean isRootRegion() { + //TODO should we add a IS_ROOT key or rename/keep IS_META to mean IS_CATALOG + return getTableName().equals(TableName.ROOT_TABLE_NAME); + } + + /** + * Checks if the table is a <code>hbase:meta</code> table + * + * @return true if table is <code> hbase:meta </code> region. + */ + @Override + public boolean isRootTable() { + return isRootRegion(); + } + + /** + * Checks if this table is <code> hbase:meta </code> region. + * + * @return true if this table is <code> hbase:meta </code> region + */ + @Override public boolean isMetaRegion() { return getOrDefault(IS_META_KEY, Boolean::valueOf, false); } diff --git a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java index 133934d..4bb45a0 100644 --- a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java +++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java @@ -32,7 +32,7 @@ import org.junit.experimental.categories.Category; /** * Reruns TestExportSnapshot using ExportSnapshot in secure mode. */ -@Ignore +//@Ignore @Category({VerySlowRegionServerTests.class, LargeTests.class}) public class TestSecureExportSnapshot extends TestExportSnapshot { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java index 0ee5a1b..e6baecd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java @@ -155,7 +155,7 @@ public class RegionsRecoveryChore extends ScheduledChore { final RegionInfo regionInfo = hMaster.getAssignmentManager().getRegionInfo(regionName); final TableName tableName = regionInfo.getTable(); - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) { // Do not reopen regions of meta table even if it has // high store file reference count return; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java index 5ef25a1..fbd0fed 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java @@ -115,7 +115,7 @@ public class SplitWALManager { return splitWALs(crashedServer, SplitType.USER); } - public List<Procedure> splitWALs(ServerName crashedServer, SplitType splitType) + public List<Procedure> splitWALs(ServerName crashedServer, SplitType splitType) throws IOException { try { // 1. list all splitting files diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java index 4360e74..1e7f1a9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java @@ -221,7 +221,7 @@ public class TableStateManager { }); for (TableDescriptor tableDesc : tableDescriptors.getAll().values()) { TableName tableName = tableDesc.getTableName(); - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) { // This table is always enabled. No fixup needed. No entry in hbase:meta needed. // Call through to fixTableState though in case a super class wants to do something. fixTableState(new TableState(tableName, TableState.State.ENABLED)); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index 2881f83..79d7b64 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -918,6 +918,15 @@ public class AssignmentManager { @VisibleForTesting static int compare(TransitRegionStateProcedure left, TransitRegionStateProcedure right) { + //TODO this is broken once we have more meta entries + if (left.getRegion().isRootRegion()) { + if (right.getRegion().isRootRegion()) { + return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion()); + } + return -1; + } else if (right.getRegion().isRootRegion()) { + return +1; + } if (left.getRegion().isMetaRegion()) { if (right.getRegion().isMetaRegion()) { return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion()); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java index d8b4256..9c58207 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java @@ -396,7 +396,7 @@ public class SimpleLoadBalancer extends BaseLoadBalancer { balanceInfo == null ? 0 : balanceInfo.getNextRegionForUnload(); if (idx >= server.getValue().size()) break; RegionInfo region = server.getValue().get(idx); - if (region.isMetaRegion()) continue; // Don't move meta regions. + if (region.isRootRegion() || region.isMetaRegion()) continue; // Don't move meta regions. regionsToMove.add(new RegionPlan(region, server.getKey().getServerName(), null)); balanceInfo.setNumRegionsAdded(balanceInfo.getNumRegionsAdded() - 1); balanceInfo.setNextRegionForUnload(balanceInfo.getNextRegionForUnload() + 1); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java index efe3d83..2f68f21 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java @@ -166,7 +166,9 @@ public final class MasterProcedureUtil { * user tables are 1. */ public static int getTablePriority(TableName tableName) { - if (TableName.isMetaTableName(tableName)) { + if (TableName.isRootTableName(tableName)) { + return 4; + } else if (TableName.isMetaTableName(tableName)) { return 3; } else if (tableName.isSystemTable()) { return 2; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java index 9ced487..5393fd0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java @@ -350,10 +350,14 @@ public class ServerCrashProcedure if (regionsOnCrashedServer == null) { return false; } - regionsOnCrashedServer.removeIf(this::isDefaultMetaRegion); + regionsOnCrashedServer.removeIf((x) -> isDefaultMetaRegion(x) || isDefaultRootRegion(x)); return !regionsOnCrashedServer.isEmpty(); } + private boolean isDefaultRootRegion(RegionInfo hri) { + return hri.isRootRegion() && RegionReplicaUtil.isDefaultReplica(hri); + } + private boolean isDefaultMetaRegion(RegionInfo hri) { return hri.isMetaRegion() && RegionReplicaUtil.isDefaultReplica(hri); } 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 fef1fa5..87d9c09 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 @@ -778,7 +778,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi this.cellComparator = htd.isMetaTable() || conf.getBoolean(USE_META_CELL_COMPARATOR, DEFAULT_USE_META_CELL_COMPARATOR) ? CellComparatorImpl.META_COMPARATOR : - CellComparatorImpl.COMPARATOR; + htd.isRootTable() ? CellComparatorImpl.ROOT_COMPARATOR : CellComparatorImpl.COMPARATOR; + this.lock = new ReentrantReadWriteLock(conf.getBoolean(FAIR_REENTRANT_CLOSE_LOCK, DEFAULT_FAIR_REENTRANT_CLOSE_LOCK)); this.flushCheckInterval = conf.getInt(MEMSTORE_PERIODIC_FLUSH_INTERVAL, @@ -4542,7 +4543,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi */ void checkResources() throws RegionTooBusyException { // If catalog region, do not impose resource constraints or block updates. - if (this.getRegionInfo().isMetaRegion()) return; + if (this.getRegionInfo().isRootRegion() || this.getRegionInfo().isMetaRegion()) return; MemStoreSize mss = this.memStoreSizing.getMemStoreSize(); if (mss.getHeapSize() + mss.getOffHeapSize() > this.blockingMemStoreSize) { @@ -8514,7 +8515,9 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi */ public Optional<byte[]> checkSplit(boolean force) { // Can't split META - if (this.getRegionInfo().isMetaRegion() || + if ( + this.getRegionInfo().isRootRegion() || + this.getRegionInfo().isMetaRegion() || TableName.NAMESPACE_TABLE_NAME.equals(this.getRegionInfo().getTable())) { return Optional.empty(); } @@ -8717,7 +8720,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi * @throws IOException If anything goes wrong with DFS */ private void sync(long txid, Durability durability) throws IOException { - if (this.getRegionInfo().isMetaRegion()) { + if (this.getRegionInfo().isRootRegion() || this.getRegionInfo().isMetaRegion()) { this.wal.sync(txid); } else { switch(durability) { @@ -8881,6 +8884,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi StringBuilder buf = new StringBuilder(); buf.append(title + ", "); buf.append(getRegionInfo().toString()); + buf.append(getRegionInfo().isRootRegion() ? " root region " : " "); buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " "); buf.append("stores: "); for (HStore s : stores.values()) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 00ba4c0..64deba5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -119,7 +119,6 @@ import org.apache.hadoop.hbase.ipc.ServerRpcController; import org.apache.hadoop.hbase.log.HBaseMarkers; import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.LoadBalancer; -import org.apache.hadoop.hbase.master.RegionState.State; import org.apache.hadoop.hbase.master.RegionState; import org.apache.hadoop.hbase.mob.MobFileCache; import org.apache.hadoop.hbase.procedure.RegionServerProcedureManagerHost; @@ -136,6 +135,7 @@ import org.apache.hadoop.hbase.regionserver.compactions.CompactionProgress; import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester; import org.apache.hadoop.hbase.regionserver.handler.CloseMetaHandler; import org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler; +import org.apache.hadoop.hbase.regionserver.handler.CloseRootHandler; import org.apache.hadoop.hbase.regionserver.handler.RSProcedureHandler; import org.apache.hadoop.hbase.regionserver.handler.RegionReplicaFlushHandler; import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder; @@ -160,7 +160,6 @@ import org.apache.hadoop.hbase.util.CompressionTest; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.FSTableDescriptors; import org.apache.hadoop.hbase.util.FSUtils; -import org.apache.hadoop.hbase.util.FutureUtils; import org.apache.hadoop.hbase.util.JvmPauseMonitor; import org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig; import org.apache.hadoop.hbase.util.Pair; @@ -1118,13 +1117,13 @@ public class HRegionServer extends Thread implements } // Closing the compactSplit thread before closing meta regions - if (!this.killed && containsMetaTableRegions()) { + if (!this.killed && containsCatalogTableRegions()) { if (!abortRequested.get() || this.dataFsOk) { if (this.compactSplitThread != null) { this.compactSplitThread.join(); this.compactSplitThread = null; } - closeMetaTableRegions(abortRequested.get()); + closeCatalogTableRegions(abortRequested.get()); } } @@ -1190,16 +1189,17 @@ public class HRegionServer extends Thread implements LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed."); } - //TODO francis update this - private boolean containsMetaTableRegions() { - return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName()); + private boolean containsCatalogTableRegions() { + return onlineRegions.containsKey(RegionInfoBuilder.ROOT_REGIONINFO.getEncodedName()) || + onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName()); } private boolean areAllUserRegionsOffline() { if (getNumberOfOnlineRegions() > 2) return false; boolean allUserRegionsOffline = true; for (Map.Entry<String, HRegion> e: this.onlineRegions.entrySet()) { - if (!e.getValue().getRegionInfo().isMetaRegion()) { + if (!e.getValue().getRegionInfo().isRootRegion() || + !e.getValue().getRegionInfo().isMetaRegion()) { allUserRegionsOffline = false; break; } @@ -2328,7 +2328,7 @@ public class HRegionServer extends Thread implements if (code == TransitionCode.OPENED) { Preconditions.checkArgument(hris != null && hris.length == 1); - if (hris[0].isMetaRegion()) { + if (hris[0].isRootRegion()) { try { MetaTableLocator.setMetaLocation(getZooKeeper(), serverName, hris[0].getReplicaId(), RegionState.State.OPEN); @@ -2821,20 +2821,25 @@ public class HRegionServer extends Thread implements * Close meta region if we carry it * @param abort Whether we're running an abort. */ - private void closeMetaTableRegions(final boolean abort) { + private void closeCatalogTableRegions(final boolean abort) { + HRegion root = null; HRegion meta = null; this.onlineRegionsLock.writeLock().lock(); try { for (Map.Entry<String, HRegion> e: onlineRegions.entrySet()) { RegionInfo hri = e.getValue().getRegionInfo(); + if (hri.isRootRegion()) { + root = e.getValue(); + } if (hri.isMetaRegion()) { meta = e.getValue(); } - if (meta != null) break; + if (root != null && meta != null) break; } } finally { this.onlineRegionsLock.writeLock().unlock(); } + if (root != null) closeRegionIgnoreErrors(root.getRegionInfo(), abort); if (meta != null) closeRegionIgnoreErrors(meta.getRegionInfo(), abort); } @@ -2849,7 +2854,8 @@ public class HRegionServer extends Thread implements try { for (Map.Entry<String, HRegion> e: this.onlineRegions.entrySet()) { HRegion r = e.getValue(); - if (!r.getRegionInfo().isMetaRegion() && r.isAvailable()) { + if (!r.getRegionInfo().isRootRegion() && !r.getRegionInfo().isMetaRegion() + && r.isAvailable()) { // Don't update zk with this close transition; pass false. closeRegionIgnoreErrors(r.getRegionInfo(), abort); } @@ -3294,7 +3300,9 @@ public class HRegionServer extends Thread implements CloseRegionHandler crh; final RegionInfo hri = actualRegion.getRegionInfo(); - if (hri.isMetaRegion()) { + if (hri.isRootRegion()) { + crh = new CloseRootHandler(this, this, hri, abort); + } else if (hri.isMetaRegion()) { crh = new CloseMetaHandler(this, this, hri, abort); } else { crh = new CloseRegionHandler(this, this, hri, abort, destination); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index 4e3c5ba..bb893fd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -2130,7 +2130,7 @@ public class HStore implements Store, HeapSize, StoreConfigInformation, this.lock.readLock().lock(); try { // Should already be enforced by the split policy! - assert !this.getRegionInfo().isMetaRegion(); + assert !this.getRegionInfo().isRootRegion() && !this.getRegionInfo().isMetaRegion(); // Not split-able if we find a reference store file present in the store. if (hasReferences()) { LOG.trace("Not splittable; has references: {}", this); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java index 1537f7c..f2a1779 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java @@ -548,7 +548,8 @@ class MemStoreFlusher implements FlushRequester { */ private boolean flushRegion(final FlushRegionEntry fqe) { HRegion region = fqe.region; - if (!region.getRegionInfo().isMetaRegion() && isTooManyStoreFiles(region)) { + if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion() + && isTooManyStoreFiles(region)) { if (fqe.isMaximumWait(this.blockingWaitTime)) { LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) + "ms on a compaction to clean up 'too many store files'; waited " + 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 f15c662..9c3349f 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 @@ -641,7 +641,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, throws IOException { int countOfCompleteMutation = 0; try { - if (!region.getRegionInfo().isMetaRegion()) { + if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) { regionServer.getMemStoreFlusher().reclaimMemStoreMemory(); } RowMutations rm = null; @@ -1080,7 +1080,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, quota.addMutation(mutation); } - if (!region.getRegionInfo().isMetaRegion()) { + if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) { regionServer.getMemStoreFlusher().reclaimMemStoreMemory(); } @@ -1211,7 +1211,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } } requestCount.increment(); - if (!region.getRegionInfo().isMetaRegion()) { + if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) { regionServer.getMemStoreFlusher().reclaimMemStoreMemory(); } return region.batchReplay(mutations.toArray( @@ -3059,7 +3059,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, region = getRegion(request.getRegion()); MutateResponse.Builder builder = MutateResponse.newBuilder(); MutationProto mutation = request.getMutation(); - if (!region.getRegionInfo().isMetaRegion()) { + if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) { regionServer.getMemStoreFlusher().reclaimMemStoreMemory(); } long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java index 3079925..8165f88 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java @@ -75,7 +75,9 @@ public abstract class RegionSplitPolicy extends Configured { * @return {@code true} if the specified region can be split. */ protected boolean canSplit() { - return !region.getRegionInfo().isMetaRegion() && region.isAvailable() && + return !region.getRegionInfo().isRootRegion() && + !region.getRegionInfo().isMetaRegion() && + region.isAvailable() && !TableName.NAMESPACE_TABLE_NAME.equals(region.getRegionInfo().getTable()) && region.getStores().stream().allMatch(HStore::canSplit); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java index 18f7e18..394d86a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java @@ -91,7 +91,8 @@ public class StorefileRefresherChore extends ScheduledChore { } // don't refresh unless enabled for all files, or it the meta region // meta region don't have WAL replication for replicas enabled yet - if (onlyMetaRefresh && !r.getRegionInfo().isMetaRegion()) continue; + if (onlyMetaRefresh && + !r.getRegionInfo().isRootRegion() && !r.getRegionInfo().isMetaRegion()) continue; String encodedName = r.getRegionInfo().getEncodedName(); long time = EnvironmentEdgeManager.currentTime(); if (!lastRefreshTimes.containsKey(encodedName)) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java index d1be4fb..ad7387e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java @@ -203,7 +203,7 @@ public class BoundedRecoveredHFilesOutputSink extends OutputSink { HFileContext hFileContext = new HFileContextBuilder(). withChecksumType(HStore.getChecksumType(walSplitter.conf)). withBytesPerCheckSum(HStore.getBytesPerChecksum(walSplitter.conf)). - withCellComparator(isMetaTable? + withCellComparator(isRootTable? CellComparatorImpl.ROOT_COMPARATOR : isMetaTable? CellComparatorImpl.META_COMPARATOR: CellComparatorImpl.COMPARATOR).build(); return writerBuilder.withFileContext(hFileContext).build(); }
