Skip to content

Commit 70b683f

Browse files
committed
Merge branch 'main' into use-direct-executor
2 parents 6ba810f + b35259f commit 70b683f

File tree

7 files changed

+41
-21
lines changed

7 files changed

+41
-21
lines changed

pom.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,13 @@
210210
<dependency>
211211
<groupId>com.google.cloud</groupId>
212212
<artifactId>google-cloud-trace</artifactId>
213-
<version>2.54.0</version>
213+
<version>2.55.0</version>
214214
<scope>test</scope>
215215
</dependency>
216216
<dependency>
217217
<groupId>com.google.api.grpc</groupId>
218218
<artifactId>proto-google-cloud-trace-v1</artifactId>
219-
<version>2.54.0</version>
219+
<version>2.55.0</version>
220220
<scope>test</scope>
221221
</dependency>
222222

@@ -241,7 +241,6 @@
241241
<configuration>
242242
<excludes>
243243
<exclude>com.google.cloud.spanner.jdbc.it.**</exclude>
244-
<exclude>com.google.cloud.spanner.jdbc.JdbcStatementTimeoutTest</exclude>
245244
</excludes>
246245
<reportNameSuffix>sponge_log</reportNameSuffix>
247246
<systemPropertyVariables>

samples/quickperf/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<dependency>
2828
<groupId>com.google.cloud</groupId>
2929
<artifactId>libraries-bom</artifactId>
30-
<version>26.51.0</version>
30+
<version>26.52.0</version>
3131
<type>pom</type>
3232
<scope>import</scope>
3333
</dependency>

samples/snippets/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<dependency>
2727
<groupId>com.google.cloud</groupId>
2828
<artifactId>libraries-bom</artifactId>
29-
<version>26.51.0</version>
29+
<version>26.52.0</version>
3030
<type>pom</type>
3131
<scope>import</scope>
3232
</dependency>

samples/spring-data-jdbc/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<dependency>
3838
<groupId>com.google.cloud</groupId>
3939
<artifactId>libraries-bom</artifactId>
40-
<version>26.51.0</version>
40+
<version>26.52.0</version>
4141
<scope>import</scope>
4242
<type>pom</type>
4343
</dependency>

samples/spring-data-mybatis/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<dependency>
3636
<groupId>com.google.cloud</groupId>
3737
<artifactId>libraries-bom</artifactId>
38-
<version>26.51.0</version>
38+
<version>26.52.0</version>
3939
<scope>import</scope>
4040
<type>pom</type>
4141
</dependency>

src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcStatement.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.cloud.spanner.connection.Connection;
2525
import com.google.cloud.spanner.connection.StatementResult;
2626
import com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType;
27+
import com.google.common.annotations.VisibleForTesting;
2728
import com.google.common.base.Stopwatch;
2829
import com.google.rpc.Code;
2930
import java.sql.ResultSet;
@@ -37,6 +38,7 @@
3738
import java.util.concurrent.locks.ReentrantLock;
3839
import java.util.function.Function;
3940
import java.util.function.Supplier;
41+
import javax.annotation.Nonnull;
4042

