[HUDI-2475] [HUDI-2862] Metadata table creation and avoid bootstrapping race for write client & add locking for upgrade (#4114)
Co-authored-by: Sivabalan Narayanan <n.siva.b@gmail.com>
This commit is contained in:
committed by
GitHub
parent
3a8d64e584
commit
2c7656c35f
@@ -265,7 +265,7 @@ public abstract class AbstractHoodieWriteClient<T extends HoodieRecordPayload, I
|
||||
* @param metadata instance of {@link HoodieCommitMetadata}.
|
||||
*/
|
||||
protected void writeTableMetadata(HoodieTable table, String instantTime, String actionType, HoodieCommitMetadata metadata) {
|
||||
table.getMetadataWriter().ifPresent(w -> ((HoodieTableMetadataWriter)w).update(metadata, instantTime,
|
||||
table.getMetadataWriter(instantTime).ifPresent(w -> ((HoodieTableMetadataWriter) w).update(metadata, instantTime,
|
||||
table.isTableServiceAction(actionType)));
|
||||
}
|
||||
|
||||
|
||||
@@ -82,6 +82,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import static org.apache.hudi.common.table.HoodieTableConfig.ARCHIVELOG_FOLDER;
|
||||
import static org.apache.hudi.metadata.HoodieTableMetadata.METADATA_TABLE_NAME_SUFFIX;
|
||||
import static org.apache.hudi.metadata.HoodieTableMetadata.NON_PARTITIONED_NAME;
|
||||
import static org.apache.hudi.metadata.HoodieTableMetadata.SOLO_COMMIT_TIMESTAMP;
|
||||
|
||||
/**
|
||||
@@ -712,7 +713,8 @@ public abstract class HoodieBackedTableMetadataWriter implements HoodieTableMeta
|
||||
*
|
||||
*/
|
||||
protected void bootstrapCommit(List<DirectoryInfo> partitionInfoList, String createInstantTime) {
|
||||
List<String> partitions = partitionInfoList.stream().map(p -> p.getRelativePath()).collect(Collectors.toList());
|
||||
List<String> partitions = partitionInfoList.stream().map(p ->
|
||||
p.getRelativePath().isEmpty() ? NON_PARTITIONED_NAME : p.getRelativePath()).collect(Collectors.toList());
|
||||
final int totalFiles = partitionInfoList.stream().mapToInt(p -> p.getTotalFiles()).sum();
|
||||
|
||||
// Record which saves the list of all partitions
|
||||
@@ -727,7 +729,7 @@ public abstract class HoodieBackedTableMetadataWriter implements HoodieTableMeta
|
||||
HoodieData<HoodieRecord> fileListRecords = engineContext.parallelize(partitionInfoList, partitionInfoList.size()).map(partitionInfo -> {
|
||||
// Record which saves files within a partition
|
||||
return HoodieMetadataPayload.createPartitionFilesRecord(
|
||||
partitionInfo.getRelativePath(), Option.of(partitionInfo.getFileNameToSizeMap()), Option.empty());
|
||||
partitionInfo.getRelativePath().isEmpty() ? NON_PARTITIONED_NAME : partitionInfo.getRelativePath(), Option.of(partitionInfo.getFileNameToSizeMap()), Option.empty());
|
||||
});
|
||||
partitionRecords = partitionRecords.union(fileListRecords);
|
||||
}
|
||||
|
||||
@@ -737,10 +737,11 @@ public abstract class HoodieTable<T extends HoodieRecordPayload, I, K, O> implem
|
||||
/**
|
||||
* Get Table metadata writer.
|
||||
*
|
||||
* @param triggeringInstantTimestamp - The instant that is triggering this metadata write
|
||||
* @return instance of {@link HoodieTableMetadataWriter
|
||||
*/
|
||||
public final Option<HoodieTableMetadataWriter> getMetadataWriter() {
|
||||
return getMetadataWriter(Option.empty());
|
||||
public final Option<HoodieTableMetadataWriter> getMetadataWriter(String triggeringInstantTimestamp) {
|
||||
return getMetadataWriter(triggeringInstantTimestamp, Option.empty());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -752,10 +753,19 @@ public abstract class HoodieTable<T extends HoodieRecordPayload, I, K, O> implem
|
||||
|
||||
/**
|
||||
* Get Table metadata writer.
|
||||
* <p>
|
||||
* Note:
|
||||
* Get the metadata writer for the conf. If the metadata table doesn't exist,
|
||||
* this wil trigger the creation of the table and the initial bootstrapping.
|
||||
* Since this call is under the transaction lock, other concurrent writers
|
||||
* are blocked from doing the similar initial metadata table creation and
|
||||
* the bootstrapping.
|
||||
*
|
||||
* @param triggeringInstantTimestamp - The instant that is triggering this metadata write
|
||||
* @return instance of {@link HoodieTableMetadataWriter}
|
||||
*/
|
||||
public <T extends SpecificRecordBase> Option<HoodieTableMetadataWriter> getMetadataWriter(Option<T> actionMetadata) {
|
||||
public <T extends SpecificRecordBase> Option<HoodieTableMetadataWriter> getMetadataWriter(String triggeringInstantTimestamp,
|
||||
Option<T> actionMetadata) {
|
||||
// Each engine is expected to override this and
|
||||
// provide the actual metadata writer, if enabled.
|
||||
return Option.empty();
|
||||
|
||||
@@ -57,7 +57,8 @@ public abstract class BaseActionExecutor<T extends HoodieRecordPayload, I, K, O,
|
||||
* @param metadata commit metadata of interest.
|
||||
*/
|
||||
protected final void writeTableMetadata(HoodieCommitMetadata metadata, String actionType) {
|
||||
table.getMetadataWriter().ifPresent(w -> w.update(metadata, instantTime, table.isTableServiceAction(actionType)));
|
||||
table.getMetadataWriter(instantTime).ifPresent(w -> w.update(
|
||||
metadata, instantTime, table.isTableServiceAction(actionType)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -65,7 +66,7 @@ public abstract class BaseActionExecutor<T extends HoodieRecordPayload, I, K, O,
|
||||
* @param metadata clean metadata of interest.
|
||||
*/
|
||||
protected final void writeTableMetadata(HoodieCleanMetadata metadata) {
|
||||
table.getMetadataWriter().ifPresent(w -> w.update(metadata, instantTime));
|
||||
table.getMetadataWriter(instantTime).ifPresent(w -> w.update(metadata, instantTime));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,7 +74,7 @@ public abstract class BaseActionExecutor<T extends HoodieRecordPayload, I, K, O,
|
||||
* @param metadata rollback metadata of interest.
|
||||
*/
|
||||
protected final void writeTableMetadata(HoodieRollbackMetadata metadata) {
|
||||
table.getMetadataWriter(Option.of(metadata)).ifPresent(w -> w.update(metadata, instantTime));
|
||||
table.getMetadataWriter(instantTime, Option.of(metadata)).ifPresent(w -> w.update(metadata, instantTime));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -81,6 +82,6 @@ public abstract class BaseActionExecutor<T extends HoodieRecordPayload, I, K, O,
|
||||
* @param metadata restore metadata of interest.
|
||||
*/
|
||||
protected final void writeTableMetadata(HoodieRestoreMetadata metadata) {
|
||||
table.getMetadataWriter(Option.of(metadata)).ifPresent(w -> w.update(metadata, instantTime));
|
||||
table.getMetadataWriter(instantTime, Option.of(metadata)).ifPresent(w -> w.update(metadata, instantTime));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user