You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by st...@apache.org on 2013/04/24 15:20:39 UTC

svn commit: r1471400 - in /sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl: cluster/voting/ common/heartbeat/

Author: stefanegli
Date: Wed Apr 24 13:20:39 2013
New Revision: 1471400

URL: http://svn.apache.org/r1471400
Log:
SLING-2827 : 'garbage collection' for timed out votings added

Modified:
    sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java
    sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHelper.java
    sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java
    sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java

Modified: sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java?rev=1471400&r1=1471399&r2=1471400&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java (original)
+++ sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java Wed Apr 24 13:20:39 2013
@@ -242,6 +242,20 @@ public class VotingHandler implements Ev
         logger.debug("analyzeVotings: all done now. I've voted yes for "
                 + lowestVoting);
     }
+    
+    public void cleanupTimedoutVotings(final ResourceResolver resourceResolver) {
+        List<VotingView> timedoutVotings = VotingHelper
+                .listTimedoutVotings(resourceResolver,
+                        config);
+        Iterator<VotingView> it = timedoutVotings.iterator();
+        while (it.hasNext()) {
+            VotingView timedoutVotingRes = it.next();
+            if (timedoutVotingRes!=null) {
+                logger.info("cleanupTimedoutVotings: removing a timed out voting: "+timedoutVotingRes);
+                timedoutVotingRes.remove();
+            }
+        }
+    }
 
     /**
      * Promote a particular voting to be the new established view

Modified: sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHelper.java?rev=1471400&r1=1471399&r2=1471400&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHelper.java (original)
+++ sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHelper.java Wed Apr 24 13:20:39 2013
@@ -91,6 +91,41 @@ public class VotingHelper {
     }
 
     /**
+     * List all the votings that have timed out
+     * @return the list of matching votings
+     */
+    public static List<VotingView> listTimedoutVotings(
+            final ResourceResolver resourceResolver, final Config config) {
+        final String ongoingVotingsPath = config.getOngoingVotingsPath();
+        final Resource ongoingVotingsResource = resourceResolver
+                .getResource(ongoingVotingsPath);
+        if (ongoingVotingsResource == null) {
+            logger.info("listTimedoutVotings: no ongoing votings parent resource found"); // TOOD - is this expected?
+            return new ArrayList<VotingView>();
+        }
+        final Iterable<Resource> children = ongoingVotingsResource.getChildren();
+        final Iterator<Resource> it = children.iterator();
+        final List<VotingView> result = new LinkedList<VotingView>();
+        if (!it.hasNext()) {
+            return result;
+        }
+        while (it.hasNext()) {
+            Resource aChild = it.next();
+            VotingView c = new VotingView(aChild);
+            if (c.isTimedoutVoting(config)) {
+                logger.debug("listTimedoutVotings: found a timed-out voting: "
+                        + aChild
+                        + ", properties="
+                        + ResourceHelper.getPropertiesForLogging(aChild));
+                result.add(c);
+            }
+        }
+        logger.debug("listTimedoutVotings: votings found: "
+                + result.size());
+        return result;
+    }
+
+    /**
      * Return the still valid (ongoing) and winning (received a yes vote
      * from everybody) voting
      * @return the valid and winning voting

Modified: sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java?rev=1471400&r1=1471399&r2=1471400&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java (original)
+++ sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java Wed Apr 24 13:20:39 2013
@@ -127,27 +127,50 @@ public class VotingView extends View {
      * @return
      */
     public boolean isOngoingVoting(final Config config) {
+        final long votingStart = getVotingStartTime();
+        if (votingStart==-1) {
+            return false;
+        }
+        final long now = System.currentTimeMillis();
+        final long diff = now - votingStart;
+        return diff < 1000 * config.getHeartbeatTimeout();
+    }
+
+    /**
+     * Checks whether this voting has timed out - that is, whether
+     * there is a valid votingStart set and whether that has timed out
+     */
+    public boolean isTimedoutVoting(final Config config) {
+        final long votingStart = getVotingStartTime();
+        if (votingStart==-1) {
+            return false;
+        }
+        final long now = System.currentTimeMillis();
+        final long diff = now - votingStart;
+        return diff > 1000 * config.getHeartbeatTimeout();
+    }
+
+    /** Get the value of the votingStart property - or -1 if anything goes wrong reading that **/
+    private long getVotingStartTime() {
         ValueMap properties = null;
         try{
             properties = getResource().adaptTo(ValueMap.class);
         } catch(RuntimeException e) {
-            logger.info("isOngoingVoting: could not get properties of "+getResource()+": "+e, e);
-            return false;
+            logger.info("getVotingStartTime: could not get properties of "+getResource()+". Likely in creation: "+e, e);
+            return -1;
         }
         if (properties == null) {
             // no properties, odd. then it's not a valid voting.
-            return false;
+            return -1;
         }
         final Date votingStartDate = properties.get("votingStart", Date.class);
         if (votingStartDate == null) {
-            logger.debug("isOngoingVoting: got a voting without votingStart. Likely in creation: "
+            logger.debug("getVotingStartTime: got a voting without votingStart. Likely in creation: "
                     + getResource());
-            return false;
+            return -1;
         }
         final long votingStart = votingStartDate.getTime();
-        final long now = System.currentTimeMillis();
-        final long diff = now - votingStart;
-        return diff < 1000 * config.getHeartbeatTimeout();
+        return votingStart;
     }
 
     /**

Modified: sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java?rev=1471400&r1=1471399&r2=1471400&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java (original)
+++ sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java Wed Apr 24 13:20:39 2013
@@ -280,6 +280,11 @@ public class HeartbeatHandler implements
             logger.info("doCheckView: votingHandler is null!");
         } else {
             votingHandler.analyzeVotings(resourceResolver);
+            try{
+                votingHandler.cleanupTimedoutVotings(resourceResolver);
+            } catch(Exception e) {
+                logger.warn("doCheckView: Exception occurred while cleaning up votings: "+e, e);
+            }
         }
 
         final VotingView winningVoting = VotingHelper.getWinningVoting(