You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by si...@apache.org on 2013/06/26 03:35:18 UTC

svn commit: r1496706 - in /zookeeper/bookkeeper/trunk: ./ bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ bookkeeper-server/src/test/java/org/apache/bookkeeper/client/

Author: sijie
Date: Wed Jun 26 01:35:18 2013
New Revision: 1496706

URL: http://svn.apache.org/r1496706
Log:
BOOKKEEPER-633: ConcurrentModificationException in RackawareEnsemblePlacementPolicy when a bookie is removed from available list (vinay via sijie)

Modified:
    zookeeper/bookkeeper/trunk/CHANGES.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicy.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java

Modified: zookeeper/bookkeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1496706&r1=1496705&r2=1496706&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/CHANGES.txt (original)
+++ zookeeper/bookkeeper/trunk/CHANGES.txt Wed Jun 26 01:35:18 2013
@@ -60,6 +60,8 @@ Trunk (unreleased changes)
 
         BOOKKEEPER-623: LedgerChecker should avoid segments of closed ledger with higher start entryId than closed entry. (vinay via sijie)
 
+        BOOKKEEPER-633: ConcurrentModificationException in RackawareEnsemblePlacementPolicy when a bookie is removed from available list (vinay via sijie)
+
       hedwig-client:
 
         BOOKKEEPER-598: Fails to compile - RESUBSCRIBE_EXCEPTION conflict (Matthew Farrellee via sijie)

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicy.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicy.java?rev=1496706&r1=1496705&r2=1496706&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicy.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicy.java Wed Jun 26 01:35:18 2013
@@ -43,6 +43,7 @@ import org.apache.commons.configuration.
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
 /**
@@ -362,14 +363,14 @@ public class RackawareEnsemblePlacementP
             Set<InetSocketAddress> readOnlyBookies) {
         rwLock.writeLock().lock();
         try {
-            Set<InetSocketAddress> joinedBookies, leftBookies, deadBookies;
+            ImmutableSet<InetSocketAddress> joinedBookies, leftBookies, deadBookies;
             Set<InetSocketAddress> oldBookieSet = knownBookies.keySet();
             // left bookies : bookies in known bookies, but not in new writable bookie cluster.
-            leftBookies = Sets.difference(oldBookieSet, writableBookies);
+            leftBookies = Sets.difference(oldBookieSet, writableBookies).immutableCopy();
             // joined bookies : bookies in new writable bookie cluster, but not in known bookies
-            joinedBookies = Sets.difference(writableBookies, oldBookieSet);
+            joinedBookies = Sets.difference(writableBookies, oldBookieSet).immutableCopy();
             // dead bookies.
-            deadBookies = Sets.difference(leftBookies, readOnlyBookies);
+            deadBookies = Sets.difference(leftBookies, readOnlyBookies).immutableCopy();
             if (LOG.isDebugEnabled()) {
                 LOG.debug(
                         "Cluster changed : left bookies are {}, joined bookies are {}, while dead bookies are {}.",

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java?rev=1496706&r1=1496705&r2=1496706&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java Wed Jun 26 01:35:18 2013
@@ -236,6 +236,31 @@ public class TestRackawareEnsemblePlacem
         }
     }
 
+    /**
+     * Test for BOOKKEEPER-633
+     */
+    @Test
+    public void testRemoveBookieFromCluster() {
+        InetSocketAddress addr1 = new InetSocketAddress("127.0.0.1", 3181);
+        InetSocketAddress addr2 = new InetSocketAddress("127.0.0.2", 3181);
+        InetSocketAddress addr3 = new InetSocketAddress("127.0.0.3", 3181);
+        InetSocketAddress addr4 = new InetSocketAddress("127.0.0.4", 3181);
+        // update dns mapping
+        StaticDNSResolver.addNodeToRack(addr1.getAddress().getHostAddress(), NetworkTopology.DEFAULT_RACK);
+        StaticDNSResolver.addNodeToRack(addr2.getAddress().getHostAddress(), "/r2");
+        StaticDNSResolver.addNodeToRack(addr3.getAddress().getHostAddress(), "/r2");
+        StaticDNSResolver.addNodeToRack(addr4.getAddress().getHostAddress(), "/r3");
+        // Update cluster
+        Set<InetSocketAddress> addrs = new HashSet<InetSocketAddress>();
+        addrs.add(addr1);
+        addrs.add(addr2);
+        addrs.add(addr3);
+        addrs.add(addr4);
+        repp.onClusterChanged(addrs, new HashSet<InetSocketAddress>());
+        addrs.remove(addr1);
+        repp.onClusterChanged(addrs, new HashSet<InetSocketAddress>());
+    }
+
     private int getNumCoveredWriteQuorums(ArrayList<InetSocketAddress> ensemble, int writeQuorumSize)
             throws Exception {
         int ensembleSize = ensemble.size();