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(); } }