@@ -699,4 +699,123 @@ public void testDefaultIsolationPolicyNotCovered() throws Exception {
699
699
.newEnsemble (2 , 2 , 2 , Collections .emptyMap (), new HashSet <>()).getResult ();
700
700
assertEquals (BookieIdGroup1 .containsAll (defaultBookieList ),true );
701
701
}
702
+
703
+ @ Test
704
+ public void testGetExcludedBookiesWithIsolationGroups () throws Exception {
705
+ Map <String , Map <String , BookieInfo >> bookieMapping = new HashMap <>();
706
+ final String isolationGroup1 = "Group1" ;
707
+ final String isolationGroup2 = "Group2" ;
708
+ final String isolationGroup3 = "Group3" ;
709
+
710
+ Map <String , BookieInfo > group1 = new HashMap <>();
711
+ group1 .put (BOOKIE1 , BookieInfo .builder ().rack ("rack0" ).build ());
712
+ group1 .put (BOOKIE2 , BookieInfo .builder ().rack ("rack0" ).build ());
713
+
714
+ Map <String , BookieInfo > group2 = new HashMap <>();
715
+ group2 .put (BOOKIE3 , BookieInfo .builder ().rack ("rack1" ).build ());
716
+ group2 .put (BOOKIE4 , BookieInfo .builder ().rack ("rack1" ).build ());
717
+
718
+ bookieMapping .put (isolationGroup1 , group1 );
719
+ bookieMapping .put (isolationGroup2 , group2 );
720
+
721
+ store .put (BookieRackAffinityMapping .BOOKIE_INFO_ROOT_PATH , jsonMapper .writeValueAsBytes (bookieMapping ),
722
+ Optional .empty ()).join ();
723
+
724
+ IsolatedBookieEnsemblePlacementPolicy isolationPolicy = new IsolatedBookieEnsemblePlacementPolicy ();
725
+ ClientConfiguration bkClientConf = new ClientConfiguration ();
726
+ bkClientConf .setProperty (BookieRackAffinityMapping .METADATA_STORE_INSTANCE , store );
727
+ bkClientConf .setProperty (IsolatedBookieEnsemblePlacementPolicy .ISOLATION_BOOKIE_GROUPS , isolationGroup1 );
728
+ bkClientConf .setProperty (IsolatedBookieEnsemblePlacementPolicy .SECONDARY_ISOLATION_BOOKIE_GROUPS , isolationGroup2 );
729
+ isolationPolicy .initialize (bkClientConf , Optional .empty (), timer , SettableFeatureProvider .DISABLE_ALL ,
730
+ NullStatsLogger .INSTANCE , BookieSocketAddress .LEGACY_BOOKIEID_RESOLVER );
731
+ isolationPolicy .onClusterChanged (writableBookies , readOnlyBookies );
732
+
733
+ /* Test common cases */
734
+ MutablePair <Set <String >, Set <String >> groups = new MutablePair <>();
735
+ groups .setLeft (Sets .newHashSet (isolationGroup1 ));
736
+ groups .setRight (Sets .newHashSet ("" ));
737
+ Set <BookieId > blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (2 , groups );
738
+ assertEquals (blacklist .size (), 2 );
739
+
740
+ groups .setLeft (Sets .newHashSet (isolationGroup1 ));
741
+ groups .setRight (Sets .newHashSet (isolationGroup2 ));
742
+ blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (2 , groups );
743
+ assertEquals (blacklist .size (), 2 );
744
+
745
+ groups .setLeft (Sets .newHashSet (isolationGroup1 ));
746
+ groups .setRight (Sets .newHashSet (isolationGroup2 ));
747
+ blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (3 , groups );
748
+ assertTrue (blacklist .isEmpty ());
749
+
750
+ /* Test a bookie belongs to multiple isolation groups */
751
+ group1 = new HashMap <>();
752
+ group1 .put (BOOKIE1 , BookieInfo .builder ().rack ("rack0" ).build ());
753
+
754
+ group2 = new HashMap <>();
755
+ group2 .put (BOOKIE2 , BookieInfo .builder ().rack ("rack0" ).build ());
756
+ group2 .put (BOOKIE3 , BookieInfo .builder ().rack ("rack1" ).build ());
757
+ group2 .put (BOOKIE4 , BookieInfo .builder ().rack ("rack1" ).build ());
758
+
759
+ Map <String , BookieInfo > group3 = new HashMap <>();
760
+ group3 .put (BOOKIE1 , BookieInfo .builder ().rack ("rack0" ).build ());
761
+
762
+ bookieMapping .put (isolationGroup1 , group1 );
763
+ bookieMapping .put (isolationGroup2 , group2 );
764
+ bookieMapping .put (isolationGroup3 , group3 );
765
+
766
+ store .put (BookieRackAffinityMapping .BOOKIE_INFO_ROOT_PATH , jsonMapper .writeValueAsBytes (bookieMapping ),
767
+ Optional .empty ()).join ();
768
+
769
+ groups .setLeft (Sets .newHashSet (isolationGroup1 , isolationGroup3 ));
770
+ groups .setRight (Sets .newHashSet ("" ));
771
+ blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (2 , groups );
772
+ assertEquals (blacklist .size (), 3 );
773
+
774
+ /* Test a bookie belongs to multiple isolation groups and totalAvailableBookiesInPrimaryGroup < ensembleSize */
775
+ groups .setLeft (Sets .newHashSet (isolationGroup1 , isolationGroup3 ));
776
+ groups .setRight (Sets .newHashSet (isolationGroup2 ));
777
+ blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (2 , groups );
778
+ assertTrue (blacklist .isEmpty ());
779
+
780
+ /* Test some bookies not set rack config */
781
+ group1 = new HashMap <>();
782
+ group1 .put (BOOKIE1 , BookieInfo .builder ().rack ("rack0" ).build ());
783
+
784
+ group2 = new HashMap <>();
785
+ group2 .put (BOOKIE2 , BookieInfo .builder ().rack ("rack0" ).build ());
786
+
787
+ bookieMapping .put (isolationGroup1 , group1 );
788
+ bookieMapping .put (isolationGroup2 , group2 );
789
+
790
+ store .put (BookieRackAffinityMapping .BOOKIE_INFO_ROOT_PATH , jsonMapper .writeValueAsBytes (bookieMapping ),
791
+ Optional .empty ()).join ();
792
+
793
+ groups .setLeft (Sets .newHashSet (isolationGroup1 ));
794
+ groups .setRight (Sets .newHashSet (isolationGroup2 ));
795
+ blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (2 , groups );
796
+ assertEquals (blacklist .size (), 2 );
797
+
798
+ groups .setLeft (Sets .newHashSet (isolationGroup1 ));
799
+ groups .setRight (Sets .newHashSet (isolationGroup2 ));
800
+ blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (3 , groups );
801
+ assertTrue (blacklist .isEmpty ());
802
+
803
+ /* Test some bookies not set rack config and totalAvailableBookiesFromPrimaryAndSecondary < ensembleSize */
804
+ group1 = new HashMap <>();
805
+ group1 .put (BOOKIE1 , BookieInfo .builder ().rack ("rack0" ).build ());
806
+
807
+ group2 = new HashMap <>();
808
+ group2 .put (BOOKIE1 , BookieInfo .builder ().rack ("rack0" ).build ());
809
+
810
+ bookieMapping .put (isolationGroup1 , group1 );
811
+ bookieMapping .put (isolationGroup2 , group2 );
812
+
813
+ store .put (BookieRackAffinityMapping .BOOKIE_INFO_ROOT_PATH , jsonMapper .writeValueAsBytes (bookieMapping ),
814
+ Optional .empty ()).join ();
815
+
816
+ groups .setLeft (Sets .newHashSet (isolationGroup1 ));
817
+ groups .setRight (Sets .newHashSet (isolationGroup2 ));
818
+ blacklist = isolationPolicy .getExcludedBookiesWithIsolationGroups (2 , groups );
819
+ assertTrue (blacklist .isEmpty ());
820
+ }
702
821
}
0 commit comments