You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pv...@apache.org on 2022/02/14 06:48:57 UTC

[hive] branch master updated: HIVE-25912: Drop external table throw NPE if the location set to ROOT (Fachuan Bai reviewed by Peter Vary) (#3009)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 108f151  HIVE-25912: Drop external table throw NPE if the location set to ROOT (Fachuan Bai reviewed by Peter Vary) (#3009)
108f151 is described below

commit 108f1513dd353a019f9182dee0a0eba35b0d6f9f
Author: 白发川(惊帆) <pi...@gmail.com>
AuthorDate: Mon Feb 14 14:48:47 2022 +0800

    HIVE-25912: Drop external table throw NPE if the location set to ROOT (Fachuan Bai reviewed by Peter Vary) (#3009)
    
    Closes #3009
---
 .../hive/metastore/utils/MetaStoreUtils.java       |  8 ++++++++
 .../apache/hadoop/hive/metastore/HMSHandler.java   |  5 +++++
 .../client/TestTablesCreateDropAlterTruncate.java  | 21 +++++++++++++++++++++
 .../metastore/utils/TestMetaStoreServerUtils.java  | 22 ++++++++++++++++++++++
 4 files changed, 56 insertions(+)

diff --git a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java
index 93c1000..07be990 100644
--- a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java
+++ b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java
@@ -186,6 +186,14 @@ public class MetaStoreUtils {
     return colNames;
   }
 
+  /*
+   * Check the table storage location must not be root path.
+   */
+  public static boolean validateTblStorage(StorageDescriptor sd) {
+    return !(StringUtils.isNotBlank(sd.getLocation())
+            && new Path(sd.getLocation()).getParent() == null);
+  }
+
   /**
    * validateName
    *
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
index bd74b3e..2d57e58 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
@@ -2282,6 +2282,11 @@ public class HMSHandler extends FacebookBase implements IHMSHandler {
           + " is not a valid object name");
     }
 
+    if (!MetaStoreUtils.validateTblStorage(tbl.getSd())) {
+      throw new InvalidObjectException(tbl.getTableName()
+              + " location must not be root path");
+    }
+
     if (!tbl.isSetCatName()) {
       tbl.setCatName(getDefaultCatalog(conf));
     }
diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java
index a6ea8cd..b92790a 100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java
@@ -78,6 +78,7 @@ import java.util.Set;
 import static org.apache.hadoop.hive.metastore.TestHiveMetaStore.createSourceTable;
 import static org.apache.hadoop.hive.metastore.Warehouse.DEFAULT_CATALOG_NAME;
 import static org.apache.hadoop.hive.metastore.Warehouse.DEFAULT_DATABASE_NAME;
+import static org.junit.Assert.assertThrows;
 
 /**
  * Test class for IMetaStoreClient API. Testing the Table related functions for metadata
@@ -357,6 +358,26 @@ public class TestTablesCreateDropAlterTruncate extends MetaStoreClientTest {
         createdTable.getSd().getLocation());
   }
 
+
+  @Test
+  public void testCreateTableRooPathLocationInSpecificDatabase() {
+    Table table = new Table();
+    StorageDescriptor sd = new StorageDescriptor();
+    List<FieldSchema> cols = new ArrayList<>();
+    sd.setLocation("hdfs://localhost:8020");
+    table.setDbName(DEFAULT_DATABASE);
+    table.setTableName("test_table_2_with_root_path");
+    cols.add(new FieldSchema("column_name", "int", null));
+    sd.setCols(cols);
+    sd.setSerdeInfo(new SerDeInfo());
+    table.setSd(sd);
+
+    Exception exception = assertThrows(InvalidObjectException.class, () -> client.createTable(table));
+    Assert.assertEquals("Storage descriptor location",
+            table.getTableName() + " location must not be root path",
+            exception.getMessage());
+  }
+
   @Test
   public void testCreateTableDefaultValuesView() throws Exception {
     Table table = new Table();
diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
index 0e74d39..c6597eb 100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
@@ -862,5 +862,27 @@ public class TestMetaStoreServerUtils {
     assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "decimal"));
   }
 
+  @Test
+  public void throwFailExceptionWithHDFSStorageIsRootPath() {
+    StorageDescriptor sd = new StorageDescriptor();
+    sd.setLocation("hdfs://localhost:8020");
+    Assert.assertFalse(MetaStoreUtils.validateTblStorage(sd));
+
+    sd.setLocation("hdfs://localhost:8020/other_path");
+    Assert.assertTrue(MetaStoreUtils.validateTblStorage(sd));
+  }
+
+  @Test
+  public void throwFailExceptionWithS3StorageIsRootPath() {
+    StorageDescriptor sd = new StorageDescriptor();
+    sd.setLocation("s3a://bucket/");
+    Assert.assertFalse(MetaStoreUtils.validateTblStorage(sd));
+
+    sd.setLocation("s3a://bucket");
+    Assert.assertFalse(MetaStoreUtils.validateTblStorage(sd));
+
+    sd.setLocation("s3a://bucket/other_path");
+    Assert.assertTrue(MetaStoreUtils.validateTblStorage(sd));
+  }
 }