def test_rebalance_leaders_unbalanced_case4(self): # Imbalanced assignment # Partial leader-imbalance possible # (Broker: leader-count): {0: 3, 1: 1, 2:0} # opt-count: 5/3 = 1, extra-count = 2 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T0', 1), ['0', '2']), ((u'T1', 0), ['0']), ((u'T1', 1), ['0']), ((u'T1', 2), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) _, net_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) ct.rebalance_leaders() _, new_net_imbal, new_leaders_per_broker = get_leader_imbalance_stats( ct.brokers.values(), ) # Verify that net-imbalance has reduced but not zero assert new_net_imbal > 0 and new_net_imbal < net_imbal # Verify the changes in leaders-per-broker count assert new_leaders_per_broker['2'] == 1 assert new_leaders_per_broker['1'] == 1 assert new_leaders_per_broker['0'] == 3
def test_rebalance_leaders_unbalanced_case4(self): # Imbalanced assignment # Partial leader-imbalance possible # (Broker: leader-count): {0: 3, 1: 1, 2:0} # opt-count: 5/3 = 1, extra-count = 2 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T0', 1), ['0', '2']), ((u'T1', 0), ['0']), ((u'T1', 1), ['0']), ((u'T1', 2), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) _, net_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) ct.rebalance_leaders() _, new_net_imbal, new_leaders_per_broker = get_leader_imbalance_stats( ct.brokers.values(), ) # Verify that net-imbalance has reduced but not zero assert new_net_imbal > 0 and new_net_imbal < net_imbal # Verify the changes in leaders-per-broker count assert new_leaders_per_broker['2'] == 1 assert new_leaders_per_broker['1'] == 1 assert new_leaders_per_broker['0'] == 3
def test_rebalance_leaders_unbalanced_case1(self): # Balance leader-imbalance successfully # (broker-id: leader-count): {0: 0, 1:2, 2:1} # Net-leader-imbalance: 1 # opt-count: 3/3 = 1, extra-count: 3%3 = 0 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T0', 1), ['2', '0']), ((u'T1', 0), ['1', '0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) orig_assignment = ct.assignment ct.rebalance_leaders() # Verify if valid-leader assignment self.assert_leader_valid(orig_assignment, ct.assignment) # New-leader imbalance-count be less than previous imbal count _, new_leader_imbal, new_leaders_per_broker = \ get_leader_imbalance_stats(ct.brokers.values()) # Verify leader-balanced assert new_leader_imbal == 0 # Verify partitions-changed assignment assert new_leaders_per_broker['0'] == 1 assert new_leaders_per_broker['1'] == 1 assert new_leaders_per_broker['2'] == 1
def test_rebalance_leaders_unbalanced_case1(self): # Balance leader-imbalance successfully # (broker-id: leader-count): {0: 0, 1:2, 2:1} # Net-leader-imbalance: 1 # opt-count: 3/3 = 1, extra-count: 3%3 = 0 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T0', 1), ['2', '0']), ((u'T1', 0), ['1', '0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) orig_assignment = ct.assignment ct.rebalance_leaders() # Verify if valid-leader assignment self.assert_leader_valid(orig_assignment, ct.assignment) # New-leader imbalance-count be less than previous imbal count _, new_leader_imbal, new_leaders_per_broker = \ get_leader_imbalance_stats(ct.brokers.values()) # Verify leader-balanced assert new_leader_imbal == 0 # Verify partitions-changed assignment assert new_leaders_per_broker['0'] == 1 assert new_leaders_per_broker['1'] == 1 assert new_leaders_per_broker['2'] == 1
def test_rebalance_leaders_unbalanced_case2b(self): assignment = dict( [ ((u'T0', 0), ['3', '2']), ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2b(self): assignment = dict( [ ((u'T0', 0), ['3', '2']), ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case3(self): # Imbalanced 0 and 2. No re-balance possible. assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0']), ((u'T2', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) ct.rebalance_leaders() # Verify still leader-imbalanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 1 # No change in assignment assert sorted(ct.assignment) == sorted(assignment)
def test_rebalance_leaders_unbalanced_case3(self): # Imbalanced 0 and 2. No re-balance possible. assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0']), ((u'T2', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) ct.rebalance_leaders() # Verify still leader-imbalanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 1 # No change in assignment assert sorted(ct.assignment) == sorted(assignment)
def test_rebalance_leaders_unbalanced_case2(self): # (Broker: leader-count): {0: 2, 1: 1, 2:0} # opt-count: 3/3 = 1, extra-count = 0 # Leader-imbalance-value: 1 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T1', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2(self): # (Broker: leader-count): {0: 2, 1: 1, 2:0} # opt-count: 3/3 = 1, extra-count = 0 # Leader-imbalance-value: 1 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T1', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case5(self): # Special case, wherein none under-balanced # but 0 is overbalanced assignment = dict( [ ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ((u'T2', 1), ['0']), ((u'T3', 0), ['2', '3']), ((u'T3', 1), ['3', '1']), ((u'T4', 0), ['1']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2d(self): # Broker-2 imbalanced with same brokers # Broker-2 requests leadership from same broker-1 twice assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T1', 2), ['0']), ((u'T1', 3), ['1', '2']), ((u'T1', 4), ['0', '1']), ((u'T1', 5), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_balanced_case2(self): # Already balanced-assignment NOT evenly-distributed # (broker-id: leader-count): {0: 1, 1:1, 2:1} # opt-count: 2/3 = 0, extra-count: 2%3 = 2 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T0', 1), ['2', '0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) orig_assignment = ct.assignment ct.rebalance_leaders() _, net_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) # No changed in already-balanced assignment assert orig_assignment == ct.assignment # Assert leader-balanced assert net_imbal == 0
def test_rebalance_leaders_unbalanced_case5(self): # Special case, wherein none under-balanced # but 0 is overbalanced assignment = dict( [ ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ((u'T2', 1), ['0']), ((u'T3', 0), ['2', '3']), ((u'T3', 1), ['3', '1']), ((u'T4', 0), ['1']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_balanced_case2(self): # Already balanced-assignment NOT evenly-distributed # (broker-id: leader-count): {0: 1, 1:1, 2:1} # opt-count: 2/3 = 0, extra-count: 2%3 = 2 assignment = dict( [ ((u'T0', 0), ['1', '2']), ((u'T0', 1), ['2', '0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) orig_assignment = ct.assignment ct.rebalance_leaders() _, net_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) # No changed in already-balanced assignment assert orig_assignment == ct.assignment # Assert leader-balanced assert net_imbal == 0
def test_rebalance_leaders_unbalanced_case2d(self): # Broker-2 imbalanced with same brokers # Broker-2 requests leadership from same broker-1 twice assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T1', 2), ['0']), ((u'T1', 3), ['1', '2']), ((u'T1', 4), ['0', '1']), ((u'T1', 5), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(3)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2e(self): # Imbalance-val 2 # Multiple imbalanced brokers (2, 5) gets non-follower balanced # from multiple brokers (1,4) assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ((u'T3', 0), ['4', '5']), ((u'T3', 1), ['3', '4']), ((u'T4', 0), ['3']), ] ) ct = self.build_cluster_topology(assignment, self.srange(6)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2e(self): # Imbalance-val 2 # Multiple imbalanced brokers (2, 5) gets non-follower balanced # from multiple brokers (1,4) assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ((u'T3', 0), ['4', '5']), ((u'T3', 1), ['3', '4']), ((u'T4', 0), ['3']), ] ) ct = self.build_cluster_topology(assignment, self.srange(6)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2c(self): # Broker-2 imbalance value: 2 with different brokers # Broker-2 requests leadership from multiple brokers (0, 1) once assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ((u'T2', 1), ['0']), ((u'T3', 0), ['3', '2']), ((u'T3', 1), ['1', '3']), ((u'T4', 0), ['1']), ((u'T4', 2), ['3']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2c(self): # Broker-2 imbalance value: 2 with different brokers # Broker-2 requests leadership from multiple brokers (0, 1) once assignment = dict( [ ((u'T1', 0), ['1', '2']), ((u'T1', 1), ['0', '1']), ((u'T2', 0), ['0']), ((u'T2', 1), ['0']), ((u'T3', 0), ['3', '2']), ((u'T3', 1), ['1', '3']), ((u'T4', 0), ['1']), ((u'T4', 2), ['3']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify leader-balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0
def test_rebalance_leaders_unbalanced_case2a(self): # (Broker: leader-count): {0: 2, 1: 1, 2:0, 3:1} # opt-count: 3/4 = 1, extra-count = 3 # Leader-imbalance-value: 1 # imbalanced-broker: 0,2; balanced-brokers: 1,3 assignment = dict( [ ((u'T0', 0), ['3', '2']), ((u'T0', 1), ['1', '3']), ((u'T1', 1), ['0', '1']), ((u'T1', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0 # Verify that (T0, 1) also swapped even if 1 and 3 were balanced # Rebalancing through non-followers replica_ids = [b.id for b in ct.partitions[('T0', 1)].replicas] assert replica_ids == ['3', '1']
def test_rebalance_leaders_unbalanced_case2a(self): # (Broker: leader-count): {0: 2, 1: 1, 2:0, 3:1} # opt-count: 3/4 = 1, extra-count = 3 # Leader-imbalance-value: 1 # imbalanced-broker: 0,2; balanced-brokers: 1,3 assignment = dict( [ ((u'T0', 0), ['3', '2']), ((u'T0', 1), ['1', '3']), ((u'T1', 1), ['0', '1']), ((u'T1', 0), ['0']), ] ) ct = self.build_cluster_topology(assignment, self.srange(4)) ct.rebalance_leaders() # Verify balanced _, leader_imbal, _ = get_leader_imbalance_stats(ct.brokers.values()) assert leader_imbal == 0 # Verify that (T0, 1) also swapped even if 1 and 3 were balanced # Rebalancing through non-followers replica_ids = [b.id for b in ct.partitions[('T0', 1)].replicas] assert replica_ids == ['3', '1']