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 {

Reply via email to