You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:27:38 UTC

[sling-org-apache-sling-discovery-oak] 03/12: SLING-4603 : more aggressively clearing the idMap-cache to avoid stale entries on slingId change - plus added getSyncHistory to BaseSyncTokenConsistencyService to allow adding it to the webconsole for debug - plus some cleanup in webconsole wrt discoveryLite info

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.discovery.oak-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-oak.git

commit c03ca86d0ecff0fe465aaa66367acca4f11bd435
Author: Stefan Egli <st...@apache.org>
AuthorDate: Thu Oct 22 12:33:15 2015 +0000

    SLING-4603 : more aggressively clearing the idMap-cache to avoid stale entries on slingId change - plus added getSyncHistory to BaseSyncTokenConsistencyService to allow adding it to the webconsole for debug - plus some cleanup in webconsole wrt discoveryLite info
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/discovery/oak@1710003 13f79535-47bb-0310-9956-ffa450edef68
---
 .../discovery/oak/TopologyWebConsolePlugin.java    | 119 ++++++++++-----------
 .../oak/cluster/OakClusterViewService.java         |  12 ++-
 2 files changed, 68 insertions(+), 63 deletions(-)

diff --git a/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java b/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java
index 23676f9..acc75aa 100644
--- a/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java
+++ b/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java
@@ -55,6 +55,8 @@ import org.apache.sling.discovery.InstanceDescription;
 import org.apache.sling.discovery.InstanceFilter;
 import org.apache.sling.discovery.TopologyEvent;
 import org.apache.sling.discovery.TopologyEvent.Type;
+import org.apache.sling.discovery.TopologyEventListener;
+import org.apache.sling.discovery.TopologyView;
 import org.apache.sling.discovery.base.commons.ClusterViewService;
 import org.apache.sling.discovery.base.connectors.announcement.Announcement;
 import org.apache.sling.discovery.base.connectors.announcement.AnnouncementRegistry;
@@ -62,8 +64,7 @@ import org.apache.sling.discovery.base.connectors.announcement.CachedAnnouncemen
 import org.apache.sling.discovery.base.connectors.ping.ConnectorRegistry;
 import org.apache.sling.discovery.base.connectors.ping.TopologyConnectorClientInformation;
 import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteDescriptor;
-import org.apache.sling.discovery.TopologyEventListener;
-import org.apache.sling.discovery.TopologyView;
+import org.apache.sling.discovery.commons.providers.spi.base.OakSyncTokenConsistencyService;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -110,10 +111,19 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
     @Reference
     protected ResourceResolverFactory resourceResolverFactory;
 
+    @Reference
+    private OakSyncTokenConsistencyService consistencyService;
+
     private TopologyView currentView;
     
     private List<String> discoveryLiteHistory = new LinkedList<String>();
 
+    /** 
+     * keeps hold of the last DiscoveryLiteDescriptor that was added
+     * to the discoveryLiteHistory - in order to de-duplicate as we go
+     */
+    private DiscoveryLiteDescriptor lastDiscoveryLiteDescriptor = null;
+    
     @Override
     public String getLabel() {
         return LABEL;
@@ -277,32 +287,6 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
         listIncomingTopologyConnectors(pw);
         listOutgoingTopologyConnectors(pw);
         pw.println("<br/>");
-
-        ResourceResolver resourceResolver = null;
-        pw.println("<p class=\"statline ui-state-highlight\">Oak Discovery-Lite Descriptor History</p>");
-        pw.println("<pre>");
-        for (String discoLiteHistoryEntry : discoveryLiteHistory) {
-            pw.println(discoLiteHistoryEntry);
-        }
-        pw.println("</pre>");
-        pw.println("<br/>");
-        pw.println("<p class=\"statline ui-state-highlight\">Current Oak Discovery-Lite Descriptor</p>");
-        pw.println("<pre>");
-        try{
-            resourceResolver = getResourceResolver();
-            DiscoveryLiteDescriptor descriptor = DiscoveryLiteDescriptor.getDescriptorFrom(resourceResolver);
-            final String logEntry = getCurrentDateFormatted() + ": " + descriptor.getDescriptorStr();
-            pw.println(logEntry);
-        } catch(Exception e) {
-            logger.error("renderOverview: Exception: "+e, e);
-            pw.println("Got exception trying to get repository descriptor: "+e);
-        } finally {
-            if (resourceResolver != null) {
-                resourceResolver.close();
-            }
-        }
-        pw.println("</pre>");
-        pw.println("<br/>");
         
         pw.println("<p class=\"statline ui-state-highlight\">Topology Change History</p>");
         pw.println("<pre>");
@@ -322,6 +306,23 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
         }
         pw.println("</pre>");
         pw.println("</br>");
