You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by re...@apache.org on 2021/07/05 04:13:31 UTC

[hbase] branch branch-1 updated: HBASE-26033 complement the admin operations in thrift2 after HBASE-21674 (#3428)

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

reidchan pushed a commit to branch branch-1
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-1 by this push:
     new 67b26c2  HBASE-26033 complement the admin operations in thrift2 after HBASE-21674 (#3428)
67b26c2 is described below

commit 67b26c2760cc08dc0a368712c81ec3bc097d0920
Author: YutSean <yu...@gmail.com>
AuthorDate: Mon Jul 5 12:12:59 2021 +0800

    HBASE-26033 complement the admin operations in thrift2 after HBASE-21674 (#3428)
    
    Signed-off-by: Reid Chan <re...@apache.org>
---
 .../hbase/thrift2/ThriftHBaseServiceHandler.java   | 222 ++++++++++++++++-----
 .../hadoop/hbase/thrift2/ThriftUtilities.java      | 143 ++++++++++++-
 2 files changed, 316 insertions(+), 49 deletions(-)

diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java
index 6bad4af..5c3e2d4 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java
@@ -21,25 +21,36 @@ package org.apache.hadoop.hbase.thrift2;
 import static org.apache.hadoop.hbase.thrift.Constants.THRIFT_READONLY_ENABLED;
 import static org.apache.hadoop.hbase.thrift.Constants.THRIFT_READONLY_ENABLED_DEFAULT;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.appendFromThrift;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.columnDescriptorFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.deleteFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.deletesFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.getFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.getsFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.incrementFromThrift;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.namespaceDescriptorFromHBase;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.namespaceDescriptorFromThrift;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.namespaceDescriptorsFromHBase;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.putFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.putsFromThrift;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.regionLocationFromHBase;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.regionLocationsFromHBase;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.resultFromHBase;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.resultsFromHBase;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.rowMutationsFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.scanFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.splitKeyFromThrift;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.tableDescriptorFromHBase;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.tableDescriptorFromThrift;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.tableDescriptorsFromHBase;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.tableNameFromThrift;
 import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.tableNamesFromHBase;
+import static org.apache.hadoop.hbase.thrift2.ThriftUtilities.tableNamesFromThrift;
 import static org.apache.thrift.TBaseHelper.byteBufferToByteArray;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -53,7 +64,10 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
+import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HRegionLocation;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.client.RegionLocator;
@@ -345,14 +359,28 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
     }
   }
 
-  @Override public TTableDescriptor getTableDescriptor(TTableName table)
+  @Override
+  public TTableDescriptor getTableDescriptor(TTableName table)
       throws TIOError, TException {
-    return null;
+    try {
+      TableName tableName = tableNameFromThrift(table);
+      HTableDescriptor tableDescriptor = connectionCache.getAdmin().getTableDescriptor(tableName);
+      return tableDescriptorFromHBase(tableDescriptor);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public List<TTableDescriptor> getTableDescriptors(List<TTableName> tables)
+  @Override
+  public List<TTableDescriptor> getTableDescriptors(List<TTableName> tables)
       throws TIOError, TException {
-    return null;
+    try {
+      List<TableName> tableNames = tableNamesFromThrift(tables);
+      return tableDescriptorsFromHBase(
+        Arrays.asList(connectionCache.getAdmin().getTableDescriptorsByTableName(tableNames)));
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
   @Override
@@ -448,8 +476,6 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
     return results;
   }
 
-
-
   @Override
   public void closeScanner(int scannerId) throws TIOError, TIllegalArgument, TException {
     LOG.debug("scannerClose: id=" + scannerId);
@@ -484,8 +510,7 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
     RegionLocator locator = null;
     try {
       locator = getLocator(table);
-      return ThriftUtilities.regionLocationsFromHBase(locator.getAllRegionLocations());
-
+      return regionLocationsFromHBase(locator.getAllRegionLocations());
     } catch (IOException e) {
       throw getTIOError(e);
     } finally {
@@ -508,8 +533,7 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
       locator = getLocator(table);
       byte[] rowBytes = byteBufferToByteArray(row);
       HRegionLocation hrl = locator.getRegionLocation(rowBytes, reload);
-      return ThriftUtilities.regionLocationFromHBase(hrl);
-
+      return regionLocationFromHBase(hrl);
     } catch (IOException e) {
       throw getTIOError(e);
     } finally {
@@ -546,12 +570,25 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
   @Override
   public List<TTableDescriptor> getTableDescriptorsByPattern(String regex, boolean includeSysTables)
       throws TIOError, TException {
-    return null;
+    try {
+      Pattern pattern = (regex == null ? null : Pattern.compile(regex));
+      List<HTableDescriptor> tableDescriptors =
+        Arrays.asList(connectionCache.getAdmin().listTables(pattern));
+      return tableDescriptorsFromHBase(tableDescriptors);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public List<TTableDescriptor> getTableDescriptorsByNamespace(String name)
+  @Override
+  public List<TTableDescriptor> getTableDescriptorsByNamespace(String name)
       throws TIOError, TException {
-    return null;
+    try {
+      HTableDescriptor[] tables = connectionCache.getAdmin().listTableDescriptorsByNamespace(name);
+      return tableDescriptorsFromHBase(Arrays.asList(tables));
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
   @Override
@@ -577,26 +614,57 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
     }
   }
 
-  @Override public void createTable(TTableDescriptor desc, List<ByteBuffer> splitKeys)
+  @Override
+  public void createTable(TTableDescriptor desc, List<ByteBuffer> splitKeys)
       throws TIOError, TException {
-
+    try {
+      HTableDescriptor descriptor = tableDescriptorFromThrift(desc);
+      byte[][] split = splitKeyFromThrift(splitKeys);
+      connectionCache.getAdmin().createTable(descriptor, split);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void deleteTable(TTableName tableName) throws TIOError, TException {
-
+  @Override
+  public void deleteTable(TTableName tableName) throws TIOError, TException {
+    try {
+      TableName table = tableNameFromThrift(tableName);
+      connectionCache.getAdmin().deleteTable(table);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void truncateTable(TTableName tableName, boolean preserveSplits)
+  @Override
+  public void truncateTable(TTableName tableName, boolean preserveSplits)
       throws TIOError, TException {
-
+    try {
+      TableName table = tableNameFromThrift(tableName);
+      connectionCache.getAdmin().truncateTable(table, preserveSplits);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void enableTable(TTableName tableName) throws TIOError, TException {
-
+  @Override
+  public void enableTable(TTableName tableName) throws TIOError, TException {
+    try {
+      TableName table = tableNameFromThrift(tableName);
+      connectionCache.getAdmin().enableTable(table);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void disableTable(TTableName tableName) throws TIOError, TException {
-
+  @Override
+  public void disableTable(TTableName tableName) throws TIOError, TException {
+    try {
+      TableName table = tableNameFromThrift(tableName);
+      connectionCache.getAdmin().disableTable(table);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
   @Override
@@ -641,51 +709,113 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
     }
   }
 
-  @Override public void addColumnFamily(TTableName tableName, TColumnFamilyDescriptor column)
+  @Override
+  public void addColumnFamily(TTableName tableName, TColumnFamilyDescriptor column)
       throws TIOError, TException {
-    throw new NotImplementedException();
+    try {
+      TableName table = tableNameFromThrift(tableName);
+      HColumnDescriptor columnFamilyDescriptor = columnDescriptorFromThrift(column);
+      connectionCache.getAdmin().addColumn(table, columnFamilyDescriptor);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void deleteColumnFamily(TTableName tableName, ByteBuffer column)
+  @Override
+  public void deleteColumnFamily(TTableName tableName, ByteBuffer column)
       throws TIOError, TException {
-    throw new NotImplementedException();
+    try {
+      TableName table = tableNameFromThrift(tableName);
+      connectionCache.getAdmin().deleteColumn(table, column.array());
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void modifyColumnFamily(TTableName tableName, TColumnFamilyDescriptor column)
+  @Override
+  public void modifyColumnFamily(TTableName tableName, TColumnFamilyDescriptor column)
       throws TIOError, TException {
-    throw new NotImplementedException();
+    try {
+      TableName table = tableNameFromThrift(tableName);
+      HColumnDescriptor columnFamilyDescriptor = columnDescriptorFromThrift(column);
+      connectionCache.getAdmin().modifyColumn(table, columnFamilyDescriptor);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void modifyTable(TTableDescriptor desc) throws TIOError, TException {
-    throw new NotImplementedException();
+  @Override
+  public void modifyTable(TTableDescriptor desc) throws TIOError, TException {
+    try {
+      HTableDescriptor descriptor = tableDescriptorFromThrift(desc);
+      connectionCache.getAdmin().modifyTable(descriptor.getTableName(), descriptor);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void createNamespace(TNamespaceDescriptor namespaceDesc)
+  @Override
+  public void createNamespace(TNamespaceDescriptor namespaceDesc)
       throws TIOError, TException {
-    throw new NotImplementedException();
+    try {
+      NamespaceDescriptor descriptor = namespaceDescriptorFromThrift(namespaceDesc);
+      connectionCache.getAdmin().createNamespace(descriptor);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void modifyNamespace(TNamespaceDescriptor namespaceDesc)
+  @Override
+  public void modifyNamespace(TNamespaceDescriptor namespaceDesc)
       throws TIOError, TException {
-    throw new NotImplementedException();
+    try {
+      NamespaceDescriptor descriptor = namespaceDescriptorFromThrift(namespaceDesc);
+      connectionCache.getAdmin().modifyNamespace(descriptor);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public void deleteNamespace(String name) throws TIOError, TException {
-    throw new NotImplementedException();
+  @Override
+  public void deleteNamespace(String name) throws TIOError, TException {
+    try {
+      connectionCache.getAdmin().deleteNamespace(name);
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public TNamespaceDescriptor getNamespaceDescriptor(String name)
+  @Override
+  public TNamespaceDescriptor getNamespaceDescriptor(String name)
       throws TIOError, TException {
-    throw new NotImplementedException();
+    try {
+      return namespaceDescriptorFromHBase(connectionCache.getAdmin().getNamespaceDescriptor(name));
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public List<TNamespaceDescriptor> listNamespaceDescriptors()
+  @Override
+  public List<TNamespaceDescriptor> listNamespaceDescriptors()
       throws TIOError, TException {
-    throw new NotImplementedException();
+    try {
+      return namespaceDescriptorsFromHBase(connectionCache.getAdmin().listNamespaceDescriptors());
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
   }
 
-  @Override public List<String> listNamespaces() throws TIOError, TException {
-    throw new NotImplementedException();
+  @Override
+  public List<String> listNamespaces() throws TIOError, TException {
+    List<String> result = new ArrayList<>();
+    try {
+      for (NamespaceDescriptor nd : connectionCache.getAdmin().listNamespaceDescriptors()) {
+        result.add(nd.getName());
+      }
+    } catch (IOException e) {
+      throw getTIOError(e);
+    }
+    return result;
   }
 
   @Override
@@ -693,12 +823,14 @@ public class ThriftHBaseServiceHandler extends HBaseServiceHandler implements TH
     return TThriftServerType.TWO;
   }
 
-  @Override public List<TOnlineLogRecord> getSlowLogResponses(Set<TServerName> serverNames,
+  @Override
+  public List<TOnlineLogRecord> getSlowLogResponses(Set<TServerName> serverNames,
       TLogQueryFilter logQueryFilter) throws TIOError, TException {
     throw new NotImplementedException();
   }
 
-  @Override public List<Boolean> clearSlowLogResponses(Set<TServerName> serverNames)
+  @Override
+  public List<Boolean> clearSlowLogResponses(Set<TServerName> serverNames)
       throws TIOError, TException {
     throw new NotImplementedException();
   }
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
index f6df35b..b310fd1 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
@@ -31,9 +31,11 @@ import java.util.Set;
 import org.apache.commons.collections.MapUtils;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
+import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HRegionLocation;
+import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeepDeletedCells;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
@@ -57,6 +59,7 @@ import org.apache.hadoop.hbase.exceptions.DeserializationException;
 import org.apache.hadoop.hbase.filter.CompareFilter;
 import org.apache.hadoop.hbase.filter.Filter;
 import org.apache.hadoop.hbase.filter.ParseFilter;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.io.TimeRange;
 import org.apache.hadoop.hbase.io.compress.Compression;
 import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
@@ -70,6 +73,7 @@ import org.apache.hadoop.hbase.thrift2.generated.TAuthorization;
 import org.apache.hadoop.hbase.thrift2.generated.TBloomFilterType;
 import org.apache.hadoop.hbase.thrift2.generated.TCellVisibility;
 import org.apache.hadoop.hbase.thrift2.generated.TColumn;
+import org.apache.hadoop.hbase.thrift2.generated.TColumnFamilyDescriptor;
 import org.apache.hadoop.hbase.thrift2.generated.TColumnIncrement;
 import org.apache.hadoop.hbase.thrift2.generated.TColumnValue;
 import org.apache.hadoop.hbase.thrift2.generated.TCompareOp;
@@ -92,6 +96,7 @@ import org.apache.hadoop.hbase.thrift2.generated.TResult;
 import org.apache.hadoop.hbase.thrift2.generated.TRowMutations;
 import org.apache.hadoop.hbase.thrift2.generated.TScan;
 import org.apache.hadoop.hbase.thrift2.generated.TServerName;
+import org.apache.hadoop.hbase.thrift2.generated.TTableDescriptor;
 import org.apache.hadoop.hbase.thrift2.generated.TTableName;
 import org.apache.hadoop.hbase.thrift2.generated.TTimeRange;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -104,8 +109,6 @@ public class ThriftUtilities {
   private final static Result EMPTY_RESULT = Result.create(EMPTY_CELL_ARRAY);
   private final static Result EMPTY_RESULT_STALE = Result.create(EMPTY_CELL_ARRAY, null, true);
 
-
-
   private ThriftUtilities() {
     throw new UnsupportedOperationException("Can't initialize class");
   }
@@ -930,8 +933,6 @@ public class ThriftUtilities {
     }
   }
 
-
-
   public static TBloomFilterType bloomFilterFromHBase(BloomType in) {
     switch (in) {
       case NONE: return TBloomFilterType.NONE;
@@ -1293,4 +1294,138 @@ public class ThriftUtilities {
     }
     return result;
   }
+
+  public static HColumnDescriptor columnDescriptorFromThrift(TColumnFamilyDescriptor in) {
+    HColumnDescriptor out = new HColumnDescriptor(in.getName());
+    if (in.isSetAttributes()) {
+      for (Map.Entry<ByteBuffer, ByteBuffer> attribute : in.getAttributes().entrySet()) {
+        out.setValue(attribute.getKey().array(), attribute.getValue().array());
+      }
+    }
+    if (in.isSetConfiguration()) {
+      for (Map.Entry<String, String> conf : in.getConfiguration().entrySet()) {
+        out.setConfiguration(conf.getKey(), conf.getValue());
+      }
+    }
+    if (in.isSetBlockSize()) {
+      out.setBlocksize(in.getBlockSize());
+    }
+    if (in.isSetBloomnFilterType()) {
+      out.setBloomFilterType(bloomFilterFromThrift(in.getBloomnFilterType()));
+    }
+    if (in.isSetCompressionType()) {
+      out.setCompressionType(compressionAlgorithmFromThrift(in.getCompressionType()));
+    }
+    if (in.isSetDfsReplication()) {
+      out.setDFSReplication(in.getDfsReplication());
+    }
+    if (in.isSetDataBlockEncoding()) {
+      out.setDataBlockEncoding(dataBlockEncodingFromThrift(in.getDataBlockEncoding()));
+    }
+    if (in.isSetKeepDeletedCells()) {
+      out.setKeepDeletedCells(keepDeletedCellsFromThrift(in.getKeepDeletedCells()));
+    }
+    if (in.isSetMaxVersions()) {
+      out.setMaxVersions(in.getMaxVersions());
+    }
+    if (in.isSetMinVersions()) {
+      out.setMinVersions(in.getMinVersions());
+    }
+    if (in.isSetScope()) {
+      out.setScope(in.getScope());
+    }
+    if (in.isSetTimeToLive()) {
+      out.setTimeToLive(in.getTimeToLive());
+    }
+    if (in.isSetBlockCacheEnabled()) {
+      out.setBlockCacheEnabled(in.isBlockCacheEnabled());
+    }
+    if (in.isSetCacheBloomsOnWrite()) {
+      out.setCacheBloomsOnWrite(in.isCacheBloomsOnWrite());
+    }
+    if (in.isSetCacheDataOnWrite()) {
+      out.setCacheDataOnWrite(in.isCacheDataOnWrite());
+    }
+    if (in.isSetCacheIndexesOnWrite()) {
+      out.setCacheIndexesOnWrite(in.isCacheIndexesOnWrite());
+    }
+    if (in.isSetCompressTags()) {
+      out.setCompressTags(in.isCompressTags());
+    }
+    if (in.isSetEvictBlocksOnClose()) {
+      out.setEvictBlocksOnClose(in.isEvictBlocksOnClose());
+    }
+    if (in.isSetInMemory()) {
+      out.setInMemory(in.isInMemory());
+    }
+    return out;
+  }
+
+  public static TColumnFamilyDescriptor columnDescriptorFromHBase(HColumnDescriptor in) {
+    TColumnFamilyDescriptor out = new TColumnFamilyDescriptor();
+    out.setName(in.getName());
+    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> attribute :
+      in.getValues().entrySet()) {
+      out.putToAttributes(ByteBuffer.wrap(attribute.getKey().get()),
+        ByteBuffer.wrap(attribute.getValue().get()));
+    }
+    for (Map.Entry<String, String> conf : in.getConfiguration().entrySet()) {
+      out.putToConfiguration(conf.getKey(), conf.getValue());
+    }
+    out.setBlockSize(in.getBlocksize());
+    out.setBloomnFilterType(bloomFilterFromHBase(in.getBloomFilterType()));
+    out.setCompressionType(compressionAlgorithmFromHBase(in.getCompressionType()));
+    out.setDfsReplication(in.getDFSReplication());
+    out.setDataBlockEncoding(dataBlockEncodingFromHBase(in.getDataBlockEncoding()));
+    out.setKeepDeletedCells(keepDeletedCellsFromHBase(in.getKeepDeletedCells()));
+    out.setMaxVersions(in.getMaxVersions());
+    out.setMinVersions(in.getMinVersions());
+    out.setScope(in.getScope());
+    out.setTimeToLive(in.getTimeToLive());
+    out.setBlockCacheEnabled(in.isBlockCacheEnabled());
+    out.setCacheBloomsOnWrite(in.isCacheBloomsOnWrite());
+    out.setCacheDataOnWrite(in.isCacheDataOnWrite());
+    out.setCacheIndexesOnWrite(in.isCacheIndexesOnWrite());
+    out.setCompressTags(in.isCompressTags());
+    out.setEvictBlocksOnClose(in.isEvictBlocksOnClose());
+    out.setInMemory(in.isInMemory());
+    return out;
+  }
+
+  public static HTableDescriptor tableDescriptorFromThrift(TTableDescriptor in) {
+    HTableDescriptor out = new HTableDescriptor(tableNameFromThrift(in.getTableName()));
+    for (TColumnFamilyDescriptor col : in.getColumns()) {
+      out.addFamily(columnDescriptorFromThrift(col));
+    }
+
+    Map<ByteBuffer, ByteBuffer> map = in.getAttributes();
+    for (Map.Entry<ByteBuffer, ByteBuffer> e : map.entrySet()) {
+      out.setValue(e.getKey().array(), e.getValue().array());
+    }
+    return out;
+  }
+
+  public static TTableDescriptor tableDescriptorFromHBase(HTableDescriptor in) {
+    TTableDescriptor out = new TTableDescriptor();
+    out.setTableName(tableNameFromHBase(in.getTableName()));
+    Map<ImmutableBytesWritable, ImmutableBytesWritable> attributes = in.getValues();
+    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> attribute
+      : attributes.entrySet()) {
+      out.putToAttributes(ByteBuffer.wrap(attribute.getKey().get()),
+        ByteBuffer.wrap(attribute.getValue().get()));
+    }
+    for (HColumnDescriptor column : in.getColumnFamilies()) {
+      out.addToColumns(columnDescriptorFromHBase(column));
+    }
+    out.setDurability(durabilityFromHBase(in.getDurability()));
+    return out;
+  }
+
+  public static List<TTableDescriptor> tableDescriptorsFromHBase(List<HTableDescriptor> in) {
+    List<TTableDescriptor> out = new ArrayList<>(in.size());
+    for (HTableDescriptor descriptor : in) {
+      out.add(tableDescriptorFromHBase(descriptor));
+    }
+    return out;
+  }
 }