Repository: knox Updated Branches: refs/heads/master e8ba712c8 -> 5af2d25f6
KNOX-1169 - Clear Cluster Configuration Monitor Cache When No Relevant Descriptors Remain Project: http://git-wip-us.apache.org/repos/asf/knox/repo Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/5af2d25f Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/5af2d25f Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/5af2d25f Branch: refs/heads/master Commit: 5af2d25f67f6b432f0af194298586ad71531588d Parents: e8ba712 Author: Phil Zampino <pzamp...@apache.org> Authored: Fri Feb 2 11:47:31 2018 -0500 Committer: Phil Zampino <pzamp...@apache.org> Committed: Fri Feb 2 12:19:46 2018 -0500 ---------------------------------------------------------------------- .../ambari/AmbariConfigurationMonitor.java | 5 +++++ .../ambari/AmbariConfigurationMonitorTest.java | 17 +++++++++++++++++ .../DefaultClusterConfigurationMonitorService.java | 8 ++++++++ .../topology/impl/DefaultTopologyService.java | 13 +++++++++++-- .../ClusterConfigurationMonitorService.java | 8 ++++++++ .../discovery/ClusterConfigurationMonitor.java | 5 +++++ 6 files changed, 54 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/knox/blob/5af2d25f/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java index 920b05c7..a086956 100644 --- a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java +++ b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java @@ -303,6 +303,11 @@ class AmbariConfigurationMonitor implements ClusterConfigurationMonitor { changeListeners.add(listener); } + @Override + public void clearCache(String source, String clusterName) { + this.removeClusterConfigVersions(source, clusterName); + } + /** * Add discovery configuration details for the specified cluster, so the monitor knows how to connect to check for * changes. http://git-wip-us.apache.org/repos/asf/knox/blob/5af2d25f/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java index 7411545..f60ce76 100644 --- a/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java +++ b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java @@ -33,8 +33,10 @@ import java.util.Map; import java.util.UUID; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; public class AmbariConfigurationMonitorTest { @@ -199,6 +201,21 @@ public class AmbariConfigurationMonitorTest { assertNull("Expected changes to have been reported.", changeNotifications.get(addr2).get(cluster1Name)); + + // Verify the cache clearing behavior + Map<String, Map<String, String>> src2ClustersData = monitor.ambariClusterConfigVersions.get(addr2); + assertTrue("Expected data for this cluster.", src2ClustersData.containsKey(cluster1Name)); + assertTrue("Expected data for this cluster.", src2ClustersData.containsKey(cluster2Name)); + + // Clear the cache for this source + monitor.clearCache(addr2, cluster1Name); + + assertFalse("Expected NO data for this cluster.", src2ClustersData.containsKey(cluster1Name)); + assertTrue("Expected data for this cluster.", src2ClustersData.containsKey(cluster2Name)); + + // Make sure the cache for the other source is unaffected + Map<String, Map<String, String>> src1ClustersData = monitor.ambariClusterConfigVersions.get(addr1); + assertTrue("Expected data for this cluster.", src1ClustersData.containsKey(cluster1Name)); } http://git-wip-us.apache.org/repos/asf/knox/blob/5af2d25f/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java ---------------------------------------------------------------------- diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java index e7ef01d..bb502c9 100644 --- a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java +++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java @@ -75,7 +75,15 @@ public class DefaultClusterConfigurationMonitorService implements ClusterConfigu } } + @Override + public void clearCache(String source, String clusterName) { + for (ClusterConfigurationMonitor monitor : monitors.values()) { + monitor.clearCache(source, clusterName); + } + } + public void setAliasService(AliasService aliasService) { this.aliasService = aliasService; } + } http://git-wip-us.apache.org/repos/asf/knox/blob/5af2d25f/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java ---------------------------------------------------------------------- diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java index 9c19cc8..5985d5f 100644 --- a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java +++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java @@ -564,7 +564,7 @@ public class DefaultTopologyService // Register a cluster configuration monitor listener for change notifications ClusterConfigurationMonitorService ccms = GatewayServer.getGatewayServices().getService(GatewayServices.CLUSTER_CONFIGURATION_MONITOR_SERVICE); - ccms.addListener(new TopologyDiscoveryTrigger(this)); + ccms.addListener(new TopologyDiscoveryTrigger(this, ccms)); } @Override @@ -885,26 +885,35 @@ public class DefaultTopologyService private static class TopologyDiscoveryTrigger implements ClusterConfigurationMonitor.ConfigurationChangeListener { private TopologyService topologyService = null; + private ClusterConfigurationMonitorService ccms = null; - TopologyDiscoveryTrigger(TopologyService topologyService) { + TopologyDiscoveryTrigger(TopologyService topologyService, ClusterConfigurationMonitorService ccms) { this.topologyService = topologyService; + this.ccms = ccms; } @Override public void onConfigurationChange(String source, String clusterName) { log.noticedClusterConfigurationChange(source, clusterName); try { + boolean affectedDescriptors = false; // Identify any descriptors associated with the cluster configuration change for (File descriptor : topologyService.getDescriptors()) { String descriptorContent = FileUtils.readFileToString(descriptor); if (descriptorContent.contains(source)) { if (descriptorContent.contains(clusterName)) { + affectedDescriptors = true; log.triggeringTopologyRegeneration(source, clusterName, descriptor.getAbsolutePath()); // 'Touch' the descriptor to trigger re-generation of the associated topology descriptor.setLastModified(System.currentTimeMillis()); } } } + + if (!affectedDescriptors) { + // If not descriptors are affected by this configuration, then clear the cache to prevent future notifications + ccms.clearCache(source, clusterName); + } } catch (Exception e) { log.errorRespondingToConfigChange(source, clusterName, e); } http://git-wip-us.apache.org/repos/asf/knox/blob/5af2d25f/gateway-spi/src/main/java/org/apache/knox/gateway/topology/ClusterConfigurationMonitorService.java ---------------------------------------------------------------------- diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/ClusterConfigurationMonitorService.java b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/ClusterConfigurationMonitorService.java index 0bfaa5f..d033eca 100644 --- a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/ClusterConfigurationMonitorService.java +++ b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/ClusterConfigurationMonitorService.java @@ -40,4 +40,12 @@ public interface ClusterConfigurationMonitorService extends Service { */ void addListener(ClusterConfigurationMonitor.ConfigurationChangeListener listener); + /** + * Clear the cluster configuration data cache for the specified source and cluster. + * + * @param source The identifier of configuration source being monitored. + * @param clusterName The name of an associated cluster being monitored. + */ + void clearCache(String source, String clusterName); + } http://git-wip-us.apache.org/repos/asf/knox/blob/5af2d25f/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitor.java ---------------------------------------------------------------------- diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitor.java b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitor.java index 641bad5..5e40537 100644 --- a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitor.java +++ b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitor.java @@ -40,6 +40,11 @@ public interface ClusterConfigurationMonitor { void addListener(ConfigurationChangeListener listener); /** + * Clear the configuration data cache for the specified source and cluster name. + */ + void clearCache(String source, String clusterName); + + /** * Monitor listener interface for receiving notifications that a configuration has changed. */ interface ConfigurationChangeListener {