+
+        pw.println("<p class=\"statline ui-state-highlight\">Oak Discovery-Lite Descriptor History</p>");
+        updateDiscoveryLiteHistory();
+        pw.println("<pre>");
+        for (String discoLiteHistoryEntry : discoveryLiteHistory) {
+            pw.println(discoLiteHistoryEntry);
+        }
+        pw.println("</pre>");
+        pw.println("<br/>");
+
+        pw.println("<p class=\"statline ui-state-highlight\">ConsistencyService History</p>");
+        pw.println("<pre>");
+        for (String syncHistoryEntry : consistencyService.getSyncHistory()) {
+            pw.println(syncHistoryEntry);
+        }
+        pw.println("</pre>");
+        pw.println("<br/>");
     }
 
     /**
@@ -600,7 +601,7 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
                             + newInstanceDescription
                             + " in oldview.. event="
                             + event);
-                    addEventLog(event.getType(), event.getType().toString());
+                    addEventLog(event.getType(), event.getType().toString()+" (new instance "+newInstanceDescription.getSlingId()+" not found in old view)");
                     return;
                 }
 
@@ -619,7 +620,7 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
                 }
             }
 
-            addEventLog(event.getType(), sb.toString());
+            addEventLog(event.getType(), "details: "+sb.toString());
         } else if (event.getType() == Type.TOPOLOGY_INIT) {
             this.currentView = event.getNewView();
             StringBuilder details = new StringBuilder();
@@ -692,7 +693,7 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
                                 + details);
             }
         }
-        addDiscoveryLiteHistoryEntry();
+        updateDiscoveryLiteHistory();
     }
 
     /**
@@ -735,17 +736,22 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
     }
 
     /**
-     * add a discoveryLite descriptor entry to the history, truncating if necessary
+     * if there's any change add a discoveryLite descriptor entry to the history, truncating if necessary
      */
