danny0405 commented on code in PR #10965: URL: https://github.com/apache/hudi/pull/10965#discussion_r1554475930
########## hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieWriteClient.java: ########## @@ -1135,8 +1138,36 @@ protected void completeLogCompaction(HoodieCommitMetadata metadata, HoodieTable */ protected HoodieWriteMetadata<O> compact(String compactionInstantTime, boolean shouldComplete) { HoodieTable table = createTable(config, context.getHadoopConf().get()); + Option<HoodieInstant> instantToCompactOption = Option.fromJavaOptional(table.getActiveTimeline() + .filterCompletedAndCompactionInstants() + .getInstants() + .stream() + .filter(instant -> HoodieActiveTimeline.EQUALS.test(instant.getTimestamp(), compactionInstantTime)) + .findFirst()); + try { + // Transaction serves to ensure only one compact job for this instant will start heartbeat, and any other concurrent + // compact job will abort if they attempt to execute compact before heartbeat expires + // Note that as long as all jobs for this table use this API for compact, then this alone should prevent + // compact rollbacks from running concurrently to compact commits. + txnManager.beginTransaction(instantToCompactOption, txnManager.getLastCompletedTransactionOwner()); Review Comment: When a conflict for the same compaction instant execution is detected, we can: 1. check the state of the instant, if it is in `INFLIGHT` state and 1.1) the heartbeat expires, we can just rollback the last execution and reattempt in this run; 1.2) if the heartbeat does not expire, just can the execution of this run and log a wanning log there. 2. if the state if still `REQUESTED`, we can execute it direcly? -- 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. To unsubscribe, e-mail: commits-unsubscr...@hudi.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org