diff --git metastore/if/hive_metastore.thrift metastore/if/hive_metastore.thrift index 6be3f93..da94703 100755 --- metastore/if/hive_metastore.thrift +++ metastore/if/hive_metastore.thrift @@ -343,6 +343,10 @@ service ThriftHiveMetastore extends fb303.FacebookService list get_index_names(1:string db_name, 2:string tbl_name, 3:i16 max_indexes=-1) throws(1:MetaException o2) + // Metastore messages + void sendMessage(1:HiveObjectRef hiveObject, 2: i32 msgType) throws(1: MetaException me) + string receiveMessage(1:HiveObjectRef hiveObject, 2: i32 msgType) throws(1: MetaException me) + //authorization privileges bool create_role(1:Role role) throws(1:MetaException o1) diff --git metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index 1247887..d8ac8bb 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -71,6 +71,7 @@ import org.apache.hadoop.hive.metastore.events.CreateTableEvent; import org.apache.hadoop.hive.metastore.events.DropDatabaseEvent; import org.apache.hadoop.hive.metastore.events.DropPartitionEvent; import org.apache.hadoop.hive.metastore.events.DropTableEvent; +import org.apache.hadoop.hive.metastore.events.MessageEvent; import org.apache.hadoop.hive.metastore.hooks.JDOConnectionURLHook; import org.apache.hadoop.hive.metastore.model.MDBPrivilege; import org.apache.hadoop.hive.metastore.model.MGlobalPrivilege; @@ -3111,6 +3112,43 @@ public class HiveMetaStore extends ThriftHiveMetastore { } } + /* (non-Javadoc) + * @see org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore.Iface#sendMessage(org.apache.hadoop.hive.metastore.api.HiveObjectRef, int) + * + * Listeners are loaded in the order they are defined in hive-site.xml. First one + * which asserts that it can handle message, will be invoked to handle the message. + * If none found, exception is thrown back to client. + */ + @Override + public void sendMessage(HiveObjectRef hiveObject, int msgType) throws MetaException, TException { + + for(MetaStoreEventListener listener : this.listeners){ + if(listener.canProcessSendMessage(msgType)) { + listener.processSendMessage(new MessageEvent(true, this, hiveObject)); + return; + } + } + throw new MetaException("No registered listener can process message of type: "+msgType); + } + + /* (non-Javadoc) + * @see org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore.Iface#recvMessage(org.apache.hadoop.hive.metastore.api.HiveObjectRef, int) + * + * Listeners are loaded in the order they are defined in hive-site.xml. First one + * which asserts that it can handle message, will be invoked to handle the message. + * If none found, exception is thrown back to client. + */ + @Override + public String receiveMessage(HiveObjectRef hiveObject, int msgType) throws MetaException, + TException { + for(MetaStoreEventListener listener : this.listeners){ + if(listener.canProcessRecvMessage(msgType)) { + return listener.processRecvMessage(new MessageEvent(true, this, hiveObject)); + } + } + throw new MetaException("No registered listener can process message of type: "+msgType); + } + } /** diff --git metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java index 5562ffc..4e69409 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java @@ -1131,4 +1131,15 @@ public class HiveMetaStoreClient implements IMetaStoreClient { } } + @Override + public void sendMessage(HiveObjectRef hiveObj, int eventType) throws MetaException, TException { + client.sendMessage(hiveObj, eventType); + + } + + @Override + public String recvMessage(HiveObjectRef hiveObj, int eventType) throws MetaException, TException { + return client.receiveMessage(hiveObj, eventType); + } + } diff --git metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java index 2ce02bb..f561604 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java @@ -637,6 +637,10 @@ public interface IMetaStoreClient { public List list_roles(String principalName, PrincipalType principalType) throws MetaException, TException; + public void sendMessage(HiveObjectRef hiveObj, int msgType) throws MetaException, TException; + + public String recvMessage(HiveObjectRef hiveObj, int msgType) throws MetaException, TException; + /** * @param hiveObject * @param user_name diff --git metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java index 75e01ec..ca1a027 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreEventListener.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hive.metastore.events.CreateTableEvent; import org.apache.hadoop.hive.metastore.events.DropDatabaseEvent; import org.apache.hadoop.hive.metastore.events.DropPartitionEvent; import org.apache.hadoop.hive.metastore.events.DropTableEvent; +import org.apache.hadoop.hive.metastore.events.MessageEvent; /** * This abstract class needs to be extended to provide implementation of actions that needs @@ -78,6 +79,22 @@ public abstract class MetaStoreEventListener implements Configurable { */ public abstract void onDropDatabase (DropDatabaseEvent dbEvent) throws MetaException; + /** + * @param msgType + * @return whether this listener can process send messages of type msgType. + */ + public abstract boolean canProcessSendMessage(int msgType); + + /** + * @param msgType + * @return whether this listener can process receive messages of type msgType. + */ + public abstract boolean canProcessRecvMessage(int msgType); + + public abstract void processSendMessage(MessageEvent msg) throws MetaException; + + public abstract String processRecvMessage(MessageEvent msg) throws MetaException; + @Override public Configuration getConf() { return this.conf; diff --git metastore/src/java/org/apache/hadoop/hive/metastore/events/MessageEvent.java metastore/src/java/org/apache/hadoop/hive/metastore/events/MessageEvent.java new file mode 100644 index 0000000..e20d23c --- /dev/null +++ metastore/src/java/org/apache/hadoop/hive/metastore/events/MessageEvent.java @@ -0,0 +1,22 @@ +package org.apache.hadoop.hive.metastore.events; + +import org.apache.hadoop.hive.metastore.HiveMetaStore.HMSHandler; +import org.apache.hadoop.hive.metastore.api.HiveObjectRef; + +public class MessageEvent extends ListenerEvent { + + private final HiveObjectRef hiveObj; + + public MessageEvent(boolean status, HMSHandler handler, HiveObjectRef hiveObj) { + super(status, handler); + this.hiveObj = hiveObj; + } + + /** + * @return the hiveObj + */ + public HiveObjectRef getHiveObj() { + return hiveObj; + } + +}