You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/06/25 20:28:34 UTC
svn commit: r958061 - in /cassandra/branches/cassandra-0.6:
src/java/org/apache/cassandra/service/AntiEntropyService.java
test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java
Author: jbellis
Date: Fri Jun 25 18:28:34 2010
New Revision: 958061
URL: http://svn.apache.org/viewvc?rev=958061&view=rev
Log:
revert r957993
Modified:
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/AntiEntropyService.java
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java
Modified: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/AntiEntropyService.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/AntiEntropyService.java?rev=958061&r1=958060&r2=958061&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/AntiEntropyService.java (original)
+++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/AntiEntropyService.java Fri Jun 25 18:28:34 2010
@@ -88,11 +88,18 @@ public class AntiEntropyService
// millisecond lifetime to store trees before they become stale
public final static long TREE_STORE_TIMEOUT = 600000;
+ // max millisecond frequency that natural (automatic) repairs should run at
+ public final static long NATURAL_REPAIR_FREQUENCY = 3600000;
// singleton enforcement
public static final AntiEntropyService instance = new AntiEntropyService();
/**
+ * Map of CFPair to timestamp of the beginning of the last natural repair.
+ */
+ private final ConcurrentMap<CFPair, Long> naturalRepairs;
+
+ /**
* Map of column families to remote endpoints that need to rendezvous. The
* first endpoint to arrive at the rendezvous will store its tree in the
* appropriate slot of the TreePair object, and the second to arrive will
@@ -107,6 +114,7 @@ public class AntiEntropyService
*/
protected AntiEntropyService()
{
+ naturalRepairs = new ConcurrentHashMap<CFPair, Long>();
trees = new HashMap<CFPair, ExpiringMap<InetAddress, TreePair>>();
}
@@ -244,6 +252,34 @@ public class AntiEntropyService
}
/**
+ * Should only be used for testing.
+ */
+ void clearNaturalRepairs_TestsOnly()
+ {
+ naturalRepairs.clear();
+ }
+
+ /**
+ * @param cf The column family.
+ * @return True if enough time has elapsed since the beginning of the last natural repair.
+ */
+ private boolean shouldRunNaturally(CFPair cf)
+ {
+ Long curtime = System.currentTimeMillis();
+ Long pretime = naturalRepairs.putIfAbsent(cf, curtime);
+ if (pretime != null)
+ {
+ if (pretime < (curtime - NATURAL_REPAIR_FREQUENCY))
+ // replace pretime with curtime, unless someone beat us to it
+ return naturalRepairs.replace(cf, pretime, curtime);
+ // need to wait longer
+ logger.debug("Skipping natural repair: last occurred " + (curtime - pretime) + "ms ago.");
+ return false;
+ }
+ return true;
+ }
+
+ /**
* Return a Validator object which can be used to collect hashes for a column family.
* A Validator must be prepared() before use, and completed() afterward.
*
@@ -264,7 +300,7 @@ public class AntiEntropyService
if (DatabaseDescriptor.getReplicationFactor(table) < 2)
return new NoopValidator();
CFPair cfpair = new CFPair(table, cf);
- if (initiator == null)
+ if (initiator == null && !shouldRunNaturally(cfpair))
return new NoopValidator();
return new Validator(cfpair);
}
Modified: cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java?rev=958061&r1=958060&r2=958061&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java (original)
+++ cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java Fri Jun 25 18:28:34 2010
@@ -87,8 +87,14 @@ public class AntiEntropyServiceTest exte
@Test
public void testGetValidator() throws Throwable
{
+ aes.clearNaturalRepairs_TestsOnly();
+
// not major
assert aes.getValidator(tablename, cfname, null, false) instanceof NoopValidator;
+ // adds entry to naturalRepairs
+ assert aes.getValidator(tablename, cfname, null, true) instanceof Validator;
+ // blocked by entry in naturalRepairs
+ assert aes.getValidator(tablename, cfname, null, true) instanceof NoopValidator;
// triggered manually
assert aes.getValidator(tablename, cfname, REMOTE, true) instanceof Validator;
}