[HUDI-1502] MOR rollback and restore support for metadata sync (#2421)
- Adds field to RollbackMetadata that capture the logs written for rollback blocks - Adds field to RollbackMetadata that capture new logs files written by unsynced deltacommits Co-authored-by: Vinoth Chandar <vinoth@apache.org>
This commit is contained in:
committed by
GitHub
parent
de42adc230
commit
e3d3677b7e
@@ -164,6 +164,7 @@ public class HoodieAppendHandle<T extends HoodieRecordPayload, I, K, O> extends
|
||||
// Since the actual log file written to can be different based on when rollover happens, we use the
|
||||
// base file to denote some log appends happened on a slice. writeToken will still fence concurrent
|
||||
// writers.
|
||||
// https://issues.apache.org/jira/browse/HUDI-1517
|
||||
createMarkerFile(partitionPath, FSUtils.makeDataFileName(baseInstantTime, writeToken, fileId, hoodieTable.getBaseFileExtension()));
|
||||
|
||||
this.writer = createLogWriter(fileSlice, baseInstantTime);
|
||||
|
||||
@@ -53,9 +53,9 @@ public abstract class AbstractMarkerBasedRollbackStrategy<T extends HoodieRecord
|
||||
|
||||
protected final HoodieWriteConfig config;
|
||||
|
||||
private final String basePath;
|
||||
protected final String basePath;
|
||||
|
||||
private final String instantTime;
|
||||
protected final String instantTime;
|
||||
|
||||
public AbstractMarkerBasedRollbackStrategy(HoodieTable<T, I, K, O> table, HoodieEngineContext context, HoodieWriteConfig config, String instantTime) {
|
||||
this.table = table;
|
||||
@@ -90,6 +90,7 @@ public abstract class AbstractMarkerBasedRollbackStrategy<T extends HoodieRecord
|
||||
String fileId = FSUtils.getFileIdFromFilePath(baseFilePathForAppend);
|
||||
String baseCommitTime = FSUtils.getCommitTime(baseFilePathForAppend.getName());
|
||||
String partitionPath = FSUtils.getRelativePartitionPath(new Path(basePath), new Path(basePath, appendBaseFilePath).getParent());
|
||||
final Map<FileStatus, Long> writtenLogFileSizeMap = getWrittenLogFileSizeMap(partitionPath, baseCommitTime, fileId);
|
||||
|
||||
HoodieLogFormat.Writer writer = null;
|
||||
try {
|
||||
@@ -121,17 +122,26 @@ public abstract class AbstractMarkerBasedRollbackStrategy<T extends HoodieRecord
|
||||
}
|
||||
}
|
||||
|
||||
Map<FileStatus, Long> filesToNumBlocksRollback = Collections.emptyMap();
|
||||
if (config.useFileListingMetadata()) {
|
||||
// When metadata is enabled, the information of files appended to is required
|
||||
filesToNumBlocksRollback = Collections.singletonMap(
|
||||
// the information of files appended to is required for metadata sync
|
||||
Map<FileStatus, Long> filesToNumBlocksRollback = Collections.singletonMap(
|
||||
table.getMetaClient().getFs().getFileStatus(Objects.requireNonNull(writer).getLogFile().getPath()),
|
||||
1L);
|
||||
}
|
||||
|
||||
return HoodieRollbackStat.newBuilder()
|
||||
.withPartitionPath(partitionPath)
|
||||
.withRollbackBlockAppendResults(filesToNumBlocksRollback)
|
||||
.build();
|
||||
.withWrittenLogFileSizeMap(writtenLogFileSizeMap).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns written log file size map for the respective baseCommitTime to assist in metadata table syncing.
|
||||
* @param partitionPath partition path of interest
|
||||
* @param baseCommitTime base commit time of interest
|
||||
* @param fileId fileId of interest
|
||||
* @return Map<FileStatus, File size>
|
||||
* @throws IOException
|
||||
*/
|
||||
protected Map<FileStatus, Long> getWrittenLogFileSizeMap(String partitionPath, String baseCommitTime, String fileId) throws IOException {
|
||||
return Collections.EMPTY_MAP;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ import org.apache.hudi.table.HoodieTable;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -57,7 +56,7 @@ public abstract class BaseMergeOnReadRollbackActionExecutor<T extends HoodieReco
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<HoodieRollbackStat> executeRollback() throws IOException {
|
||||
protected List<HoodieRollbackStat> executeRollback() {
|
||||
HoodieTimer rollbackTimer = new HoodieTimer();
|
||||
rollbackTimer.startTimer();
|
||||
|
||||
|
||||
@@ -74,14 +74,16 @@ public class RollbackUtils {
|
||||
final List<String> successDeleteFiles = new ArrayList<>();
|
||||
final List<String> failedDeleteFiles = new ArrayList<>();
|
||||
final Map<FileStatus, Long> commandBlocksCount = new HashMap<>();
|
||||
final List<FileStatus> filesToRollback = new ArrayList<>();
|
||||
final Map<FileStatus, Long> writtenLogFileSizeMap = new HashMap<>();
|
||||
Option.ofNullable(stat1.getSuccessDeleteFiles()).ifPresent(successDeleteFiles::addAll);
|
||||
Option.ofNullable(stat2.getSuccessDeleteFiles()).ifPresent(successDeleteFiles::addAll);
|
||||
Option.ofNullable(stat1.getFailedDeleteFiles()).ifPresent(failedDeleteFiles::addAll);
|
||||
Option.ofNullable(stat2.getFailedDeleteFiles()).ifPresent(failedDeleteFiles::addAll);
|
||||
Option.ofNullable(stat1.getCommandBlocksCount()).ifPresent(commandBlocksCount::putAll);
|
||||
Option.ofNullable(stat2.getCommandBlocksCount()).ifPresent(commandBlocksCount::putAll);
|
||||
return new HoodieRollbackStat(stat1.getPartitionPath(), successDeleteFiles, failedDeleteFiles, commandBlocksCount);
|
||||
Option.ofNullable(stat1.getWrittenLogFileSizeMap()).ifPresent(writtenLogFileSizeMap::putAll);
|
||||
Option.ofNullable(stat2.getWrittenLogFileSizeMap()).ifPresent(writtenLogFileSizeMap::putAll);
|
||||
return new HoodieRollbackStat(stat1.getPartitionPath(), successDeleteFiles, failedDeleteFiles, commandBlocksCount, writtenLogFileSizeMap);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user