From 47468bf95777d45b70cb7e0b865793b28ed02845 Mon Sep 17 00:00:00 2001 From: Namit Jain Date: Mon, 24 Jan 2011 23:26:23 +0000 Subject: [PATCH] HIVE-1897 Alter command execution "when HDFS is down" results in holding stale data in MetaStore (Chinna Rao Lalam via namit) git-svn-id: https://svn.apache.org/repos/asf/hive/trunk@1063060 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 3 +++ .../hadoop/hive/metastore/HiveAlterHandler.java | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 4354acb877c3..429faacca080 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -716,6 +716,9 @@ Trunk - Unreleased HIVE-1917 CTAS (create-table-as-select) throws exception when showing results (Ning Zhang via namit) + HIVE-1897 Alter command execution "when HDFS is down" results in holding + stale data in MetaStore (Chinna Rao Lalam via namit) + TESTS HIVE-1464. improve test query performance diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java index fa6b5ae8a261..81d667ba1683 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java @@ -74,6 +74,7 @@ public void alterTable(RawStore msdb, Warehouse wh, String dbname, String newTblLoc = null; boolean moveData = false; boolean rename = false; + Table oldt = null; try { msdb.openTransaction(); name = name.toLowerCase(); @@ -90,7 +91,7 @@ public void alterTable(RawStore msdb, Warehouse wh, String dbname, } // get old table - Table oldt = msdb.getTable(dbname, name); + oldt = msdb.getTable(dbname, name); if (oldt == null) { throw new InvalidOperationException("table " + newt.getDbName() + "." + newt.getTableName() + " doesn't exist"); @@ -194,6 +195,17 @@ public void alterTable(RawStore msdb, Warehouse wh, String dbname, srcFs.rename(srcPath, destPath); } } catch (IOException e) { + boolean revertMetaDataTransaction = false; + try { + msdb.openTransaction(); + msdb.alterTable(dbname, newt.getTableName(), oldt); + revertMetaDataTransaction = msdb.commitTransaction(); + } catch (Exception e1) { + LOG.error("Reverting metadata opeation failed During HDFS operation failed", e1); + if (!revertMetaDataTransaction) { + msdb.rollbackTransaction(); + } + } throw new InvalidOperationException("Unable to access old location " + srcPath + " for table " + dbname + "." + name); }