[HUDI-845] Added locking capability to allow multiple writers (#2374)
* [HUDI-845] Added locking capability to allow multiple writers 1. Added LockProvider API for pluggable lock methodologies 2. Added Resolution Strategy API to allow for pluggable conflict resolution 3. Added TableService client API to schedule table services 4. Added Transaction Manager for wrapping actions within transactions
This commit is contained in:
@@ -22,14 +22,15 @@ package org.apache.hudi.common.testutils;
|
||||
import org.apache.hudi.avro.model.HoodieCleanMetadata;
|
||||
import org.apache.hudi.avro.model.HoodieCleanerPlan;
|
||||
import org.apache.hudi.avro.model.HoodieRequestedReplaceMetadata;
|
||||
import org.apache.hudi.avro.model.HoodieRollbackMetadata;
|
||||
import org.apache.hudi.common.fs.FSUtils;
|
||||
import org.apache.hudi.common.model.HoodieCommitMetadata;
|
||||
import org.apache.hudi.common.model.HoodieFileFormat;
|
||||
import org.apache.hudi.common.model.HoodiePartitionMetadata;
|
||||
import org.apache.hudi.common.model.HoodieReplaceCommitMetadata;
|
||||
import org.apache.hudi.common.model.IOType;
|
||||
import org.apache.hudi.common.table.HoodieTableMetaClient;
|
||||
import org.apache.hudi.common.table.timeline.HoodieTimeline;
|
||||
import org.apache.hudi.common.table.timeline.TimelineMetadataUtils;
|
||||
import org.apache.hudi.common.table.view.HoodieTableFileSystemView;
|
||||
import org.apache.hudi.common.table.view.TableFileSystemView;
|
||||
import org.apache.hudi.exception.HoodieException;
|
||||
@@ -47,6 +48,8 @@ import java.util.Map;
|
||||
|
||||
import static org.apache.hudi.common.table.timeline.TimelineMetadataUtils.serializeCleanMetadata;
|
||||
import static org.apache.hudi.common.table.timeline.TimelineMetadataUtils.serializeCleanerPlan;
|
||||
import static org.apache.hudi.common.table.timeline.TimelineMetadataUtils.serializeRequestedReplaceMetadata;
|
||||
import static org.apache.hudi.common.table.timeline.TimelineMetadataUtils.serializeRollbackMetadata;
|
||||
|
||||
public class FileCreateUtils {
|
||||
|
||||
@@ -117,6 +120,10 @@ public class FileCreateUtils {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.COMMIT_EXTENSION);
|
||||
}
|
||||
|
||||
public static void createCommit(String basePath, String instantTime, HoodieCommitMetadata metadata) throws IOException {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.COMMIT_EXTENSION, metadata.toJsonString().getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
public static void createCommit(String basePath, String instantTime, FileSystem fs) throws IOException {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.COMMIT_EXTENSION, fs);
|
||||
}
|
||||
@@ -149,9 +156,8 @@ public class FileCreateUtils {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.REPLACE_COMMIT_EXTENSION, metadata.toJsonString().getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
public static void createRequestedReplaceCommit(String basePath, String instantTime, HoodieRequestedReplaceMetadata requestedMetadata) throws IOException {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.REQUESTED_REPLACE_COMMIT_EXTENSION,
|
||||
TimelineMetadataUtils.serializeRequestedReplaceMetadata(requestedMetadata).get());
|
||||
public static void createRequestedReplaceCommit(String basePath, String instantTime, HoodieRequestedReplaceMetadata requestedReplaceMetadata) throws IOException {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.REQUESTED_REPLACE_COMMIT_EXTENSION, serializeRequestedReplaceMetadata(requestedReplaceMetadata).get());
|
||||
}
|
||||
|
||||
public static void createInflightReplaceCommit(String basePath, String instantTime) throws IOException {
|
||||
@@ -170,6 +176,14 @@ public class FileCreateUtils {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.INFLIGHT_CLEAN_EXTENSION, serializeCleanerPlan(cleanerPlan).get());
|
||||
}
|
||||
|
||||
public static void createInflightRollbackFile(String basePath, String instantTime) throws IOException {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.INFLIGHT_ROLLBACK_EXTENSION);
|
||||
}
|
||||
|
||||
public static void createRollbackFile(String basePath, String instantTime, HoodieRollbackMetadata rollbackMetadata) throws IOException {
|
||||
createMetaFile(basePath, instantTime, HoodieTimeline.ROLLBACK_EXTENSION, serializeRollbackMetadata(rollbackMetadata).get());
|
||||
}
|
||||
|
||||
private static void createAuxiliaryMetaFile(String basePath, String instantTime, String suffix) throws IOException {
|
||||
Path parentPath = Paths.get(basePath, HoodieTableMetaClient.AUXILIARYFOLDER_NAME);
|
||||
Files.createDirectories(parentPath);
|
||||
|
||||
@@ -23,7 +23,9 @@ import org.apache.hudi.avro.model.HoodieCleanMetadata;
|
||||
import org.apache.hudi.avro.model.HoodieCleanerPlan;
|
||||
import org.apache.hudi.avro.model.HoodieCompactionPlan;
|
||||
import org.apache.hudi.avro.model.HoodieRequestedReplaceMetadata;
|
||||
import org.apache.hudi.avro.model.HoodieRollbackMetadata;
|
||||
import org.apache.hudi.common.model.FileSlice;
|
||||
import org.apache.hudi.common.model.HoodieCommitMetadata;
|
||||
import org.apache.hudi.common.model.HoodieFileFormat;
|
||||
import org.apache.hudi.common.model.HoodieReplaceCommitMetadata;
|
||||
import org.apache.hudi.common.model.IOType;
|
||||
@@ -65,6 +67,7 @@ import static org.apache.hudi.common.testutils.FileCreateUtils.createInflightCom
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createInflightCompaction;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createInflightDeltaCommit;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createInflightReplaceCommit;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createInflightRollbackFile;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createMarkerFile;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createReplaceCommit;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createRequestedCleanFile;
|
||||
@@ -72,6 +75,7 @@ import static org.apache.hudi.common.testutils.FileCreateUtils.createRequestedCo
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createRequestedCompaction;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createRequestedDeltaCommit;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createRequestedReplaceCommit;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.createRollbackFile;
|
||||
import static org.apache.hudi.common.testutils.FileCreateUtils.logFileName;
|
||||
|
||||
public class HoodieTestTable {
|
||||
@@ -155,6 +159,15 @@ public class HoodieTestTable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public HoodieTestTable addCommit(String instantTime, HoodieCommitMetadata metadata) throws Exception {
|
||||
createRequestedCommit(basePath, instantTime);
|
||||
createInflightCommit(basePath, instantTime);
|
||||
createCommit(basePath, instantTime, metadata);
|
||||
currentInstantTime = instantTime;
|
||||
metaClient = HoodieTableMetaClient.reload(metaClient);
|
||||
return this;
|
||||
}
|
||||
|
||||
public HoodieTestTable addDeltaCommit(String instantTime) throws Exception {
|
||||
createRequestedDeltaCommit(basePath, instantTime);
|
||||
createInflightDeltaCommit(basePath, instantTime);
|
||||
@@ -173,6 +186,13 @@ public class HoodieTestTable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public HoodieTestTable addRequestedReplace(String instantTime, HoodieRequestedReplaceMetadata requestedReplaceMetadata) throws Exception {
|
||||
createRequestedReplaceCommit(basePath, instantTime, requestedReplaceMetadata);
|
||||
currentInstantTime = instantTime;
|
||||
metaClient = HoodieTableMetaClient.reload(metaClient);
|
||||
return this;
|
||||
}
|
||||
|
||||
public HoodieTestTable addInflightClean(String instantTime, HoodieCleanerPlan cleanerPlan) throws IOException {
|
||||
createRequestedCleanFile(basePath, instantTime, cleanerPlan);
|
||||
createInflightCleanFile(basePath, instantTime, cleanerPlan);
|
||||
@@ -190,6 +210,14 @@ public class HoodieTestTable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public HoodieTestTable addRollback(String instantTime, HoodieRollbackMetadata rollbackMetadata) throws IOException {
|
||||
createInflightRollbackFile(basePath, instantTime);
|
||||
createRollbackFile(basePath, instantTime, rollbackMetadata);
|
||||
currentInstantTime = instantTime;
|
||||
metaClient = HoodieTableMetaClient.reload(metaClient);
|
||||
return this;
|
||||
}
|
||||
|
||||
public HoodieTestTable addRequestedCompaction(String instantTime) throws IOException {
|
||||
createRequestedCompaction(basePath, instantTime);
|
||||
currentInstantTime = instantTime;
|
||||
|
||||
@@ -124,14 +124,14 @@ public class ZookeeperTestService {
|
||||
return zooKeeperServer;
|
||||
}
|
||||
|
||||
public void stop() throws IOException {
|
||||
public void stop() throws RuntimeException {
|
||||
if (!started) {
|
||||
return;
|
||||
}
|
||||
|
||||
standaloneServerFactory.shutdown();
|
||||
if (!waitForServerDown(clientPort, CONNECTION_TIMEOUT)) {
|
||||
throw new IOException("Waiting for shutdown of standalone server");
|
||||
throw new RuntimeException("Waiting for shutdown of standalone server");
|
||||
}
|
||||
|
||||
// clear everything
|
||||
@@ -232,4 +232,8 @@ public class ZookeeperTestService {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public String connectString() {
|
||||
return bindIP + ":" + clientPort;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,4 +93,4 @@ public class TestCommitUtils {
|
||||
writeStat1.setFileId(fileId);
|
||||
return writeStat1;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user