You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2019/07/17 14:50:54 UTC

[hbase] branch master updated: HBASE-7191 HBCK - Add offline create/fix hbase.version and hbase.id Signed-off-by: Peter Somogyi

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

stack pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 82ea04d  HBASE-7191 HBCK - Add offline create/fix hbase.version and hbase.id Signed-off-by: Peter Somogyi <ps...@apache.org>
82ea04d is described below

commit 82ea04dbab5da6e875a71384000ee2397c2bfe39
Author: stack <st...@apache.org>
AuthorDate: Tue Jul 16 14:26:07 2019 -0700

    HBASE-7191 HBCK - Add offline create/fix hbase.version and hbase.id
    Signed-off-by: Peter Somogyi <ps...@apache.org>
---
 .../java/org/apache/hadoop/hbase/util/FSUtils.java | 20 ++++++---
 .../org/apache/hadoop/hbase/util/TestFSUtils.java  | 50 +++++++++++++++++++---
 2 files changed, 57 insertions(+), 13 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java
index 7806b35..1865568 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java
@@ -423,23 +423,29 @@ public abstract class FSUtils extends CommonFSUtils {
       boolean message, int wait, int retries)
   throws IOException, DeserializationException {
     String version = getVersion(fs, rootdir);
+    String msg;
     if (version == null) {
       if (!metaRegionExists(fs, rootdir)) {
         // rootDir is empty (no version file and no root region)
         // just create new version file (HBASE-1195)
         setVersion(fs, rootdir, wait, retries);
         return;
+      } else {
+        msg = "hbase.version file is missing. Is your hbase.rootdir valid? " +
+            "You can restore hbase.version file by running 'HBCK2 filesystem -fix'. " +
+            "See https://github.com/apache/hbase-operator-tools/tree/master/hbase-hbck2";
       }
-    } else if (version.compareTo(HConstants.FILE_SYSTEM_VERSION) == 0) return;
+    } else if (version.compareTo(HConstants.FILE_SYSTEM_VERSION) == 0) {
+      return;
+    } else {
+      msg = "HBase file layout needs to be upgraded. Current filesystem version is " + version +
+          " but software requires version " + HConstants.FILE_SYSTEM_VERSION +
+          ". Consult http://hbase.apache.org/book.html for further information about " +
+          "upgrading HBase.";
+    }
 
     // version is deprecated require migration
     // Output on stdout so user sees it in terminal.
-    String msg = "HBase file layout needs to be upgraded."
-      + " You have version " + version
-      + " and I want version " + HConstants.FILE_SYSTEM_VERSION
-      + ". Consult http://hbase.apache.org/book.html for further information about upgrading HBase."
-      + " Is your hbase.rootdir valid? If so, you may need to run "
-      + "'hbase hbck -fixVersionFile'.";
     if (message) {
       System.out.println("WARNING! " + msg);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSUtils.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSUtils.java
index c5863f7..1296c47 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSUtils.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSUtils.java
@@ -39,6 +39,7 @@ import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HDFSBlocksDistribution;
+import org.apache.hadoop.hbase.client.RegionInfoBuilder;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
 import org.apache.hadoop.hbase.fs.HFileSystem;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
@@ -201,18 +202,43 @@ public class TestFSUtils {
     }
   }
 
+  private void writeVersionFile(Path versionFile, String version) throws IOException {
+    if (FSUtils.isExists(fs, versionFile)) {
+      assertTrue(FSUtils.delete(fs, versionFile, true));
+    }
+    try (FSDataOutputStream s = fs.create(versionFile)) {
+      s.writeUTF(version);
+    }
+    assertTrue(fs.exists(versionFile));
+  }
+
   @Test
   public void testVersion() throws DeserializationException, IOException {
     final Path rootdir = htu.getDataTestDir();
     final FileSystem fs = rootdir.getFileSystem(conf);
     assertNull(FSUtils.getVersion(fs, rootdir));
-    // Write out old format version file.  See if we can read it in and convert.
+    // No meta dir so no complaint from checkVersion.
+    // Presumes it a new install. Will create version file.
+    FSUtils.checkVersion(fs, rootdir, true);
+    // Now remove the version file and create a metadir so checkVersion fails.
     Path versionFile = new Path(rootdir, HConstants.VERSION_FILE_NAME);
-    FSDataOutputStream s = fs.create(versionFile);
-    final String version = HConstants.FILE_SYSTEM_VERSION;
-    s.writeUTF(version);
-    s.close();
-    assertTrue(fs.exists(versionFile));
+    assertTrue(FSUtils.isExists(fs, versionFile));
+    assertTrue(FSUtils.delete(fs, versionFile, true));
+    Path metaRegionDir =
+        FSUtils.getRegionDirFromRootDir(rootdir, RegionInfoBuilder.FIRST_META_REGIONINFO);
+    FsPermission defaultPerms = FSUtils.getFilePermissions(fs, this.conf,
+        HConstants.DATA_FILE_UMASK_KEY);
+    FSUtils.create(fs, metaRegionDir, defaultPerms, false);
+    boolean thrown = false;
+    try {
+      FSUtils.checkVersion(fs, rootdir, true);
+    } catch (FileSystemVersionException e) {
+      thrown = true;
+    }
+    assertTrue("Expected FileSystemVersionException", thrown);
+    // Write out a good version file.  See if we can read it in and convert.
+    String version = HConstants.FILE_SYSTEM_VERSION;
+    writeVersionFile(versionFile, version);
     FileStatus [] status = fs.listStatus(versionFile);
     assertNotNull(status);
     assertTrue(status.length > 0);
@@ -222,6 +248,18 @@ public class TestFSUtils {
     // File will have been converted. Exercise the pb format
     assertEquals(version, FSUtils.getVersion(fs, rootdir));
     FSUtils.checkVersion(fs, rootdir, true);
+    // Write an old version file.
+    String oldVersion = "1";
+    writeVersionFile(versionFile, oldVersion);
+    newVersion = FSUtils.getVersion(fs, rootdir);
+    assertNotEquals(version, newVersion);
+    thrown = false;
+    try {
+      FSUtils.checkVersion(fs, rootdir, true);
+    } catch (FileSystemVersionException e) {
+      thrown = true;
+    }
+    assertTrue("Expected FileSystemVersionException", thrown);
   }
 
   @Test