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;
     }