From 482e3c0dbd5c5d00627b6cebca6543ac9da260a4 Mon Sep 17 00:00:00 2001 From: elong Date: Fri, 1 Jul 2016 22:23:40 -0400 Subject: [PATCH] 0002666: Cache offline node database parameters used by node communication --- .../symmetric/service/IParameterService.java | 2 ++ .../impl/AbstractParameterService.java | 33 +++++++++++-------- .../impl/NodeCommunicationService.java | 4 +-- .../service/impl/ParameterService.java | 14 ++++++++ .../service/impl/MockParameterService.java | 4 +++ 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IParameterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IParameterService.java index 99d7ff20c7..a24674fbb8 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IParameterService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IParameterService.java @@ -72,6 +72,8 @@ public interface IParameterService { public TypedProperties getDatabaseParameters(String externalId, String nodeGroupId); + public List getOfflineNodeParameters(); + public TypedProperties getAllParameters(); public boolean isRegistrationServer(); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractParameterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractParameterService.java index e42c7ee690..238518152c 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractParameterService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractParameterService.java @@ -144,21 +144,26 @@ public synchronized void rereadParameters() { } protected TypedProperties getParameters() { - if (parameters == null - || (cacheTimeoutInMs > 0 && lastTimeParameterWereCached < (System - .currentTimeMillis() - cacheTimeoutInMs))) { - try { - parameters = rereadApplicationParameters(); - lastTimeParameterWereCached = System.currentTimeMillis(); - cacheTimeoutInMs = getInt(ParameterConstants.PARAMETER_REFRESH_PERIOD_IN_MS); - } catch (SqlException ex) { - if (parameters != null) { - log.warn("Could not read database parameters. We will try again later", ex); - } else { - log.error("Could not read database parameters and they have not yet been initialized"); - throw ex; + long timeoutTime = System.currentTimeMillis() - cacheTimeoutInMs; + // Quick check if cache is timed out + if (parameters == null || (cacheTimeoutInMs > 0 && lastTimeParameterWereCached < timeoutTime)) { + synchronized (this) { + // Synchronized check to prevent calling reread parameters multiple times + if (parameters == null || (cacheTimeoutInMs > 0 && lastTimeParameterWereCached < timeoutTime)) { + try { + parameters = rereadApplicationParameters(); + lastTimeParameterWereCached = System.currentTimeMillis(); + cacheTimeoutInMs = getInt(ParameterConstants.PARAMETER_REFRESH_PERIOD_IN_MS); + } catch (SqlException ex) { + if (parameters != null) { + log.warn("Could not read database parameters. We will try again later", ex); + } else { + log.error("Could not read database parameters and they have not yet been initialized"); + throw ex; + } + throw ex; + } } - throw ex; } } return parameters; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/NodeCommunicationService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/NodeCommunicationService.java index cc1e335246..c2759a6c71 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/NodeCommunicationService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/NodeCommunicationService.java @@ -257,7 +257,7 @@ protected List removeOfflineNodes(List nodes) { if (parameterService.is(ParameterConstants.NODE_OFFLINE)) { nodes.clear(); } else { - List parms = parameterService.getDatabaseParametersFor(ParameterConstants.NODE_OFFLINE); + List parms = parameterService.getOfflineNodeParameters(); for (DatabaseParameter parm : parms) { Iterator iter = nodes.iterator(); while (iter.hasNext()) { @@ -284,7 +284,7 @@ protected List getNodesToCommunicateWithOffline(CommunicationType communic nodesToCommunicateWith.addAll(nodeService.findNodesToPull()); } } else { - List parms = parameterService.getDatabaseParametersFor(ParameterConstants.NODE_OFFLINE); + List parms = parameterService.getOfflineNodeParameters(); nodesToCommunicateWith = new ArrayList(parms.size()); if (parms.size() > 0) { List sourceNodes = null; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ParameterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ParameterService.java index d917b60640..ac2a1eba11 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ParameterService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ParameterService.java @@ -52,6 +52,8 @@ public class ParameterService extends AbstractParameterService implements IParam private ISqlTemplate sqlTemplate; private Date lastUpdateTime; + + private List offlineParameters; public ParameterService(IDatabasePlatform platform, ITypedPropertiesFactory factory, String tablePrefix) { this.tablePrefix = tablePrefix; @@ -170,9 +172,14 @@ protected TypedProperties rereadApplicationParameters() { TypedProperties p = this.factory.reload(); p.putAll(systemProperties); p.putAll(rereadDatabaseParameters(p)); + rereadOfflineNodeParameters(); return p; } + protected synchronized void rereadOfflineNodeParameters() { + offlineParameters = getDatabaseParametersFor(ParameterConstants.NODE_OFFLINE); + } + public List getDatabaseParametersFor(String paramKey) { return sqlTemplate.query(sql.getSql("selectParametersByKeySql"), new DatabaseParameterMapper(), paramKey); @@ -182,6 +189,13 @@ public TypedProperties getDatabaseParameters(String externalId, String nodeGroup return readParametersFromDatabase("selectParametersSql", externalId, nodeGroupId); } + public List getOfflineNodeParameters() { + if (offlineParameters == null) { + rereadOfflineNodeParameters(); + } + return offlineParameters; + } + class DatabaseParameterMapper implements ISqlRowMapper { IParameterFilter filter = extensionService != null ? extensionService.getExtensionPoint(IParameterFilter.class) : null; public DatabaseParameter mapRow(Row row) { diff --git a/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/MockParameterService.java b/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/MockParameterService.java index 16f123f732..e0f506d86e 100644 --- a/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/MockParameterService.java +++ b/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/MockParameterService.java @@ -81,6 +81,10 @@ public TypedProperties getDatabaseParametersByNodeGroupId(String nodeGroupId) { return null; } + public List getOfflineNodeParameters() { + return null; + } + public String getTablePrefix() { return "sym"; }