diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
index 94698e6771..58352905f9 100644
--- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
+++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
@@ -71,6 +71,8 @@
import javax.jdo.JDOException;
import com.codahale.metrics.Counter;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
import com.google.common.collect.Lists;
import org.apache.commons.cli.OptionBuilder;
@@ -4979,14 +4981,21 @@ public Partition get_partition(final String db_name, final String tbl_name,
private void fireReadTablePreEvent(String catName, String dbName, String tblName)
throws MetaException, NoSuchObjectException {
if(preListeners.size() > 0) {
- // do this only if there is a pre event listener registered (avoid unnecessary
- // metastore api call)
- Table t = getMS().getTable(catName, dbName, tblName);
- if (t == null) {
- throw new NoSuchObjectException(TableName.getQualified(catName, dbName, tblName)
- + " table not found");
- }
- firePreEvent(new PreReadTableEvent(t, this));
+ Supplier
tableSupplier = Suppliers.memoize(new Supplier() {
+ @Override public Table get() {
+ try {
+ Table t = getMS().getTable(catName, dbName, tblName);
+ if (t == null) {
+ throw new NoSuchObjectException(TableName.getQualified(catName, dbName, tblName)
+ + " table not found");
+ }
+ return t;
+ } catch(MetaException | NoSuchObjectException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ firePreEvent(new PreReadTableEvent(tableSupplier, this));
}
}
diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/events/PreReadTableEvent.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/events/PreReadTableEvent.java
index beec72bc12..c1325773ec 100644
--- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/events/PreReadTableEvent.java
+++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/events/PreReadTableEvent.java
@@ -18,6 +18,7 @@
package org.apache.hadoop.hive.metastore.events;
+import com.google.common.base.Supplier;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.hive.metastore.IHMSHandler;
@@ -30,18 +31,23 @@
@InterfaceStability.Stable
public class PreReadTableEvent extends PreEventContext {
- private final Table table;
+ private final Supplier tableSupplier;
public PreReadTableEvent(Table table, IHMSHandler handler) {
super(PreEventType.READ_TABLE, handler);
- this.table = table;
+ this.tableSupplier = () -> table;
+ }
+
+ public PreReadTableEvent(Supplier tableSupplier, IHMSHandler handler) {
+ super(PreEventType.READ_TABLE, handler);
+ this.tableSupplier = tableSupplier;
}
/**
* @return the table
*/
public Table getTable() {
- return table;
+ return tableSupplier.get();
}
}