Skip to content

Commit ade21aa

Browse files
feat: fix issues
1 parent ce08210 commit ade21aa

File tree

7 files changed

+85
-77
lines changed

7 files changed

+85
-77
lines changed

shaded-lock-ydb/pom.xml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@
6060
<type>pom</type>
6161
<scope>import</scope>
6262
</dependency>
63+
<dependency>
64+
<groupId>org.springframework.boot</groupId>
65+
<artifactId>spring-boot-dependencies</artifactId>
66+
<version>${spring.boot.version}</version>
67+
<scope>import</scope>
68+
<type>pom</type>
69+
</dependency>
6370
</dependencies>
6471
</dependencyManagement>
6572

@@ -83,14 +90,12 @@
8390
<dependency>
8491
<groupId>org.springframework.boot</groupId>
8592
<artifactId>spring-boot-autoconfigure</artifactId>
86-
<version>${spring.boot.version}</version>
8793
<scope>provided</scope>
8894
</dependency>
8995

9096
<dependency>
9197
<groupId>org.springframework.boot</groupId>
9298
<artifactId>spring-boot-starter-test</artifactId>
93-
<version>${spring.boot.version}</version>
9499
<scope>test</scope>
95100
</dependency>
96101
<dependency>
@@ -99,9 +104,8 @@
99104
<scope>test</scope>
100105
</dependency>
101106
<dependency>
102-
<groupId>org.junit.jupiter</groupId>
103-
<artifactId>junit-jupiter-api</artifactId>
104-
<version>${junit5.version}</version>
107+
<groupId>org.springframework.boot</groupId>
108+
<artifactId>spring-boot-starter-jdbc</artifactId>
105109
<scope>test</scope>
106110
</dependency>
107111
</dependencies>
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
11
package tech.ydb.lock.provider;
22

3+
import java.sql.SQLException;
34
import java.util.Optional;
5+
import javax.annotation.PreDestroy;
46
import net.javacrumbs.shedlock.core.LockConfiguration;
57
import net.javacrumbs.shedlock.core.LockProvider;
68
import net.javacrumbs.shedlock.core.SimpleLock;
79
import org.slf4j.Logger;
810
import org.slf4j.LoggerFactory;
911
import tech.ydb.coordination.CoordinationClient;
1012
import tech.ydb.coordination.SemaphoreLease;
13+
import tech.ydb.jdbc.YdbConnection;
1114

