Skip to content

Commit 8da7066

Browse files
committed
Add support for flyway.postgresql.transactional.lock
Closes gh-32629
1 parent 289d458 commit 8da7066

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.flywaydb.core.api.configuration.FluentConfiguration;
3737
import org.flywaydb.core.api.migration.JavaMigration;
3838
import org.flywaydb.core.extensibility.ConfigurationExtension;
39+
import org.flywaydb.core.internal.database.postgresql.PostgreSQLConfigurationExtension;
3940
import org.flywaydb.database.oracle.OracleConfigurationExtension;
4041
import org.flywaydb.database.sqlserver.SQLServerConfigurationExtension;
4142

@@ -153,6 +154,12 @@ OracleFlywayConfigurationCustomizer oracleFlywayConfigurationCustomizer() {
153154
return new OracleFlywayConfigurationCustomizer(this.properties);
154155
}
155156

157+
@Bean
158+
@ConditionalOnClass(name = "org.flywaydb.core.internal.database.postgresql.PostgreSQLConfigurationExtension")
159+
PostgresqlFlywayConfigurationCustomizer postgresqlFlywayConfigurationCustomizer() {
160+
return new PostgresqlFlywayConfigurationCustomizer(this.properties);
161+
}
162+
156163
@Bean
157164
Flyway flyway(FlywayConnectionDetails connectionDetails, ResourceLoader resourceLoader,
158165
ObjectProvider<DataSource> dataSource, @FlywayDataSource ObjectProvider<DataSource> flywayDataSource,
@@ -478,6 +485,30 @@ public void customize(FluentConfiguration configuration) {
478485

479486
}
480487

488+
@Order(Ordered.HIGHEST_PRECEDENCE)
489+
static final class PostgresqlFlywayConfigurationCustomizer implements FlywayConfigurationCustomizer {
490+
491+
private final FlywayProperties properties;
492+
493+
PostgresqlFlywayConfigurationCustomizer(FlywayProperties properties) {
494+
this.properties = properties;
495+
}
496+
497+
@Override
498+
public void customize(FluentConfiguration configuration) {
499+
ConfigurationExtensionMapper<PostgreSQLConfigurationExtension> map = new ConfigurationExtensionMapper<>(
500+
PropertyMapper.get().alwaysApplyingWhenNonNull(), () -> {
501+
PostgreSQLConfigurationExtension extension = configuration.getPluginRegister()
502+
.getPlugin(PostgreSQLConfigurationExtension.class);
503+
Assert.notNull(extension, "PostgreSQL extension missing");
504+
return extension;
505+
});
506+
map.apply(this.properties.getPostgresql().getTransactionalLock(),
507+
PostgreSQLConfigurationExtension::setTransactionalLock);
508+
}
509+
510+
}
511+
481512
@Order(Ordered.HIGHEST_PRECEDENCE)
482513
static final class SqlServerFlywayConfigurationCustomizer implements FlywayConfigurationCustomizer {
483514

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ public class FlywayProperties {
372372
*/
373373
private Boolean detectEncoding;
374374

375+
private final Postgresql postgresql = new Postgresql();
376+
375377
public boolean isEnabled() {
376378
return this.enabled;
377379
}
@@ -868,4 +870,29 @@ public void setDetectEncoding(final Boolean detectEncoding) {
868870
this.detectEncoding = detectEncoding;
869871
}
870872

873+
public Postgresql getPostgresql() {
874+
return this.postgresql;
875+
}
876+
877+
/**
878+
* {@code PostgreSQLConfigurationExtension} properties.
879+
*/
880+
public static class Postgresql {
881+
882+
/**
883+
* Whether transactional advisory locks should be used. If set to false,
884+
* session-level locks are used instead.
885+
*/
886+
private Boolean transactionalLock;
887+
888+
public Boolean getTransactionalLock() {
889+
return this.transactionalLock;
890+
}
891+
892+
public void setTransactionalLock(Boolean transactionalLock) {
893+
this.transactionalLock = transactionalLock;
894+
}
895+
896+
}
897+
871898
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.flywaydb.core.api.callback.Event;
3434
import org.flywaydb.core.api.configuration.FluentConfiguration;
3535
import org.flywaydb.core.api.migration.JavaMigration;
36+
import org.flywaydb.core.internal.database.postgresql.PostgreSQLConfigurationExtension;
3637
import org.flywaydb.core.internal.license.FlywayTeamsUpgradeRequiredException;
3738
import org.flywaydb.database.oracle.OracleConfigurationExtension;
3839
import org.flywaydb.database.sqlserver.SQLServerConfigurationExtension;
@@ -52,6 +53,7 @@
5253
import org.springframework.boot.autoconfigure.AutoConfigurations;
5354
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayAutoConfigurationRuntimeHints;
5455
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.OracleFlywayConfigurationCustomizer;
56+
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.PostgresqlFlywayConfigurationCustomizer;
5557
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.SqlServerFlywayConfigurationCustomizer;
5658
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
5759
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
@@ -733,6 +735,24 @@ void outputQueryResultsIsCorrectlyMapped() {
733735
.run(validateFlywayTeamsPropertyOnly("outputQueryResults"));
734736
}
735737

738+
@Test
739+
void postgresqlExtensionIsNotLoadedByDefault() {
740+
FluentConfiguration configuration = mock(FluentConfiguration.class);
741+
new PostgresqlFlywayConfigurationCustomizer(new FlywayProperties()).customize(configuration);
742+
then(configuration).shouldHaveNoInteractions();
743+
}
744+
745+
@Test
746+
void postgresqlTransactionalLockIsCorrectlyMapped() {
747+
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
748+
.withPropertyValues("spring.flyway.postgresql.transactional-lock=false")
749+
.run((context) -> assertThat(context.getBean(Flyway.class)
750+
.getConfiguration()
751+
.getPluginRegister()
752+
.getPlugin(PostgreSQLConfigurationExtension.class)
753+
.isTransactionalLock()).isFalse());
754+
}
755+
736756
@Test
737757
void sqlServerExtensionIsNotLoadedByDefault() {
738758
FluentConfiguration configuration = mock(FluentConfiguration.class);

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ void expectedPropertiesAreManaged() {
112112
// Property that moved to a separate Oracle plugin
113113
ignoreProperties(properties, "oracleSqlplus", "oracleSqlplusWarn", "oracleKerberosCacheFile",
114114
"oracleWalletLocation");
115+
// Postgresql extension
116+
ignoreProperties(properties, "postgresql");
115117
// Property that moved to a separate SQL plugin
116118
ignoreProperties(properties, "sqlServerKerberosLoginFile");
117119
// High level object we can't set with properties

0 commit comments

Comments
 (0)