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(