[HUDI-2861] Re-use same rollback instant time for failed rollbacks (#4123)
This commit is contained in:
committed by
GitHub
parent
a88691fed3
commit
f8e0176eb0
@@ -26,6 +26,7 @@ import org.apache.hudi.common.model.HoodieRecord;
|
||||
import org.apache.hudi.common.table.HoodieTableMetaClient;
|
||||
import org.apache.hudi.common.table.timeline.HoodieInstant;
|
||||
import org.apache.hudi.common.table.view.TableFileSystemView.BaseFileOnlyView;
|
||||
import org.apache.hudi.common.testutils.FileCreateUtils;
|
||||
import org.apache.hudi.common.testutils.HoodieTestDataGenerator;
|
||||
import org.apache.hudi.common.testutils.HoodieTestTable;
|
||||
import org.apache.hudi.config.HoodieCompactionConfig;
|
||||
@@ -247,6 +248,84 @@ public class TestClientRollback extends HoodieClientTestBase {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Cases for effects of rollbacking completed/inflight commits.
|
||||
*/
|
||||
@Test
|
||||
public void testFailedRollbackCommit() throws Exception {
|
||||
// Let's create some commit files and base files
|
||||
final String p1 = "2016/05/01";
|
||||
final String p2 = "2016/05/02";
|
||||
final String p3 = "2016/05/06";
|
||||
final String commitTime1 = "20160501010101";
|
||||
final String commitTime2 = "20160502020601";
|
||||
final String commitTime3 = "20160506030611";
|
||||
Map<String, String> partitionAndFileId1 = new HashMap<String, String>() {
|
||||
{
|
||||
put(p1, "id11");
|
||||
put(p2, "id12");
|
||||
put(p3, "id13");
|
||||
}
|
||||
};
|
||||
Map<String, String> partitionAndFileId2 = new HashMap<String, String>() {
|
||||
{
|
||||
put(p1, "id21");
|
||||
put(p2, "id22");
|
||||
put(p3, "id23");
|
||||
}
|
||||
};
|
||||
Map<String, String> partitionAndFileId3 = new HashMap<String, String>() {
|
||||
{
|
||||
put(p1, "id31");
|
||||
put(p2, "id32");
|
||||
put(p3, "id33");
|
||||
}
|
||||
};
|
||||
HoodieTestTable testTable = HoodieTestTable.of(metaClient)
|
||||
.withPartitionMetaFiles(p1, p2, p3)
|
||||
.addCommit(commitTime1)
|
||||
.withBaseFilesInPartitions(partitionAndFileId1)
|
||||
.addCommit(commitTime2)
|
||||
.withBaseFilesInPartitions(partitionAndFileId2)
|
||||
.addInflightCommit(commitTime3)
|
||||
.withBaseFilesInPartitions(partitionAndFileId3);
|
||||
|
||||
HoodieWriteConfig config = HoodieWriteConfig.newBuilder().withPath(basePath)
|
||||
.withRollbackUsingMarkers(false)
|
||||
.withCompactionConfig(HoodieCompactionConfig.newBuilder()
|
||||
.withFailedWritesCleaningPolicy(HoodieFailedWritesCleaningPolicy.LAZY).build())
|
||||
.withIndexConfig(HoodieIndexConfig.newBuilder().withIndexType(HoodieIndex.IndexType.INMEMORY).build()).build();
|
||||
|
||||
try (SparkRDDWriteClient client = getHoodieWriteClient(config)) {
|
||||
|
||||
// Rollback commit3
|
||||
client.rollback(commitTime3);
|
||||
assertFalse(testTable.inflightCommitExists(commitTime3));
|
||||
assertFalse(testTable.baseFilesExist(partitionAndFileId3, commitTime3));
|
||||
assertTrue(testTable.baseFilesExist(partitionAndFileId2, commitTime2));
|
||||
|
||||
metaClient.reloadActiveTimeline();
|
||||
List<HoodieInstant> rollbackInstants = metaClient.getActiveTimeline().getRollbackTimeline().getInstants().collect(Collectors.toList());
|
||||
assertEquals(rollbackInstants.size(), 1);
|
||||
HoodieInstant rollbackInstant = rollbackInstants.get(0);
|
||||
|
||||
// delete rollback completed meta file and retry rollback.
|
||||
FileCreateUtils.deleteRollbackCommit(basePath, rollbackInstant.getTimestamp());
|
||||
|
||||
// recreate actual commit files so that we can retry the rollback
|
||||
testTable.addInflightCommit(commitTime3).withBaseFilesInPartitions(partitionAndFileId3);
|
||||
|
||||
// retry rolling back the commit again.
|
||||
client.rollback(commitTime3);
|
||||
|
||||
// verify there are no extra rollback instants
|
||||
metaClient.reloadActiveTimeline();
|
||||
rollbackInstants = metaClient.getActiveTimeline().getRollbackTimeline().getInstants().collect(Collectors.toList());
|
||||
assertEquals(rollbackInstants.size(), 1);
|
||||
assertEquals(rollbackInstants.get(0), rollbackInstant);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test auto-rollback of commits which are in flight.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user