Browse Source

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)
changes/16/785916/2
Xing Zhang 2 months ago
parent
commit
db24d7bb51
No known key found for this signature in database GPG Key ID: 43F80E57B910E3B0
7 changed files with 19 additions and 13 deletions
  1. +1
    -1
      octavia/common/jinja/lvs/jinja_cfg.py
  2. +1
    -1
      octavia/tests/functional/amphorae/backend/agent/api_server/test_keepalivedlvs.py
  3. +2
    -2
      octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py
  4. +6
    -6
      octavia/tests/unit/common/jinja/lvs/test_lvs_jinja_cfg.py
  5. +2
    -2
      octavia/tests/unit/common/sample_configs/sample_configs_combined.py
  6. +1
    -1
      octavia/tests/unit/common/sample_configs/sample_configs_split.py
  7. +6
    -0
      releasenotes/notes/fix-udp-listener-wrr-50de9dc0774a8ea1.yaml

+ 1
- 1
octavia/common/jinja/lvs/jinja_cfg.py View File

@ -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'
}


+ 1
- 1
octavia/tests/functional/amphorae/backend/agent/api_server/test_keepalivedlvs.py View File

@ -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"


+ 2
- 2
octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py View File

@ -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"


+ 6
- 6
octavia/tests/unit/common/jinja/lvs/test_lvs_jinja_cfg.py View File

@ -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"


+ 2
- 2
octavia/tests/unit/common/sample_configs/sample_configs_combined.py View File

@ -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


+ 1
- 1
octavia/tests/unit/common/sample_configs/sample_configs_split.py View File

@ -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


+ 6
- 0
releasenotes/notes/fix-udp-listener-wrr-50de9dc0774a8ea1.yaml View File

@ -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'.

Loading…
Cancel
Save