From db24d7bb5187676c0501e722b7eaa5bd9161829e 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 octavia/tests/unit/common/jinja/lvs/test_lvs_jinja_cfg.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) The third file has conflict due to HTTP and TCP checks in UDP healthmonitor (patch I61c7d8d4df54710a92b8c055be84bba29bf3d7e6) was introduced in stable/ussuri. 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) (cherry picked from commit a8266a9e4f89c0c2120994e3d6b98c1ffdac4877) --- octavia/common/jinja/lvs/jinja_cfg.py | 2 +- .../backend/agent/api_server/test_keepalivedlvs.py | 2 +- .../backends/utils/test_keepalivedlvs_query.py | 4 ++-- .../unit/common/jinja/lvs/test_lvs_jinja_cfg.py | 12 ++++++------ .../common/sample_configs/sample_configs_combined.py | 4 ++-- .../common/sample_configs/sample_configs_split.py | 2 +- .../notes/fix-udp-listener-wrr-50de9dc0774a8ea1.yaml | 6 ++++++ 7 files changed, 19 insertions(+), 13 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 02a52d8d50..6632404a30 100644 --- a/octavia/common/jinja/lvs/jinja_cfg.py +++ b/octavia/common/jinja/lvs/jinja_cfg.py @@ -27,7 +27,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 ee6dc5b024..b2fe490191 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 82888f70c7..4d10d57181 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 1ac9c34f32..6c8d1d15b5 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" 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 d59949f944..3694ccc349 100644 --- a/octavia/tests/unit/common/sample_configs/sample_configs_combined.py +++ b/octavia/tests/unit/common/sample_configs/sample_configs_combined.py @@ -469,7 +469,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 @@ -481,7 +481,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 4aa57d709b..1ab198ce72 100644 --- a/octavia/tests/unit/common/sample_configs/sample_configs_split.py +++ b/octavia/tests/unit/common/sample_configs/sample_configs_split.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 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'.