Skip to content

Commit b5a0bd6

Browse files
authored
Merge pull request #214 from zonkyio/database-releasing-warnings
#211 Fix false positive warnings related to releasing database resources
2 parents 363e7af + 1ce20bb commit b5a0bd6

File tree

6 files changed

+60
-37
lines changed

6 files changed

+60
-37
lines changed

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/h2/H2DatabaseProvider.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import io.zonky.test.db.provider.DatabaseProvider;
2121
import io.zonky.test.db.provider.EmbeddedDatabase;
2222
import io.zonky.test.db.provider.ProviderException;
23+
import io.zonky.test.db.util.ReflectionUtils;
2324
import org.h2.tools.Server;
2425
import org.slf4j.Logger;
2526
import org.slf4j.LoggerFactory;
2627
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
28+
import org.springframework.util.ClassUtils;
2729

2830
import javax.sql.DataSource;
2931
import java.sql.Connection;
@@ -41,13 +43,23 @@ public class H2DatabaseProvider implements DatabaseProvider {
4143
private static Server startServer() {
4244
try {
4345
Server server = Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "0").start();
44-
Runtime.getRuntime().addShutdownHook(new Thread(server::shutdown));
46+
registerShutdownHook(server);
4547
return server;
4648
} catch (SQLException e) {
4749
return null;
4850
}
4951
}
5052

