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 <[email protected]> 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 "[email protected]" <[email protected]>.
