You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by px...@apache.org on 2016/08/23 06:51:56 UTC

hive git commit: HIVE-14511: Improve MSCK for partitioned table to deal with special cases (Pengcheng Xiong, reviewed by Ashutosh Chauhan)

Repository: hive
Updated Branches:
  refs/heads/master 127898f52 -> 477728956


HIVE-14511: Improve MSCK for partitioned table to deal with special cases (Pengcheng Xiong, reviewed by Ashutosh Chauhan)


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

Branch: refs/heads/master
Commit: 4777289561340471c4d40184c3fa23d9a35b2599
Parents: 127898f
Author: Pengcheng Xiong <px...@apache.org>
Authored: Mon Aug 22 23:51:38 2016 -0700
Committer: Pengcheng Xiong <px...@apache.org>
Committed: Mon Aug 22 23:51:38 2016 -0700

----------------------------------------------------------------------
 .../hive/ql/metadata/HiveMetaStoreChecker.java  | 103 ++++++++++++++-----
 .../ql/metadata/TestHiveMetaStoreChecker.java   |  20 +---
 .../test/queries/clientnegative/msck_repair_1.q |  17 +++
 .../test/queries/clientnegative/msck_repair_2.q |  18 ++++
 .../test/queries/clientnegative/msck_repair_3.q |  19 ++++
 .../test/queries/clientpositive/msck_repair_1.q |  18 ++++
 .../test/queries/clientpositive/msck_repair_2.q |  20 ++++
 .../test/queries/clientpositive/msck_repair_3.q |  17 +++
 .../results/clientnegative/msck_repair_1.q.out  |  19 ++++
 .../results/clientnegative/msck_repair_2.q.out  |  19 ++++
 .../results/clientnegative/msck_repair_3.q.out  |  19 ++++
 .../results/clientpositive/msck_repair_1.q.out  |  39 +++++++
 .../results/clientpositive/msck_repair_2.q.out  |  39 +++++++
 .../results/clientpositive/msck_repair_3.q.out  |  39 +++++++
 14 files changed, 364 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMetaStoreChecker.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMetaStoreChecker.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMetaStoreChecker.java
