[HUDI-2794] Guarding table service commits within a single lock to commit to both data table and metadata table (#4037)
* Fixing a single lock to commit table services across metadata table and data table * Addressing comments * rebasing with master
This commit is contained in:
committed by
GitHub
parent
b972aa5bf2
commit
7bb90e8caf
@@ -205,31 +205,19 @@ public class CleanActionExecutor<T extends HoodieRecordPayload, I, K, O> extends
|
||||
Option.of(timer.endTimer()),
|
||||
cleanStats
|
||||
);
|
||||
writeMetadata(metadata);
|
||||
if (!skipLocking) {
|
||||
this.txnManager.beginTransaction(Option.empty(), Option.empty());
|
||||
}
|
||||
writeTableMetadata(metadata);
|
||||
table.getActiveTimeline().transitionCleanInflightToComplete(inflightInstant,
|
||||
TimelineMetadataUtils.serializeCleanMetadata(metadata));
|
||||
LOG.info("Marked clean started on " + inflightInstant.getTimestamp() + " as complete");
|
||||
return metadata;
|
||||
} catch (IOException e) {
|
||||
throw new HoodieIOException("Failed to clean up after commit", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update metadata table if available. Any update to metadata table happens within data table lock.
|
||||
* @param cleanMetadata instance of {@link HoodieCleanMetadata} to be applied to metadata.
|
||||
*/
|
||||
private void writeMetadata(HoodieCleanMetadata cleanMetadata) {
|
||||
if (config.isMetadataTableEnabled()) {
|
||||
try {
|
||||
if (!skipLocking) {
|
||||
this.txnManager.beginTransaction(Option.empty(), Option.empty());
|
||||
}
|
||||
writeTableMetadata(cleanMetadata);
|
||||
} finally {
|
||||
if (!skipLocking) {
|
||||
this.txnManager.endTransaction();
|
||||
}
|
||||
} finally {
|
||||
if (!skipLocking) {
|
||||
this.txnManager.endTransaction();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,30 +255,18 @@ public abstract class BaseRollbackActionExecutor<T extends HoodieRecordPayload,
|
||||
|
||||
protected void finishRollback(HoodieInstant inflightInstant, HoodieRollbackMetadata rollbackMetadata) throws HoodieIOException {
|
||||
try {
|
||||
writeToMetadata(rollbackMetadata);
|
||||
if (!skipLocking) {
|
||||
this.txnManager.beginTransaction(Option.empty(), Option.empty());
|
||||
}
|
||||
writeTableMetadata(rollbackMetadata);
|
||||
table.getActiveTimeline().transitionRollbackInflightToComplete(inflightInstant,
|
||||
TimelineMetadataUtils.serializeRollbackMetadata(rollbackMetadata));
|
||||
LOG.info("Rollback of Commits " + rollbackMetadata.getCommitsRollback() + " is complete");
|
||||
} catch (IOException e) {
|
||||
throw new HoodieIOException("Error executing rollback at instant " + instantTime, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update metadata table if available. Any update to metadata table happens within data table lock.
|
||||
* @param rollbackMetadata instance of {@link HoodieRollbackMetadata} to be applied to metadata.
|
||||
*/
|
||||
private void writeToMetadata(HoodieRollbackMetadata rollbackMetadata) {
|
||||
if (config.isMetadataTableEnabled()) {
|
||||
try {
|
||||
if (!skipLocking) {
|
||||
this.txnManager.beginTransaction(Option.empty(), Option.empty());
|
||||
}
|
||||
writeTableMetadata(rollbackMetadata);
|
||||
} finally {
|
||||
if (!skipLocking) {
|
||||
this.txnManager.endTransaction();
|
||||
}
|
||||
} finally {
|
||||
if (!skipLocking) {
|
||||
this.txnManager.endTransaction();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user