Beispiel #1
0
    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
Beispiel #4
0
    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
Beispiel #6
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
Beispiel #7
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)
Beispiel #9
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_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
Beispiel #11
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
Beispiel #12
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
Beispiel #15
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
Beispiel #18
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
Beispiel #19
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
Beispiel #21
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']