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..c546a70df7 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 @@ -66,6 +66,7 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Supplier; import java.util.regex.Pattern; import javax.jdo.JDOException; @@ -4979,14 +4980,19 @@ 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 = () -> { + 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..688ec3ad70 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 @@ -23,6 +23,8 @@ import org.apache.hadoop.hive.metastore.IHMSHandler; import org.apache.hadoop.hive.metastore.api.Table; +import java.util.function.Supplier; + /** * Table read event */ @@ -30,18 +32,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(); } }