- Added reconnection attempts to DB on DB connection failure [#26322]

This commit is contained in:
Francesco Mangiacrapa 2024-07-09 16:09:22 +02:00
parent 9e0a2582e2
commit b8d54fea0b
2 changed files with 55 additions and 1 deletions

View File

@ -2,6 +2,7 @@
## [v1.1.3] ## [v1.1.3]
- Added apply regex business logic [#26322] - Added apply regex business logic [#26322]
- Added reconnection attempts to DB on DB connection failure [#26322]
## [v1.1.2] ## [v1.1.2]
- Using parent version range [#25572] - Using parent version range [#25572]

View File

@ -1,5 +1,7 @@
package org.gcube.application.cms.sdi.plugins; package org.gcube.application.cms.sdi.plugins;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -41,6 +43,7 @@ import org.gcube.application.geoportal.common.model.document.identification.Spat
import org.gcube.application.geoportal.common.model.plugins.IndexerPluginDescriptor; import org.gcube.application.geoportal.common.model.plugins.IndexerPluginDescriptor;
import org.gcube.application.geoportal.common.model.plugins.PluginDescriptor; import org.gcube.application.geoportal.common.model.plugins.PluginDescriptor;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.geoportal.common.model.rest.DatabaseConnection;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.gcube.portlets.user.uriresolvermanager.UriResolverManager; import org.gcube.portlets.user.uriresolvermanager.UriResolverManager;
import org.gcube.portlets.user.uriresolvermanager.resolvers.query.GeoportalResolverQueryStringBuilder; import org.gcube.portlets.user.uriresolvermanager.resolvers.query.GeoportalResolverQueryStringBuilder;
@ -66,6 +69,8 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPluginInterface { public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPluginInterface {
private static final int CONNECTION_TIMEOUT = 30;
static final PluginDescriptor DESCRIPTOR = new PluginDescriptor(Constants.INDEXER_PLUGIN_ID, static final PluginDescriptor DESCRIPTOR = new PluginDescriptor(Constants.INDEXER_PLUGIN_ID,
IndexerPluginDescriptor.INDEXER); IndexerPluginDescriptor.INDEXER);
@ -328,7 +333,7 @@ public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPlugin
if (applyRegex != null) { if (applyRegex != null) {
try { try {
String valueString = toSetValue==null?"":toSetValue.toString(); String valueString = toSetValue == null ? "" : toSetValue.toString();
String type = applyRegex.getType(); String type = applyRegex.getType();
REGEX_TYPES theRegexType = ApplyRegex.REGEX_TYPES.valueOf(type); REGEX_TYPES theRegexType = ApplyRegex.REGEX_TYPES.valueOf(type);
Pattern p = Pattern.compile(applyRegex.getRegex()); Pattern p = Pattern.compile(applyRegex.getRegex());
@ -438,6 +443,10 @@ public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPlugin
// TODO CACHE // TODO CACHE
private PostgisIndexer getIndexer(UseCaseDescriptor ucd, Document params) private PostgisIndexer getIndexer(UseCaseDescriptor ucd, Document params)
throws ConfigurationException, SQLException, InvalidProfileException, SDIInteractionException { throws ConfigurationException, SQLException, InvalidProfileException, SDIInteractionException {
//Added by Francesco
databaseConnectionValidator();
PostgisIndexer indexer = new PostgisIndexer(sdiCache.getObject(), ucd, postgisCache.getObject()); PostgisIndexer indexer = new PostgisIndexer(sdiCache.getObject(), ucd, postgisCache.getObject());
List<MappingObject> mappingObjects = getMappings(ucd); List<MappingObject> mappingObjects = getMappings(ucd);
@ -449,4 +458,48 @@ public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPlugin
return indexer; return indexer;
} }
private boolean checkDatabaseConnection() {
DatabaseConnection connectionParameters = null;
try {
connectionParameters = postgisCache.getObject();
// Getting connection
Connection connection = DriverManager.getConnection(connectionParameters.getUrl(),
connectionParameters.getUser(), connectionParameters.getPwd());
// Check if the connection is valid (timeout 30 seconds)
if (connection != null && connection.isValid(CONNECTION_TIMEOUT)) {
log.debug("Connection to DB {} is OK!", connectionParameters.getUrl());
return true;
} else {
log.debug("Connection to DB {} is KO!", connectionParameters.getUrl());
return false;
}
} catch (SQLException e) {
log.warn("Error on connecting to DB: " + connectionParameters, e);
return false;
} catch (ConfigurationException e1) {
log.warn("Error on reading connection configuration: " + connectionParameters, e1);
return false;
}
}
private void databaseConnectionValidator() {
int maxRetry = 5;
int attempt = 0;
while (!checkDatabaseConnection() && attempt <= maxRetry) {
attempt++;
log.info("Attempt number: {}", attempt);
log.info("Disposing the PostGis Cache");
postgisCache.shutdown();
log.info("Loading the PostGis Cache for context");
try {
postgisCache.getObject();
} catch (ConfigurationException e) {
log.warn("DtabaseConnectionValidatorError on reading connection configuration: ", e);
}
}
}
} }