Repository: hbase Updated Branches: refs/heads/master cc6fe16e5 -> 43a8dea34
HBASE-11987 Make zk-less table states backward compatible (Andrey Stepachev) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/43a8dea3 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/43a8dea3 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/43a8dea3 Branch: refs/heads/master Commit: 43a8dea347fb5c9a7082eaaa23a2d379cdaba9fe Parents: cc6fe16 Author: stack <st...@apache.org> Authored: Mon Sep 15 23:23:32 2014 -0700 Committer: stack <st...@apache.org> Committed: Mon Sep 15 23:23:50 2014 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/util/FSTableDescriptors.java | 23 +++++++++++++--- .../hbase/util/TestFSTableDescriptors.java | 28 ++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/43a8dea3/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java index bc8fc7f..f05575c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java @@ -596,17 +596,32 @@ public class FSTableDescriptors implements TableDescriptors { try { td = TableDescriptor.parseFrom(content); } catch (DeserializationException e) { - throw new IOException("content=" + Bytes.toShort(content), e); + // we have old HTableDescriptor here + try { + HTableDescriptor htd = HTableDescriptor.parseFrom(content); + LOG.warn("Found old table descriptor, converting to new format for table " + + htd.getTableName() + "; NOTE table will be in ENABLED state!"); + td = new TableDescriptor(htd, TableState.State.ENABLED); + if (rewritePb) rewriteTableDescriptor(fs, status, td); + } catch (DeserializationException e1) { + throw new IOException("content=" + Bytes.toShort(content), e); + } } if (rewritePb && !ProtobufUtil.isPBMagicPrefix(content)) { // Convert the file over to be pb before leaving here. - Path tableInfoDir = status.getPath().getParent(); - Path tableDir = tableInfoDir.getParent(); - writeTableDescriptor(fs, td, tableDir, status); + rewriteTableDescriptor(fs, status, td); } return td; } + private static void rewriteTableDescriptor(final FileSystem fs, final FileStatus status, + final TableDescriptor td) + throws IOException { + Path tableInfoDir = status.getPath().getParent(); + Path tableDir = tableInfoDir.getParent(); + writeTableDescriptor(fs, td, tableDir, status); + } + /** * Update table descriptor on the file system * @throws IOException Thrown if failed update. http://git-wip-us.apache.org/repos/asf/hbase/blob/43a8dea3/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSTableDescriptors.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSTableDescriptors.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSTableDescriptors.java index 839091c..23b1310 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSTableDescriptors.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestFSTableDescriptors.java @@ -28,6 +28,9 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; + +import org.apache.hadoop.fs.FSDataInputStream; +import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.hbase.client.TableState; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -42,6 +45,7 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableDescriptors; import org.apache.hadoop.hbase.TableExistsException; +import org.apache.hadoop.hbase.exceptions.DeserializationException; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.testclassification.MiscTests; import org.junit.Test; @@ -175,6 +179,30 @@ public class TestFSTableDescriptors { assertTrue(td.equals(td2)); } + @Test public void testReadingOldHTDFromFS() throws IOException, DeserializationException { + final String name = "testReadingOldHTDFromFS"; + FileSystem fs = FileSystem.get(UTIL.getConfiguration()); + Path rootdir = UTIL.getDataTestDir(name); + FSTableDescriptors fstd = new FSTableDescriptors(fs, rootdir); + HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name)); + TableDescriptor td = new TableDescriptor(htd, TableState.State.ENABLED); + Path descriptorFile = fstd.updateTableDescriptor(td); + try (FSDataOutputStream out = fs.create(descriptorFile, true)) { + out.write(htd.toByteArray()); + } + FSTableDescriptors fstd2 = new FSTableDescriptors(fs, rootdir); + TableDescriptor td2 = fstd2.getDescriptor(htd.getTableName()); + assertEquals(td, td2); + FileStatus descriptorFile2 = + FSTableDescriptors.getTableInfoPath(fs, fstd2.getTableDir(htd.getTableName())); + byte[] buffer = td.toByteArray(); + try (FSDataInputStream in = fs.open(descriptorFile2.getPath())) { + in.readFully(buffer); + } + TableDescriptor td3 = TableDescriptor.parseFrom(buffer); + assertEquals(td, td3); + } + @Test public void testHTableDescriptors() throws IOException, InterruptedException { final String name = "testHTableDescriptors";