Ensure Liquibase validation is performed once per area

Closes #10132
This commit is contained in:
Stefan Guilhen 2022-02-22 15:04:08 -03:00 committed by Hynek Mlnařík
parent c49c4f80a2
commit af7a040d54

View file

@ -24,6 +24,8 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function; import java.util.function.Function;
import javax.naming.InitialContext; import javax.naming.InitialContext;
import javax.naming.NamingException; import javax.naming.NamingException;
@ -80,10 +82,11 @@ public class JpaMapStorageProviderFactory implements
EnvironmentDependentProviderFactory { EnvironmentDependentProviderFactory {
public static final String PROVIDER_ID = "jpa-map-storage"; public static final String PROVIDER_ID = "jpa-map-storage";
private static final Logger logger = Logger.getLogger(JpaMapStorageProviderFactory.class);
private volatile EntityManagerFactory emf; private volatile EntityManagerFactory emf;
private final Set<Class<?>> validatedModels = ConcurrentHashMap.newKeySet();
private Config.Scope config; private Config.Scope config;
private static final Logger logger = Logger.getLogger(JpaMapStorageProviderFactory.class);
public final static DeepCloner CLONER = new DeepCloner.Builder() public final static DeepCloner CLONER = new DeepCloner.Builder()
//client //client
@ -144,6 +147,7 @@ public class JpaMapStorageProviderFactory implements
if (emf != null) { if (emf != null) {
emf.close(); emf.close();
} }
this.validatedModels.clear();
} }
private void lazyInit() { private void lazyInit() {
@ -231,23 +235,24 @@ public class JpaMapStorageProviderFactory implements
} }
public void validateAndUpdateSchema(KeycloakSession session, Class<?> modelType) { public void validateAndUpdateSchema(KeycloakSession session, Class<?> modelType) {
Connection connection = getConnection(); if (this.validatedModels.add(modelType)) {
Connection connection = getConnection();
try {
if (logger.isDebugEnabled()) printOperationalInfo(connection);
try { MapJpaUpdaterProvider updater = session.getProvider(MapJpaUpdaterProvider.class);
if (logger.isDebugEnabled()) printOperationalInfo(connection); MapJpaUpdaterProvider.Status status = updater.validate(modelType, connection, config.get("schema"));
MapJpaUpdaterProvider updater = session.getProvider(MapJpaUpdaterProvider.class); if (!status.equals(VALID)) {
MapJpaUpdaterProvider.Status status = updater.validate(modelType, connection, config.get("schema")); update(modelType, connection, session);
}
if (! status.equals(VALID)) { } finally {
update(modelType, connection, session); if (connection != null) {
} try {
} finally { connection.close();
if (connection != null) { } catch (SQLException e) {
try { logger.warn("Can't close connection", e);
connection.close(); }
} catch (SQLException e) {
logger.warn("Can't close connection", e);
} }
} }
} }