index a164b12..34b76b8 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMetaStoreChecker.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMetaStoreChecker.java
@@ -310,7 +310,7 @@ public class HiveMetaStoreChecker {
     // now check the table folder and see if we find anything
     // that isn't in the metastore
     Set<Path> allPartDirs = new HashSet<Path>();
-    getAllLeafDirs(tablePath, allPartDirs);
+    checkPartitionDirs(tablePath, allPartDirs, table.getPartCols().size());
     // don't want the table dir
     allPartDirs.remove(tablePath);
 
@@ -358,21 +358,25 @@ public class HiveMetaStoreChecker {
   }
 
   /**
-   * Recursive method to get the leaf directories of a base path. Example:
-   * base/dir1/dir2 base/dir3
-   *
-   * This will return dir2 and dir3 but not dir1.
+   * Assume that depth is 2, i.e., partition columns are a and b
+   * tblPath/a=1  => throw exception
+   * tblPath/a=1/file => throw exception
+   * tblPath/a=1/b=2/file => return a=1/b=2
+   * tblPath/a=1/b=2/c=3 => return a=1/b=2
+   * tblPath/a=1/b=2/c=3/file => return a=1/b=2
    *
    * @param basePath
    *          Start directory
    * @param allDirs
    *          This set will contain the leaf paths at the end.
+   * @param maxDepth
+   *          Specify how deep the search goes.
    * @throws IOException
    *           Thrown if we can't get lists from the fs.
    * @throws HiveException 
    */
 
-  private void getAllLeafDirs(Path basePath, Set<Path> allDirs) throws IOException, HiveException {
+  private void checkPartitionDirs(Path basePath, Set<Path> allDirs, int maxDepth) throws IOException, HiveException {
     ConcurrentLinkedQueue<Path> basePaths = new ConcurrentLinkedQueue<>();
     basePaths.add(basePath);
     // we only use the keySet of ConcurrentHashMap
@@ -390,33 +394,53 @@ public class HiveMetaStoreChecker {
       LOG.debug("Using threaded version of MSCK-GetPaths with number of threads "
           + ((ThreadPoolExecutor) pool).getPoolSize());
     }
-    getAllLeafDirs(pool, basePaths, dirSet, basePath.getFileSystem(conf));
+    checkPartitionDirs(pool, basePaths, dirSet, basePath.getFileSystem(conf), maxDepth, maxDepth);
     pool.shutdown();
     allDirs.addAll(dirSet.keySet());
   }
 
   // process the basePaths in parallel and then the next level of basePaths
-  private void getAllLeafDirs(final ExecutorService pool, final ConcurrentLinkedQueue<Path> basePaths,
-      final Map<Path, Object> allDirs, final FileSystem fs) throws IOException, HiveException {
+  private void checkPartitionDirs(final ExecutorService pool,
+      final ConcurrentLinkedQueue<Path> basePaths, final Map<Path, Object> allDirs,
+      final FileSystem fs, final int depth, final int maxDepth) throws IOException, HiveException {
     final ConcurrentLinkedQueue<Path> nextLevel = new ConcurrentLinkedQueue<>();
     if (null == pool) {
       for (final Path path : basePaths) {
         FileStatus[] statuses = fs.listStatus(path, FileUtils.HIDDEN_FILES_PATH_FILTER);
-        boolean directoryFound = false;
+        boolean fileFound = false;
         for (FileStatus status : statuses) {
-          if (status.isDir()) {
-            directoryFound = true;
+          if (status.isDirectory()) {
             nextLevel.add(status.getPath());
+          } else {
+            fileFound = true;
           }
         }
-
-        if (!directoryFound) {
-          // true is just a boolean object place holder because neither the key nor the value can be null.
+        if (depth != 0) {
+          // we are in the middle of the search and we find a file
+          if (fileFound) {
+            if ("throw".equals(HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_MSCK_PATH_VALIDATION))) {
+              throw new HiveException(
+                  "MSCK finds a file rather than a folder when it searches for " + path.toString());
+            } else {
+              LOG.warn("MSCK finds a file rather than a folder when it searches for "
+                  + path.toString());
+            }
+          }
+          if (!nextLevel.isEmpty()) {
+            checkPartitionDirs(pool, nextLevel, allDirs, fs, depth - 1, maxDepth);
+          } else if (depth != maxDepth) {
+            // since nextLevel is empty, we are missing partition columns.
+            if ("throw".equals(HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_MSCK_PATH_VALIDATION))) {
+              throw new HiveException("MSCK is missing partition columns under " + path.toString());
+            } else {
+              LOG.warn("MSCK is missing partition columns under " + path.toString());
+            }
+          }
+        } else {
+          // true is just a boolean object place holder because neither the
+          // key nor the value can be null.
           allDirs.put(path, true);
         }
-        if (!nextLevel.isEmpty()) {
-          getAllLeafDirs(pool, nextLevel, allDirs, fs);
-        }
       }
     } else {
       final List<Future<Void>> futures = new LinkedList<>();
@@ -425,16 +449,42 @@ public class HiveMetaStoreChecker {
           @Override
           public Void call() throws Exception {
             FileStatus[] statuses = fs.listStatus(path, FileUtils.HIDDEN_FILES_PATH_FILTER);
-            boolean directoryFound = false;
-
+            boolean fileFound = false;
             for (FileStatus status : statuses) {
-              if (status.isDir()) {
-                directoryFound = true;
+              if (status.isDirectory()) {
                 nextLevel.add(status.getPath());
+              } else {
+                fileFound = true;
               }
             }
-
-            if (!directoryFound) {
+            if (depth != 0) {
+              // we are in the middle of the search and we find a file
+              if (fileFound) {
+                if ("throw".equals(HiveConf.getVar(conf,
+                    HiveConf.ConfVars.HIVE_MSCK_PATH_VALIDATION))) {
+                  throw new HiveException(
+                      "MSCK finds a file rather than a folder when it searches for "
+                          + path.toString());
+                } else {
+                  LOG.warn("MSCK finds a file rather than a folder when it searches for "
+                      + path.toString());
+                }
+              }
+              if (!nextLevel.isEmpty()) {
+                checkPartitionDirs(pool, nextLevel, allDirs, fs, depth - 1, maxDepth);
+              } else if (depth != maxDepth) {
+                // since nextLevel is empty, we are missing partition columns.
+                if ("throw".equals(HiveConf.getVar(conf,
+                    HiveConf.ConfVars.HIVE_MSCK_PATH_VALIDATION))) {
+                  throw new HiveException("MSCK is missing partition columns under "
+                      + path.toString());
+                } else {
+                  LOG.warn("MSCK is missing partition columns under " + path.toString());
+                }
+              }
+            } else {
+              // true is just a boolean object place holder because neither the
+              // key nor the value can be null.
               allDirs.put(path, true);
             }
             return null;
@@ -450,10 +500,9 @@ public class HiveMetaStoreChecker {
           throw new HiveException(e.getCause());
         }
       }
-      if (!nextLevel.isEmpty()) {
-        getAllLeafDirs(pool, nextLevel, allDirs, fs);
+      if (!nextLevel.isEmpty() && depth != 0) {
+        checkPartitionDirs(pool, nextLevel, allDirs, fs, depth - 1, maxDepth);
       }
     }
   }
-
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHiveMetaStoreChecker.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHiveMetaStoreChecker.java b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHiveMetaStoreChecker.java
index 5b8ec60..3f26bcd 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHiveMetaStoreChecker.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHiveMetaStoreChecker.java
@@ -226,7 +226,10 @@ public class TestHiveMetaStoreChecker extends TestCase {
     List<Partition> partitions = hive.getPartitions(table);
     assertEquals(2, partitions.size());
     Partition partToRemove = partitions.get(0);
-    Path partToRemovePath = partToRemove.getDataLocation();
+    // As this partition (partdate=2008-01-01/partcity=london) is the only
+    // partition under (partdate=2008-01-01)
+    // we also need to delete partdate=2008-01-01 to make it consistent.
+    Path partToRemovePath = partToRemove.getDataLocation().getParent();
     fs = partToRemovePath.getFileSystem(hive.getConf());
     fs.delete(partToRemovePath, true);
 
@@ -255,20 +258,7 @@ public class TestHiveMetaStoreChecker extends TestCase {
     // put the other one back
     fs.mkdirs(partToRemovePath);
 
-    // add a partition dir on fs
-    Path fakePart = new Path(table.getDataLocation().toString(),
-        "fakepartition=fakevalue");
-    fs.mkdirs(fakePart);
-    fs.deleteOnExit(fakePart);
-
-    checker.checkMetastore(dbName, tableName, null, result);
-    // one extra partition
-    assertEquals(Collections.<String>emptyList(), result.getTablesNotInMs());
-    assertEquals(Collections.<String>emptyList(), result.getTablesNotOnFs());
-    assertEquals(Collections.<String>emptyList(), result.getPartitionsNotOnFs());
-    assertEquals(1, result.getPartitionsNotInMs().size());
-    assertEquals(fakePart.getName(), result.getPartitionsNotInMs().get(0)
-        .getPartitionName());
+    // old test is moved to msck_repair_2.q
 
     // cleanup
     hive.dropTable(dbName, tableName, true, true);

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/queries/clientnegative/msck_repair_1.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/msck_repair_1.q b/ql/src/test/queries/clientnegative/msck_repair_1.q
new file mode 100644
index 0000000..d07afaa
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/msck_repair_1.q
@@ -0,0 +1,17 @@
+set hive.msck.repair.batch.size=1;
+
+DROP TABLE IF EXISTS repairtable;
+
+CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING);
+
+MSCK TABLE repairtable;
+
+dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/repairtable/p1=c;
+
+MSCK TABLE default.repairtable;
+
+MSCK REPAIR TABLE default.repairtable;
+
+MSCK TABLE repairtable;
+
+DROP TABLE default.repairtable;

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/queries/clientnegative/msck_repair_2.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/msck_repair_2.q b/ql/src/test/queries/clientnegative/msck_repair_2.q
new file mode 100644
index 0000000..8810e70
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/msck_repair_2.q
@@ -0,0 +1,18 @@
+set hive.msck.repair.batch.size=1;
+
+DROP TABLE IF EXISTS repairtable;
+
+CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING);
+
+MSCK TABLE repairtable;
+
+dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/repairtable/p1=c;
+dfs -touchz ${system:test.warehouse.dir}/repairtable/p1=c/datafile;
+
+MSCK TABLE default.repairtable;
+
+MSCK REPAIR TABLE default.repairtable;
+
+MSCK TABLE repairtable;
+
+DROP TABLE default.repairtable;

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/queries/clientnegative/msck_repair_3.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/msck_repair_3.q b/ql/src/test/queries/clientnegative/msck_repair_3.q
new file mode 100644
index 0000000..28cce2e
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/msck_repair_3.q
@@ -0,0 +1,19 @@
+set hive.msck.repair.batch.size=1;
+
+DROP TABLE IF EXISTS repairtable;
+
+CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING);
+
+MSCK TABLE repairtable;
+
+dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/repairtable/p1=c/p2=a/p3=b;
+dfs -touchz ${system:test.warehouse.dir}/repairtable/p1=c/p2=a/p3=b/datafile;
+dfs -touchz ${system:test.warehouse.dir}/repairtable/p1=c/datafile;
+
+MSCK TABLE default.repairtable;
+
+MSCK REPAIR TABLE default.repairtable;
+
+MSCK TABLE repairtable;
+
+DROP TABLE default.repairtable;

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/queries/clientpositive/msck_repair_1.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/msck_repair_1.q b/ql/src/test/queries/clientpositive/msck_repair_1.q
new file mode 100644
index 0000000..ea596cb
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/msck_repair_1.q
@@ -0,0 +1,18 @@
+set hive.msck.repair.batch.size=1;
+
+DROP TABLE IF EXISTS repairtable;
+
+CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING);
+
+MSCK TABLE repairtable;
+
+dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/repairtable/p1=c/p2=a/p3=b;
+dfs -touchz ${system:test.warehouse.dir}/repairtable/p1=c/p2=a/p3=b/datafile;
+
+MSCK TABLE default.repairtable;
+
+MSCK REPAIR TABLE default.repairtable;
+
+MSCK TABLE repairtable;
+
+DROP TABLE default.repairtable;

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/queries/clientpositive/msck_repair_2.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/msck_repair_2.q b/ql/src/test/queries/clientpositive/msck_repair_2.q
new file mode 100644
index 0000000..d833821
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/msck_repair_2.q
@@ -0,0 +1,20 @@
+set hive.msck.repair.batch.size=1;
+set hive.msck.path.validation=skip;
+
+DROP TABLE IF EXISTS repairtable;
+
+CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING);
+
+MSCK TABLE repairtable;
+
+dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/repairtable/p1=c/p2=a/p3=b;
+dfs -touchz ${system:test.warehouse.dir}/repairtable/p1=c/p2=a/p3=b/datafile;
+dfs -touchz ${system:test.warehouse.dir}/repairtable/p1=c/datafile;
+
+MSCK TABLE default.repairtable;
+
+MSCK REPAIR TABLE default.repairtable;
+
+MSCK TABLE repairtable;
+
+DROP TABLE default.repairtable;

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/queries/clientpositive/msck_repair_3.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/msck_repair_3.q b/ql/src/test/queries/clientpositive/msck_repair_3.q
new file mode 100644
index 0000000..fdefca1
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/msck_repair_3.q
@@ -0,0 +1,17 @@
+set hive.msck.repair.batch.size=1;
+
+DROP TABLE IF EXISTS repairtable;
+
+CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING);
+
+MSCK TABLE repairtable;
+
+dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/repairtable/p1=c/p2=a/p3=b;
+
+MSCK TABLE default.repairtable;
+
+MSCK REPAIR TABLE default.repairtable;
+
+MSCK TABLE repairtable;
+
+DROP TABLE default.repairtable;

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/results/clientnegative/msck_repair_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/msck_repair_1.q.out b/ql/src/test/results/clientnegative/msck_repair_1.q.out
new file mode 100644
index 0000000..c5f644d
--- /dev/null
+++ b/ql/src/test/results/clientnegative/msck_repair_1.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: DROP TABLE IF EXISTS repairtable
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS repairtable
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@repairtable
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: MSCK TABLE default.repairtable
+PREHOOK: type: MSCK
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/results/clientnegative/msck_repair_2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/msck_repair_2.q.out b/ql/src/test/results/clientnegative/msck_repair_2.q.out
new file mode 100644
index 0000000..c5f644d
--- /dev/null
+++ b/ql/src/test/results/clientnegative/msck_repair_2.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: DROP TABLE IF EXISTS repairtable
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS repairtable
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@repairtable
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: MSCK TABLE default.repairtable
+PREHOOK: type: MSCK
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/results/clientnegative/msck_repair_3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/msck_repair_3.q.out b/ql/src/test/results/clientnegative/msck_repair_3.q.out
new file mode 100644
index 0000000..c5f644d
--- /dev/null
+++ b/ql/src/test/results/clientnegative/msck_repair_3.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: DROP TABLE IF EXISTS repairtable
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS repairtable
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@repairtable
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: MSCK TABLE default.repairtable
+PREHOOK: type: MSCK
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/results/clientpositive/msck_repair_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/msck_repair_1.q.out b/ql/src/test/results/clientpositive/msck_repair_1.q.out
new file mode 100644
index 0000000..c394f9b
--- /dev/null
+++ b/ql/src/test/results/clientpositive/msck_repair_1.q.out
@@ -0,0 +1,39 @@
+PREHOOK: query: DROP TABLE IF EXISTS repairtable
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS repairtable
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@repairtable
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: MSCK TABLE default.repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE default.repairtable
+POSTHOOK: type: MSCK
+Partitions not in metastore:	repairtable:p1=c/p2=a
+PREHOOK: query: MSCK REPAIR TABLE default.repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK REPAIR TABLE default.repairtable
+POSTHOOK: type: MSCK
+Partitions not in metastore:	repairtable:p1=c/p2=a
+Repair: Added partition to metastore default.repairtable:p1=c/p2=a
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: DROP TABLE default.repairtable
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@repairtable
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: DROP TABLE default.repairtable
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@repairtable
+POSTHOOK: Output: default@repairtable

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/results/clientpositive/msck_repair_2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/msck_repair_2.q.out b/ql/src/test/results/clientpositive/msck_repair_2.q.out
new file mode 100644
index 0000000..c394f9b
--- /dev/null
+++ b/ql/src/test/results/clientpositive/msck_repair_2.q.out
@@ -0,0 +1,39 @@
+PREHOOK: query: DROP TABLE IF EXISTS repairtable
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS repairtable
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@repairtable
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: MSCK TABLE default.repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE default.repairtable
+POSTHOOK: type: MSCK
+Partitions not in metastore:	repairtable:p1=c/p2=a
+PREHOOK: query: MSCK REPAIR TABLE default.repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK REPAIR TABLE default.repairtable
+POSTHOOK: type: MSCK
+Partitions not in metastore:	repairtable:p1=c/p2=a
+Repair: Added partition to metastore default.repairtable:p1=c/p2=a
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: DROP TABLE default.repairtable
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@repairtable
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: DROP TABLE default.repairtable
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@repairtable
+POSTHOOK: Output: default@repairtable

http://git-wip-us.apache.org/repos/asf/hive/blob/47772895/ql/src/test/results/clientpositive/msck_repair_3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/msck_repair_3.q.out b/ql/src/test/results/clientpositive/msck_repair_3.q.out
new file mode 100644
index 0000000..c394f9b
--- /dev/null
+++ b/ql/src/test/results/clientpositive/msck_repair_3.q.out
@@ -0,0 +1,39 @@
+PREHOOK: query: DROP TABLE IF EXISTS repairtable
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS repairtable
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: CREATE TABLE repairtable(col STRING) PARTITIONED BY (p1 STRING, p2 STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@repairtable
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: MSCK TABLE default.repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE default.repairtable
+POSTHOOK: type: MSCK
+Partitions not in metastore:	repairtable:p1=c/p2=a
+PREHOOK: query: MSCK REPAIR TABLE default.repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK REPAIR TABLE default.repairtable
+POSTHOOK: type: MSCK
+Partitions not in metastore:	repairtable:p1=c/p2=a
+Repair: Added partition to metastore default.repairtable:p1=c/p2=a
+PREHOOK: query: MSCK TABLE repairtable
+PREHOOK: type: MSCK
+POSTHOOK: query: MSCK TABLE repairtable
+POSTHOOK: type: MSCK
+PREHOOK: query: DROP TABLE default.repairtable
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@repairtable
+PREHOOK: Output: default@repairtable
+POSTHOOK: query: DROP TABLE default.repairtable
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@repairtable
+POSTHOOK: Output: default@repairtable