Repository: trafodion
Updated Branches:
  refs/heads/master dcbc9f2c9 -> 072708f1b


[TRAFODION-3025] add create option storage policy


Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/5724227c
Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/5724227c
Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/5724227c

Branch: refs/heads/master
Commit: 5724227c48f1fa33e993a5642803792fb0478867
Parents: 027c7f5
Author: Liu Ming <ovis_p...@sina.com>
Authored: Sat Apr 21 11:26:52 2018 -0400
Committer: Liu Ming <ovis_p...@sina.com>
Committed: Sat Apr 21 11:26:52 2018 -0400

----------------------------------------------------------------------
 core/sql/executor/HBaseClient_JNI.cpp           |   5 +
 core/sql/exp/ExpHbaseDefs.h                     |   1 +
 core/sql/regress/seabase/EXPECTED002            |   2 +
 core/sql/regress/seabase/TEST002                |   1 +
 core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp        |   5 +
 .../java/org/trafodion/sql/HBaseClient.java     | 104 ++++++++++++++++++-
 6 files changed, 116 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafodion/blob/5724227c/core/sql/executor/HBaseClient_JNI.cpp
----------------------------------------------------------------------
diff --git a/core/sql/executor/HBaseClient_JNI.cpp 
b/core/sql/executor/HBaseClient_JNI.cpp
index 8726fb8..a231241 100644
--- a/core/sql/executor/HBaseClient_JNI.cpp
+++ b/core/sql/executor/HBaseClient_JNI.cpp
@@ -535,10 +535,14 @@ HBC_RetCode HBaseClient_JNI::create(const char* fileName, 
HBASE_NAMELIST& colFam
 
   if (jresult == false) 
   {
+printf("LMDBG: jresult is false\n");
     logError(CAT_SQL_HBASE, "HBaseClient_JNI::create()", getLastError());
     jenv_->PopLocalFrame(NULL);
     return HBC_ERROR_CREATE_EXCEPTION;
   }
+  else
+printf("LMDBG: jresult is true\n");
+
   jenv_->PopLocalFrame(NULL);
   return HBC_OK;
 }
@@ -604,6 +608,7 @@ HBC_RetCode HBaseClient_JNI::create(const char* fileName,
   if (jresult == false) 
   {
     logError(CAT_SQL_HBASE, "HBaseClient_JNI::create()", getLastError());
+    GetCliGlobals()->setJniErrorStr(getLastError());
     jenv_->PopLocalFrame(NULL);
     return HBC_ERROR_CREATE_EXCEPTION;
   }

http://git-wip-us.apache.org/repos/asf/trafodion/blob/5724227c/core/sql/exp/ExpHbaseDefs.h
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpHbaseDefs.h b/core/sql/exp/ExpHbaseDefs.h
index 598328c..b3f8475 100644
--- a/core/sql/exp/ExpHbaseDefs.h
+++ b/core/sql/exp/ExpHbaseDefs.h
@@ -74,6 +74,7 @@ enum HbaseOptionEnum
     HBASE_SPLIT_POLICY                = 22,   //   "
     HBASE_CACHE_DATA_IN_L1            = 23,   // column family
     HBASE_PREFETCH_BLOCKS_ON_OPEN     = 24,   //   "
+    HBASE_HDFS_STORAGE_POLICY         = 25,   //   "
     HBASE_MAX_OPTIONS
   };
 

http://git-wip-us.apache.org/repos/asf/trafodion/blob/5724227c/core/sql/regress/seabase/EXPECTED002
----------------------------------------------------------------------
diff --git a/core/sql/regress/seabase/EXPECTED002 
b/core/sql/regress/seabase/EXPECTED002
index 286b157..a98ae97 100644
--- a/core/sql/regress/seabase/EXPECTED002
+++ b/core/sql/regress/seabase/EXPECTED002
@@ -1313,6 +1313,7 @@ FS_DATA_TYPE  SQL_DATA_TYPE         DISPLAY_DATA_TYPE
 +>memstore_flush_size = '2000000',
 +>split_policy = 
'org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy',
 +>CACHE_DATA_IN_L1 = 'false',
++>HDFS_STORAGE_POLICY = 'hot' ,
 +>prefetch_blocks_on_open = 'false'
 +>);
 
