|
|
|
@ -160,6 +160,8 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
private static final int USE_POST_LOWWATERMARK_HOOK = 1;
|
|
|
|
|
private static final int USE_PRE_HIGHWATERMARK_HOOK = 2;
|
|
|
|
|
|
|
|
|
|
private static final int USE_POST_HIGHWATERMARK_HOOK = 3;
|
|
|
|
|
|
|
|
|
|
@Parameterized.Parameters(name = "table: {0}, chunkColumn: {1}")
|
|
|
|
|
public static Collection<Object[]> parameters() {
|
|
|
|
|
return Arrays.asList(
|
|
|
|
@ -350,10 +352,76 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
testStartingOffset(StartupOptions.latest(), Collections.emptyList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testSnapshotOnlyModeWithDMLPostHighWaterMark() throws Exception {
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
false, 21, USE_POST_HIGHWATERMARK_HOOK, StartupOptions.snapshot());
|
|
|
|
|
List<String> expectedRecords =
|
|
|
|
|
Arrays.asList(
|
|
|
|
|
"+I[101, user_1, Shanghai, 123567891234]",
|
|
|
|
|
"+I[102, user_2, Shanghai, 123567891234]",
|
|
|
|
|
"+I[103, user_3, Shanghai, 123567891234]",
|
|
|
|
|
"+I[109, user_4, Shanghai, 123567891234]",
|
|
|
|
|
"+I[110, user_5, Shanghai, 123567891234]",
|
|
|
|
|
"+I[111, user_6, Shanghai, 123567891234]",
|
|
|
|
|
"+I[118, user_7, Shanghai, 123567891234]",
|
|
|
|
|
"+I[121, user_8, Shanghai, 123567891234]",
|
|
|
|
|
"+I[123, user_9, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1009, user_10, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1010, user_11, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1011, user_12, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1012, user_13, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1013, user_14, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1014, user_15, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1015, user_16, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1016, user_17, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1017, user_18, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1018, user_19, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1019, user_20, Shanghai, 123567891234]",
|
|
|
|
|
"+I[2000, user_21, Shanghai, 123567891234]");
|
|
|
|
|
assertEqualsInAnyOrder(expectedRecords, records);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testSnapshotOnlyModeWithDMLPreHighWaterMark() throws Exception {
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
false, 21, USE_PRE_HIGHWATERMARK_HOOK, StartupOptions.snapshot());
|
|
|
|
|
List<String> expectedRecords =
|
|
|
|
|
Arrays.asList(
|
|
|
|
|
"+I[101, user_1, Shanghai, 123567891234]",
|
|
|
|
|
"+I[102, user_2, Shanghai, 123567891234]",
|
|
|
|
|
"+I[103, user_3, Shanghai, 123567891234]",
|
|
|
|
|
"+I[109, user_4, Shanghai, 123567891234]",
|
|
|
|
|
"+I[110, user_5, Shanghai, 123567891234]",
|
|
|
|
|
"+I[111, user_6, Shanghai, 123567891234]",
|
|
|
|
|
"+I[118, user_7, Shanghai, 123567891234]",
|
|
|
|
|
"+I[121, user_8, Shanghai, 123567891234]",
|
|
|
|
|
"+I[123, user_9, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1009, user_10, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1010, user_11, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1011, user_12, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1012, user_13, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1013, user_14, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1014, user_15, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1015, user_16, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1016, user_17, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1017, user_18, Shanghai, 123567891234]",
|
|
|
|
|
"+I[1018, user_19, Shanghai, 123567891234]",
|
|
|
|
|
"+I[2000, user_21, Pittsburgh, 123567891234]",
|
|
|
|
|
"+I[15213, user_15213, Shanghai, 123567891234]");
|
|
|
|
|
// when enable backfill, the wal log between (snapshot, high_watermark) will be
|
|
|
|
|
// applied as snapshot image
|
|
|
|
|
assertEqualsInAnyOrder(expectedRecords, records);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testEnableBackfillWithDMLPreHighWaterMark() throws Exception {
|
|
|
|
|
|
|
|
|
|
List<String> records = testBackfillWhenWritingEvents(false, 21, USE_PRE_HIGHWATERMARK_HOOK);
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
false, 21, USE_PRE_HIGHWATERMARK_HOOK, StartupOptions.initial());
|
|
|
|
|
|
|
|
|
|
List<String> expectedRecords =
|
|
|
|
|
Arrays.asList(
|
|
|
|
@ -386,7 +454,9 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
@Test
|
|
|
|
|
public void testEnableBackfillWithDMLPostLowWaterMark() throws Exception {
|
|
|
|
|
|
|
|
|
|
List<String> records = testBackfillWhenWritingEvents(false, 21, USE_POST_LOWWATERMARK_HOOK);
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
false, 21, USE_POST_LOWWATERMARK_HOOK, StartupOptions.initial());
|
|
|
|
|
|
|
|
|
|
List<String> expectedRecords =
|
|
|
|
|
Arrays.asList(
|
|
|
|
@ -419,7 +489,9 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
@Test
|
|
|
|
|
public void testSkipBackfillWithDMLPreHighWaterMark() throws Exception {
|
|
|
|
|
|
|
|
|
|
List<String> records = testBackfillWhenWritingEvents(true, 25, USE_PRE_HIGHWATERMARK_HOOK);
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
true, 25, USE_PRE_HIGHWATERMARK_HOOK, StartupOptions.initial());
|
|
|
|
|
|
|
|
|
|
List<String> expectedRecords =
|
|
|
|
|
Arrays.asList(
|
|
|
|
@ -456,7 +528,9 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
@Test
|
|
|
|
|
public void testSkipBackfillWithDMLPostLowWaterMark() throws Exception {
|
|
|
|
|
|
|
|
|
|
List<String> records = testBackfillWhenWritingEvents(true, 25, USE_POST_LOWWATERMARK_HOOK);
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
true, 25, USE_POST_LOWWATERMARK_HOOK, StartupOptions.initial());
|
|
|
|
|
|
|
|
|
|
List<String> expectedRecords =
|
|
|
|
|
Arrays.asList(
|
|
|
|
@ -492,7 +566,11 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<String> testBackfillWhenWritingEvents(
|
|
|
|
|
boolean skipSnapshotBackfill, int fetchSize, int hookType) throws Exception {
|
|
|
|
|
boolean skipSnapshotBackfill,
|
|
|
|
|
int fetchSize,
|
|
|
|
|
int hookType,
|
|
|
|
|
StartupOptions startupOptions)
|
|
|
|
|
throws Exception {
|
|
|
|
|
customDatabase.createAndInitialize();
|
|
|
|
|
TestTable customerTable =
|
|
|
|
|
new TestTable(customDatabase, "customers", TestTableSchemas.CUSTOMERS);
|
|
|
|
@ -509,6 +587,7 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
.tableList(customerTable.getTableId())
|
|
|
|
|
.deserializer(customerTable.getDeserializer())
|
|
|
|
|
.skipSnapshotBackfill(skipSnapshotBackfill)
|
|
|
|
|
.startupOptions(startupOptions)
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
String[] statements =
|
|
|
|
@ -529,10 +608,17 @@ public class MySqlSourceITCase extends MySqlSourceTestBase {
|
|
|
|
|
connection.execute(statements);
|
|
|
|
|
connection.commit();
|
|
|
|
|
};
|
|
|
|
|
if (hookType == USE_PRE_HIGHWATERMARK_HOOK) {
|
|
|
|
|
hooks.setPreHighWatermarkAction(snapshotPhaseHook);
|
|
|
|
|
} else if (hookType == USE_POST_LOWWATERMARK_HOOK) {
|
|
|
|
|
hooks.setPostLowWatermarkAction(snapshotPhaseHook);
|
|
|
|
|
|
|
|
|
|
switch (hookType) {
|
|
|
|
|
case USE_POST_LOWWATERMARK_HOOK:
|
|
|
|
|
hooks.setPostLowWatermarkAction(snapshotPhaseHook);
|
|
|
|
|
break;
|
|
|
|
|
case USE_PRE_HIGHWATERMARK_HOOK:
|
|
|
|
|
hooks.setPreHighWatermarkAction(snapshotPhaseHook);
|
|
|
|
|
break;
|
|
|
|
|
case USE_POST_HIGHWATERMARK_HOOK:
|
|
|
|
|
hooks.setPostHighWatermarkAction(snapshotPhaseHook);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
source.setSnapshotHooks(hooks);
|
|
|
|
|