deniskuzZ commented on a change in pull request #1834:
URL: https://github.com/apache/hive/pull/1834#discussion_r570565029



##########
File path: 
standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
##########
@@ -4797,6 +4800,84 @@ private void heartbeatTxn(Connection dbConn, long txnid)
     }
   }
 
+  private boolean foundCommittedTransaction(Connection dbConn, long txnId, 
FindStatStatusByWriteIdRequest rqst,
+                                           String condition) throws 
SQLException, MetaException {
+    String s = sqlGenerator.addLimitClause(1,
+            "1 FROM \"COMPLETED_TXN_COMPONENTS\" WHERE \"CTC_TXNID\" " + 
condition + " " + txnId +
+                    " AND \"CTC_DATABASE\" = ? AND \"CTC_TABLE\" = ?");
+    if (rqst.getPartName() != null) {
+      s += " AND \"CTC_PARTITION\" = ?";
+    }
+
+    try (PreparedStatement pStmt =
+           sqlGenerator.prepareStmtWithParameters(dbConn, s,  
Arrays.asList(rqst.getDbName(), rqst.getTblName()))) {
+      if (rqst.getPartName() != null) {
+        pStmt.setString(3, rqst.getPartName());
+      }
+      LOG.debug("Going to execute query <" + s + ">");
+      try (ResultSet rs2 = pStmt.executeQuery()) {
+        if (rs2.next()) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  @Override
+  @RetrySemantics.Idempotent
+  public FindStatStatusByWriteIdResponse 
findStatStatusByWriteId(FindStatStatusByWriteIdRequest rqst)
+          throws SQLException, MetaException {
+    try {
+      Connection dbConn = null;
+      Statement stmt = null;
+      try {
+        lockInternal();
+        dbConn = getDbConn(Connection.TRANSACTION_READ_COMMITTED);
+        stmt = dbConn.createStatement();
+        TxnState state;
+        long txnId = getTxnIdForWriteId(rqst.getDbName(), rqst.getTblName(), 
rqst.getWriteId());
+        TxnStatus txnStatus = findTxnState(txnId, stmt);
+        if (txnStatus == TxnStatus.ABORTED) {
+          state = TxnState.ABORTED;
+        } else if (txnStatus == TxnStatus.OPEN) {
+          state = TxnState.OPEN;
+        } else if (foundCommittedTransaction(dbConn, txnId, rqst, ">")) {

Review comment:
       That's not entirely correct. Txn with higher txnId might be commited 
before txn with lower id. See how WRITE_SET table works. It has 2 properties 
WS_TXNID and WS_COMMIT_ID. This table only tracks update/delete operations, 
that are conflicting, insert doesn't belong to this category, so you cannot 
rely on it as well.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: gitbox-unsubscr...@hive.apache.org
For additional commands, e-mail: gitbox-h...@hive.apache.org

Reply via email to