Index: metastore/src/test/org/apache/hadoop/hive/metastore/DummyListener.java =================================================================== --- metastore/src/test/org/apache/hadoop/hive/metastore/DummyListener.java (revision 1427681) +++ metastore/src/test/org/apache/hadoop/hive/metastore/DummyListener.java (working copy) @@ -23,12 +23,15 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.metastore.api.MetaException; +import org.apache.hadoop.hive.metastore.events.AddIndexEvent; import org.apache.hadoop.hive.metastore.events.AddPartitionEvent; +import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; import org.apache.hadoop.hive.metastore.events.AlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterTableEvent; import org.apache.hadoop.hive.metastore.events.CreateDatabaseEvent; import org.apache.hadoop.hive.metastore.events.CreateTableEvent; import org.apache.hadoop.hive.metastore.events.DropDatabaseEvent; +import org.apache.hadoop.hive.metastore.events.DropIndexEvent; import org.apache.hadoop.hive.metastore.events.DropPartitionEvent; import org.apache.hadoop.hive.metastore.events.DropTableEvent; import org.apache.hadoop.hive.metastore.events.ListenerEvent; @@ -91,4 +94,18 @@ notifyList.add(partEvent); } + @Override + public void onAddIndex(AddIndexEvent indexEvent) throws MetaException { + notifyList.add(indexEvent); + } + + @Override + public void onDropIndex(DropIndexEvent indexEvent) throws MetaException { + notifyList.add(indexEvent); + } + + @Override + public void onAlterIndex(AlterIndexEvent indexEvent) throws MetaException { + notifyList.add(indexEvent); + } } Index: metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreEventListener.java =================================================================== --- metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreEventListener.java (revision 1427681) +++ metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreEventListener.java (working copy) @@ -28,25 +28,32 @@ import org.apache.hadoop.hive.cli.CliSessionState; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.api.Database; +import org.apache.hadoop.hive.metastore.api.Index; import org.apache.hadoop.hive.metastore.api.Partition; import org.apache.hadoop.hive.metastore.api.PartitionEventType; import org.apache.hadoop.hive.metastore.api.Table; +import org.apache.hadoop.hive.metastore.events.AddIndexEvent; import org.apache.hadoop.hive.metastore.events.AddPartitionEvent; +import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; import org.apache.hadoop.hive.metastore.events.AlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterTableEvent; import org.apache.hadoop.hive.metastore.events.CreateDatabaseEvent; import org.apache.hadoop.hive.metastore.events.CreateTableEvent; import org.apache.hadoop.hive.metastore.events.DropDatabaseEvent; +import org.apache.hadoop.hive.metastore.events.DropIndexEvent; import org.apache.hadoop.hive.metastore.events.DropPartitionEvent; import org.apache.hadoop.hive.metastore.events.DropTableEvent; import org.apache.hadoop.hive.metastore.events.ListenerEvent; import org.apache.hadoop.hive.metastore.events.LoadPartitionDoneEvent; +import org.apache.hadoop.hive.metastore.events.PreAddIndexEvent; import org.apache.hadoop.hive.metastore.events.PreAddPartitionEvent; +import org.apache.hadoop.hive.metastore.events.PreAlterIndexEvent; import org.apache.hadoop.hive.metastore.events.PreAlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.PreAlterTableEvent; import org.apache.hadoop.hive.metastore.events.PreCreateDatabaseEvent; import org.apache.hadoop.hive.metastore.events.PreCreateTableEvent; import org.apache.hadoop.hive.metastore.events.PreDropDatabaseEvent; +import org.apache.hadoop.hive.metastore.events.PreDropIndexEvent; import org.apache.hadoop.hive.metastore.events.PreDropPartitionEvent; import org.apache.hadoop.hive.metastore.events.PreDropTableEvent; import org.apache.hadoop.hive.metastore.events.PreEventContext; @@ -180,6 +187,29 @@ assertEquals(expectedDb, actualDb); } + private void validateIndex(Index expectedIndex, Index actualIndex) { + assertEquals(expectedIndex.getDbName(), actualIndex.getDbName()); + assertEquals(expectedIndex.getIndexName(), actualIndex.getIndexName()); + assertEquals(expectedIndex.getIndexHandlerClass(), actualIndex.getIndexHandlerClass()); + assertEquals(expectedIndex.getOrigTableName(), actualIndex.getOrigTableName()); + assertEquals(expectedIndex.getIndexTableName(), actualIndex.getIndexTableName()); + assertEquals(expectedIndex.getSd().getLocation(), actualIndex.getSd().getLocation()); + } + + private void validateAddIndex(Index expectedIndex, Index actualIndex) { + validateIndex(expectedIndex, actualIndex); + } + + private void validateAlterIndex(Index expectedOldIndex, Index actualOldIndex, + Index expectedNewIndex, Index actualNewIndex) { + validateIndex(expectedOldIndex, actualOldIndex); + validateIndex(expectedNewIndex, actualNewIndex); + } + + private void validateDropIndex(Index expectedIndex, Index actualIndex) { + validateIndex(expectedIndex, actualIndex); + } + public void testListener() throws Exception { int listSize = 0; @@ -215,6 +245,50 @@ PreCreateTableEvent preTblEvent = (PreCreateTableEvent)(preNotifyList.get(listSize - 1)); validateCreateTable(tbl, preTblEvent.getTable()); + driver.run("create index tmptbl_i on table tmptbl(a) as 'compact' " + + "WITH DEFERRED REBUILD IDXPROPERTIES ('prop1'='val1', 'prop2'='val2')"); + listSize += 2; // creates index table internally + assertEquals(notifyList.size(), listSize); + assertEquals(preNotifyList.size(), listSize); + + Index oldIndex = msc.getIndex(dbName, "tmptbl", "tmptbl_i"); + + AddIndexEvent addIndexEvent = (AddIndexEvent)notifyList.get(listSize - 1); + assert addIndexEvent.getStatus(); + validateAddIndex(oldIndex, addIndexEvent.getIndex()); + + PreAddIndexEvent preAddIndexEvent = (PreAddIndexEvent)(preNotifyList.get(listSize - 2)); + validateAddIndex(oldIndex, preAddIndexEvent.getIndex()); + + driver.run("alter index tmptbl_i on tmptbl set IDXPROPERTIES " + + "('prop1'='val1_new', 'prop3'='val3')"); + listSize++; + assertEquals(notifyList.size(), listSize); + assertEquals(preNotifyList.size(), listSize); + + Index newIndex = msc.getIndex(dbName, "tmptbl", "tmptbl_i"); + + AlterIndexEvent alterIndexEvent = (AlterIndexEvent) notifyList.get(listSize - 1); + assert alterIndexEvent.getStatus(); + validateAlterIndex(oldIndex, alterIndexEvent.getOldIndex(), + newIndex, alterIndexEvent.getNewIndex()); + + PreAlterIndexEvent preAlterIndexEvent = (PreAlterIndexEvent) (preNotifyList.get(listSize - 1)); + validateAlterIndex(oldIndex, preAlterIndexEvent.getOldIndex(), + newIndex, preAlterIndexEvent.getNewIndex()); + + driver.run("drop index tmptbl_i on tmptbl"); + listSize += 2; + assertEquals(notifyList.size(), listSize); + assertEquals(preNotifyList.size(), listSize); + + DropIndexEvent dropIndexEvent = (DropIndexEvent) notifyList.get(listSize - 1); + assert dropIndexEvent.getStatus(); + validateDropIndex(newIndex, dropIndexEvent.getIndex()); + + PreDropIndexEvent preDropIndexEvent = (PreDropIndexEvent) (preNotifyList.get(listSize - 2)); + validateDropIndex(newIndex, preDropIndexEvent.getIndex()); + driver.run("alter table tmptbl add partition (b='2011')"); listSize++; Partition part = msc.getPartition("tmpdb", "tmptbl", "b=2011"); Index: metastore/src/java/org/apache/hadoop/hive/metastore/events/AlterIndexEvent.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/events/AlterIndexEvent.java (working copy) +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/AlterIndexEvent.java (working copy) @@ -18,47 +18,26 @@ package org.apache.hadoop.hive.metastore.events; -import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.HiveMetaStore; +import org.apache.hadoop.hive.metastore.api.Index; +public class AlterIndexEvent extends ListenerEvent { -/** - * Base class for all the events which are defined for metastore. - */ + private final Index newIndex; + private final Index oldIndex; -public abstract class PreEventContext { - - public static enum PreEventType { - CREATE_TABLE, - DROP_TABLE, - ALTER_TABLE, - ADD_PARTITION, - DROP_PARTITION, - ALTER_PARTITION, - CREATE_DATABASE, - DROP_DATABASE, - LOAD_PARTITION_DONE + public AlterIndexEvent(Index oldIndex, Index newIndex, boolean status, + HiveMetaStore.HMSHandler handler) { + super(status, handler); + this.oldIndex = oldIndex; + this.newIndex = newIndex; } - private final PreEventType eventType; - private final HMSHandler handler; - - public PreEventContext(PreEventType eventType, HMSHandler handler) { - this.eventType = eventType; - this.handler = handler; + public Index getOldIndex() { + return oldIndex; } - /** - * @return the event type - */ - public PreEventType getEventType() { - return eventType; + public Index getNewIndex() { + return newIndex; } - - /** - * @return the handler - */ - public HMSHandler getHandler() { - return handler; - } - } Index: metastore/src/java/org/apache/hadoop/hive/metastore/events/PreDropIndexEvent.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/events/PreDropIndexEvent.java (working copy) +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/PreDropIndexEvent.java (working copy) @@ -18,47 +18,19 @@ package org.apache.hadoop.hive.metastore.events; -import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.HiveMetaStore; +import org.apache.hadoop.hive.metastore.api.Index; +public class PreDropIndexEvent extends PreEventContext { -/** - * Base class for all the events which are defined for metastore. - */ + private final Index index; -public abstract class PreEventContext { - - public static enum PreEventType { - CREATE_TABLE, - DROP_TABLE, - ALTER_TABLE, - ADD_PARTITION, - DROP_PARTITION, - ALTER_PARTITION, - CREATE_DATABASE, - DROP_DATABASE, - LOAD_PARTITION_DONE + public PreDropIndexEvent(Index index, HiveMetaStore.HMSHandler handler) { + super(PreEventType.DROP_INDEX, handler); + this.index = index; } - private final PreEventType eventType; - private final HMSHandler handler; - - public PreEventContext(PreEventType eventType, HMSHandler handler) { - this.eventType = eventType; - this.handler = handler; + public Index getIndex() { + return index; } - - /** - * @return the event type - */ - public PreEventType getEventType() { - return eventType; - } - - /** - * @return the handler - */ - public HMSHandler getHandler() { - return handler; - } - } Index: metastore/src/java/org/apache/hadoop/hive/metastore/events/AddIndexEvent.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/events/AddIndexEvent.java (working copy) +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/AddIndexEvent.java (working copy) @@ -18,47 +18,19 @@ package org.apache.hadoop.hive.metastore.events; -import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.HiveMetaStore; +import org.apache.hadoop.hive.metastore.api.Index; +public class AddIndexEvent extends ListenerEvent { -/** - * Base class for all the events which are defined for metastore. - */ + private final Index index; -public abstract class PreEventContext { - - public static enum PreEventType { - CREATE_TABLE, - DROP_TABLE, - ALTER_TABLE, - ADD_PARTITION, - DROP_PARTITION, - ALTER_PARTITION, - CREATE_DATABASE, - DROP_DATABASE, - LOAD_PARTITION_DONE + public AddIndexEvent(Index index, boolean status, HiveMetaStore.HMSHandler handler) { + super(status, handler); + this.index = index; } - private final PreEventType eventType; - private final HMSHandler handler; - - public PreEventContext(PreEventType eventType, HMSHandler handler) { - this.eventType = eventType; - this.handler = handler; + public Index getIndex() { + return index; } - - /** - * @return the event type - */ - public PreEventType getEventType() { - return eventType; - } - - /** - * @return the handler - */ - public HMSHandler getHandler() { - return handler; - } - } Index: metastore/src/java/org/apache/hadoop/hive/metastore/events/PreAlterIndexEvent.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/events/PreAlterIndexEvent.java (working copy) +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/PreAlterIndexEvent.java (working copy) @@ -18,47 +18,26 @@ package org.apache.hadoop.hive.metastore.events; -import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.HiveMetaStore; +import org.apache.hadoop.hive.metastore.api.Index; +public class PreAlterIndexEvent extends PreEventContext { -/** - * Base class for all the events which are defined for metastore. - */ +private final Index newIndex; + private final Index oldIndex; -public abstract class PreEventContext { - - public static enum PreEventType { - CREATE_TABLE, - DROP_TABLE, - ALTER_TABLE, - ADD_PARTITION, - DROP_PARTITION, - ALTER_PARTITION, - CREATE_DATABASE, - DROP_DATABASE, - LOAD_PARTITION_DONE + public PreAlterIndexEvent(Index oldIndex, Index newIndex, HiveMetaStore.HMSHandler handler) { + super(PreEventType.ALTER_INDEX, handler); + this.oldIndex = oldIndex; + this.newIndex = newIndex; } - private final PreEventType eventType; - private final HMSHandler handler; - - public PreEventContext(PreEventType eventType, HMSHandler handler) { - this.eventType = eventType; - this.handler = handler; + public Index getOldIndex() { + return oldIndex; } - /** - * @return the event type - */ - public PreEventType getEventType() { - return eventType; + public Index getNewIndex() { + return newIndex; } +} - /** - * @return the handler - */ - public HMSHandler getHandler() { - return handler; - } - -} Index: metastore/src/java/org/apache/hadoop/hive/metastore/events/PreAddIndexEvent.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/events/PreAddIndexEvent.java (working copy) +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/PreAddIndexEvent.java (working copy) @@ -18,47 +18,20 @@ package org.apache.hadoop.hive.metastore.events; -import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.HiveMetaStore; +import org.apache.hadoop.hive.metastore.api.Index; +public class PreAddIndexEvent extends PreEventContext { -/** - * Base class for all the events which are defined for metastore. - */ +private final Index table; -public abstract class PreEventContext { - - public static enum PreEventType { - CREATE_TABLE, - DROP_TABLE, - ALTER_TABLE, - ADD_PARTITION, - DROP_PARTITION, - ALTER_PARTITION, - CREATE_DATABASE, - DROP_DATABASE, - LOAD_PARTITION_DONE + public PreAddIndexEvent(Index table, HiveMetaStore.HMSHandler handler) { + super(PreEventType.ADD_INDEX, handler); + this.table = table; } - private final PreEventType eventType; - private final HMSHandler handler; - - public PreEventContext(PreEventType eventType, HMSHandler handler) { - this.eventType = eventType; - this.handler = handler; + public Index getIndex() { + return table; } +} - /** - * @return the event type - */ - public PreEventType getEventType() { - return eventType; - } - - /** - * @return the handler - */ - public HMSHandler getHandler() { - return handler; - } - -} Index: metastore/src/java/org/apache/hadoop/hive/metastore/events/PreEventContext.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/events/PreEventContext.java (revision 1427681) +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/PreEventContext.java (working copy) @@ -36,7 +36,10 @@ ALTER_PARTITION, CREATE_DATABASE, DROP_DATABASE, - LOAD_PARTITION_DONE + LOAD_PARTITION_DONE, + ADD_INDEX, + ALTER_INDEX, + DROP_INDEX } private final PreEventType eventType; Index: metastore/src/java/org/apache/hadoop/hive/metastore/events/DropIndexEvent.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/events/DropIndexEvent.java (working copy) +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/DropIndexEvent.java (working copy) @@ -18,47 +18,19 @@ package org.apache.hadoop.hive.metastore.events; -import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.HiveMetaStore; +import org.apache.hadoop.hive.metastore.api.Index; +public class DropIndexEvent extends ListenerEvent { -/** - * Base class for all the events which are defined for metastore. - */ + private final Index index; -public abstract class PreEventContext { - - public static enum PreEventType { - CREATE_TABLE, - DROP_TABLE, - ALTER_TABLE, - ADD_PARTITION, - DROP_PARTITION, - ALTER_PARTITION, - CREATE_DATABASE, - DROP_DATABASE, - LOAD_PARTITION_DONE + public DropIndexEvent(Index index, boolean status, HiveMetaStore.HMSHandler handler) { + super(status, handler); + this.index = index; } - private final PreEventType eventType; - private final HMSHandler handler; - - public PreEventContext(PreEventType eventType, HMSHandler handler) { - this.eventType = eventType; - this.handler = handler; + public Index getIndex() { + return index; } - - /** - * @return the event type - */ - public PreEventType getEventType() { - return eventType; - } - - /** - * @return the handler - */ - public HMSHandler getHandler() { - return handler; - } - } Index: metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java (revision 1427681) +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java (working copy) @@ -87,22 +87,28 @@ import org.apache.hadoop.hive.metastore.api.UnknownPartitionException; import org.apache.hadoop.hive.metastore.api.UnknownTableException; import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants; +import org.apache.hadoop.hive.metastore.events.AddIndexEvent; +import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; import org.apache.hadoop.hive.metastore.events.AddPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterTableEvent; import org.apache.hadoop.hive.metastore.events.CreateDatabaseEvent; import org.apache.hadoop.hive.metastore.events.CreateTableEvent; import org.apache.hadoop.hive.metastore.events.DropDatabaseEvent; +import org.apache.hadoop.hive.metastore.events.DropIndexEvent; import org.apache.hadoop.hive.metastore.events.DropPartitionEvent; import org.apache.hadoop.hive.metastore.events.DropTableEvent; import org.apache.hadoop.hive.metastore.events.EventCleanerTask; import org.apache.hadoop.hive.metastore.events.LoadPartitionDoneEvent; +import org.apache.hadoop.hive.metastore.events.PreAddIndexEvent; import org.apache.hadoop.hive.metastore.events.PreAddPartitionEvent; +import org.apache.hadoop.hive.metastore.events.PreAlterIndexEvent; import org.apache.hadoop.hive.metastore.events.PreAlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.PreAlterTableEvent; import org.apache.hadoop.hive.metastore.events.PreCreateDatabaseEvent; import org.apache.hadoop.hive.metastore.events.PreCreateTableEvent; import org.apache.hadoop.hive.metastore.events.PreDropDatabaseEvent; +import org.apache.hadoop.hive.metastore.events.PreDropIndexEvent; import org.apache.hadoop.hive.metastore.events.PreDropPartitionEvent; import org.apache.hadoop.hive.metastore.events.PreDropTableEvent; import org.apache.hadoop.hive.metastore.events.PreEventContext; @@ -1125,18 +1131,29 @@ return (ms.getTable(dbname, name) != null); } - private void drop_table_core(final RawStore ms, final String dbname, final String name, - final boolean deleteData) throws NoSuchObjectException, MetaException, IOException, - InvalidObjectException, InvalidInputException { + private boolean drop_table_core(final RawStore ms, final String dbname, final String name, + final boolean deleteData, final String indexName) throws NoSuchObjectException, + MetaException, IOException, InvalidObjectException, InvalidInputException { boolean success = false; - boolean isExternal = false; - Path tblPath = null; - List partPaths = null; + ms.openTransaction(); + try { + if (success = drop_table_core_notxn(ms, dbname, name, deleteData, indexName)) { + success = ms.commitTransaction(); + } + } finally { + if (!success) { + ms.rollbackTransaction(); + } + } + return success; + } + + private boolean drop_table_core_notxn(RawStore ms, String dbname, String name, + boolean deleteData, String indexName) throws NoSuchObjectException, MetaException, + IOException, InvalidObjectException, InvalidInputException { + boolean success = false; Table tbl = null; - isExternal = false; - boolean isIndexTable = false; try { - ms.openTransaction(); // drop any partitions tbl = get_table(dbname, name); if (tbl == null) { @@ -1148,8 +1165,8 @@ firePreEvent(new PreDropTableEvent(tbl, this)); - isIndexTable = isIndexTable(tbl); - if (isIndexTable) { + boolean isIndexTable = isIndexTable(tbl); + if (indexName == null && isIndexTable) { throw new RuntimeException( "The table " + name + " is an index table. Please do drop index instead."); } @@ -1167,38 +1184,41 @@ throw new MetaException(e.getMessage()); } } - isExternal = isExternal(tbl); + Path tblPath = null; + boolean isExternal = isExternal(tbl); if (tbl.getSd().getLocation() != null) { tblPath = new Path(tbl.getSd().getLocation()); if (!wh.isWritable(tblPath.getParent())) { - throw new MetaException("Table metadata not deleted since " + + String target = indexName == null ? "Table" : "Index table"; + throw new MetaException(target + " metadata not deleted since " + tblPath.getParent() + " is not writable by " + hiveConf.getUser()); } } // Drop the partitions and get a list of locations which need to be deleted - partPaths = dropPartitionsAndGetLocations(ms, dbname, name, tblPath, + List partPaths = dropPartitionsAndGetLocations(ms, dbname, name, tblPath, tbl.getPartitionKeys(), deleteData && !isExternal); if (!ms.dropTable(dbname, name)) { - throw new MetaException("Unable to drop table"); + String tableName = dbname + "." + name; + throw new MetaException(indexName == null ? "Unable to drop table " + tableName: + "Unable to drop index table " + tableName + " for index " + indexName); } - success = ms.commitTransaction(); - } finally { - if (!success) { - ms.rollbackTransaction(); - } else if (deleteData && !isExternal) { + if (deleteData && !isExternal) { // Delete the data in the partitions which have other locations deletePartitionData(partPaths); // Delete the data in the table deleteTableData(tblPath); // ok even if the data is not deleted } + success = true; + } finally { for (MetaStoreEventListener listener : listeners) { listener.onDropTable(new DropTableEvent(tbl, success, this)); } } + return success; } /** @@ -1307,8 +1327,7 @@ boolean success = false; Exception ex = null; try { - drop_table_core(getMS(), dbname, name, deleteData); - success = true; + success = drop_table_core(getMS(), dbname, name, deleteData, null); } catch (IOException e) { ex = e; throw new MetaException(e.getMessage()); @@ -2241,7 +2260,12 @@ boolean success = false; Exception ex = null; + Index oldIndex = null; try { + oldIndex = get_index_by_name(dbname, base_table_name, index_name); + + firePreEvent(new PreAlterIndexEvent(oldIndex, newIndex, this)); + getMS().alterIndex(dbname, base_table_name, index_name, newIndex); success = true; } catch (InvalidObjectException e) { @@ -2843,6 +2867,8 @@ try { ms.openTransaction(); + firePreEvent(new PreAddIndexEvent(index, this)); + Index old_index = null; try { old_index = get_index_by_name(index.getDbName(), index @@ -2890,6 +2916,10 @@ } ms.rollbackTransaction(); } + for (MetaStoreEventListener listener : listeners) { + AddIndexEvent addIndexEvent = new AddIndexEvent(index, success, this); + listener.onAddIndex(addIndexEvent); + } } } @@ -2934,56 +2964,34 @@ MetaException, TException, IOException, InvalidObjectException, InvalidInputException { boolean success = false; - Path tblPath = null; - List partPaths = null; + Index index = null; try { ms.openTransaction(); // drop the underlying index table - Index index = get_index_by_name(dbName, tblName, indexName); - if (index == null) { - throw new NoSuchObjectException(indexName + " doesn't exist"); - } + index = get_index_by_name(dbName, tblName, indexName); // throws exception if not exists + + firePreEvent(new PreDropIndexEvent(index, this)); + ms.dropIndex(dbName, tblName, indexName); String idxTblName = index.getIndexTableName(); if (idxTblName != null) { - Table tbl = null; - tbl = this.get_table(dbName, idxTblName); - if (tbl.getSd() == null) { - throw new MetaException("Table metadata is corrupted"); - } - - if (tbl.getSd().getLocation() != null) { - tblPath = new Path(tbl.getSd().getLocation()); - if (!wh.isWritable(tblPath.getParent())) { - throw new MetaException("Index table metadata not deleted since " + - tblPath.getParent() + " is not writable by " + - hiveConf.getUser()); - } - } - - // Drop the partitions and get a list of partition locations which need to be deleted - partPaths = dropPartitionsAndGetLocations(ms, dbName, idxTblName, tblPath, - tbl.getPartitionKeys(), deleteData); - - if (!ms.dropTable(dbName, idxTblName)) { - throw new MetaException("Unable to drop underlying data table " - + idxTblName + " for index " + idxTblName); - } + success = drop_table_core_notxn(ms, dbName, idxTblName, deleteData, indexName); } - success = ms.commitTransaction(); + if (success) { + success = ms.commitTransaction(); + } } finally { if (!success) { ms.rollbackTransaction(); - return false; - } else if (deleteData && tblPath != null) { - deletePartitionData(partPaths); - deleteTableData(tblPath); - // ok even if the data is not deleted } + for (MetaStoreEventListener listener : listeners) { + DropIndexEvent dropIndexEvent = new DropIndexEvent(index, success, this); + listener.onDropIndex(dropIndexEvent); + } } - return true; + return success; } @Override Index: metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java (revision 1427681) +++ metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java (working copy) @@ -21,12 +21,15 @@ import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.metastore.api.MetaException; +import org.apache.hadoop.hive.metastore.events.AddIndexEvent; +import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; import org.apache.hadoop.hive.metastore.events.AddPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterTableEvent; import org.apache.hadoop.hive.metastore.events.CreateDatabaseEvent; import org.apache.hadoop.hive.metastore.events.CreateTableEvent; import org.apache.hadoop.hive.metastore.events.DropDatabaseEvent; +import org.apache.hadoop.hive.metastore.events.DropIndexEvent; import org.apache.hadoop.hive.metastore.events.DropPartitionEvent; import org.apache.hadoop.hive.metastore.events.DropTableEvent; import org.apache.hadoop.hive.metastore.events.LoadPartitionDoneEvent; @@ -109,9 +112,29 @@ * @throws MetaException */ public void onLoadPartitionDone(LoadPartitionDoneEvent partSetDoneEvent) throws MetaException { + } + /** + * @param indexEvent index event + * @throws MetaException + */ + public void onAddIndex(AddIndexEvent indexEvent) throws MetaException { } + /** + * @param indexEvent index event + * @throws MetaException + */ + public void onDropIndex(DropIndexEvent indexEvent) throws MetaException { + } + + /** + * @param indexEvent index event + * @throws MetaException + */ + public void onAlterIndex(AlterIndexEvent indexEvent) throws MetaException { + } + @Override public Configuration getConf() { return this.conf; Index: ql/src/test/org/apache/hadoop/hive/ql/QTestUtil.java =================================================================== --- ql/src/test/org/apache/hadoop/hive/ql/QTestUtil.java (revision 1427681) +++ ql/src/test/org/apache/hadoop/hive/ql/QTestUtil.java (working copy) @@ -476,7 +476,7 @@ List indexes = db.getIndexes(dbName, tblName, (short)-1); if (indexes != null && indexes.size() > 0) { for (Index index : indexes) { - db.dropIndex(dbName, tblName, index.getIndexName(), true); + db.dropIndex(dbName, tblName, index.getIndexName()); } } } Index: ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java =================================================================== --- ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java (revision 1427681) +++ ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java (working copy) @@ -455,7 +455,7 @@ // Drop index try { - hm.dropIndex(MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, indexName, true); + hm.dropIndex(MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, indexName); } catch (HiveException e) { System.err.println(StringUtils.stringifyException(e)); assertTrue("Unable to drop index: " + indexName, false); Index: ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java (revision 1427681) +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java (working copy) @@ -788,11 +788,19 @@ } } - public boolean dropIndex(String db_name, String tbl_name, String index_name, boolean deleteData) throws HiveException { + public void dropIndex(String db_name, String tbl_name, String index_name) + throws HiveException { + dropIndex(db_name, tbl_name, index_name, true, true); + } + + public void dropIndex(String db_name, String tbl_name, String index_name, + boolean deleteData, boolean ignoreUnknownIdx) throws HiveException { try { - return getMSC().dropIndex(db_name, tbl_name, index_name, deleteData); + getMSC().dropIndex(db_name, tbl_name, index_name, deleteData); } catch (NoSuchObjectException e) { - throw new HiveException("Partition or table doesn't exist.", e); + if (!ignoreUnknownIdx) { + throw new HiveException("Index doesn't exist.", e); + } } catch (Exception e) { throw new HiveException("Unknown error. Please check logs.", e); } Index: ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (revision 1427681) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (working copy) @@ -871,8 +871,7 @@ } private int dropIndex(Hive db, DropIndexDesc dropIdx) throws HiveException { - db.dropIndex(db.getCurrentDatabase(), dropIdx.getTableName(), - dropIdx.getIndexName(), true); + db.dropIndex(db.getCurrentDatabase(), dropIdx.getTableName(), dropIdx.getIndexName()); return 0; }