|
|
|
@ -34,6 +34,7 @@ import org.apache.flink.types.Row;
|
|
|
|
|
import org.apache.flink.util.CloseableIterator;
|
|
|
|
|
import org.apache.flink.util.ExceptionUtils;
|
|
|
|
|
|
|
|
|
|
import com.ververica.cdc.connectors.base.options.StartupOptions;
|
|
|
|
|
import com.ververica.cdc.connectors.base.source.utils.hooks.SnapshotPhaseHook;
|
|
|
|
|
import com.ververica.cdc.connectors.base.source.utils.hooks.SnapshotPhaseHooks;
|
|
|
|
|
import com.ververica.cdc.connectors.postgres.PostgresTestBase;
|
|
|
|
@ -89,6 +90,7 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
private final String scanStartupMode;
|
|
|
|
|
|
|
|
|
@ -323,13 +325,81 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
tableResult.getJobClient().get().cancel().get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testSnapshotOnlyModeWithDMLPostHighWaterMark() throws Exception {
|
|
|
|
|
// The data num is 21, set fetchSize = 22 to test the job is bounded.
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
false, 22, 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 {
|
|
|
|
|
// The data num is 21, set fetchSize = 22 to test the job is bounded
|
|
|
|
|
List<String> records =
|
|
|
|
|
testBackfillWhenWritingEvents(
|
|
|
|
|
false, 22, 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 {
|
|
|
|
|
if (!DEFAULT_SCAN_STARTUP_MODE.equals(scanStartupMode)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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(
|
|
|
|
@ -365,7 +435,9 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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(
|
|
|
|
@ -401,7 +473,9 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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(
|
|
|
|
@ -441,7 +515,9 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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(
|
|
|
|
@ -477,7 +553,11 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<String> testBackfillWhenWritingEvents(
|
|
|
|
|
boolean skipSnapshotBackfill, int fetchSize, int hookType) throws Exception {
|
|
|
|
|
boolean skipSnapshotBackfill,
|
|
|
|
|
int fetchSize,
|
|
|
|
|
int hookType,
|
|
|
|
|
StartupOptions startupOptions)
|
|
|
|
|
throws Exception {
|
|
|
|
|
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
|
|
|
|
|
env.enableCheckpointing(1000);
|
|
|
|
|
env.setParallelism(1);
|
|
|
|
@ -504,6 +584,7 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
.database(customDatabase.getDatabaseName())
|
|
|
|
|
.slotName(slotName)
|
|
|
|
|
.tableList(tableId)
|
|
|
|
|
.startupOptions(startupOptions)
|
|
|
|
|
.skipSnapshotBackfill(skipSnapshotBackfill)
|
|
|
|
|
.deserializer(customerTable.getDeserializer())
|
|
|
|
|
.build();
|
|
|
|
@ -528,10 +609,16 @@ public class PostgresSourceITCase extends PostgresTestBase {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (hookType == USE_POST_LOWWATERMARK_HOOK) {
|
|
|
|
|
hooks.setPostLowWatermarkAction(snapshotPhaseHook);
|
|
|
|
|
} else if (hookType == USE_PRE_HIGHWATERMARK_HOOK) {
|
|
|
|
|
hooks.setPreHighWatermarkAction(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);
|
|
|
|
|
|
|
|
|
|