Skip to content

Commit a384791

Browse files
author
Marius Posta
authored
bulk-cdk-toolkit-extract-cdc,source-mysql-v2: speed up Debezium tests with mysql (#46341)
1 parent d0d3d40 commit a384791

5 files changed

Lines changed: 33 additions & 10 deletions

File tree

airbyte-cdk/bulk/toolkits/extract-cdc/src/test/kotlin/io/airbyte/cdk/read/cdc/CdcPartitionReaderTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ class CdcPartitionReaderMySQLTest :
387387
.withDebeziumName(databaseName)
388388
.withHeartbeats(heartbeat)
389389
.with("include.schema.changes", "false")
390+
.with("connect.keep.alive.interval.ms", "1000")
390391
.withDatabase("hostname", host)
391392
.withDatabase("port", firstMappedPort.toString())
392393
.withDatabase("user", username)

airbyte-integrations/connectors/source-mysql-v2/metadata.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ data:
99
connectorSubtype: database
1010
connectorType: source
1111
definitionId: 561393ed-7e3a-4d0d-8b8b-90ded371754c
12-
dockerImageTag: 0.0.13
12+
dockerImageTag: 0.0.14
1313
dockerRepository: airbyte/source-mysql-v2
1414
documentationUrl: https://docs.airbyte.com/integrations/sources/mysql
1515
githubIssueLabel: source-mysql-v2

airbyte-integrations/connectors/source-mysql-v2/src/main/kotlin/io/airbyte/integrations/source/mysql/MysqlSourceConfiguration.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ package io.airbyte.integrations.source.mysql
33

44
import io.airbyte.cdk.ConfigErrorException
55
import io.airbyte.cdk.command.CdcSourceConfiguration
6+
import io.airbyte.cdk.command.ConfigurationSpecificationSupplier
67
import io.airbyte.cdk.command.JdbcSourceConfiguration
78
import io.airbyte.cdk.command.SourceConfiguration
89
import io.airbyte.cdk.command.SourceConfigurationFactory
910
import io.airbyte.cdk.ssh.SshConnectionOptions
1011
import io.airbyte.cdk.ssh.SshTunnelMethodConfiguration
1112
import io.github.oshai.kotlinlogging.KotlinLogging
13+
import io.micronaut.context.annotation.Factory
1214
import jakarta.inject.Singleton
1315
import java.net.URLDecoder
1416
import java.nio.charset.StandardCharsets
@@ -30,9 +32,22 @@ data class MysqlSourceConfiguration(
3032
override val resourceAcquisitionHeartbeat: Duration = Duration.ofMillis(100L),
3133
override val checkpointTargetInterval: Duration,
3234
override val checkPrivileges: Boolean,
33-
override val debeziumHeartbeatInterval: Duration = Duration.ofSeconds(1),
35+
override val debeziumHeartbeatInterval: Duration = Duration.ofSeconds(10),
36+
val debeziumKeepAliveInterval: Duration = Duration.ofMinutes(1),
3437
) : JdbcSourceConfiguration, CdcSourceConfiguration {
3538
override val global = cursorConfiguration is CdcCursor
39+
40+
/** Required to inject [MysqlSourceConfiguration] directly. */
41+
@Factory
42+
private class MicronautFactory {
43+
@Singleton
44+
fun mysqlSourceConfig(
45+
factory:
46+
SourceConfigurationFactory<
47+
MysqlSourceConfigurationJsonObject, MysqlSourceConfiguration>,
48+
supplier: ConfigurationSpecificationSupplier<MysqlSourceConfigurationJsonObject>,
49+
): MysqlSourceConfiguration = factory.make(supplier.get())
50+
}
3651
}
3752

3853
@Singleton

airbyte-integrations/connectors/source-mysql-v2/src/main/kotlin/io/airbyte/integrations/source/mysql/cdc/MySqlDebeziumOperations.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import com.fasterxml.jackson.databind.JsonNode
88
import com.fasterxml.jackson.databind.node.ArrayNode
99
import com.fasterxml.jackson.databind.node.ObjectNode
1010
import io.airbyte.cdk.ConfigErrorException
11-
import io.airbyte.cdk.command.CdcSourceConfiguration
12-
import io.airbyte.cdk.command.JdbcSourceConfiguration
1311
import io.airbyte.cdk.command.OpaqueStateValue
1412
import io.airbyte.cdk.data.OffsetDateTimeCodec
1513
import io.airbyte.cdk.discover.CommonMetaField
@@ -28,6 +26,7 @@ import io.airbyte.cdk.read.cdc.DebeziumSchemaHistory
2826
import io.airbyte.cdk.read.cdc.DebeziumState
2927
import io.airbyte.cdk.ssh.TunnelSession
3028
import io.airbyte.cdk.util.Jsons
29+
import io.airbyte.integrations.source.mysql.MysqlSourceConfiguration
3130
import io.airbyte.protocol.models.v0.AirbyteRecordMessage
3231
import io.airbyte.protocol.models.v0.AirbyteRecordMessageMeta
3332
import io.debezium.connector.mysql.MySqlConnector
@@ -53,8 +52,7 @@ import org.apache.kafka.connect.source.SourceRecord
5352
@Singleton
5453
class MySqlDebeziumOperations(
5554
val jdbcConnectionFactory: JdbcConnectionFactory,
56-
jdbcSourceConfiguration: JdbcSourceConfiguration,
57-
cdcSourceConfiguration: CdcSourceConfiguration,
55+
configuration: MysqlSourceConfiguration,
5856
random: Random = Random.Default,
5957
) : DebeziumOperations<MySqlPosition> {
6058
private val log = KotlinLogging.logger {}
@@ -249,7 +247,7 @@ class MySqlDebeziumOperations(
249247
return Jsons.objectNode().apply { set<JsonNode>(STATE, stateNode) }
250248
}
251249

252-
val databaseName: String = jdbcSourceConfiguration.namespaces.first()
250+
val databaseName: String = configuration.namespaces.first()
253251
val serverID: Int = random.nextInt(MIN_SERVER_ID..MAX_SERVER_ID)
254252

255253
val commonProperties: Map<String, String> by lazy {
@@ -258,7 +256,7 @@ class MySqlDebeziumOperations(
258256
.withDefault()
259257
.withConnector(MySqlConnector::class.java)
260258
.withDebeziumName(databaseName)
261-
.withHeartbeats(cdcSourceConfiguration.debeziumHeartbeatInterval)
259+
.withHeartbeats(configuration.debeziumHeartbeatInterval)
262260
// This to make sure that binary data represented as a base64-encoded String.
263261
// https://debezium.io/documentation/reference/2.2/connectors/mysql.html#mysql-property-binary-handling-mode
264262
.with("binary.handling.mode", "base64")
@@ -271,7 +269,11 @@ class MySqlDebeziumOperations(
271269
.with("snapshot.locking.mode", "none")
272270
// https://debezium.io/documentation/reference/2.2/connectors/mysql.html#mysql-property-include-schema-changes
273271
.with("include.schema.changes", "false")
274-
.withDatabase(jdbcSourceConfiguration.jdbcProperties)
272+
.with(
273+
"connect.keep.alive.interval.ms",
274+
configuration.debeziumKeepAliveInterval.toMillis().toString()
275+
)
276+
.withDatabase(configuration.jdbcProperties)
275277
.withDatabase("hostname", tunnelSession.address.hostName)
276278
.withDatabase("port", tunnelSession.address.port.toString())
277279
.withDatabase("dbname", databaseName)

airbyte-integrations/connectors/source-mysql-v2/src/test/kotlin/io/airbyte/integrations/source/mysql/MysqlSourceTestConfigurationFactory.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,10 @@ class MysqlSourceTestConfigurationFactory :
1818
): MysqlSourceConfiguration =
1919
MysqlSourceConfigurationFactory()
2020
.makeWithoutExceptionHandling(pojo)
21-
.copy(maxConcurrency = 1, checkpointTargetInterval = Duration.ofSeconds(3))
21+
.copy(
22+
maxConcurrency = 1,
23+
checkpointTargetInterval = Duration.ofSeconds(3),
24+
debeziumHeartbeatInterval = Duration.ofMillis(100),
25+
debeziumKeepAliveInterval = Duration.ofSeconds(1),
26+
)
2227
}

0 commit comments

Comments
 (0)