)]}'
{"id":"openstack%2Fopenstack-helm~1011978","triplet_id":"openstack%2Fopenstack-helm~master~I5d40cdbf987d04f986ed4fbdc5c48656972d51e8","project":"openstack/openstack-helm","branch":"master","topic":"neutron-ovn-raft-members","attention_set":{},"removed_from_attention_set":{"39426":{"account":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"last_update":"2026-11-03 18:54:22.000000000","reason":"Change was submitted"},"7156":{"account":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"last_update":"2026-11-03 15:48:18.000000000","reason":"\u003cGERRIT_ACCOUNT_7156\u003e replied on the change","reason_account":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"}}},"hashtags":[],"change_id":"I5d40cdbf987d04f986ed4fbdc5c48656972d51e8","subject":"fix(neutron): Allow giving the OVN clients every member of the OVN databases","status":"MERGED","created":"2026-10-23 04:36:12.000000000","updated":"2026-11-03 18:55:23.000000000","submitted":"2026-11-03 18:54:22.000000000","submitter":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"total_comment_count":3,"unresolved_comment_count":0,"has_review_started":true,"submission_id":"1011978-neutron-ovn-raft-members","meta_rev_id":"f23236fad14de3c3b544d91479812536c4afcc86","_number":1011978,"virtual_id_number":1011978,"owner":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"actions":{},"labels":{"Verified":{"approved":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"value":0,"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},{"value":0,"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},{"tag":"autogenerated:zuul:gate","value":2,"date":"2026-11-03 18:54:22.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","default_value":0,"optional":true},"Code-Review":{"approved":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"all":[{"value":2,"date":"2026-10-28 18:31:33.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},{"value":2,"date":"2026-11-03 15:48:18.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},{"value":0,"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","default_value":0,"optional":true},"Workflow":{"approved":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"all":[{"value":0,"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},{"value":1,"date":"2026-11-03 15:48:18.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},{"value":0,"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-10-23 06:14:56.000000000","updated_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"reviewer":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"state":"REVIEWER"},{"updated":"2026-10-26 10:48:22.000000000","updated_by":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"reviewer":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"state":"REVIEWER"},{"updated":"2026-10-28 18:31:33.000000000","updated_by":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"reviewer":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"state":"REVIEWER"}],"messages":[{"id":"eac9ec33bf6ea385fbbdc0e7130f3e90c85bf4a4","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"date":"2026-10-23 04:36:12.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"dd4101b1a5e2085edfd2c3f241f5783dd38e5ef3","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-23 06:14:56.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/547130f59ad249abb97f9cd29bb22a8a\n\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/06525c0b617442d6812d9376690bae1a : SUCCESS in 2m 33s\n- openstack-helm-linter https://zuul.opendev.org/t/openstack/build/e9e9c9e867d743e1a51335941d249692 : SUCCESS in 2m 19s\n- openstack-helm-pre-commit https://zuul.opendev.org/t/openstack/build/9a6fee78f27a40fa91ad4cf495acbef8 : SUCCESS in 2m 45s\n- openstack-helm-release-notes https://zuul.opendev.org/t/openstack/build/f8c02af1beeb4318898ea3579872616c : SUCCESS in 1m 41s\n- openstack-helm-build-charts https://zuul.opendev.org/t/openstack/build/08ec53018c1347c9b72fa46d85fce96e : SUCCESS in 2m 15s\n- openstack-helm-compute-kit-2025-2-ubuntu_noble https://zuul.opendev.org/t/openstack/build/474bdb3242144035ab5958f9f6a1f81e : SUCCESS in 58m 57s\n- openstack-helm-compute-kit-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/1407965b275445c7bad8aad7f9d63818 : SUCCESS in 1h 20m 48s\n- openstack-helm-tls-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/e6a6f57474254e0383f5aa2c5a2a8b3a : SUCCESS in 1h 05m 20s\n- openstack-helm-dpdk-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/96bc29b922554654a6ada45e327f87fe : SUCCESS in 57m 35s\n- openstack-helm-crd-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/fceab2e320f445d2abb2d7af3d1dfd2c : SUCCESS in 53m 53s\n- openstack-helm-operators-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/25b1e393d273499dbe3d1784962d4ddd : SUCCESS in 1h 33m 35s\n- openstack-helm-compute-kit-2026-2-ubuntu_resolute https://zuul.opendev.org/t/openstack/build/91927eb2a923468fa7d62b37f10dcdc7 : SUCCESS in 1h 15m 52s\n\nWarning:\n  File .ssh/known_hosts.old found in build home directory during playbook opendev.org/openstack/openstack-helm/playbooks/prepare-hosts.yaml for job openstack-helm-tls-2026-1-ubuntu_noble.  Add to preserve-home-paths if safe, or otherwise remove.\n  File .ssh/known_hosts.old found in build home directory during playbook opendev.org/openstack/openstack-helm/playbooks/mount-volumes.yaml for job openstack-helm-tls-2026-1-ubuntu_noble.  Add to preserve-home-paths if safe, or otherwise remove.\n  File .ssh/known_hosts.old found in build home directory during playbook opendev.org/openstack/openstack-helm/playbooks/use-buildset-registry.yaml for job openstack-helm-tls-2026-1-ubuntu_noble.  Add to preserve-home-paths if safe, or otherwise remove.\n  File .ssh/known_hosts.old found in build home directory during playbook opendev.org/openstack/openstack-helm/playbooks/inject-keys.yaml for job openstack-helm-tls-2026-1-ubuntu_noble.  Add to preserve-home-paths if safe, or otherwise remove.\n  File .ssh/known_hosts.old found in build home directory during playbook opendev.org/openstack/openstack-helm/playbooks/deploy-env.yaml for job openstack-helm-tls-2026-1-ubuntu_noble.  Add to preserve-home-paths if safe, or otherwise remove.","accounts_in_message":[],"_revision_number":1},{"id":"8ed2cc83ca850d67c87cb66d2382f1cfb39bca7f","author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"date":"2026-10-26 10:48:22.000000000","message":"Patch Set 1: Code-Review-1\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"e19dc7f082d23566429248a467e93c1c558e211e","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"date":"2026-10-27 00:39:07.000000000","message":"Uploaded patch set 2.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":2},{"id":"ae85d44b16521e248c925c1632585c67f1e94389","author":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"date":"2026-10-27 00:39:16.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"4b66af6a0c9a60c60f687d970228b3745715b617","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-27 02:39:12.000000000","message":"Patch Set 2: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/c6da8f893521452ca22172e76983ece4\n\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/726fe6c59f1e43e0b993bef6e8749749 : SUCCESS in 2m 45s\n- openstack-helm-linter https://zuul.opendev.org/t/openstack/build/99d31fc93366493f8cc4ed88dfcc1a46 : SUCCESS in 2m 59s\n- openstack-helm-pre-commit https://zuul.opendev.org/t/openstack/build/c93436102c0a41e19505f80e6fe89f8c : SUCCESS in 2m 45s\n- openstack-helm-release-notes https://zuul.opendev.org/t/openstack/build/551e025901684855b145ebaeae88f0b4 : SUCCESS in 1m 51s\n- openstack-helm-build-charts https://zuul.opendev.org/t/openstack/build/a0c3932ecc934bd6b47f4a7c43b75194 : SUCCESS in 2m 21s\n- openstack-helm-compute-kit-2025-2-ubuntu_noble https://zuul.opendev.org/t/openstack/build/a4c8058f7b264e64bec18aa2b0a28cb8 : SUCCESS in 1h 40m 41s\n- openstack-helm-compute-kit-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/e0552687153a425a9102113a999f7ac4 : SUCCESS in 1h 45m 30s\n- openstack-helm-tls-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/099e3405a6b748f0a82ad08d92465cab : SUCCESS in 1h 48m 03s\n- openstack-helm-dpdk-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/f221cb6afae44341bddf8b2209d2c87e : SUCCESS in 57m 06s\n- openstack-helm-crd-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/7d37bb9ddf3d49fb93876c958afe5663 : SUCCESS in 1h 15m 41s\n- openstack-helm-operators-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/c0c0a47b1c0d4e389c753dd8e2d0646f : SUCCESS in 1h 30m 29s\n- openstack-helm-compute-kit-2026-2-ubuntu_resolute https://zuul.opendev.org/t/openstack/build/e514bceb479045ec9a93ff0f44348db8 : SUCCESS in 1h 15m 01s","accounts_in_message":[],"_revision_number":2},{"id":"3a90f54e2ad9eba4033934bd9beda2fda2085833","author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"date":"2026-10-28 18:31:33.000000000","message":"Patch Set 2: Code-Review+2\n\n(1 comment)","accounts_in_message":[],"_revision_number":2},{"id":"1c02460ccff32cae5045a3b8b30cf526111a3725","author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"date":"2026-11-03 15:48:18.000000000","message":"Patch Set 2: Code-Review+2 Workflow+1","accounts_in_message":[],"_revision_number":2},{"id":"950063d354b8bde199481424ac9cda0d5d626fac","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-11-03 15:48:32.000000000","message":"Patch Set 2: -Verified\n\nStarting gate jobs.","accounts_in_message":[],"_revision_number":2},{"id":"80ac9ec95475b30c0ca2010d8a0c37d8a2d3f404","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-11-03 18:54:22.000000000","message":"Patch Set 2: Verified+2\n\nBuild succeeded (gate pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/7b4b6e201d884e58baf696d63afbac2d\n\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/9f6423da20e849f38d859b5407d22218 : SUCCESS in 3m 49s\n- openstack-helm-linter https://zuul.opendev.org/t/openstack/build/6d7c9d62919f4b01a872c54f2547e3c9 : SUCCESS in 3m 16s\n- openstack-helm-release-notes https://zuul.opendev.org/t/openstack/build/28c69907306445e196c611c5685510ba : SUCCESS in 2m 12s\n- openstack-helm-compute-kit-2026-1-ubuntu_noble https://zuul.opendev.org/t/openstack/build/32c0228c15e6403d92c9463cbc3ccd62 : SUCCESS in 1h 50m 04s\n- openstack-helm-logging https://zuul.opendev.org/t/openstack/build/4dff4744e6304d7d996fcc846886dcb1 : SUCCESS in 48m 51s\n- openstack-helm-monitoring https://zuul.opendev.org/t/openstack/build/b3c73abf6f394f8985b7170309864671 : SUCCESS in 29m 44s","accounts_in_message":[],"_revision_number":2},{"id":"6a0a591b9d9a9c020860103ab29359148943f143","tag":"autogenerated:gerrit:merged","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-11-03 18:54:22.000000000","message":"Change has been successfully merged","accounts_in_message":[],"_revision_number":2},{"id":"f23236fad14de3c3b544d91479812536c4afcc86","tag":"autogenerated:zuul:promote","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-11-03 18:55:23.000000000","message":"Patch Set 2:\n\nBuild succeeded (promote pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/85433996e58843829b78680ded1dfbfb\n\n- promote-openstack-tox-docs https://zuul.opendev.org/t/openstack/build/7d2580c0ebc24787b247c3573c0de0d5 : SUCCESS in 45s","accounts_in_message":[],"_revision_number":2}],"current_revision_number":2,"current_revision":"f38d0070ceea119d6356c6e22b4a894e541330e9","revisions":{"2de7c758e7289b8fe2f6bf24ca8d63ca57ea1b17":{"kind":"REWORK","_number":1,"created":"2026-10-23 04:36:12.000000000","uploader":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"ref":"refs/changes/78/1011978/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/openstack-helm","ref":"refs/changes/78/1011978/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/1"}}},"commit":{"parents":[{"commit":"7509f39c327a8351de53f03dee55137de9a98a1b","subject":"Merge \"fix(ovn): Render the component tolerations\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/openstack-helm/commit/7509f39c327a8351de53f03dee55137de9a98a1b"}]}],"author":{"name":"Simon Zhou","email":"td@fivetime.ltd","date":"2026-10-23 04:05:51.000000000","tz":0},"committer":{"name":"Simon Zhou","email":"td@fivetime.ltd","date":"2026-10-23 04:17:06.000000000","tz":0},"subject":"fix(neutron): Give the OVN clients every member of the OVN databases","message":"fix(neutron): Give the OVN clients every member of the OVN databases\n\nneutron-ovn-init points every OVN client of neutron at one address per\ndatabase, the ClusterIP of the ovn-ovsdb-nb and ovn-ovsdb-sb Services,\ntaken from the Service environment variables. With a clustered OVN\n(pod.replicas.ovn_ovsdb_nb/sb \u003e 1 in the ovn chart) that address is\nbalanced over the RAFT members. The python-ovs IDL connects leader-only\nby default, and neutron keeps that for its northbound connections, so a\nconnection that lands on a follower is dropped (\"not cluster leader\")\nand retried through the same address until it happens to reach the\nleader, at startup and again after every leader change.\n\nOn a three-member cluster, 30 leader-only connections to the northbound\ndatabase through the Service address took 9.2 seconds on average and\nup to 74 seconds, with up to 11 refusals each, as the reconnect backs\noff between attempts. Given the member list, all 30 were up within 0.9\nseconds.\n\nBuild the connection strings from endpoints.ovn_ovsdb_nb and\nendpoints.ovn_ovsdb_sb with helm-toolkit\u0027s\nhost_and_port_endpoint_uri_lookup, which lists every member of a\nStatefulSet the way endpoints.oslo_messaging does for RabbitMQ, so that\nthe IDL can try them in turn and follow the leader. These are the\nper-pod names ovn-controller is already given by the ovn chart.\nstatefulset.replicas defaults to 1, like pod.replicas in the ovn chart,\nand has to be raised with it. The endpoints also let the OVN databases\nlive in another namespace, which the Service environment variables did\nnot. conf.plugins.ml2_conf.ovn.ovn_nb_connection and ovn_sb_connection\nstill take precedence.\n\nChangelog: fixed: neutron connects to every member of a clustered OVN\n  database instead of one Service address\nAssisted-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I5d40cdbf987d04f986ed4fbdc5c48656972d51e8\nSigned-off-by: Simon Zhou \u003ctd@fivetime.ltd\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/openstack-helm/commit/2de7c758e7289b8fe2f6bf24ca8d63ca57ea1b17"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/openstack-helm/commit/2de7c758e7289b8fe2f6bf24ca8d63ca57ea1b17"}]},"branch":"refs/heads/master"},"f38d0070ceea119d6356c6e22b4a894e541330e9":{"kind":"REWORK","_number":2,"created":"2026-10-27 00:39:07.000000000","uploader":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"ref":"refs/changes/78/1011978/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/openstack-helm","ref":"refs/changes/78/1011978/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/openstack-helm refs/changes/78/1011978/2"}}},"commit":{"parents":[{"commit":"7509f39c327a8351de53f03dee55137de9a98a1b","subject":"Merge \"fix(ovn): Render the component tolerations\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/openstack-helm/commit/7509f39c327a8351de53f03dee55137de9a98a1b"}]}],"author":{"name":"Simon Zhou","email":"td@fivetime.ltd","date":"2026-10-23 04:05:51.000000000","tz":0},"committer":{"name":"Simon Zhou","email":"td@fivetime.ltd","date":"2026-10-27 00:33:25.000000000","tz":0},"subject":"fix(neutron): Allow giving the OVN clients every member of the OVN databases","message":"fix(neutron): Allow giving the OVN clients every member of the OVN databases\n\nneutron-ovn-init points every OVN client of neutron at one address per\ndatabase, the ClusterIP of the ovn-ovsdb-nb and ovn-ovsdb-sb Services,\ntaken from the Service environment variables. With a clustered OVN\n(pod.replicas.ovn_ovsdb_nb/sb \u003e 1 in the ovn chart) that address is\nbalanced over the RAFT members. The python-ovs IDL connects leader-only\nby default, and neutron keeps that for its northbound connections, so a\nconnection that lands on a follower is dropped (\"not cluster leader\")\nand retried through the same address until it happens to reach the\nleader, at startup and again after every leader change.\n\nOn a three-member cluster, 30 leader-only connections to the northbound\ndatabase through the Service address took 9.2 seconds on average and\nup to 74 seconds, with up to 11 refusals each, as the reconnect backs\noff between attempts. Given the member list, all 30 were up within 0.9\nseconds.\n\nAdd endpoints.ovn_ovsdb_nb and endpoints.ovn_ovsdb_sb. When their\nstatefulset is set, build the connection strings with helm-toolkit\u0027s\nhost_and_port_endpoint_uri_lookup, which lists every member of a\nStatefulSet the way endpoints.oslo_messaging does for RabbitMQ, so that\nthe IDL can try them in turn and follow the leader; these are the\nper-pod names ovn-controller is already given by the ovn chart, and the\ndatabases may then also live in another namespace. statefulset defaults\nto null, which keeps the Service address: python-ovs resolves host names\nonly with the python unbound module, and without it neutron fails to\nstart with \"DNS support requires the python unbound library\". With the\ndefault the chart renders as before.\nconf.plugins.ml2_conf.ovn.ovn_nb_connection and ovn_sb_connection still\ntake precedence.\n\npython-ovs on Ubuntu Noble connected to all three members of the\nnorthbound database by these names with python3-unbound installed, and\nto none without it.\n\nChangelog: added: neutron can be given every member of a clustered OVN\n  database instead of one Service address\nAssisted-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I5d40cdbf987d04f986ed4fbdc5c48656972d51e8\nSigned-off-by: Simon Zhou \u003ctd@fivetime.ltd\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/openstack-helm/commit/f38d0070ceea119d6356c6e22b4a894e541330e9"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/openstack-helm/commit/f38d0070ceea119d6356c6e22b4a894e541330e9"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~DefaultSubmitRule","status":"CLOSED","labels":[{"label":"Verified","status":"MAY","applied_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"MAY","applied_by":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"}},{"label":"Workflow","status":"MAY","applied_by":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"}}]}],"submit_requirements":[{"name":"Verified","description":"Verified in gate by CI","status":"SATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Verified\u003dMAX AND -label:Verified\u003dMIN","fulfilled":true,"status":"PASS","passing_atoms":["label:Verified\u003dMAX"],"failing_atoms":["label:Verified\u003dMIN"],"atom_explanations":{"label:Verified\u003dMAX":"","label:Verified\u003dMIN":""}}},{"name":"Code-Review","description":"Code reviewed by core reviewer","status":"SATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Code-Review\u003dMAX AND -label:Code-Review\u003dMIN","fulfilled":true,"status":"PASS","passing_atoms":["label:Code-Review\u003dMAX"],"failing_atoms":["label:Code-Review\u003dMIN"],"atom_explanations":{"label:Code-Review\u003dMAX":"","label:Code-Review\u003dMIN":""}}},{"name":"Workflow","description":"Approved for gate by core reviewer","status":"SATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Workflow\u003dMAX AND -label:Workflow\u003dMIN","fulfilled":true,"status":"PASS","passing_atoms":["label:Workflow\u003dMAX"],"failing_atoms":["label:Workflow\u003dMIN"],"atom_explanations":{"label:Workflow\u003dMAX":"","label:Workflow\u003dMIN":""}}}]}
