Repository: hbase Updated Branches: refs/heads/branch-1.2 97877df17 -> 11503fc6e
HBASE-18024 HRegion#initializeRegionInternals should not re-create .hregioninfo file when the region directory no longer exists Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/11503fc6 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/11503fc6 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/11503fc6 Branch: refs/heads/branch-1.2 Commit: 11503fc6e65a6e350d4a17cd6031d6ae4d204bdc Parents: 97877df Author: Esteban Gutierrez <este...@apache.org> Authored: Fri Jul 21 13:13:00 2017 -0500 Committer: Esteban Gutierrez <este...@apache.org> Committed: Thu Aug 10 18:47:45 2017 -0500 ---------------------------------------------------------------------- .../hadoop/hbase/regionserver/HRegion.java | 11 +++++-- .../hbase/regionserver/HRegionFileSystem.java | 31 +++++++++++++++++--- .../hadoop/hbase/regionserver/TestHRegion.java | 7 ++++- .../TestStoreFileRefresherChore.java | 2 ++ 4 files changed, 44 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/11503fc6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java ---------------------------------------------------------------------- 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 5bb6206..ef9a81a 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 @@ -811,8 +811,15 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi } // Write HRI to a file in case we need to recover hbase:meta - status.setStatus("Writing region info on filesystem"); - fs.checkRegionInfoOnFilesystem(); + // Only the primary replica should write .regioninfo + if (this.getRegionInfo().getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID) { + status.setStatus("Writing region info on filesystem"); + fs.checkRegionInfoOnFilesystem(); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Skipping creation of .regioninfo file for " + this.getRegionInfo()); + } + } // Initialize all the HStores status.setStatus("Initializing all the Stores"); http://git-wip-us.apache.org/repos/asf/hbase/blob/11503fc6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java index 19e8c45..619358c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java @@ -798,9 +798,19 @@ public class HRegionFileSystem { // only should be sufficient. I don't want to read the file every time to check if it pb // serialized. byte[] content = getRegionInfoFileContent(regionInfoForFs); + + // Verify if the region directory exists before opening a region. We need to do this since if + // the region directory doesn't exist we will re-create the region directory and a new HRI + // when HRegion.openHRegion() is called. try { - Path regionInfoFile = new Path(getRegionDir(), REGION_INFO_FILE); + FileStatus status = fs.getFileStatus(getRegionDir()); + } catch (FileNotFoundException e) { + LOG.warn(getRegionDir() + " doesn't exist for region: " + regionInfoForFs.getEncodedName() + + " on table " + regionInfo.getTable()); + } + try { + Path regionInfoFile = new Path(getRegionDir(), REGION_INFO_FILE); FileStatus status = fs.getFileStatus(regionInfoFile); if (status != null && status.getLen() == content.length) { // Then assume the content good and move on. @@ -893,7 +903,13 @@ public class HRegionFileSystem { } // Write HRI to a file in case we need to recover hbase:meta - regionFs.writeRegionInfoOnFilesystem(false); + // Only primary replicas should write region info + if (regionInfo.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID) { + regionFs.writeRegionInfoOnFilesystem(false); + } else { + if (LOG.isDebugEnabled()) + LOG.debug("Skipping creation of .regioninfo file for " + regionInfo); + } return regionFs; } @@ -923,8 +939,15 @@ public class HRegionFileSystem { regionFs.cleanupSplitsDir(); regionFs.cleanupMergesDir(); - // if it doesn't exists, Write HRI to a file, in case we need to recover hbase:meta - regionFs.checkRegionInfoOnFilesystem(); + // If it doesn't exists, Write HRI to a file, in case we need to recover hbase:meta + // Only create HRI if we are the default replica + if (regionInfo.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID) { + regionFs.checkRegionInfoOnFilesystem(); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Skipping creation of .regioninfo file for " + regionInfo); + } + } } return regionFs; http://git-wip-us.apache.org/repos/asf/hbase/blob/11503fc6/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java index 4eaf94a..3e8534f 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java @@ -6145,6 +6145,10 @@ public class TestHRegion { @Test public void testCloseRegionWrittenToWAL() throws Exception { + + Path rootDir = new Path(dir + name.getMethodName()); + FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir); + final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42); final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName)); @@ -6163,7 +6167,8 @@ public class TestHRegion { when(rss.getWAL((HRegionInfo) any())).thenReturn(wal); - // open a region first so that it can be closed later + // create and then open a region first so that it can be closed later + region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri)); region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(), rss, null); http://git-wip-us.apache.org/repos/asf/hbase/blob/11503fc6/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java index 439f72d..0dedc39 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java @@ -167,6 +167,8 @@ public class TestStoreFileRefresherChore { when(regionServer.getConfiguration()).thenReturn(TEST_UTIL.getConfiguration()); HTableDescriptor htd = getTableDesc(TableName.valueOf("testIsStale"), families); + htd.setRegionReplication(2); + Region primary = initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 0); Region replica1 = initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 1); regions.add(primary);