Skip to content

Commit d1f2741

Browse files
committed
debezium/dbz#1850 Add snapshot lock and query SPI implementations
- Add NoSnapshotLock and SharedSnapshotLock for snapshot locking - Add SelectAllSnapshotQuery for snapshot query - Register SPI services in META-INF/services - Update AbstractStreamingAdapter and YashanDbConnectorTask - Update pom.xml dependencies Signed-off-by: Tlinian <2629731238@qq.com>
1 parent e5701bc commit d1f2741

12 files changed

Lines changed: 141 additions & 4 deletions

pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@
167167
<groupId>io.debezium</groupId>
168168
<artifactId>debezium-util</artifactId>
169169
</dependency>
170+
<dependency>
171+
<groupId>io.debezium</groupId>
172+
<artifactId>debezium-storage-kafka</artifactId>
173+
</dependency>
170174
<dependency>
171175
<groupId>io.debezium</groupId>
172176
<artifactId>debezium-connect-plugins</artifactId>

src/main/java/io/debezium/connector/yashandb/AbstractStreamingAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ protected boolean areSameTimestamp(Scn scn1, Scn scn2, YashanDbConnection connec
7070

7171
final String query = "SELECT 1 FROM DUAL WHERE SCN_TO_TIMESTAMP(?)=SCN_TO_TIMESTAMP(?)";
7272
try (PreparedStatement ps = connection.connection().prepareStatement(query)) {
73-
ps.setString(1, scn1.toString());
74-
ps.setString(2, scn2.toString());
73+
ps.setLong(1, scn1.longValue());
74+
ps.setLong(2, scn2.longValue());
7575
ResultSet rs = ps.executeQuery();
7676
return rs.next();
7777
}

src/main/java/io/debezium/connector/yashandb/YashanDbConnectorTask.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,12 @@ public ChangeEventSourceCoordinator<YashanDbPartition, YashanDbOffsetContext> st
114114
CustomConverterRegistry customConverterRegistry = connectorConfig.getServiceRegistry().tryGetService(CustomConverterRegistry.class);
115115
this.schema = new YashanDbDatabaseSchema(connectorConfig, valueConverters, defaultValueConverter, schemaNameAdjuster,
116116
topicNamingStrategy, tableNameCaseSensitivity, customConverterRegistry, taskContext);
117-
final SnapshotterService snapshotterService = connectorConfig.getServiceRegistry().tryGetService(SnapshotterService.class);
118117

119118
Offsets<YashanDbPartition, YashanDbOffsetContext> previousOffsets = getPreviousOffsets(new YashanDbPartition.Provider(connectorConfig),
120119
connectorConfig.getAdapter().getOffsetContextLoader());
121120

122121
beanRegistryJdbcConnection = connectionFactory.newConnection();
123-
// Manual Bean Registration
122+
// Manual Bean Registration - must be done before any service that requires it is created (e.g. SnapshotterService)
124123
connectorConfig.getBeanRegistry().add(StandardBeanNames.CONFIGURATION, config);
125124
connectorConfig.getBeanRegistry().add(StandardBeanNames.CONNECTOR_CONFIG, connectorConfig);
126125
connectorConfig.getBeanRegistry().add(StandardBeanNames.DATABASE_SCHEMA, schema);
@@ -129,6 +128,8 @@ public ChangeEventSourceCoordinator<YashanDbPartition, YashanDbOffsetContext> st
129128
connectorConfig.getBeanRegistry().add(StandardBeanNames.OFFSETS, previousOffsets);
130129
connectorConfig.getBeanRegistry().add(StandardBeanNames.CDC_SOURCE_TASK_CONTEXT, taskContext);
131130

131+
final SnapshotterService snapshotterService = connectorConfig.getServiceRegistry().tryGetService(SnapshotterService.class);
132+
132133
YashanDbPartition partition = previousOffsets.getTheOnlyPartition();
133134
YashanDbOffsetContext previousOffset = previousOffsets.getTheOnlyOffset();
134135

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright Debezium Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package io.debezium.connector.yashandb.snapshot.lock;
7+
8+
import java.time.Duration;
9+
import java.util.Map;
10+
import java.util.Optional;
11+
12+
import io.debezium.annotation.ConnectorSpecific;
13+
import io.debezium.connector.yashandb.YashanDbConnector;
14+
import io.debezium.connector.yashandb.YashanDbConnectorConfig;
15+
import io.debezium.snapshot.spi.SnapshotLock;
16+
17+
@ConnectorSpecific(connector = YashanDbConnector.class)
18+
public class NoSnapshotLock implements SnapshotLock {
19+
20+
@Override
21+
public String name() {
22+
return YashanDbConnectorConfig.SnapshotLockingMode.NONE.getValue();
23+
}
24+
25+
@Override
26+
public void configure(Map<String, ?> properties) {
27+
28+
}
29+
30+
@Override
31+
public Optional<String> tableLockingStatement(Duration lockTimeout, String tableId) {
32+
33+
return Optional.empty();
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright Debezium Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package io.debezium.connector.yashandb.snapshot.lock;
7+
8+
import java.time.Duration;
9+
import java.util.Map;
10+
import java.util.Optional;
11+
12+
import io.debezium.annotation.ConnectorSpecific;
13+
import io.debezium.connector.yashandb.YashanDbConnector;
14+
import io.debezium.connector.yashandb.YashanDbConnectorConfig;
15+
import io.debezium.snapshot.spi.SnapshotLock;
16+
17+
@ConnectorSpecific(connector = YashanDbConnector.class)
18+
public class SharedSnapshotLock implements SnapshotLock {
19+
20+
@Override
21+
public String name() {
22+
return YashanDbConnectorConfig.SnapshotLockingMode.SHARED.getValue();
23+
}
24+
25+
@Override
26+
public void configure(Map<String, ?> properties) {
27+
28+
}
29+
30+
@Override
31+
public Optional<String> tableLockingStatement(Duration lockTimeout, String tableId) {
32+
33+
return Optional.of(String.format("LOCK TABLE %s IN SHARE MODE", tableId));
34+
}
35+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright Debezium Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package io.debezium.connector.yashandb.snapshot.query;
7+
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Optional;
11+
12+
import io.debezium.annotation.ConnectorSpecific;
13+
import io.debezium.bean.StandardBeanNames;
14+
import io.debezium.bean.spi.BeanRegistry;
15+
import io.debezium.bean.spi.BeanRegistryAware;
16+
import io.debezium.config.CommonConnectorConfig;
17+
import io.debezium.connector.yashandb.YashanDbConnector;
18+
import io.debezium.connector.yashandb.YashanDbOffsetContext;
19+
import io.debezium.relational.RelationalSnapshotChangeEventSource;
20+
import io.debezium.snapshot.spi.SnapshotQuery;
21+
22+
@ConnectorSpecific(connector = YashanDbConnector.class)
23+
public class SelectAllSnapshotQuery implements SnapshotQuery, BeanRegistryAware {
24+
25+
private BeanRegistry beanRegistry;
26+
27+
@Override
28+
public String name() {
29+
return CommonConnectorConfig.SnapshotQueryMode.SELECT_ALL.getValue();
30+
}
31+
32+
@Override
33+
public void configure(Map<String, ?> properties) {
34+
35+
}
36+
37+
@Override
38+
public void injectBeanRegistry(BeanRegistry beanRegistry) {
39+
this.beanRegistry = beanRegistry;
40+
}
41+
42+
@Override
43+
public Optional<String> snapshotQuery(String tableId, List<String> snapshotSelectColumns) {
44+
45+
final RelationalSnapshotChangeEventSource.RelationalSnapshotContext snapshotContext = beanRegistry.lookupByName(StandardBeanNames.SNAPSHOT_CONTEXT,
46+
RelationalSnapshotChangeEventSource.RelationalSnapshotContext.class);
47+
final YashanDbOffsetContext offset = (YashanDbOffsetContext) snapshotContext.offset;
48+
49+
final String snapshotOffset = offset.getScn().toString();
50+
String columns = String.join(", ", snapshotSelectColumns);
51+
assert snapshotOffset != null;
52+
return Optional.of(String.format("SELECT %s FROM %s AS OF SCN %s", columns, tableId, snapshotOffset));
53+
54+
}
55+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.debezium.connector.yashandb.converters.YashanDbCloudEventsProvider
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.debezium.connector.yashandb.YashanDbEventMetadataProvider
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
io.debezium.connector.yashandb.snapshot.lock.NoSnapshotLock
2+
io.debezium.connector.yashandb.snapshot.lock.SharedSnapshotLock
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.debezium.connector.yashandb.snapshot.query.SelectAllSnapshotQuery

0 commit comments

Comments
 (0)