53+
private static void registerShutdownHook(Server server) {
54+
try {
55+
Class<?> applicationType = ClassUtils.forName("org.springframework.boot.SpringApplication", null);
56+
Object shutdownHandlers = ReflectionUtils.invokeStaticMethod(applicationType, "getShutdownHandlers");
57+
ReflectionUtils.invokeMethod(shutdownHandlers, "add", (Runnable) server::shutdown);
58+
} catch (Throwable ex) {
59+
Runtime.getRuntime().addShutdownHook(new Thread(server::shutdown));
60+
}
61+
}
62+
5163
@Override
5264
public EmbeddedDatabase createDatabase(DatabasePreparer preparer) throws ProviderException {
5365
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
@@ -86,12 +98,13 @@ private static void shutdownDatabase(DataSource dataSource, String dbName) {
8698
CompletableFuture.runAsync(() -> {
8799
try {
88100
executeStatement(dataSource, "SHUTDOWN");
89-
} catch (Exception e) {
90-
if (logger.isTraceEnabled()) {
91-
logger.warn("Unable to release '{}' database", dbName, e);
92-
} else {
93-
logger.warn("Unable to release '{}' database", dbName);
94-
}
101+
} catch (SQLException e) {
102+
// it seems that there is no error for database in use condition
103+
// if (logger.isTraceEnabled()) {
104+
// logger.warn("Unable to release '{}' database", dbName, e);
105+
// } else {
106+
// logger.warn("Unable to release '{}' database", dbName);
107+
// }
95108
}
96109
});
97110
}

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/mssql/DockerMSSQLDatabaseProvider.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,13 @@ private void dropDatabase(ClientConfig config, String dbName) {
197197
CompletableFuture.runAsync(() -> {
198198
try {
199199
executeStatement(config, String.format("DROP DATABASE IF EXISTS %s", dbName));
200-
} catch (Exception e) {
201-
if (logger.isTraceEnabled()) {
202-
logger.warn("Unable to release '{}' database", dbName, e);
203-
} else {
204-
logger.warn("Unable to release '{}' database", dbName);
200+
} catch (SQLException e) {
201+
if (e.getErrorCode() == 3702) { // mssql server error code for database in use condition
202+
if (logger.isTraceEnabled()) {
203+
logger.warn("Unable to release '{}' database", dbName, e);
204+
} else {
205+
logger.warn("Unable to release '{}' database", dbName);
206+
}
205207
}
206208
}
207209
});

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/postgres/DockerPostgresDatabaseProvider.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,13 @@ private void dropDatabase(ClientConfig config, String dbName) {
224224
CompletableFuture.runAsync(() -> {
225225
try {
226226
executeStatement(config, String.format("DROP DATABASE IF EXISTS %s", dbName));
227-
} catch (Exception e) {
228-
if (logger.isTraceEnabled()) {
229-
logger.warn("Unable to release '{}' database", dbName, e);
230-
} else {
231-
logger.warn("Unable to release '{}' database", dbName);
227+
} catch (SQLException e) {
228+
if ("55006".equals(e.getSQLState())) { // postgres error code for object_in_use condition
229+
if (logger.isTraceEnabled()) {
230+
logger.warn("Unable to release '{}' database", dbName, e);
231+
} else {
232+
logger.warn("Unable to release '{}' database", dbName);
233+
}
232234
}
233235
}
234236
});

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/postgres/OpenTablePostgresDatabaseProvider.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
import com.google.common.util.concurrent.UncheckedExecutionException;
2626
import com.opentable.db.postgres.embedded.EmbeddedPostgres;
2727
import io.zonky.test.db.preparer.DatabasePreparer;
28-
import io.zonky.test.db.provider.support.BlockingDatabaseWrapper;
2928
import io.zonky.test.db.provider.DatabaseRequest;
3029
import io.zonky.test.db.provider.DatabaseTemplate;
3130
import io.zonky.test.db.provider.EmbeddedDatabase;
3231
import io.zonky.test.db.provider.ProviderException;
33-
import io.zonky.test.db.provider.support.SimpleDatabaseTemplate;
3432
import io.zonky.test.db.provider.TemplatableDatabaseProvider;
33+
import io.zonky.test.db.provider.support.BlockingDatabaseWrapper;
34+
import io.zonky.test.db.provider.support.SimpleDatabaseTemplate;
3535
import io.zonky.test.db.util.PropertyUtils;
3636
import io.zonky.test.db.util.RandomStringUtils;
3737
import org.postgresql.ds.PGSimpleDataSource;
@@ -169,11 +169,13 @@ private void dropDatabase(ClientConfig config, String dbName) {
169169
CompletableFuture.runAsync(() -> {
170170
try {
171171
executeStatement(config, String.format("DROP DATABASE IF EXISTS %s", dbName));
172-
} catch (Exception e) {
173-
if (logger.isTraceEnabled()) {
174-
logger.warn("Unable to release '{}' database", dbName, e);
175-
} else {
176-
logger.warn("Unable to release '{}' database", dbName);
172+
} catch (SQLException e) {
173+
if ("55006".equals(e.getSQLState())) { // postgres error code for object_in_use condition
174+
if (logger.isTraceEnabled()) {
175+
logger.warn("Unable to release '{}' database", dbName, e);
176+
} else {
177+
logger.warn("Unable to release '{}' database", dbName);
178+
}
177179
}
178180
}
179181
});

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/postgres/YandexPostgresDatabaseProvider.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
import de.flapdoodle.embed.process.distribution.GenericVersion;
2626
import de.flapdoodle.embed.process.distribution.IVersion;
2727
import io.zonky.test.db.preparer.DatabasePreparer;
28-
import io.zonky.test.db.provider.support.BlockingDatabaseWrapper;
2928
import io.zonky.test.db.provider.DatabaseRequest;
3029
import io.zonky.test.db.provider.DatabaseTemplate;
3130
import io.zonky.test.db.provider.EmbeddedDatabase;
3231
import io.zonky.test.db.provider.ProviderException;
33-
import io.zonky.test.db.provider.support.SimpleDatabaseTemplate;
3432
import io.zonky.test.db.provider.TemplatableDatabaseProvider;
33+
import io.zonky.test.db.provider.support.BlockingDatabaseWrapper;
34+
import io.zonky.test.db.provider.support.SimpleDatabaseTemplate;
3535
import io.zonky.test.db.util.PropertyUtils;
3636
import io.zonky.test.db.util.RandomStringUtils;
3737
import org.postgresql.ds.PGSimpleDataSource;
@@ -185,11 +185,13 @@ private void dropDatabase(ClientConfig config, String dbName) {
185185
CompletableFuture.runAsync(() -> {
186186
try {
187187
executeStatement(config, String.format("DROP DATABASE IF EXISTS %s", dbName));
188-
} catch (Exception e) {
189-
if (logger.isTraceEnabled()) {
190-
logger.warn("Unable to release '{}' database", dbName, e);
191-
} else {
192-
logger.warn("Unable to release '{}' database", dbName);
188+
} catch (SQLException e) {
189+
if ("55006".equals(e.getSQLState())) { // postgres error code for object_in_use condition
190+
if (logger.isTraceEnabled()) {
191+
logger.warn("Unable to release '{}' database", dbName, e);
192+
} else {
193+
logger.warn("Unable to release '{}' database", dbName);
194+
}
193195
}
194196
}
195197
});

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/postgres/ZonkyPostgresDatabaseProvider.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,17 @@ public EmbeddedDatabase createDatabase(ClientConfig config, DatabaseRequest requ
170170
}
171171
}
172172

173-
private void dropDatabase(ClientConfig config, String dbName) {
173+
private void dropDatabase(ClientConfig config, String dbName) {
174174
CompletableFuture.runAsync(() -> {
175175
try {
176176
executeStatement(config, String.format("DROP DATABASE IF EXISTS %s", dbName));
177-
} catch (Exception e) {
178-
if (logger.isTraceEnabled()) {
179-
logger.warn("Unable to release '{}' database", dbName, e);
180-
} else {
181-
logger.warn("Unable to release '{}' database", dbName);
177+
} catch (SQLException e) {
178+
if ("55006".equals(e.getSQLState())) { // postgres error code for object_in_use condition
179+
if (logger.isTraceEnabled()) {
180+
logger.warn("Unable to release '{}' database", dbName, e);
181+
} else {
182+
logger.warn("Unable to release '{}' database", dbName);
183+
}
182184
}
183185
}
184186
});

0 commit comments

Comments
 (0)