You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by xu...@apache.org on 2015/07/16 09:52:41 UTC

[23/50] [abbrv] hive git commit: HIVE-11194 - Exchange partition on external tables should fail with error message when target folder already exists (Aihua Xu, reviewd by Chao Sun)

HIVE-11194 - Exchange partition on external tables should fail with error message when target folder already exists (Aihua Xu, reviewd by Chao Sun)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/8121b9ab
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/8121b9ab
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/8121b9ab

Branch: refs/heads/parquet
Commit: 8121b9ab644cbe477df477827dd82a9859a7791b
Parents: 65e9fcf
Author: Chao Sun <su...@apache.org>
Authored: Mon Jul 13 09:36:22 2015 -0700
Committer: Chao Sun <su...@apache.org>
Committed: Mon Jul 13 09:36:22 2015 -0700

----------------------------------------------------------------------
 .../apache/hadoop/hive/common/FileUtils.java    |  9 +++-
 .../hadoop/hive/metastore/HiveMetaStore.java    |  2 +-
 .../queries/clientnegative/exchange_partition.q | 19 +++++++
 .../clientnegative/exchange_partition.q.out     | 54 ++++++++++++++++++++
 4 files changed, 82 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/8121b9ab/common/src/java/org/apache/hadoop/hive/common/FileUtils.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hadoop/hive/common/FileUtils.java b/common/src/java/org/apache/hadoop/hive/common/FileUtils.java
index c2c54bc..7e4f386 100644
--- a/common/src/java/org/apache/hadoop/hive/common/FileUtils.java
+++ b/common/src/java/org/apache/hadoop/hive/common/FileUtils.java
@@ -30,7 +30,6 @@ import java.util.List;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.DefaultFileAccess;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.FileUtil;
@@ -635,6 +634,14 @@ public final class FileUtils {
                                Path destPath, boolean inheritPerms,
                                Configuration conf) throws IOException {
     LOG.info("Renaming " + sourcePath + " to " + destPath);
+
+    // If destPath directory exists, rename call will move the sourcePath
+    // into destPath without failing. So check it before renaming.
+    if (fs.exists(destPath)) {
+      throw new IOException("Cannot rename the source path. The destination "
+          + "path already exists.");
+    }
+
     if (!inheritPerms) {
       //just rename the directory
       return fs.rename(sourcePath, destPath);

http://git-wip-us.apache.org/repos/asf/hive/blob/8121b9ab/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
----------------------------------------------------------------------
diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
index 4c9cd79..920e762 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
@@ -2581,7 +2581,7 @@ public class HiveMetaStore extends ThriftHiveMetastore {
         pathCreated = wh.renameDir(sourcePath, destPath);
         success = ms.commitTransaction();
       } finally {
-        if (!success) {
+        if (!success || !pathCreated) {
           ms.rollbackTransaction();
           if (pathCreated) {
             wh.renameDir(destPath, sourcePath);

http://git-wip-us.apache.org/repos/asf/hive/blob/8121b9ab/ql/src/test/queries/clientnegative/exchange_partition.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/exchange_partition.q b/ql/src/test/queries/clientnegative/exchange_partition.q
new file mode 100644
index 0000000..7dc4f57
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/exchange_partition.q
@@ -0,0 +1,19 @@
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/ex_table1;
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/ex_table1/part=part1;
+CREATE EXTERNAL TABLE ex_table1 ( key INT, value STRING)
+    PARTITIONED BY (part STRING)
+    STORED AS textfile
+        LOCATION 'file:${system:test.tmp.dir}/ex_table1';
+
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/ex_table2;
+
+CREATE EXTERNAL TABLE ex_table2 ( key INT, value STRING)
+    PARTITIONED BY (part STRING)
+    STORED AS textfile
+	LOCATION 'file:${system:test.tmp.dir}/ex_table2';
+
+INSERT OVERWRITE TABLE ex_table2 PARTITION (part='part1')
+SELECT key, value FROM src WHERE key < 10;
+SHOW PARTITIONS ex_table2;
+
+ALTER TABLE ex_table1 EXCHANGE PARTITION (part='part1') WITH TABLE ex_table2;

http://git-wip-us.apache.org/repos/asf/hive/blob/8121b9ab/ql/src/test/results/clientnegative/exchange_partition.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/exchange_partition.q.out b/ql/src/test/results/clientnegative/exchange_partition.q.out
new file mode 100644
index 0000000..b81fb99
--- /dev/null
+++ b/ql/src/test/results/clientnegative/exchange_partition.q.out
@@ -0,0 +1,54 @@
+PREHOOK: query: CREATE EXTERNAL TABLE ex_table1 ( key INT, value STRING)
+    PARTITIONED BY (part STRING)
+    STORED AS textfile
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+PREHOOK: Output: database:default
+PREHOOK: Output: default@ex_table1
+POSTHOOK: query: CREATE EXTERNAL TABLE ex_table1 ( key INT, value STRING)
+    PARTITIONED BY (part STRING)
+    STORED AS textfile
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@ex_table1
+PREHOOK: query: CREATE EXTERNAL TABLE ex_table2 ( key INT, value STRING)
+    PARTITIONED BY (part STRING)
+    STORED AS textfile
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+PREHOOK: Output: database:default
+PREHOOK: Output: default@ex_table2
+POSTHOOK: query: CREATE EXTERNAL TABLE ex_table2 ( key INT, value STRING)
+    PARTITIONED BY (part STRING)
+    STORED AS textfile
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@ex_table2
+PREHOOK: query: INSERT OVERWRITE TABLE ex_table2 PARTITION (part='part1')
+SELECT key, value FROM src WHERE key < 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@ex_table2@part=part1
+POSTHOOK: query: INSERT OVERWRITE TABLE ex_table2 PARTITION (part='part1')
+SELECT key, value FROM src WHERE key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@ex_table2@part=part1
+POSTHOOK: Lineage: ex_table2 PARTITION(part=part1).key EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: ex_table2 PARTITION(part=part1).value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: SHOW PARTITIONS ex_table2
+PREHOOK: type: SHOWPARTITIONS
+PREHOOK: Input: default@ex_table2
+POSTHOOK: query: SHOW PARTITIONS ex_table2
+POSTHOOK: type: SHOWPARTITIONS
+POSTHOOK: Input: default@ex_table2
+part=part1
+PREHOOK: query: ALTER TABLE ex_table1 EXCHANGE PARTITION (part='part1') WITH TABLE ex_table2
+PREHOOK: type: null
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: java.io.IOException Cannot rename the source path. The destination path already exists.)