diff --git standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java index 750040a914..f25dbc398e 100644 --- standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -12347,7 +12347,7 @@ private boolean isCurrentStatsValidForTheQuery( ValidWriteIdList list4Stats = new ValidReaderWriteIdList(statsWriteIdList); ValidWriteIdList list4TheQuery = new ValidReaderWriteIdList(queryValidWriteIdList); - return !checkConcurrentWrites ? TxnIdUtils.checkEquivalentWriteIds(list4Stats, list4TheQuery) : + return !checkConcurrentWrites ? TxnIdUtils.isValidWrite(statsWriteId, list4TheQuery) : !TxnIdUtils.areTheseConcurrentWrites(list4Stats, statsWriteId, list4TheQuery, queryWriteId); } } diff --git storage-api/src/java/org/apache/hive/common/util/TxnIdUtils.java storage-api/src/java/org/apache/hive/common/util/TxnIdUtils.java index 4b00864a08..e92a77f016 100644 --- storage-api/src/java/org/apache/hive/common/util/TxnIdUtils.java +++ storage-api/src/java/org/apache/hive/common/util/TxnIdUtils.java @@ -73,6 +73,26 @@ public static boolean areTheseConcurrentWrites( return index2Older >= 0 || index2Newer >= 0; } + /** + * Check if the write of the given write id is valid regarding the given + * writeIdList. + * Return false if the given writeId is contained in the given writeIdList. + */ + public static boolean isValidWrite( + long statsWriteId, ValidWriteIdList queryWriteIdList) { + + // If olderWriteId is for aborted write, return false. + if (queryWriteIdList.isWriteIdAborted(statsWriteId)) { + return false; + } + + if (statsWriteId > queryWriteIdList.getHighWatermark()) { + return false; + } + + return 0 > Arrays.binarySearch(queryWriteIdList.getInvalidWriteIds(), statsWriteId); + } + /** * Check the min open ID/highwater mark/exceptions list to see if 2 ID lists are at the same commit point. * This can also be used for ValidTxnList as well as ValidWriteIdList.