Repository: hive Updated Branches: refs/heads/branch-2 7362ea6d4 -> c0a57a33b
HIVE-18031: Support replication for Alter Database operation (Sankar Hariappan, reviewed by Anishek Agarwal) This is a partial backport of HIVE-18031 which adds support for replication alter database events. The partial backport just adds support for alter database events but it does not add the replication part to avoid api incompatibility. Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/c0a57a33 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/c0a57a33 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/c0a57a33 Branch: refs/heads/branch-2 Commit: c0a57a33b44d73fbe0f95256f0a3822bd3720aa8 Parents: 7362ea6 Author: Sergio Pena <[email protected]> Authored: Tue Jun 5 07:35:09 2018 -0500 Committer: Sergio Pena <[email protected]> Committed: Tue Jun 5 07:35:09 2018 -0500 ---------------------------------------------------------------------- .../listener/DbNotificationListener.java | 16 ++++ .../listener/DummyRawStoreFailEvent.java | 6 +- .../listener/TestDbNotificationListener.java | 50 ++++++++++ .../hadoop/hive/metastore/HiveMetaStore.java | 32 ++++++- .../hive/metastore/MetaStoreEventListener.java | 8 ++ .../metastore/MetaStoreListenerNotifier.java | 8 ++ .../metastore/events/AlterDatabaseEvent.java | 56 ++++++++++++ .../messaging/AlterDatabaseMessage.java | 36 ++++++++ .../hive/metastore/messaging/EventMessage.java | 1 + .../messaging/MessageDeserializer.java | 7 ++ .../metastore/messaging/MessageFactory.java | 9 ++ .../json/JSONAlterDatabaseMessage.java | 96 ++++++++++++++++++++ .../messaging/json/JSONMessageDeserializer.java | 11 +++ .../messaging/json/JSONMessageFactory.java | 12 +++ 14 files changed, 344 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/hcatalog/server-extensions/src/main/java/org/apache/hive/hcatalog/listener/DbNotificationListener.java ---------------------------------------------------------------------- diff --git a/hcatalog/server-extensions/src/main/java/org/apache/hive/hcatalog/listener/DbNotificationListener.java b/hcatalog/server-extensions/src/main/java/org/apache/hive/hcatalog/listener/DbNotificationListener.java index 54e5d45..8114d35 100644 --- a/hcatalog/server-extensions/src/main/java/org/apache/hive/hcatalog/listener/DbNotificationListener.java +++ b/hcatalog/server-extensions/src/main/java/org/apache/hive/hcatalog/listener/DbNotificationListener.java @@ -44,6 +44,7 @@ import org.apache.hadoop.hive.metastore.api.Partition; 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.AlterDatabaseEvent; import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; import org.apache.hadoop.hive.metastore.events.AlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterTableEvent; @@ -357,6 +358,21 @@ public class DbNotificationListener extends MetaStoreEventListener { } /** + * @param dbEvent alter database event + * @throws MetaException + */ + @Override + public void onAlterDatabase(AlterDatabaseEvent dbEvent) throws MetaException { + Database oldDb = dbEvent.getOldDatabase(); + Database newDb = dbEvent.getNewDatabase(); + NotificationEvent event = + new NotificationEvent(0, now(), EventType.ALTER_DATABASE.toString(), msgFactory + .buildAlterDatabaseMessage(oldDb, newDb).toString()); + event.setDbName(oldDb.getName()); + process(event, dbEvent); + } + + /** * @param fnEvent function event * @throws MetaException */ http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java ---------------------------------------------------------------------- diff --git a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java index 1099480..aa6ab6e 100644 --- a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java +++ b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java @@ -151,7 +151,11 @@ public class DummyRawStoreFailEvent implements RawStore, Configurable { @Override public boolean alterDatabase(String dbName, Database db) throws NoSuchObjectException, MetaException { - return objectStore.alterDatabase(dbName, db); + if (shouldEventSucceed) { + return objectStore.alterDatabase(dbName, db); + } else { + throw new RuntimeException("Event failed."); + } } @Override http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java ---------------------------------------------------------------------- diff --git a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java index 8e9eb3d..2697509 100644 --- a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java +++ b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java @@ -62,6 +62,7 @@ import org.apache.hadoop.hive.metastore.api.ResourceUri; import org.apache.hadoop.hive.metastore.api.SerDeInfo; import org.apache.hadoop.hive.metastore.api.StorageDescriptor; import org.apache.hadoop.hive.metastore.api.Table; +import org.apache.hadoop.hive.metastore.events.AlterDatabaseEvent; import org.apache.hadoop.hive.metastore.events.AddIndexEvent; import org.apache.hadoop.hive.metastore.events.AddPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; @@ -77,6 +78,7 @@ import org.apache.hadoop.hive.metastore.events.DropPartitionEvent; import org.apache.hadoop.hive.metastore.events.DropTableEvent; import org.apache.hadoop.hive.metastore.events.InsertEvent; import org.apache.hadoop.hive.metastore.events.ListenerEvent; +import org.apache.hadoop.hive.metastore.messaging.AlterDatabaseMessage; import org.apache.hadoop.hive.metastore.messaging.AddPartitionMessage; import org.apache.hadoop.hive.metastore.messaging.AlterIndexMessage; import org.apache.hadoop.hive.metastore.messaging.AlterPartitionMessage; @@ -187,6 +189,10 @@ public class TestDbNotificationListener { pushEventId(EventType.DROP_DATABASE, dbEvent); } + public void onAlterDatabase (AlterDatabaseEvent dbEvent) throws MetaException { + pushEventId(EventType.ALTER_DATABASE, dbEvent); + } + public void onAddIndex(AddIndexEvent indexEvent) throws MetaException { pushEventId(EventType.CREATE_INDEX, indexEvent); } @@ -406,6 +412,50 @@ public class TestDbNotificationListener { } @Test + public void alterDatabase() throws Exception { + String dbName = "alterdatabase"; + String tblOwner = "me"; + Database db = + new Database(dbName, "", "file:/tmp/alterdatabase", null); + + // Event 1 + msClient.createDatabase(db); + + // Event 2 + db.setOwnerName("you"); + db.setLocationUri("file:/tmp/alterdatabase_copy"); + msClient.alterDatabase(dbName, db); + + // Get notifications from metastore + NotificationEventResponse rsp = msClient.getNextNotification(firstEventId, 0, null); + assertEquals(2, rsp.getEventsSize()); + NotificationEvent event = rsp.getEvents().get(1); + assertEquals(firstEventId + 2, event.getEventId()); + assertTrue(event.getEventTime() >= startTime); + assertEquals(EventType.ALTER_DATABASE.toString(), event.getEventType()); + assertEquals(dbName, event.getDbName()); + + AlterDatabaseMessage alterDatabaseMessage = md.getAlterDatabaseMessage(event.getMessage()); + assertEquals(db, alterDatabaseMessage.getDbObjAfter()); + + // Verify the eventID was passed to the non-transactional listener + MockMetaStoreEventListener.popAndVerifyLastEventId(EventType.ALTER_DATABASE, firstEventId + 2); + MockMetaStoreEventListener.popAndVerifyLastEventId(EventType.CREATE_DATABASE, firstEventId + 1); + + // When hive.metastore.transactional.event.listeners is set, + // a failed event should not create a new notification + DummyRawStoreFailEvent.setEventSucceed(false); + try { + msClient.alterDatabase(dbName, db); + fail("Error: alter database should've failed"); + } catch (Exception ex) { + // expected + } + rsp = msClient.getNextNotification(firstEventId, 0, null); + assertEquals(2, rsp.getEventsSize()); + } + + @Test public void alterTable() throws Exception { String defaultDbName = "default"; String tblName = "altertabletbl"; http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/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 02c345b..813b8aa 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -80,6 +80,7 @@ import org.apache.hadoop.hive.common.metrics.common.MetricsVariable; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.hive.metastore.api.*; +import org.apache.hadoop.hive.metastore.events.AlterDatabaseEvent; import org.apache.hadoop.hive.metastore.events.AddIndexEvent; import org.apache.hadoop.hive.metastore.events.AddPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; @@ -1003,6 +1004,9 @@ public class HiveMetaStore extends ThriftHiveMetastore { startFunction("alter_database" + dbName); boolean success = false; Exception ex = null; + RawStore ms = getMS(); + Database oldDB = null; + Map<String, String> transactionalListenersResponses = Collections.emptyMap(); // Perform the same URI normalization as create_database_core. if (newDB.getLocationUri() != null) { @@ -1010,17 +1014,39 @@ public class HiveMetaStore extends ThriftHiveMetastore { } try { - Database oldDB = get_database_core(dbName); + oldDB = get_database_core(dbName); if (oldDB == null) { throw new MetaException("Could not alter database \"" + dbName + "\". Could not retrieve old definition."); } firePreEvent(new PreAlterDatabaseEvent(oldDB, newDB, this)); - getMS().alterDatabase(dbName, newDB); - success = true; + + ms.openTransaction(); + ms.alterDatabase(dbName, newDB); + + if (!transactionalListeners.isEmpty()) { + transactionalListenersResponses = + MetaStoreListenerNotifier.notifyEvent(transactionalListeners, + EventType.ALTER_DATABASE, + new AlterDatabaseEvent(oldDB, newDB, true, this)); + } + + success = ms.commitTransaction(); } catch (Exception e) { ex = e; rethrowException(e); } finally { + if (!success) { + ms.rollbackTransaction(); + } + + if ((null != oldDB) && (!listeners.isEmpty())) { + MetaStoreListenerNotifier.notifyEvent(listeners, + EventType.ALTER_DATABASE, + new AlterDatabaseEvent(oldDB, newDB, success, this), + null, + transactionalListenersResponses, ms); + } + endFunction("alter_database", success, ex); } } http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java index b0defb5..bca36e3 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hive.metastore; 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.AlterDatabaseEvent; import org.apache.hadoop.hive.metastore.events.AddIndexEvent; import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; import org.apache.hadoop.hive.metastore.events.AddPartitionEvent; @@ -119,6 +120,13 @@ public abstract class MetaStoreEventListener implements Configurable { } /** + * @param dbEvent alter database event + * @throws MetaException + */ + public void onAlterDatabase(AlterDatabaseEvent dbEvent) throws MetaException { + } + + /** * @param partSetDoneEvent * @throws MetaException */ http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreListenerNotifier.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreListenerNotifier.java b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreListenerNotifier.java index 37327f8..432d8ef 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreListenerNotifier.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreListenerNotifier.java @@ -26,6 +26,7 @@ import org.apache.hadoop.hive.metastore.api.EnvironmentContext; 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.AlterDatabaseEvent; import org.apache.hadoop.hive.metastore.events.AlterIndexEvent; import org.apache.hadoop.hive.metastore.events.AlterPartitionEvent; import org.apache.hadoop.hive.metastore.events.AlterTableEvent; @@ -93,6 +94,13 @@ public class MetaStoreListenerNotifier { listener.onDropPartition((DropPartitionEvent)event); } }) + .put(EventType.ALTER_DATABASE, new EventNotifier() { + @Override + public void notify(MetaStoreEventListener listener, + ListenerEvent event) throws MetaException { + listener.onAlterDatabase((AlterDatabaseEvent)event); + } + }) .put(EventType.ALTER_TABLE, new EventNotifier() { @Override public void notify(MetaStoreEventListener listener, ListenerEvent event) throws MetaException { http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/events/AlterDatabaseEvent.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/events/AlterDatabaseEvent.java b/metastore/src/java/org/apache/hadoop/hive/metastore/events/AlterDatabaseEvent.java new file mode 100644 index 0000000..91dff76 --- /dev/null +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/events/AlterDatabaseEvent.java @@ -0,0 +1,56 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.metastore.events; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.api.Database; + +/** + * AlterDatabaseEvent. + * Event which is captured during database alters for owner info or properties or location + */ [email protected] [email protected] +public class AlterDatabaseEvent extends ListenerEvent { + + private final Database oldDb; + private final Database newDb; + + public AlterDatabaseEvent(Database oldDb, Database newDb, boolean status, HMSHandler handler) { + super(status, handler); + this.oldDb = oldDb; + this.newDb = newDb; + } + + /** + * @return the old db + */ + public Database getOldDatabase() { + return oldDb; + } + + /** + * @return the new db + */ + public Database getNewDatabase() { + return newDb; + } +} http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/AlterDatabaseMessage.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/AlterDatabaseMessage.java b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/AlterDatabaseMessage.java new file mode 100644 index 0000000..2d9f53f --- /dev/null +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/AlterDatabaseMessage.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hadoop.hive.metastore.messaging; + +import org.apache.hadoop.hive.metastore.api.Database; + +/** + * AlterDatabaseMessage. + * Abstract class to store the Alter database message + */ +public abstract class AlterDatabaseMessage extends EventMessage { + + protected AlterDatabaseMessage() { + super(EventType.ALTER_DATABASE); + } + + public abstract Database getDbObjBefore() throws Exception; + public abstract Database getDbObjAfter() throws Exception; +} http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/EventMessage.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/EventMessage.java b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/EventMessage.java index 1ec0de0..06902e1 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/EventMessage.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/EventMessage.java @@ -37,6 +37,7 @@ public abstract class EventMessage { ADD_PARTITION(MessageFactory.ADD_PARTITION_EVENT), DROP_PARTITION(MessageFactory.DROP_PARTITION_EVENT), ALTER_TABLE(MessageFactory.ALTER_TABLE_EVENT), + ALTER_DATABASE(MessageFactory.ALTER_DATABASE_EVENT), ALTER_PARTITION(MessageFactory.ALTER_PARTITION_EVENT), INSERT(MessageFactory.INSERT_EVENT), CREATE_FUNCTION(MessageFactory.CREATE_FUNCTION_EVENT), http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageDeserializer.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageDeserializer.java b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageDeserializer.java index 515c455..ce37763 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageDeserializer.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageDeserializer.java @@ -32,6 +32,8 @@ public abstract class MessageDeserializer { switch (EventMessage.EventType.valueOf(eventTypeString)) { case CREATE_DATABASE: return getCreateDatabaseMessage(messageBody); + case ALTER_DATABASE: + return getAlterDatabaseMessage(messageBody); case DROP_DATABASE: return getDropDatabaseMessage(messageBody); case CREATE_TABLE: @@ -70,6 +72,11 @@ public abstract class MessageDeserializer { public abstract CreateDatabaseMessage getCreateDatabaseMessage(String messageBody); /** + * Method to de-serialize AlterDatabaseMessage instance. + */ + public abstract AlterDatabaseMessage getAlterDatabaseMessage(String messageBody); + + /** * Method to de-serialize DropDatabaseMessage instance. */ public abstract DropDatabaseMessage getDropDatabaseMessage(String messageBody); http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageFactory.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageFactory.java b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageFactory.java index ff57326..67e6eae 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageFactory.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/MessageFactory.java @@ -44,6 +44,7 @@ public abstract class MessageFactory { public static final String ALTER_TABLE_EVENT = "ALTER_TABLE"; public static final String DROP_TABLE_EVENT = "DROP_TABLE"; public static final String CREATE_DATABASE_EVENT = "CREATE_DATABASE"; + public static final String ALTER_DATABASE_EVENT = "ALTER_DATABASE"; public static final String DROP_DATABASE_EVENT = "DROP_DATABASE"; public static final String INSERT_EVENT = "INSERT"; public static final String CREATE_FUNCTION_EVENT = "CREATE_FUNCTION"; @@ -128,6 +129,14 @@ public abstract class MessageFactory { public abstract CreateDatabaseMessage buildCreateDatabaseMessage(Database db); /** + * Factory method for AlterDatabaseMessage. + * @param beforeDb The Database before alter. + * @param afterDb The Database after alter. + * @return AlterDatabaseMessage instance. + */ + public abstract AlterDatabaseMessage buildAlterDatabaseMessage(Database beforeDb, Database afterDb); + + /** * Factory method for DropDatabaseMessage. * @param db The Database being dropped. * @return DropDatabaseMessage instance. http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONAlterDatabaseMessage.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONAlterDatabaseMessage.java b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONAlterDatabaseMessage.java new file mode 100644 index 0000000..28a7d45 --- /dev/null +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONAlterDatabaseMessage.java @@ -0,0 +1,96 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.hadoop.hive.metastore.messaging.json; + +import org.apache.hadoop.hive.metastore.api.Database; +import org.apache.hadoop.hive.metastore.messaging.AlterDatabaseMessage; +import org.apache.thrift.TException; +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * JSON alter database message. + */ +public class JSONAlterDatabaseMessage extends AlterDatabaseMessage { + + @JsonProperty + String server, servicePrincipal, db, dbObjBeforeJson, dbObjAfterJson; + + @JsonProperty + Long timestamp; + + /** + * Default constructor, needed for Jackson. + */ + public JSONAlterDatabaseMessage() { + } + + public JSONAlterDatabaseMessage(String server, String servicePrincipal, + Database dbObjBefore, Database dbObjAfter, Long timestamp) { + this.server = server; + this.servicePrincipal = servicePrincipal; + this.db = dbObjBefore.getName(); + this.timestamp = timestamp; + try { + this.dbObjBeforeJson = JSONMessageFactory.createDatabaseObjJson(dbObjBefore); + this.dbObjAfterJson = JSONMessageFactory.createDatabaseObjJson(dbObjAfter); + } catch (TException e) { + throw new IllegalArgumentException("Could not serialize: ", e); + } + checkValid(); + } + + @Override + public String getServer() { + return server; + } + + @Override + public String getServicePrincipal() { + return servicePrincipal; + } + + @Override + public String getDB() { + return db; + } + + @Override + public Long getTimestamp() { + return timestamp; + } + + @Override + public Database getDbObjBefore() throws Exception { + return (Database) JSONMessageFactory.getTObj(dbObjBeforeJson, Database.class); + } + + @Override + public Database getDbObjAfter() throws Exception { + return (Database) JSONMessageFactory.getTObj(dbObjAfterJson, Database.class); + } + + @Override + public String toString() { + try { + return JSONMessageDeserializer.mapper.writeValueAsString(this); + } catch (Exception e) { + throw new IllegalArgumentException("Could not serialize: ", e); + } + } +} http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java index 40ef5fb..5ff4923 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.metastore.messaging.json; +import org.apache.hadoop.hive.metastore.messaging.AlterDatabaseMessage; import org.apache.hadoop.hive.metastore.messaging.AddPartitionMessage; import org.apache.hadoop.hive.metastore.messaging.AlterIndexMessage; import org.apache.hadoop.hive.metastore.messaging.AlterPartitionMessage; @@ -63,6 +64,16 @@ public class JSONMessageDeserializer extends MessageDeserializer { } @Override + public AlterDatabaseMessage getAlterDatabaseMessage(String messageBody) { + try { + return mapper.readValue(messageBody, JSONAlterDatabaseMessage.class); + } catch (Exception exception) { + throw new IllegalArgumentException("Could not construct JSONAlterDatabaseMessage.", + exception); + } + } + + @Override public DropDatabaseMessage getDropDatabaseMessage(String messageBody) { try { return mapper.readValue(messageBody, JSONDropDatabaseMessage.class); http://git-wip-us.apache.org/repos/asf/hive/blob/c0a57a33/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageFactory.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageFactory.java b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageFactory.java index 8b1291a..9b381ff 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageFactory.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageFactory.java @@ -35,6 +35,7 @@ import org.apache.hadoop.hive.metastore.api.NotificationEvent; import org.apache.hadoop.hive.metastore.api.Partition; import org.apache.hadoop.hive.metastore.api.Table; import org.apache.hadoop.hive.metastore.messaging.AddPartitionMessage; +import org.apache.hadoop.hive.metastore.messaging.AlterDatabaseMessage; import org.apache.hadoop.hive.metastore.messaging.AlterIndexMessage; import org.apache.hadoop.hive.metastore.messaging.AlterPartitionMessage; import org.apache.hadoop.hive.metastore.messaging.AlterTableMessage; @@ -94,6 +95,12 @@ public class JSONMessageFactory extends MessageFactory { } @Override + public AlterDatabaseMessage buildAlterDatabaseMessage(Database beforeDb, Database afterDb) { + return new JSONAlterDatabaseMessage(MS_SERVER_URL, MS_SERVICE_PRINCIPAL, + beforeDb, afterDb, now()); + } + + @Override public DropDatabaseMessage buildDropDatabaseMessage(Database db) { return new JSONDropDatabaseMessage(MS_SERVER_URL, MS_SERVICE_PRINCIPAL, db.getName(), now()); } @@ -195,6 +202,11 @@ public class JSONMessageFactory extends MessageFactory { })); } + static String createDatabaseObjJson(Database dbObj) throws TException { + TSerializer serializer = new TSerializer(new TJSONProtocol.Factory()); + return serializer.toString(dbObj, "UTF-8"); + } + static String createTableObjJson(Table tableObj) throws TException { TSerializer serializer = new TSerializer(new TJSONProtocol.Factory()); return serializer.toString(tableObj, "UTF-8");