-    private synchronized void addDiscoveryLiteHistoryEntry() {
+    private synchronized void updateDiscoveryLiteHistory() {
         ResourceResolver resourceResolver = null;
         try{
             resourceResolver = getResourceResolver();
             DiscoveryLiteDescriptor descriptor = 
                     DiscoveryLiteDescriptor.getDescriptorFrom(resourceResolver);
 
+            if (lastDiscoveryLiteDescriptor!=null && 
+                    descriptor.getDescriptorStr().equals(lastDiscoveryLiteDescriptor.getDescriptorStr())) {
+                // de-duplication - then there's nothing to update
+                return;
+            }
             final String logEntry = getCurrentDateFormatted() + ": " + descriptor.getDescriptorStr();
-            
+            lastDiscoveryLiteDescriptor = descriptor;
             discoveryLiteHistory.add(logEntry);
             while (discoveryLiteHistory.size() > 12) {
                 discoveryLiteHistory.remove(0);
@@ -923,34 +929,6 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
             pw.println();
         }
 
-        ResourceResolver resourceResolver = null;
-        pw.println("Oak Discovery-Lite Descriptor History");
-        pw.println("---------------------------------------");
-        for (String discoLiteHistoryEntry : discoveryLiteHistory) {
-            pw.println(discoLiteHistoryEntry);
-        }
-        pw.println();
-        pw.println();
-        pw.println("Current Oak Discovery-Lite Descriptor");
-        pw.println("---------------------------------------");
-        try{
-            resourceResolver = getResourceResolver();
-            DiscoveryLiteDescriptor descriptor = DiscoveryLiteDescriptor.getDescriptorFrom(resourceResolver);
-            final String logEntry = getCurrentDateFormatted() + ": " + descriptor.getDescriptorStr();
-            pw.println(logEntry);
-            pw.println();
-            pw.println();
-        } catch(Exception e) {
-            logger.error("renderOverview: Exception: "+e, e);
-            pw.println("Got exception trying to get repository descriptor: "+e);
-            pw.println();
-            pw.println();
-        } finally {
-            if (resourceResolver != null) {
-                resourceResolver.close();
-            }
-        }
-
         if ( topologyLog.size() > 0 ) {
             pw.println("Topology Change History");
             pw.println("---------------------------------------");
@@ -969,6 +947,23 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement
             }
             pw.println();
         }
+
+        pw.println("Oak Discovery-Lite Descriptor History");
+        pw.println("---------------------------------------");
+        updateDiscoveryLiteHistory();
+        for (String discoLiteHistoryEntry : discoveryLiteHistory) {
+            pw.println(discoLiteHistoryEntry);
+        }
+        pw.println();
+        pw.println();
+
+        pw.println("ConsistencyService History");
+        pw.println("---------------------------------------");
+        for (String syncHistoryEntry : consistencyService.getSyncHistory()) {
+            pw.println(syncHistoryEntry);
+        }
+        pw.println();
+        pw.println();
     }
 
     private String getCurrentDateFormatted() {
diff --git a/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java b/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java
index ce55cc2..4f770cf 100644
--- a/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java
+++ b/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java
@@ -68,6 +68,9 @@ public class OakClusterViewService implements ClusterViewService {
     @Reference
     private IdMapService idMapService;
     
+    /** the last sequence number read from the oak discovery-lite descriptor **/
+    private long lastSeqNum = -1;
+    
     public static OakClusterViewService testConstructor(SlingSettingsService settingsService,
             ResourceResolverFactory resourceResolverFactory,
             IdMapService idMapService,
@@ -98,6 +101,11 @@ public class OakClusterViewService implements ClusterViewService {
             resourceResolver = getResourceResolver();
             DiscoveryLiteDescriptor descriptor = 
                     DiscoveryLiteDescriptor.getDescriptorFrom(resourceResolver);
+            if (lastSeqNum!=descriptor.getSeqNum()) {
+                logger.info("getLocalClusterView: sequence number change detected - clearing idmap cache");
+                idMapService.clearCache();
+                lastSeqNum = descriptor.getSeqNum();
+            }
             return asClusterView(descriptor, resourceResolver);
         } catch (UndefinedClusterViewException e) {
             logger.info("getLocalClusterView: undefined clusterView: "+e.getReason()+" - "+e.getMessage());
@@ -122,7 +130,7 @@ public class OakClusterViewService implements ClusterViewService {
         }
         logger.trace("asClusterView: start");
         String clusterViewId = descriptor.getViewId();
-        String localClusterSyncTokenId = descriptor.getViewId()+"_"+descriptor.getSeqNum();
+        String localClusterSyncTokenId = /*descriptor.getViewId()+"_"+*/String.valueOf(descriptor.getSeqNum());
         if (!descriptor.isFinal()) {
             throw new UndefinedClusterViewException(Reason.NO_ESTABLISHED_VIEW, "descriptor is not yet final: "+descriptor);
         }
@@ -146,6 +154,7 @@ public class OakClusterViewService implements ClusterViewService {
         for (Integer id : activeIdsList) {
             String slingId = idMapService.toSlingId(id, resourceResolver);
             if (slingId == null) {
+                idMapService.clearCache();
                 throw new UndefinedClusterViewException(Reason.NO_ESTABLISHED_VIEW,
                         "no slingId mapped for clusterNodeId="+id);
             }
@@ -169,6 +178,7 @@ public class OakClusterViewService implements ClusterViewService {
             boolean isOwn = id==me;
             String slingId = idMapService.toSlingId(id, resourceResolver);
             if (slingId==null) {
+                idMapService.clearCache();
                 logger.info("asClusterView: cannot resolve oak-clusterNodeId {} to a slingId", id);
                 throw new Exception("Cannot resolve oak-clusterNodeId "+id+" to a slingId");
             }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.