Skip to content

Commit 40c3cb9

Browse files
committed
Added tests for resizable session pool
1 parent ddc6950 commit 40c3cb9

File tree

3 files changed

+128
-27
lines changed

3 files changed

+128
-27
lines changed

jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
import java.util.logging.Logger;
99

1010
import tech.ydb.core.grpc.GrpcTransport;
11+
import tech.ydb.core.grpc.GrpcTransportBuilder;
1112
import tech.ydb.jdbc.exception.YdbConfigurationException;
1213
import tech.ydb.jdbc.settings.ParsedProperty;
1314
import tech.ydb.jdbc.settings.YdbClientProperties;
1415
import tech.ydb.jdbc.settings.YdbClientProperty;
1516
import tech.ydb.jdbc.settings.YdbConnectionProperties;
17+
import tech.ydb.jdbc.settings.YdbConnectionProperty;
1618
import tech.ydb.jdbc.settings.YdbOperationProperties;
1719
import tech.ydb.scheme.SchemeClient;
1820
import tech.ydb.table.TableClient;
@@ -26,8 +28,11 @@
2628

2729
public class YdbContext implements AutoCloseable {
2830
private static final Logger LOGGER = Logger.getLogger(YdbContext.class.getName());
29-
private static final int SESSION_POOL_STEP = 50;
30-
private static final int SESSION_POOL_THRESHOLD = 10;
31+
32+
private static final int SESSION_POOL_DEFAULT_MIN_SIZE = 0;
33+
private static final int SESSION_POOL_DEFAULT_MAX_SIZE = 50;
34+
private static final int SESSION_POOL_RESIZE_STEP = 50;
35+
private static final int SESSION_POOL_RESIZE_THRESHOLD = 10;
3136

3237
private final YdbConfig config;
3338

@@ -62,6 +67,10 @@ public String getUrl() {
6267
return config.getUrl();
6368
}
6469

70+
public int getConnectionsCount() {
71+
return connectionsCount.get();
72+
}
73+
6574
public YdbOperationProperties getOperationProperties() {
6675
return config.getOperationProperties();
6776
}
@@ -80,8 +89,8 @@ public void close() {
8089
public void register() {
8190
int actual = connectionsCount.incrementAndGet();
8291
int maxSize = tableClient.sessionPoolStats().getMaxSize();
83-
if (autoResizeSessionPool && actual > maxSize - SESSION_POOL_THRESHOLD) {
84-
int newSize = maxSize + SESSION_POOL_STEP;
92+
if (autoResizeSessionPool && actual > maxSize - SESSION_POOL_RESIZE_THRESHOLD) {
93+
int newSize = maxSize + SESSION_POOL_RESIZE_STEP;
8594
if (maxSize == tableClient.sessionPoolStats().getMaxSize()) {
8695
tableClient.updatePoolMaxSize(newSize);
8796
}
@@ -91,9 +100,9 @@ public void register() {
91100
public void deregister() {
92101
int actual = connectionsCount.decrementAndGet();
93102
int maxSize = tableClient.sessionPoolStats().getMaxSize();
94-
if (autoResizeSessionPool && maxSize > SESSION_POOL_STEP) {
95-
if (actual < maxSize - SESSION_POOL_STEP + SESSION_POOL_THRESHOLD) {
96-
int newSize = maxSize - SESSION_POOL_STEP;
103+
if (autoResizeSessionPool && maxSize > SESSION_POOL_RESIZE_STEP) {
104+
if (actual < maxSize - SESSION_POOL_RESIZE_STEP - 2 * SESSION_POOL_RESIZE_THRESHOLD) {
105+
int newSize = maxSize - SESSION_POOL_RESIZE_STEP;
97106
if (maxSize == tableClient.sessionPoolStats().getMaxSize()) {
98107
tableClient.updatePoolMaxSize(newSize);
99108
}
@@ -108,7 +117,7 @@ public static YdbContext createContext(YdbConfig config) throws SQLException {
108117

109118
LOGGER.log(Level.INFO, "Creating new YDB connection to {0}", connProps.getConnectionString());
110119

111-
GrpcTransport grpcTransport = connProps.toGrpcTransport();
120+
GrpcTransport grpcTransport = buildGrpcTransport(connProps);
112121
PooledTableClient.Builder tableClient = PooledTableClient.newClient(
113122
GrpcTableRpc.useTransport(grpcTransport)
114123
);
@@ -120,6 +129,21 @@ public static YdbContext createContext(YdbConfig config) throws SQLException {
120129
}
121130
}
122131

132+
public static GrpcTransport buildGrpcTransport(YdbConnectionProperties props) {
133+
GrpcTransportBuilder builder = GrpcTransport.forConnectionString(props.getConnectionString());
134+
for (Map.Entry<YdbConnectionProperty<?>, ParsedProperty> entry : props.getParams().entrySet()) {
135+
if (entry.getValue() != null) {
136+
entry.getKey().getSetter().accept(builder, entry.getValue().getParsedValue());
137+
}
138+
}
139+
140+
if (props.hasStaticCredentials()) {
141+
builder = builder.withAuthProvider(props.getStaticCredentials());
142+
}
143+
144+
return builder.build();
145+
}
146+
123147
private static boolean buildTableClient(TableClient.Builder builder, YdbClientProperties props) {
124148
for (Map.Entry<YdbClientProperty<?>, ParsedProperty> entry : props.getParams().entrySet()) {
125149
if (entry.getValue() != null) {
@@ -134,15 +158,15 @@ private static boolean buildTableClient(TableClient.Builder builder, YdbClientPr
134158
return true;
135159
}
136160

137-
int minSize = 0;
138-
int maxSize = 50;
161+
int minSize = SESSION_POOL_DEFAULT_MIN_SIZE;
162+
int maxSize = SESSION_POOL_DEFAULT_MAX_SIZE;
139163

140164
if (minSizeConfig != null) {
141165
minSize = Math.max(0, minSizeConfig.getParsedValue());
142-
maxSize = Math.min(maxSize, minSize);
166+
maxSize = Math.max(maxSize, minSize);
143167
}
144168
if (maxSizeConfig != null) {
145-
maxSize = Math.max(minSize, maxSizeConfig.getParsedValue());
169+
maxSize = Math.max(minSize + 1, maxSizeConfig.getParsedValue());
146170
}
147171

148172
builder.sessionPoolSize(minSize, maxSize);

jdbc/src/main/java/tech/ydb/jdbc/settings/YdbConnectionProperties.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
import javax.annotation.Nullable;
77

88
import tech.ydb.core.auth.StaticCredentials;
9-
import tech.ydb.core.grpc.GrpcTransport;
10-
import tech.ydb.core.grpc.GrpcTransportBuilder;
9+
1110

1211
public class YdbConnectionProperties {
1312
private final String safeURL;
@@ -42,18 +41,11 @@ public Map<YdbConnectionProperty<?>, ParsedProperty> getParams() {
4241
return params;
4342
}
4443

45-
public GrpcTransport toGrpcTransport() {
46-
GrpcTransportBuilder builder = GrpcTransport.forConnectionString(connectionString);
47-
for (Map.Entry<YdbConnectionProperty<?>, ParsedProperty> entry : params.entrySet()) {
48-
if (entry.getValue() != null) {
49-
entry.getKey().getSetter().accept(builder, entry.getValue().getParsedValue());
50-
}
51-
}
52-
53-
if (username != null && !username.isEmpty()) {
54-
builder = builder.withAuthProvider(new StaticCredentials(username, password));
55-
}
44+
public boolean hasStaticCredentials() {
45+
return username != null && !username.isEmpty();
46+
}
5647

57-
return builder.build();
48+
public StaticCredentials getStaticCredentials() {
49+
return new StaticCredentials(username, password);
5850
}
5951
}

jdbc/src/test/java/tech/ydb/jdbc/YdbDriverIntegrationTest.java

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
import java.sql.Connection;
44
import java.sql.DriverManager;
55
import java.sql.SQLException;
6+
import java.util.ArrayDeque;
7+
import java.util.Deque;
68
import java.util.Properties;
79

810
import org.junit.jupiter.api.Assertions;
911
import org.junit.jupiter.api.Test;
1012
import org.junit.jupiter.api.extension.RegisterExtension;
1113

12-
import tech.ydb.jdbc.impl.YdbConnectionImpl;
1314
import tech.ydb.jdbc.context.YdbContext;
15+
import tech.ydb.jdbc.impl.YdbConnectionImpl;
1416
import tech.ydb.jdbc.impl.helper.JdbcUrlHelper;
1517
import tech.ydb.test.junit5.YdbHelperExtension;
1618

@@ -95,4 +97,87 @@ public void testContextCache() throws SQLException {
9597
Assertions.assertNotSame(ctx, unwrapped.getCtx());
9698
}
9799
}
100+
101+
@Test
102+
public void testResizeSessionPool() throws SQLException {
103+
String url = jdbcURL.build();
104+
try (Connection conn = DriverManager.getConnection(url)) {
105+
YdbContext ctx = conn.unwrap(YdbConnection.class).getCtx();
106+
107+
Assertions.assertEquals(1, ctx.getConnectionsCount());
108+
Assertions.assertEquals(50, ctx.getTableClient().sessionPoolStats().getMaxSize());
109+
110+
Deque<Connection> connections = new ArrayDeque<>();
111+
for (int i = 0; i < 39; i++) {
112+
connections.offer(DriverManager.getConnection(url));
113+
}
114+
115+
Assertions.assertEquals(40, ctx.getConnectionsCount());
116+
Assertions.assertEquals(50, ctx.getTableClient().sessionPoolStats().getMaxSize());
117+
118+
connections.add(DriverManager.getConnection(url));
119+
120+
Assertions.assertEquals(41, ctx.getConnectionsCount());
121+
Assertions.assertEquals(100, ctx.getTableClient().sessionPoolStats().getMaxSize());
122+
123+
for (int i = 0; i < 11; i++) {
124+
connections.poll().close();
125+
}
126+
127+
Assertions.assertEquals(30, ctx.getConnectionsCount());
128+
Assertions.assertEquals(100, ctx.getTableClient().sessionPoolStats().getMaxSize());
129+
130+
connections.poll().close();
131+
132+
Assertions.assertEquals(29, ctx.getConnectionsCount());
133+
Assertions.assertEquals(50, ctx.getTableClient().sessionPoolStats().getMaxSize());
134+
135+
for (Connection c: connections) {
136+
c.close();
137+
}
138+
139+
Assertions.assertEquals(1, ctx.getConnectionsCount());
140+
Assertions.assertEquals(50, ctx.getTableClient().sessionPoolStats().getMaxSize());
141+
}
142+
}
143+
144+
@Test
145+
public void testFixedSessionPool() throws SQLException {
146+
assertFixedSessionPool("sessionPoolSizeMin", "0", 50);
147+
assertFixedSessionPool("sessionPoolSizeMin", "-1", 50);
148+
assertFixedSessionPool("sessionPoolSizeMax", "0", 1);
149+
assertFixedSessionPool("sessionPoolSizeMax", "5", 5);
150+
}
151+
152+
private void assertFixedSessionPool(String arg, String value, int poolSize) throws SQLException {
153+
String url = jdbcURL.withArg(arg, value).build();
154+
try (Connection conn = DriverManager.getConnection(url)) {
155+
YdbContext ctx = conn.unwrap(YdbConnection.class).getCtx();
156+
157+
Assertions.assertEquals(1, ctx.getConnectionsCount());
158+
Assertions.assertEquals(poolSize, ctx.getTableClient().sessionPoolStats().getMaxSize());
159+
160+
Deque<Connection> connections = new ArrayDeque<>();
161+
for (int i = 0; i < poolSize * 2; i++) {
162+
connections.offer(DriverManager.getConnection(url));
163+
}
164+
165+
Assertions.assertEquals(1 + poolSize * 2, ctx.getConnectionsCount());
166+
Assertions.assertEquals(poolSize, ctx.getTableClient().sessionPoolStats().getMaxSize());
167+
168+
for (int i = 0; i < poolSize; i++) {
169+
connections.poll().close();
170+
}
171+
172+
Assertions.assertEquals(1 + poolSize, ctx.getConnectionsCount());
173+
Assertions.assertEquals(poolSize, ctx.getTableClient().sessionPoolStats().getMaxSize());
174+
175+
for (Connection c: connections) {
176+
c.close();
177+
}
178+
179+
Assertions.assertEquals(1, ctx.getConnectionsCount());
180+
Assertions.assertEquals(poolSize, ctx.getTableClient().sessionPoolStats().getMaxSize());
181+
}
182+
}
98183
}

0 commit comments

Comments
 (0)