@@ -1350,6 +1351,7 @@ CREATE TABLE TRAFODION.T002SCH.CREATEOPTIONS
     MEMSTORE_FLUSH_SIZE = '2000000',
     SPLIT_POLICY = 
'org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy',
     CACHE_DATA_IN_L1 = 'false',
+    HDFS_STORAGE_POLICY = 'hot',
     PREFETCH_BLOCKS_ON_OPEN = 'false'
   )
 ;

http://git-wip-us.apache.org/repos/asf/trafodion/blob/5724227c/core/sql/regress/seabase/TEST002
----------------------------------------------------------------------
diff --git a/core/sql/regress/seabase/TEST002 b/core/sql/regress/seabase/TEST002
index c7bc291..081793f 100644
--- a/core/sql/regress/seabase/TEST002
+++ b/core/sql/regress/seabase/TEST002
@@ -261,6 +261,7 @@ durability = 'async_wal',
 memstore_flush_size = '2000000',
 split_policy = 
'org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy',
 CACHE_DATA_IN_L1 = 'false',
+HDFS_STORAGE_POLICY = 'hot' ,
 prefetch_blocks_on_open = 'false'
 );
 

http://git-wip-us.apache.org/repos/asf/trafodion/blob/5724227c/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp 
b/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
index fa43caa..14f07c2 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
+++ b/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
@@ -2488,6 +2488,11 @@ short CmpSeabaseDDL::generateHbaseOptionsArray(
           else
              isError = TRUE;
         }
+      else if (hbaseOption->key() == "HDFS_STORAGE_POLICY")
+        {
+          hbaseCreateOptionsArray[HBASE_HDFS_STORAGE_POLICY] =
+            hbaseOption->val();
+        }
       else
         isError = TRUE;
 

http://git-wip-us.apache.org/repos/asf/trafodion/blob/5724227c/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
----------------------------------------------------------------------
diff --git a/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java 
b/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
index ffb42a2..94517bf 100644
--- a/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
+++ b/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
@@ -34,6 +34,8 @@ import java.util.Map;
 import java.util.Arrays;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 
 import org.apache.log4j.PropertyConfigurator;
 import org.apache.log4j.Logger;
@@ -93,6 +95,8 @@ import java.util.TreeSet;
 
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.LocatedFileStatus;
 import org.apache.hadoop.fs.permission.AclEntry;
 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.io.hfile.HFile;
