[HUDI-3072] Fixing conflict resolution in transaction management code path for auto commit code path (#4588)
* Fixing conflict resolution in transaction management code path for auto commit code path * Addressing comments * Fixing test failures
This commit is contained in:
committed by
GitHub
parent
cfde45b548
commit
e00a9042e9
@@ -60,9 +60,31 @@ public class TransactionUtils {
|
||||
final Option<HoodieCommitMetadata> thisCommitMetadata,
|
||||
final HoodieWriteConfig config,
|
||||
Option<HoodieInstant> lastCompletedTxnOwnerInstant) throws HoodieWriteConflictException {
|
||||
return resolveWriteConflictIfAny(table, currentTxnOwnerInstant, thisCommitMetadata, config, lastCompletedTxnOwnerInstant, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve any write conflicts when committing data.
|
||||
*
|
||||
* @param table
|
||||
* @param currentTxnOwnerInstant
|
||||
* @param thisCommitMetadata
|
||||
* @param config
|
||||
* @param lastCompletedTxnOwnerInstant
|
||||
* @return
|
||||
* @throws HoodieWriteConflictException
|
||||
*/
|
||||
public static Option<HoodieCommitMetadata> resolveWriteConflictIfAny(
|
||||
final HoodieTable table,
|
||||
final Option<HoodieInstant> currentTxnOwnerInstant,
|
||||
final Option<HoodieCommitMetadata> thisCommitMetadata,
|
||||
final HoodieWriteConfig config,
|
||||
Option<HoodieInstant> lastCompletedTxnOwnerInstant,
|
||||
boolean reloadActiveTimeline) throws HoodieWriteConflictException {
|
||||
if (config.getWriteConcurrencyMode().supportsOptimisticConcurrencyControl()) {
|
||||
ConflictResolutionStrategy resolutionStrategy = config.getWriteConflictResolutionStrategy();
|
||||
Stream<HoodieInstant> instantStream = resolutionStrategy.getCandidateInstants(table.getActiveTimeline(), currentTxnOwnerInstant.get(), lastCompletedTxnOwnerInstant);
|
||||
Stream<HoodieInstant> instantStream = resolutionStrategy.getCandidateInstants(reloadActiveTimeline
|
||||
? table.getMetaClient().reloadActiveTimeline() : table.getActiveTimeline(), currentTxnOwnerInstant.get(), lastCompletedTxnOwnerInstant);
|
||||
final ConcurrentOperation thisOperation = new ConcurrentOperation(currentTxnOwnerInstant.get(), thisCommitMetadata.orElse(new HoodieCommitMetadata()));
|
||||
instantStream.forEach(instant -> {
|
||||
try {
|
||||
|
||||
@@ -31,7 +31,6 @@ import org.apache.hudi.common.model.WriteOperationType;
|
||||
import org.apache.hudi.common.table.timeline.HoodieActiveTimeline;
|
||||
import org.apache.hudi.common.table.timeline.HoodieInstant;
|
||||
import org.apache.hudi.common.table.timeline.HoodieInstant.State;
|
||||
import org.apache.hudi.common.table.timeline.HoodieTimeline;
|
||||
import org.apache.hudi.common.util.Option;
|
||||
import org.apache.hudi.common.util.StringUtils;
|
||||
import org.apache.hudi.common.util.collection.Pair;
|
||||
@@ -152,18 +151,22 @@ public abstract class BaseCommitActionExecutor<T extends HoodieRecordPayload, I,
|
||||
|
||||
protected void autoCommit(Option<Map<String, String>> extraMetadata, HoodieWriteMetadata<O> result) {
|
||||
final Option<HoodieInstant> inflightInstant = Option.of(new HoodieInstant(State.INFLIGHT,
|
||||
HoodieTimeline.COMMIT_ACTION, instantTime));
|
||||
getCommitActionType(), instantTime));
|
||||
this.txnManager.beginTransaction(inflightInstant,
|
||||
lastCompletedTxn.isPresent() ? Option.of(lastCompletedTxn.get().getLeft()) : Option.empty());
|
||||
try {
|
||||
setCommitMetadata(result);
|
||||
// reload active timeline so as to get all updates after current transaction have started. hence setting last arg to true.
|
||||
TransactionUtils.resolveWriteConflictIfAny(table, this.txnManager.getCurrentTransactionOwner(),
|
||||
result.getCommitMetadata(), config, this.txnManager.getLastCompletedTransactionOwner());
|
||||
result.getCommitMetadata(), config, this.txnManager.getLastCompletedTransactionOwner(), true);
|
||||
commit(extraMetadata, result);
|
||||
} finally {
|
||||
this.txnManager.endTransaction(inflightInstant);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void setCommitMetadata(HoodieWriteMetadata<O> result);
|
||||
|
||||
protected abstract void commit(Option<Map<String, String>> extraMetadata, HoodieWriteMetadata<O> result);
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user