ankit-j commented on a change in pull request #2096: Entries must be 
acknowledged by bookies in multiple fault domains before being acknowledged to 
client
URL: https://github.com/apache/bookkeeper/pull/2096#discussion_r286259421
 
 

 ##########
 File path: 
bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java
 ##########
 @@ -2233,4 +2233,93 @@ public void 
testNewEnsembleExcludesDefaultRackBookiesEnforceMinNumRacks() throws
                     + bookiesOfDefaultRackInEnsemble, 
bookiesOfDefaultRackInEnsemble.isEmpty());
         }
     }
+
+    /**
+     * This tests areAckedBookiesAdheringToPlacementPolicy function in 
RackawareEnsemblePlacementPolicy.
+     */
+    @Test
+    public void testAreAckedBookiesAdheringToPlacementPolicy() throws 
Exception {
+        String defaultRackForThisTest = 
NetworkTopology.DEFAULT_REGION_AND_RACK;
+        repp.uninitalize();
+        updateMyRack(defaultRackForThisTest);
+
+        ClientConfiguration conf = new ClientConfiguration(this.conf);
+        conf.setMinNumRacksPerWriteQuorum(2);
+        conf.setEnforceMinNumRacksPerWriteQuorum(true);
+        conf.setEnforceMinNumFaultDomainsForWrite(true);
+
+        TestStatsProvider statsProvider = new TestStatsProvider();
+        TestStatsLogger statsLogger = statsProvider.getStatsLogger("");
+
+        repp = new RackawareEnsemblePlacementPolicy();
+        repp.initialize(conf, Optional.<DNSToSwitchMapping> empty(), timer, 
DISABLE_ALL, statsLogger);
+        repp.withDefaultRack(defaultRackForThisTest);
+
+        int ensembleSize = 7;
+        int writeQuorumSize = 3;
+        int ackQuorumSize = 2;
+
+        int numOfBookiesInDefaultRack = 7;
+        int numOfRacks = 3;
+        int numOfBookiesPerRack = 3;
+
+        List<BookieSocketAddress> bookieSocketAddressesDefaultRack = new 
ArrayList<>();
+        List<BookieSocketAddress> bookieSocketAddressesNonDefaultRack = new 
ArrayList<>();
+        Set<BookieSocketAddress> writableBookies;
+        Set<BookieSocketAddress> bookiesForEntry = new HashSet<>();
+
+        for (int i = 0; i < numOfRacks; i++) {
+            for (int j = 0; j < numOfBookiesPerRack; j++) {
+                int index = i * numOfBookiesPerRack + j;
+                bookieSocketAddressesNonDefaultRack.add(new 
BookieSocketAddress("128.0.0." + index, 3181));
+                
StaticDNSResolver.addNodeToRack(bookieSocketAddressesNonDefaultRack.get(index).getHostName(),
+                                                "/default-region/r" + i);
+            }
+        }
+
+        for (int i = 0; i < numOfBookiesInDefaultRack; i++) {
+            bookieSocketAddressesDefaultRack.add(new 
BookieSocketAddress("127.0.0." + (i + 100), 3181));
+            
StaticDNSResolver.addNodeToRack(bookieSocketAddressesDefaultRack.get(i).getHostName(),
+                                            defaultRackForThisTest);
+        }
+
+        writableBookies = new HashSet<>(bookieSocketAddressesNonDefaultRack);
+        writableBookies.addAll(bookieSocketAddressesDefaultRack);
+        repp.onClusterChanged(writableBookies, new HashSet<>());
+
+        // Case 1 : Bookies in the ensemble from the same rack.
+        // Manually crafting the ensemble here to create the error case when 
the check should return false
+
+        List<BookieSocketAddress> ensemble = new 
ArrayList<>(bookieSocketAddressesDefaultRack);
+        for (int entryId = 0; entryId < 10; entryId++) {
+            DistributionSchedule ds = new 
RoundRobinDistributionSchedule(writeQuorumSize, ackQuorumSize, ensembleSize);
+            DistributionSchedule.WriteSet ws = ds.getWriteSet(entryId);
+
+            for (int i = 0; i < ws.size(); i++) {
+                bookiesForEntry.add(ensemble.get(ws.get(i)));
+            }
+
+            
assertFalse(repp.areAckedBookiesAdheringToPlacementPolicy(bookiesForEntry));
+        }
+
+        // Case 2 : Bookies in the ensemble from the different racks
+
+        EnsemblePlacementPolicy.PlacementResult<List<BookieSocketAddress>>
+                ensembleResponse = repp.newEnsemble(ensembleSize,
+                                                    writeQuorumSize,
+                                                    ackQuorumSize,
+                                                    null,
+                                                    new HashSet<>());
+        ensemble = ensembleResponse.getResult();
+        for (int entryId = 0; entryId < 10; entryId++) {
+            DistributionSchedule ds = new 
RoundRobinDistributionSchedule(writeQuorumSize, ackQuorumSize, ensembleSize);
+            DistributionSchedule.WriteSet ws = ds.getWriteSet(entryId);
+
+            for (int i = 0; i < ws.size(); i++) {
+                bookiesForEntry.add(ensemble.get(ws.get(i)));
+            }
+
+            
assertTrue(repp.areAckedBookiesAdheringToPlacementPolicy(bookiesForEntry));
 
 Review comment:
   That is not correct. So the ensemble here is picked randomly from 9 bookies 
belonging to a total of 3 racks. For a sample run :
   
   ```
   /default-region/r0/128.0.0.0:3181
   /default-region/r0/128.0.0.1:3181
   /default-region/r0/128.0.0.2:3181
   
   /default-region/r1/128.0.0.3:3181
   /default-region/r1/128.0.0.4:3181
   /default-region/r1/128.0.0.5:3181
   
   /default-region/r2/128.0.0.6:3181
   /default-region/r2/128.0.0.7:3181
   /default-region/r2/128.0.0.8:3181
   
   /default-region/default-rack/127.0.0.100:3181
   /default-region/default-rack/127.0.0.101:3181
   /default-region/default-rack/127.0.0.102:3181
   /default-region/default-rack/127.0.0.103:3181
   /default-region/default-rack/127.0.0.104:3181
   /default-region/default-rack/127.0.0.105:3181
   /default-region/default-rack/127.0.0.106:3181
   
   Ensemble
   [127.0.0.104:3181, 128.0.0.8:3181, 127.0.0.106:3181, 128.0.0.3:3181, 
128.0.0.0:3181, 128.0.0.6:3181, 128.0.0.1:3181]
   [default, r2, default, r1, r0, r2, r0]
   
   ```
   
   So the case you mentioned was actually recreated when we tested with entryId 
4 which we do

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to