4143
/** Base class for Cloud Spanner JDBC {@link Statement}s */
4244
abstract class AbstractJdbcStatement extends AbstractJdbcWrapper implements Statement {
@@ -49,7 +51,7 @@ abstract class AbstractJdbcStatement extends AbstractJdbcWrapper implements Stat
4951
private boolean closeOnCompletion;
5052
private boolean poolable;
5153
private final JdbcConnection connection;
52-
private int queryTimeout;
54+
private Duration queryTimeout = Duration.ZERO;
5355

5456
AbstractJdbcStatement(JdbcConnection connection) throws SQLException {
5557
this.connection = connection;
@@ -157,13 +159,22 @@ protected <T> T runWithStatementTimeout(JdbcFunction<Connection, T> function)
157159
*/
158160
StatementTimeout setTemporaryStatementTimeout() throws SQLException {
159161
StatementTimeout originalTimeout = null;
160-
if (getQueryTimeout() > 0) {
162+
if (!getQueryTimeoutDuration().isZero()) {
161163
if (connection.getSpannerConnection().hasStatementTimeout()) {
162164
TimeUnit unit = getAppropriateTimeUnit();
163165
originalTimeout =
164166
StatementTimeout.of(connection.getSpannerConnection().getStatementTimeout(unit), unit);
165167
}
166-
connection.getSpannerConnection().setStatementTimeout(getQueryTimeout(), TimeUnit.SECONDS);
168+
Duration queryTimeout = getQueryTimeoutDuration();
169+
if (queryTimeout.getNano() > 0) {
170+
connection
171+
.getSpannerConnection()
172+
.setStatementTimeout(queryTimeout.toMillis(), TimeUnit.MILLISECONDS);
173+
} else {
174+
connection
175+
.getSpannerConnection()
176+
.setStatementTimeout(queryTimeout.getSeconds(), TimeUnit.SECONDS);
177+
}
167178
}
168179
return originalTimeout;
169180
}
@@ -173,7 +184,7 @@ StatementTimeout setTemporaryStatementTimeout() throws SQLException {
173184
* has been executed.
174185
*/
175186
void resetStatementTimeout(StatementTimeout originalTimeout) throws SQLException {
176-
if (getQueryTimeout() > 0) {
187+
if (!getQueryTimeoutDuration().isZero()) {
177188
if (originalTimeout == null) {
178189
connection.getSpannerConnection().clearStatementTimeout();
179190
} else {
@@ -334,14 +345,26 @@ private StatementResult rerunShowStatementTimeout(com.google.cloud.spanner.State
334345

335346
@Override
336347
public int getQueryTimeout() throws SQLException {
348+
return (int) getQueryTimeoutDuration().getSeconds();
349+
}
350+
351+
@VisibleForTesting
352+
@Nonnull
353+
Duration getQueryTimeoutDuration() throws SQLException {
337354
checkClosed();
338-
return queryTimeout;
355+
return this.queryTimeout;
339356
}
340357

341358
@Override
342359
public void setQueryTimeout(int seconds) throws SQLException {
360+
setQueryTimeout(Duration.ofSeconds(seconds));
361+
}
362+
363+
@VisibleForTesting
364+
void setQueryTimeout(@Nonnull Duration duration) throws SQLException {
365+
JdbcPreconditions.checkArgument(!duration.isNegative(), "Timeout must be >= 0");
343366
checkClosed();
344-
this.queryTimeout = seconds;
367+
this.queryTimeout = duration;
345368
}
346369

347370
@Override

src/test/java/com/google/cloud/spanner/jdbc/JdbcStatementTimeoutTest.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.sql.ResultSet;
3232
import java.sql.SQLException;
3333
import java.sql.Statement;
34+
import java.time.Duration;
3435
import java.util.concurrent.ExecutorService;
3536
import java.util.concurrent.Executors;
3637
import java.util.concurrent.Future;
@@ -41,10 +42,7 @@
4142
import org.junit.runners.Parameterized.Parameter;
4243
import org.junit.runners.Parameterized.Parameters;
4344

44-
/**
45-
* Tests setting a statement timeout. This test is by default not included in unit test runs, as the
46-
* minimum timeout value in JDBC is 1 second, which again makes this test relatively slow.
47-
*/
45+
/** Tests setting a statement timeout. */
4846
@RunWith(Parameterized.class)
4947
public class JdbcStatementTimeoutTest extends AbstractMockServerTest {
5048

@@ -77,7 +75,7 @@ public void testExecuteTimeout() throws SQLException {
7775
// Simulate that executeSql takes 2 seconds and set a statement timeout of 1 second.
7876
mockSpanner.setExecuteSqlExecutionTime(
7977
SimulatedExecutionTime.ofMinimumAndRandomTime(2000, 0));
80-
statement.setQueryTimeout(1);
78+
((JdbcStatement) statement).setQueryTimeout(Duration.ofMillis(5L));
8179
assertThrows(
8280
JdbcSqlTimeoutException.class, () -> statement.execute(INSERT_STATEMENT.getSql()));
8381
}
@@ -101,7 +99,7 @@ public void testExecuteQueryTimeout() throws SQLException {
10199
// second.
102100
mockSpanner.setExecuteStreamingSqlExecutionTime(
103101
SimulatedExecutionTime.ofMinimumAndRandomTime(2000, 0));
104-
statement.setQueryTimeout(1);
102+
((JdbcStatement) statement).setQueryTimeout(Duration.ofMillis(5L));
105103
assertThrows(
106104
JdbcSqlTimeoutException.class,
107105
() -> statement.executeQuery(SELECT_RANDOM_STATEMENT.getSql()));
@@ -119,7 +117,7 @@ public void testExecuteUpdateTimeout() throws SQLException {
119117
// Simulate that executeSql takes 2 seconds and set a statement timeout of 1 second.
120118
mockSpanner.setExecuteSqlExecutionTime(
121119
SimulatedExecutionTime.ofMinimumAndRandomTime(2000, 0));
122-
statement.setQueryTimeout(1);
120+
((JdbcStatement) statement).setQueryTimeout(Duration.ofMillis(5L));
123121
assertThrows(
124122
JdbcSqlTimeoutException.class,
125123
() -> statement.executeUpdate(INSERT_STATEMENT.getSql()));
@@ -139,7 +137,7 @@ public void testExecuteBatchTimeout() throws SQLException {
139137
// Simulate that executeBatchDml takes 2 seconds and set a statement timeout of 1 second.
140138
mockSpanner.setExecuteBatchDmlExecutionTime(
141139
SimulatedExecutionTime.ofMinimumAndRandomTime(2000, 0));
142-
statement.setQueryTimeout(1);
140+
((JdbcStatement) statement).setQueryTimeout(Duration.ofMillis(5L));
143141
statement.addBatch(INSERT_STATEMENT.getSql());
144142
assertThrows(JdbcSqlTimeoutException.class, statement::executeBatch);
145143
}

0 commit comments

Comments
 (0)