1215
/**
1316
* @author Kirill Kurdyukov
1417
*/
15-
public class YdbLockProvider implements LockProvider {
16-
private static final Logger logger = LoggerFactory.getLogger(YdbLockProvider.class);
18+
public class YdbCoordinationServiceLockProvider implements LockProvider {
19+
private static final Logger logger = LoggerFactory.getLogger(YdbCoordinationServiceLockProvider.class);
1720
private static final String YDB_LOCK_NODE_NAME = "shared-lock-ydb";
1821
private static final int ATTEMPT_CREATE_NODE = 10;
1922

23+
private final YdbConnection ydbConnection;
2024
private final CoordinationClient coordinationClient;
21-
private final YdbLockProperties ydbLockProperties;
2225

23-
public YdbLockProvider(CoordinationClient coordinationClient, YdbLockProperties ydbLockProperties) {
24-
this.coordinationClient = coordinationClient;
25-
this.ydbLockProperties = ydbLockProperties;
26+
public YdbCoordinationServiceLockProvider(YdbConnection ydbConnection) {
27+
this.ydbConnection = ydbConnection;
28+
this.coordinationClient = CoordinationClient.newClient(ydbConnection.getCtx().getGrpcTransport());
2629
}
2730

2831
public void init() {
@@ -48,24 +51,27 @@ public Optional<SimpleLock> lock(LockConfiguration lockConfiguration) {
4851

4952
logger.debug("Created coordination node session");
5053

51-
coordinationSession.createSemaphore(lockConfiguration.getName(), 1).join()
52-
.expectSuccess("Failed creating semaphore[" + lockConfiguration.getName() +
53-
"], coordination node[" + YDB_LOCK_NODE_NAME + "]");
54+
var semaphoreLease = coordinationSession.acquireEphemeralSemaphore(lockConfiguration.getName(), true,
55+
lockConfiguration.getLockAtMostFor()).join();
5456

55-
logger.debug("Created semaphore[" + lockConfiguration.getName() + "]");
57+
if (semaphoreLease.isSuccess()) {
58+
logger.debug("Semaphore acquired");
5659

57-
var semaphoreLease = coordinationSession.acquireSemaphore(lockConfiguration.getName(), 1,
58-
ydbLockProperties.acquireSemaphoreTimeout).join().getValue();
59-
60-
logger.debug("Semaphore acquired");
61-
62-
return Optional.of(new YdbSimpleLock(semaphoreLease));
60+
return Optional.of(new YdbSimpleLock(semaphoreLease.getValue()));
61+
} else {
62+
return Optional.empty();
63+
}
6364
}
6465

6566
private record YdbSimpleLock(SemaphoreLease semaphoreLease) implements SimpleLock {
6667
@Override
67-
public void unlock() {
68-
semaphoreLease.release().join();
69-
}
68+
public void unlock() {
69+
semaphoreLease.release().join();
7070
}
71+
}
72+
73+
@PreDestroy
74+
private void close() throws SQLException {
75+
ydbConnection.close();
76+
}
7177
}

shaded-lock-ydb/src/main/java/tech/ydb/lock/provider/YdbLockProperties.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

shaded-lock-ydb/src/main/java/tech/ydb/lock/provider/YdbLockProviderConfiguration.java

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,18 @@
22

33
import java.sql.SQLException;
44
import javax.sql.DataSource;
5-
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
6-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
7-
import org.springframework.boot.context.properties.EnableConfigurationProperties;
85
import org.springframework.context.annotation.Bean;
96
import org.springframework.context.annotation.Configuration;
10-
import tech.ydb.coordination.CoordinationClient;
117
import tech.ydb.jdbc.YdbConnection;
12-
import tech.ydb.jdbc.YdbDriver;
138

149
/**
1510
* @author Kirill Kurdyukov
1611
*/
1712

1813
@Configuration
19-
@EnableConfigurationProperties(YdbLockProperties.class)
2014
public class YdbLockProviderConfiguration {
21-
22-
@Configuration
23-
@ConditionalOnClass(YdbDriver.class)
24-
public static class YdbLockProviderDataSourceConfiguration {
25-
26-
@Bean
27-
@ConditionalOnBean(DataSource.class)
28-
public CoordinationClient coordinationClient(DataSource dataSource) throws SQLException {
29-
try (var ydbConnection = dataSource.getConnection().unwrap(YdbConnection.class)) {
30-
31-
return CoordinationClient.newClient(ydbConnection.getCtx().getGrpcTransport());
32-
}
33-
}
34-
}
35-
3615
@Bean
37-
public YdbLockProvider ydbLockProvider(CoordinationClient coordinationClient,
38-
YdbLockProperties ydbLockProperties) {
39-
var ydbLockProvider = new YdbLockProvider(coordinationClient, ydbLockProperties);
40-
41-
ydbLockProvider.init();
42-
43-
return ydbLockProvider;
16+
public YdbCoordinationServiceLockProvider ydbLockProvider(DataSource dataSource) throws SQLException {
17+
return new YdbCoordinationServiceLockProvider(dataSource.getConnection().unwrap(YdbConnection.class));
4418
}
4519
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package tech.ydb.lock.provider;
22

3-
import org.springframework.boot.test.context.SpringBootTest;
3+
import org.springframework.boot.autoconfigure.SpringBootApplication;
44

55
/**
66
* @author Kirill Kurdyukov
77
*/
8-
@SpringBootTest
8+
@SpringBootApplication
99
public class TestApp {
1010
}

shaded-lock-ydb/src/test/java/tech/ydb/lock/provider/YdbLockProviderTest.java

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
package tech.ydb.lock.provider;
22

3+
import java.time.Duration;
4+
import java.time.Instant;
5+
import java.util.ArrayList;
6+
import java.util.Optional;
7+
import java.util.concurrent.ExecutionException;
8+
import java.util.concurrent.Executors;
9+
import java.util.concurrent.Future;
10+
import java.util.concurrent.atomic.AtomicInteger;
11+
import net.javacrumbs.shedlock.core.LockConfiguration;
12+
import net.javacrumbs.shedlock.core.SimpleLock;
13+
import org.junit.jupiter.api.Assertions;
314
import org.junit.jupiter.api.Test;
415
import org.junit.jupiter.api.extension.RegisterExtension;
516
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,10 +47,43 @@ private static String jdbcUrl() {
3647
}
3748

3849
@Autowired
39-
private YdbLockProvider ydbLockProvider;
50+
private YdbCoordinationServiceLockProvider lockProvider;
4051

4152
@Test
42-
public void integrationTest() {
53+
public void integrationTest() throws ExecutionException, InterruptedException {
54+
var executorServer = Executors.newFixedThreadPool(10);
55+
var atomicInt = new AtomicInteger();
56+
var futures = new ArrayList<Future<?>>();
4357

58+
for (int i = 0; i < 100; i++) {
59+
final var ii = i;
60+
futures.add(executorServer.submit(() -> {
61+
lockProvider.init();
62+
63+
Optional<SimpleLock> optinal = Optional.empty();
64+
65+
while (optinal.isEmpty()) {
66+
optinal = lockProvider.lock(
67+
new LockConfiguration(Instant.now(), "semaphore", Duration.ZERO, Duration.ZERO));
68+
69+
optinal.ifPresent(simpleLock -> {
70+
try {
71+
Thread.sleep(100);
72+
} catch (InterruptedException e) {
73+
throw new RuntimeException(e);
74+
}
75+
76+
atomicInt.addAndGet(ii);
77+
simpleLock.unlock();
78+
});
79+
}
80+
}));
81+
}
82+
83+
for (Future<?> future : futures) {
84+
future.get();
85+
}
86+
87+
Assertions.assertEquals(4950, atomicInt.get());
4488
}
4589
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
spring.datasource.driver-class-name=tech.ydb.jdbc.YdbDriver

0 commit comments

Comments
 (0)