From a8266a9e4f89c0c2120994e3d6b98c1ffdac4877 Mon Sep 17 00:00:00 2001 From: Xing Zhang Date: Tue, 2 Mar 2021 12:55:35 +0800 Subject: [PATCH] Fix weighted round-robin about UDP listener 'lb_algo rr' in keepalived won't work correctly with weight for UDP listeners, it should be 'lb_algo wrr'. 'wrr' is superset of 'rr' algorithm, as round-robin is a specical instance of the weighted round-robin scheduling, in which all the weights are equal. [1] Algorithm in HAProxy is set to 'roundrobin', which also support weights, but in keepalived must be set to 'wrr' to work with the weighted round-robin scheduling, as it is different to 'rr'. [1] https://www.keepalived.org/doc/scheduling_algorithms.html Story 2008462 Task 41491 Conflicts: octavia/tests/unit/common/jinja/lvs/test_jinja_cfg.py octavia/tests/unit/common/sample_configs/sample_configs_combined.py NOTE(Xing Zhang): The first file does not exist in stable/victoria due to unit test structure was fixed, file renamed from test_lvs_jinja_cfg.py, (patch I6d84047b3481a2bf6bf9bd17d482fb504dbc752b) was introduced in stable/wallaby. The second file has conflict due to the SCTP is supported by the amphora provider in the Wallaby release. (patch I30997ae6cc6b8ec724f0e9dcfdfe49356b320ff4) This backport removes SCTP in commit message and releasenote due to SCTP was introduced in the Wallaby release. Change-Id: Ic63929d8864e5285baf70dd85e6362988bf2863f (cherry picked from commit 5352a10f62f1a4763aeee81e2e638a9896b6ce79) (cherry picked from commit d9603b3d21723fce3b7380b14d537d847088246c) (cherry picked from commit c7640b90ad549566e23a97fbcf2f2ad387bed7d4) --- octavia/common/jinja/lvs/jinja_cfg.py | 2 +- .../agent/api_server/test_keepalivedlvs.py | 2 +- .../backends/utils/test_keepalivedlvs_query.py | 4 ++-- .../unit/common/jinja/lvs/test_lvs_jinja_cfg.py | 16 ++++++++-------- .../sample_configs/sample_configs_combined.py | 4 ++-- .../sample_configs/sample_configs_split.py | 2 +- .../fix-udp-listener-wrr-50de9dc0774a8ea1.yaml | 6 ++++++ 7 files changed, 21 insertions(+), 15 deletions(-) create mode 100644 releasenotes/notes/fix-udp-listener-wrr-50de9dc0774a8ea1.yaml diff --git a/octavia/common/jinja/lvs/jinja_cfg.py b/octavia/common/jinja/lvs/jinja_cfg.py index 59bba328d1..c2fa5cdb94 100644 --- a/octavia/common/jinja/lvs/jinja_cfg.py +++ b/octavia/common/jinja/lvs/jinja_cfg.py @@ -28,7 +28,7 @@ PROTOCOL_MAP = { } BALANCE_MAP = { - constants.LB_ALGORITHM_ROUND_ROBIN: 'rr', + constants.LB_ALGORITHM_ROUND_ROBIN: 'wrr', constants.LB_ALGORITHM_LEAST_CONNECTIONS: 'lc', constants.LB_ALGORITHM_SOURCE_IP: 'sh' } diff --git a/octavia/tests/functional/amphorae/backend/agent/api_server/test_keepalivedlvs.py b/octavia/tests/functional/amphorae/backend/agent/api_server/test_keepalivedlvs.py index fe5ef0372b..59f749a64f 100644 --- a/octavia/tests/functional/amphorae/backend/agent/api_server/test_keepalivedlvs.py +++ b/octavia/tests/functional/amphorae/backend/agent/api_server/test_keepalivedlvs.py @@ -42,7 +42,7 @@ class KeepalivedLvsTestCase(base.TestCase): "# Configuration for Listener %(listener_id)s\n\n" "net_namespace haproxy-amphora\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol udp\n" " delay_loop 30\n" diff --git a/octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py b/octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py index 4c379645da..4b8cf7b8ba 100644 --- a/octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +++ b/octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py @@ -56,7 +56,7 @@ CFG_FILE_TEMPLATE_v4 = ( "# Configuration for Listener %(listener_id)s\n\n" "net_namespace %(ns_name)s\n\n" "virtual_server 10.0.0.37 7777 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol udp\n\n\n" " # Configuration for Pool %(pool_id)s\n" @@ -97,7 +97,7 @@ CFG_FILE_TEMPLATE_v6 = ( "# Configuration for Listener %(listener_id)s\n\n" "net_namespace %(ns_name)s\n\n" "virtual_server fd79:35e2:9963:0:f816:3eff:fe6d:7a2a 7777 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol udp\n\n\n" " # Configuration for Pool %(pool_id)s\n" diff --git a/octavia/tests/unit/common/jinja/lvs/test_lvs_jinja_cfg.py b/octavia/tests/unit/common/jinja/lvs/test_lvs_jinja_cfg.py index d3ba8fd5f7..51b0405d2e 100644 --- a/octavia/tests/unit/common/jinja/lvs/test_lvs_jinja_cfg.py +++ b/octavia/tests/unit/common/jinja/lvs/test_lvs_jinja_cfg.py @@ -40,7 +40,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n" " persistence_timeout 33\n" @@ -86,7 +86,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n" " delay_loop 30\n" @@ -129,7 +129,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n" " delay_loop 30\n" @@ -172,7 +172,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n" " delay_loop 30\n" @@ -227,7 +227,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n\n\n" " # Configuration for Pool sample_pool_id_0\n" @@ -245,7 +245,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n\n\n" " # Pool sample_pool_id_1 is disabled\n" @@ -347,7 +347,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n" " delay_loop 30\n" @@ -408,7 +408,7 @@ class TestLvsCfg(base.TestCase): "# Configuration for Listener sample_listener_id_1\n\n" "net_namespace amphora-haproxy\n\n" "virtual_server 10.0.0.2 80 {\n" - " lb_algo rr\n" + " lb_algo wrr\n" " lb_kind NAT\n" " protocol UDP\n" " delay_loop 30\n" diff --git a/octavia/tests/unit/common/sample_configs/sample_configs_combined.py b/octavia/tests/unit/common/sample_configs/sample_configs_combined.py index 9e6fc491d0..c9d89edf1c 100644 --- a/octavia/tests/unit/common/sample_configs/sample_configs_combined.py +++ b/octavia/tests/unit/common/sample_configs/sample_configs_combined.py @@ -468,7 +468,7 @@ RET_UDP_POOL = { 'id': 'sample_pool_id_1', 'enabled': True, 'health_monitor': UDP_HEALTH_MONITOR_NO_SCRIPT, - 'lb_algorithm': 'rr', + 'lb_algorithm': 'wrr', 'members': [UDP_MEMBER_1, UDP_MEMBER_2], 'protocol': 'udp', 'session_persistence': UDP_SOURCE_IP_BODY @@ -480,7 +480,7 @@ RET_UDP_LISTENER = { 'id': 'sample_pool_id_1', 'enabled': True, 'health_monitor': RET_UDP_HEALTH_MONITOR, - 'lb_algorithm': 'rr', + 'lb_algorithm': 'wrr', 'members': [UDP_MEMBER_1, UDP_MEMBER_2], 'protocol': 'udp', 'session_persistence': UDP_SOURCE_IP_BODY diff --git a/octavia/tests/unit/common/sample_configs/sample_configs_split.py b/octavia/tests/unit/common/sample_configs/sample_configs_split.py index f628bed949..d63d9b8153 100644 --- a/octavia/tests/unit/common/sample_configs/sample_configs_split.py +++ b/octavia/tests/unit/common/sample_configs/sample_configs_split.py @@ -467,7 +467,7 @@ RET_UDP_POOL = { 'id': 'sample_pool_id_1', 'enabled': True, 'health_monitor': UDP_HEALTH_MONITOR_NO_SCRIPT, - 'lb_algorithm': 'rr', + 'lb_algorithm': 'wrr', 'members': [UDP_MEMBER_1, UDP_MEMBER_2], 'protocol': 'udp', 'session_persistence': UDP_SOURCE_IP_BODY diff --git a/releasenotes/notes/fix-udp-listener-wrr-50de9dc0774a8ea1.yaml b/releasenotes/notes/fix-udp-listener-wrr-50de9dc0774a8ea1.yaml new file mode 100644 index 0000000000..c795d9f8c3 --- /dev/null +++ b/releasenotes/notes/fix-udp-listener-wrr-50de9dc0774a8ea1.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fix weighted round-robin for UDP listeners with keepalived and lvs. + The algorithm must be specified as 'wrr' in order for weighted + round-robin to work correctly, but was being set to 'rr'.