Author: slebresne
Date: Tue Oct 25 15:49:54 2011
New Revision: 1188740

URL: http://svn.apache.org/viewvc?rev=1188740&view=rev
Log:
Fix race in AntiEntropyService
patch by slebresne; reviewed by jbellis for CASSANDRA-3400

Modified:
    cassandra/branches/cassandra-0.8/CHANGES.txt
    
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/service/AntiEntropyService.java

Modified: cassandra/branches/cassandra-0.8/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1188740&r1=1188739&r2=1188740&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.8/CHANGES.txt Tue Oct 25 15:49:54 2011
@@ -32,6 +32,7 @@
  * prevent nodes that failed to join from hanging around forever 
    (CASSANDRA-3351)
  * remove incorrect optimization from slice read path (CASSANDRA-3390)
+ * Fix race in AntiEntropyService (CASSANDRA-3400)
 
 
 0.8.7

Modified: 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/service/AntiEntropyService.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/service/AntiEntropyService.java?rev=1188740&r1=1188739&r2=1188740&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/service/AntiEntropyService.java
 (original)
+++ 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/service/AntiEntropyService.java
 Tue Oct 25 15:49:54 2011
@@ -766,6 +766,7 @@ public class AntiEntropyService
             private final Set<InetAddress> requestedEndpoints = new 
HashSet<InetAddress>();
             private final Map<InetAddress, MerkleTree> trees = new 
HashMap<InetAddress, MerkleTree>();
             private final Set<InetAddress> syncJobs = new 
HashSet<InetAddress>();
+            private final Condition requestsSent = new SimpleCondition();
 
             public RepairJob(String cfname)
             {
@@ -783,6 +784,8 @@ public class AntiEntropyService
                 // send requests to all nodes
                 for (InetAddress endpoint : requestedEndpoints)
                     AntiEntropyService.instance.request(getName(), endpoint, 
range, tablename, cfname);
+
+                requestsSent.signalAll();
             }
 
             /**
@@ -791,6 +794,16 @@ public class AntiEntropyService
              */
             public synchronized int addTree(TreeRequest request, MerkleTree 
tree)
             {
+                // Wait for all request to have been performed (see #3400)
+                try
+                {
+                    requestsSent.await();
+                }
+                catch (InterruptedException e)
+                {
+                    throw new AssertionError("Interrupted while waiting for 
requests to be sent");
+                }
+
                 assert request.cf.right.equals(cfname);
                 trees.put(request.endpoint, tree);
                 requestedEndpoints.remove(request.endpoint);


Reply via email to