11
11
12
12
package org .apache .kafka .controller .es ;
13
13
14
+ import java .util .Collections ;
15
+ import java .util .Optional ;
16
+ import java .util .stream .Collectors ;
14
17
import org .apache .kafka .common .TopicPartition ;
18
+ import org .apache .kafka .metadata .BrokerRegistration ;
15
19
import org .apache .kafka .server .util .MockRandom ;
20
+ import org .junit .jupiter .api .AfterEach ;
16
21
import org .junit .jupiter .api .Assertions ;
17
22
import org .junit .jupiter .api .Test ;
18
23
19
24
import java .util .HashMap ;
20
- import java .util .HashSet ;
21
25
import java .util .List ;
22
26
import java .util .Map ;
23
27
import java .util .Set ;
24
28
25
29
public class LoadAwarePartitionLeaderSelectorTest {
26
30
31
+ @ AfterEach
32
+ public void tearDown () {
33
+ ClusterStats .getInstance ().updateExcludedBrokers (Collections .emptySet ());
34
+ ClusterStats .getInstance ().updateBrokerLoads (Collections .emptyMap ());
35
+ ClusterStats .getInstance ().updatePartitionLoads (Collections .emptyMap ());
36
+ }
37
+
27
38
@ Test
28
39
public void testLoadAwarePartitionLeaderSelector () {
29
- List <Integer > aliveBrokers = List .of (0 , 1 , 2 , 3 , 4 , 5 );
30
- Set <Integer > brokerSet = new HashSet <>(aliveBrokers );
31
- int brokerToRemove = 5 ;
40
+ List <BrokerRegistration > aliveBrokers = List .of (
41
+ new BrokerRegistration .Builder ().setId (0 ).build (),
42
+ new BrokerRegistration .Builder ().setId (1 ).build (),
43
+ new BrokerRegistration .Builder ().setId (2 ).build (),
44
+ new BrokerRegistration .Builder ().setId (3 ).build (),
45
+ new BrokerRegistration .Builder ().setId (4 ).build (),
46
+ new BrokerRegistration .Builder ().setId (5 ).build ());
47
+ Set <Integer > brokerSet = aliveBrokers .stream ().map (BrokerRegistration ::id ).collect (Collectors .toSet ());
48
+ BrokerRegistration brokerToRemove = aliveBrokers .get (aliveBrokers .size () - 1 );
32
49
MockRandom random = new MockRandom ();
33
- LoadAwarePartitionLeaderSelector loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random ,
34
- aliveBrokers , broker -> broker != brokerToRemove );
50
+ LoadAwarePartitionLeaderSelector loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , brokerToRemove );
35
51
36
52
// fallback to random selector
37
53
setUpCluster ();
38
54
Map <Integer , Double > brokerLoads = new HashMap <>();
39
- randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove , brokerLoads );
55
+ randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove . id () , brokerLoads );
40
56
Assertions .assertEquals (4000 , brokerLoads .get (0 ));
41
57
Assertions .assertEquals (4000 , brokerLoads .get (1 ));
42
58
Assertions .assertEquals (4000 , brokerLoads .get (2 ));
@@ -45,8 +61,8 @@ public void testLoadAwarePartitionLeaderSelector() {
45
61
46
62
// load aware selector
47
63
brokerLoads = setUpCluster ();
48
- loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , broker -> broker != brokerToRemove );
49
- randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove , brokerLoads );
64
+ loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , brokerToRemove );
65
+ randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove . id () , brokerLoads );
50
66
Assertions .assertEquals (5990 , brokerLoads .get (0 ));
51
67
Assertions .assertEquals (7660 , brokerLoads .get (1 ));
52
68
Assertions .assertEquals (6720 , brokerLoads .get (2 ));
@@ -57,8 +73,8 @@ public void testLoadAwarePartitionLeaderSelector() {
57
73
brokerLoads = setUpCluster ();
58
74
brokerLoads .remove (1 );
59
75
ClusterStats .getInstance ().updateBrokerLoads (brokerLoads );
60
- loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , broker -> broker != brokerToRemove );
61
- randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove , brokerLoads );
76
+ loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , brokerToRemove );
77
+ randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove . id () , brokerLoads );
62
78
Assertions .assertEquals (6840 , brokerLoads .get (0 ));
63
79
Assertions .assertEquals (7280 , brokerLoads .get (2 ));
64
80
Assertions .assertEquals (7950 , brokerLoads .get (3 ));
@@ -67,8 +83,8 @@ public void testLoadAwarePartitionLeaderSelector() {
67
83
// tests exclude broker
68
84
brokerLoads = setUpCluster ();
69
85
ClusterStats .getInstance ().updateExcludedBrokers (Set .of (1 ));
70
- loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , broker -> broker != brokerToRemove );
71
- randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove , brokerLoads );
86
+ loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , brokerToRemove );
87
+ randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove . id () , brokerLoads );
72
88
Assertions .assertEquals (6970 , brokerLoads .get (0 ));
73
89
Assertions .assertEquals (5000 , brokerLoads .get (1 ));
74
90
Assertions .assertEquals (7210 , brokerLoads .get (2 ));
@@ -93,6 +109,46 @@ private void randomSelect(LoadAwarePartitionLeaderSelector selector, int count,
93
109
}
94
110
}
95
111
112
+ @ Test
113
+ public void testLoadAwarePartitionLeaderSelectorWithRack () {
114
+ String rackA = "rack-a" ;
115
+ String rackB = "rack-b" ;
116
+ List <BrokerRegistration > aliveBrokers = List .of (
117
+ new BrokerRegistration .Builder ().setId (0 ).setRack (Optional .of (rackA )).build (),
118
+ new BrokerRegistration .Builder ().setId (1 ).setRack (Optional .of (rackB )).build (),
119
+ new BrokerRegistration .Builder ().setId (2 ).setRack (Optional .of (rackB )).build (),
120
+ new BrokerRegistration .Builder ().setId (3 ).setRack (Optional .of (rackB )).build (),
121
+ new BrokerRegistration .Builder ().setId (4 ).setRack (Optional .of (rackB )).build (),
122
+ new BrokerRegistration .Builder ().setId (5 ).setRack (Optional .of (rackB )).build ());
123
+
124
+ Set <Integer > brokerSet = aliveBrokers .stream ().map (BrokerRegistration ::id ).collect (Collectors .toSet ());
125
+ setUpCluster ();
126
+ BrokerRegistration brokerToRemove = aliveBrokers .get (0 );
127
+ MockRandom random = new MockRandom ();
128
+ LoadAwarePartitionLeaderSelector loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , brokerToRemove );
129
+
130
+ // fallback to random selector
131
+ Map <Integer , Double > brokerLoads = new HashMap <>();
132
+ randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove .id (), brokerLoads );
133
+ Assertions .assertEquals (4000 , brokerLoads .get (1 ));
134
+ Assertions .assertEquals (4000 , brokerLoads .get (2 ));
135
+ Assertions .assertEquals (4000 , brokerLoads .get (3 ));
136
+ Assertions .assertEquals (4000 , brokerLoads .get (4 ));
137
+ Assertions .assertEquals (4000 , brokerLoads .get (5 ));
138
+
139
+ // load aware selector
140
+ brokerLoads = setUpCluster ();
141
+ brokerToRemove = aliveBrokers .get (1 );
142
+ loadAwarePartitionLeaderSelector = new LoadAwarePartitionLeaderSelector (random , aliveBrokers , brokerToRemove );
143
+ randomSelect (loadAwarePartitionLeaderSelector , 2000 , brokerSet , brokerToRemove .id (), brokerLoads );
144
+ Assertions .assertEquals (0 , brokerLoads .get (0 ));
145
+ Assertions .assertEquals (5000 , brokerLoads .get (1 ));
146
+ Assertions .assertEquals (7330 , brokerLoads .get (2 ));
147
+ Assertions .assertEquals (7840 , brokerLoads .get (3 ));
148
+ Assertions .assertEquals (7120 , brokerLoads .get (4 ));
149
+ Assertions .assertEquals (6710 , brokerLoads .get (5 ));
150
+ }
151
+
96
152
private Map <Integer , Double > setUpCluster () {
97
153
Map <Integer , Double > brokerLoads = new HashMap <>();
98
154
brokerLoads .put (0 , 0.0 );
0 commit comments