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");

Reply via email to