@@ -161,6 +165,7 @@ public class HBaseClient {
     public static final int HBASE_SPLIT_POLICY = 22;
     public static final int HBASE_CACHE_DATA_IN_L1 = 23;
     public static final int HBASE_PREFETCH_BLOCKS_ON_OPEN = 24;
+    public static final int HBASE_HDFS_STORAGE_POLICY= 25;
 
 
     private static Connection connection; 
@@ -237,10 +242,12 @@ public class HBaseClient {
    private class ChangeFlags {
        boolean tableDescriptorChanged;
        boolean columnDescriptorChanged;
+       boolean storagePolicyChanged;
 
        ChangeFlags() {
            tableDescriptorChanged = false;
            columnDescriptorChanged = false;
+           storagePolicyChanged = false;
        }
 
        void setTableDescriptorChanged() {
@@ -258,6 +265,19 @@ public class HBaseClient {
        boolean columnDescriptorChanged() {
            return columnDescriptorChanged;
        }
+
+       void setStoragePolicyChanged(String str) {
+           storagePolicy_ = str;
+           storagePolicyChanged = true;
+       }
+
+       boolean storagePolicyChanged()    {
+           return storagePolicyChanged;
+       }
+
+       String storagePolicy_;
+
+
    }
 
    private ChangeFlags setDescriptors(Object[] tableOptions,
@@ -477,6 +497,11 @@ public class HBaseClient {
                  colDesc.setPrefetchBlocksOnOpen(false); 
              returnStatus.setColumnDescriptorChanged();
              break ;
+           case HBASE_HDFS_STORAGE_POLICY:
+               //TODO HBase 2.0 support this
+               //So when come to HBase 2.0, no need to do this via HDFS, just 
set here
+             returnStatus.setStoragePolicyChanged(tableOption);
+             break ;
            case HBASE_SPLIT_POLICY:
                // This method not yet available in earlier versions
                // desc.setRegionSplitPolicyClassName(tableOption));
@@ -498,6 +523,7 @@ public class HBaseClient {
        throws IOException, MasterNotRunningException {
             if (logger.isDebugEnabled()) logger.debug("HBaseClient.createk(" + 
tblName + ") called.");
             String trueStr = "TRUE";
+            ChangeFlags setDescRet = null;
             HTableDescriptor desc = new HTableDescriptor(tblName);
             addCoprocessor(desc);
             int defaultVersionsValue = 0;
@@ -518,7 +544,7 @@ public class HBaseClient {
                 HColumnDescriptor colDesc = new HColumnDescriptor(colFam);
 
                 // change the descriptors based on the tableOptions; 
-                setDescriptors(tableOptions,desc /*out*/,colDesc /*out*/, 
defaultVersionsValue);
+                setDescRet = setDescriptors(tableOptions,desc /*out*/,colDesc 
/*out*/, defaultVersionsValue);
                 
                 desc.addFamily(colDesc);
             }
@@ -552,10 +578,84 @@ public class HBaseClient {
                      admin.createTable(desc);
                   }
                }
-            admin.close();
+
+            if(setDescRet!= null)
+              if(setDescRet.storagePolicyChanged())
+              {
+                 //change the HDFS storage policy
+                 //get the HBase table path
+                 String hbaseRoot = config.get("hbase.rootdir");
+                 FileSystem fs = FileSystem.get(config);
+                 //Construct the HDFS dir
+                 //find out if namespace is there
+                 String[] parts = tblName.split(":");
+                 String namespacestr="";
+
+                 //guess the path pattern
+                 //different HBase version may have different path pattern
+                 //There is no interface to get this information using HBase 
User API
+                 //Since it is HBase internal behavior
+                 //At present, before HBase 2.0 release and before HBASE-19858 
released in HBase 1.5.0
+                 //Trafodion here need a trick to guess
+                 String fullPath = hbaseRoot + "/data/" ;
+                 String fullPath2 = hbaseRoot + "/data/default/";
+
+                 //check if fullPath2 exist
+                 if(fs.exists(new Path(fullPath2)))
+                    fullPath = fullPath2;
+
+                 if(parts.length >1) //have namespace
+                   fullPath = fullPath + parts[0] + "/" + parts[1];
+                 else
+                   fullPath = fullPath + tblName;
+
+                 if (logger.isDebugEnabled()) logger.debug("createk table 
fullPath is " + fullPath);
+
+                 String invokeret = invokeSetStoragePolicy(fs, fullPath, 
setDescRet.storagePolicy_ ) ;
+
+                 if( invokeret != null)
+                 {
+                   //error handling
+                   admin.close();
+                   throw new IOException(invokeret);
+                 }
+              }
+
+        admin.close();
         return true;
     }
 
+    private static String invokeSetStoragePolicy(final FileSystem fs, final 
String pathstr,
+      final String storagePolicy) {
+        String ret = null;
+        Path path = new Path(pathstr);
+        Method m = null;
+        try {
+            m = fs.getClass().getDeclaredMethod("setStoragePolicy",
+            new Class<?>[] { Path.class, String.class });
+            m.setAccessible(true);
+        } catch (NoSuchMethodException e) {
+            ret = "FileSystem doesn't support setStoragePolicy";
+            m = null;
+        } catch (SecurityException e) {
+          ret = "No access to setStoragePolicy on FileSystem from the 
SecurityManager";
+          m = null; // could happen on setAccessible() or getDeclaredMethod()
+        }
+        if (m != null) {
+          try {
+            m.invoke(fs, path, storagePolicy);
+            if (logger.isDebugEnabled()) {
+              logger.debug("Set storagePolicy=" + storagePolicy + " for path=" 
+ path);
+            }
+          } catch (Exception e) {
+               logger.error("invoke set storage policy error : " + e);
+               ret = "invoke set storage policy error : " + e.getMessage();
+          }
+        }
+
+       return ret;
+    }
+
     public boolean registerTruncateOnAbort(String tblName, long transID)
         throws MasterNotRunningException, IOException {
 

Reply via email to