)]}'
{"id":"openstack%2Foctavia~993556","triplet_id":"openstack%2Foctavia~master~Ia026781af131da7c91642470802d342eca259b05","project":"openstack/octavia","branch":"master","attention_set":{},"removed_from_attention_set":{"37632":{"account":{"_account_id":37632,"name":"Dmitriy Chubinidze","email":"dcu995@gmail.com","username":"chubinidzedr"},"last_update":"2026-07-28 10:21:44.000000000","reason":"Change was submitted"},"38562":{"account":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"last_update":"2026-07-28 08:45:56.000000000","reason":"\u003cGERRIT_ACCOUNT_38562\u003e replied on the change","reason_account":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"}},"39044":{"account":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"last_update":"2026-07-28 10:21:44.000000000","reason":"Change was submitted"},"37604":{"account":{"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},"last_update":"2026-07-28 10:21:44.000000000","reason":"Change was submitted"},"28619":{"account":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"last_update":"2026-07-28 10:21:44.000000000","reason":"Change was submitted"},"29244":{"account":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"last_update":"2026-07-27 06:39:33.000000000","reason":"removed on reply"},"37598":{"account":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"last_update":"2026-07-01 17:50:20.000000000","reason":"\u003cGERRIT_ACCOUNT_37598\u003e replied on the change","reason_account":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"}}},"hashtags":[],"change_id":"Ia026781af131da7c91642470802d342eca259b05","subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","status":"MERGED","created":"2026-06-16 10:19:06.000000000","updated":"2026-07-28 10:23:06.000000000","submitted":"2026-07-28 10:21:44.000000000","submitter":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"total_comment_count":49,"unresolved_comment_count":1,"has_review_started":true,"submission_id":"993556","meta_rev_id":"cac023a4edc4b9713a41281e4d164ddac47aa21c","_number":993556,"virtual_id_number":993556,"owner":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"actions":{},"labels":{"Verified":{"approved":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"value":0,"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},{"value":0,"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},{"value":0,"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},{"tag":"autogenerated:zuul:gate","value":2,"date":"2026-07-28 10:21:44.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":0,"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},{"value":0,"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"}],"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":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"recommended":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"all":[{"value":1,"date":"2026-07-28 08:45:56.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},{"value":0,"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},{"value":0,"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},{"value":0,"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":2,"date":"2026-07-27 06:39:33.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},{"value":1,"date":"2026-07-01 17:50:20.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"}],"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":"","value":1,"default_value":0,"optional":true},"Workflow":{"approved":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"all":[{"value":0,"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},{"value":0,"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},{"value":0,"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},{"value":0,"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":1,"date":"2026-07-28 08:48:11.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},{"value":0,"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true},"Backport-Candidate":{"recommended":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"all":[{"value":0,"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},{"value":0,"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},{"value":0,"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},{"value":0,"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":0,"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},{"value":1,"date":"2026-07-01 17:50:20.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"}],"values":{"-2":"Do Not Backport","-1":"Not A Backport Candidate"," 0":"Backport Review Needed","+1":"Proposed Backport","+2":"Should Backport"},"description":"","value":1,"default_value":0,"optional":true}},"removable_reviewers":[{"_account_id":37632,"name":"Dmitriy Chubinidze","email":"dcu995@gmail.com","username":"chubinidzedr"}],"reviewers":{"REVIEWER":[{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},{"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},{"_account_id":37632,"name":"Dmitriy Chubinidze","email":"dcu995@gmail.com","username":"chubinidzedr"},{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-06-16 10:52:50.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"state":"CC"},{"updated":"2026-06-16 10:53:45.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"state":"REVIEWER"},{"updated":"2026-06-16 10:53:45.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"state":"REVIEWER"},{"updated":"2026-06-16 10:53:45.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"state":"REVIEWER"},{"updated":"2026-06-16 12:44:37.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-06-17 08:15:32.000000000","updated_by":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"reviewer":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"state":"CC"},{"updated":"2026-06-17 08:34:31.000000000","updated_by":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"reviewer":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"state":"REVIEWER"},{"updated":"2026-06-30 14:15:38.000000000","updated_by":{"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},"reviewer":{"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},"state":"REVIEWER"},{"updated":"2026-07-08 18:09:48.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":37632,"name":"Dmitriy Chubinidze","email":"dcu995@gmail.com","username":"chubinidzedr"},"state":"REVIEWER"}],"messages":[{"id":"9c6e5f2eb3ff6ca273228925cc6bb5244f7d07c5","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-16 10:19:06.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"6b101caba223598ac70afa1e0d41ed06a3b7a7fc","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-16 10:52:50.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"a04dcee3b39076d8fb89041e97ad1cde9ceafa82","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-16 10:53:45.000000000","message":"Patch Set 1: Backport-Candidate+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"f7a3c4f803d79284c9751565b5ca2188deed30e8","tag":"autogenerated:claude-review","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-16 11:04:06.000000000","message":"Patch Set 1:\n\n(5 comments)\n\n*Reviewed by claude-sonnet-4-6*\n\n# Code Review: openstack/octavia - Change #993556\n\n**Gerrit URL**: https://review.opendev.org/c/openstack/octavia/+/993556\n**Patchset**: 1\n**Reviewed**: 2026-06-16 12:00:02\n**Reviewer**: claude-sonnet-4-6\n**First Review**\n\n---\n\n## Change Summary\n\nThis change fixes a ZooKeeper session churn bug in `ZookeeperTaskFlowDriver` where a new `KazooClient` was being created and immediately closed every ~8 seconds (controlled by `jobboard_expiration_time / 4`) inside the `_extend_jobs()` polling loop. The fix introduces a single, long-lived `KazooClient` created at driver initialization (`__init__`), which is passed to `ZookeeperJobBoard` via the `client\u003d` kwarg so the board\u0027s `close()` no longer tears down the underlying ZooKeeper session. A `shutdown()` lifecycle hook is threaded through `ConsumerService.terminate()` → `ControllerWorker.shutdown()` → `ZookeeperTaskFlowDriver.shutdown()` to clean up the persistent client on service termination.\n\n**Files Modified**: 5\n**Lines Added**: +129\n**Lines Removed**: -6\n\n### Commit Message\n```\nFix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime,\npassed to ZookeeperJobBoard via the existing `client\u003d` kwarg so\nthe board\u0027s close() no longer tears down the connection.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nSigned-off-by: Alicja Filipek\u003calicja.filipek@cleura.com\u003e\n\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nBug refs: #2144800\n```\n\n### Purpose\nThis fixes Launchpad bug #2144800: continuous ZooKeeper session churn caused by `job_board()` being called inside a `with` block in `_extend_jobs()`, which runs in a background thread every `expiration_time / 4` seconds (default ~8s). Each invocation was creating a new `KazooClient`, connecting, then immediately disconnecting, exhausting ZooKeeper session slots and causing `kazoo.exceptions.ConnectionLoss` errors during load-balancer operations.\n\n### Scope\n- `ZookeeperTaskFlowDriver` initialization and resource lifecycle\n- `ControllerWorker` shutdown sequence\n- `ConsumerService` termination sequence\n- Unit tests for the Zookeeper driver\n- Test dependency addition (`kazoo`)\n\n---\n\n## Test Results\n\n_No test commands configured._\n\n---\n\n## Code Analysis\n\n### Overall Assessment\nThe fix addresses a real and impactful production bug with a sound architectural approach: moving from per-call client creation to a single long-lived client. The shutdown lifecycle chain is correctly threaded through the service layers. However, **Patchset 1 contains leftover development artifacts — commented-out code and dead comments — that must be removed before this change can merge.**\n\n### Strengths\n- Correct root-cause fix: passing `client\u003dself._client` to `ZookeeperJobBoard` prevents `board.close()` from finalizing the shared connection.\n- Clean extensibility: the no-op `JobboardTaskFlowDriver.shutdown()` base method means Redis and Etcd drivers require zero changes.\n- Defensive `hasattr` guard in `ControllerWorker.shutdown()` correctly handles the `jobboard_enabled\u003dFalse` path where `self.jobboard_driver` is never set.\n- Consistent `try/except AttributeError` pattern in `consumer.py` matches existing shutdown code style.\n- Lazy import of `kazoo_utils` correctly avoids a hard dependency on kazoo for non-ZooKeeper deployments.\n- Test coverage is meaningful: client reuse, shared-client passing, idempotent shutdown, and startup are all verified.\n\n### Issues Found\n\n#### Critical Issues 🔴\n\n**Commented-out development code left in production file**\n\n`taskflow_jobboard_driver.py` lines 84–95 contain a block of commented-out code representing an alternative refactoring that was abandoned mid-development, plus a `# return client` dead comment left inside live code. This is not review-ready:\n\n```python\n    #     self._client \u003d None\n    #     self._client \u003d self._get_client()\n    #\n    # def _get_client(self):\n    #     job_backends_hosts \u003d self._hosts_str\n        conf \u003d {\n            \u0027hosts\u0027: self._hosts_str,\n        }\n        conf.update(CONF.task_flow.jobboard_zookeeper_ssl_options)\n        self._client \u003d kazoo_utils.make_client(conf)\n        self._client.start()\n        # return client\n```\n\nThe commented-out `_get_client()` method sketch and the `# return client` comment at the end of live code must be removed entirely before merge.\n\n#### Major Issues 🟡\n\n**1. Missing blank line between `ZookeeperTaskFlowDriver` and `RedisTaskFlowDriver` (PEP 8 / hacking)**\n\n`taskflow_jobboard_driver.py` line 117: There is only one blank line between the end of `ZookeeperTaskFlowDriver.shutdown()` and `class RedisTaskFlowDriver`. PEP 8 (and OpenStack\u0027s `hacking` enforcer) requires **two** blank lines between top-level class definitions. The original code had two blank lines here; the patch accidentally collapsed them to one. This will likely fail the `pep8` gate check.\n\n**2. Behavioral change at service startup not documented**\n\nPreviously, ZooKeeper connectivity errors would surface lazily on the first `job_board()` call. With this fix, `self._client.start()` is called in `__init__`, so a service that starts when ZooKeeper is unreachable will now fail immediately at process startup rather than on first use. This is arguably better behavior, but it is a breaking change for deployments that tolerate a briefly-unavailable ZooKeeper at startup. This behavioral shift is not mentioned in the commit message and has no release note.\n\n**3. Thread safety: TOCTOU race in `shutdown()`**\n\n`ZookeeperTaskFlowDriver.shutdown()` is not thread-safe:\n\n```python\ndef shutdown(self):\n    if self._client is not None:          # check\n        self._kazoo_utils.finalize_client(self._client)  # use\n        self._client \u003d None               # clear\n```\n\n`job_board()` concurrently accesses `self._client`. In a multi-threaded environment (conductor thread + shutdown thread), `finalize_client()` could be called while a concurrent `job_board()` call is using the client. A `threading.Lock` should guard access to `self._client` in both `job_board()` and `shutdown()`. At minimum, the known risk should be documented.\n\n**4. Missing release note**\n\nThis is a bugfix with user-visible production impact (ZooKeeper session exhaustion, `ConnectionLoss` errors during LB operations). OpenStack projects require a releasenote entry under `releasenotes/notes/` for changes of this severity. None is included.\n\n#### Minor Issues / Suggestions 🔵\n\n**1. Redundant local variable in `job_board()`**\n\n`taskflow_jobboard_driver.py` line 98:\n```python\njob_backends_hosts \u003d self._hosts_str\n```\nThis local variable is only used once (on line 101) and simply aliases `self._hosts_str`. It can be replaced with a direct reference to `self._hosts_str`, which also removes a leftover artifact from the pre-patch code.\n\n**2. Inconsistent use of local vs. instance attribute for `kazoo_utils`**\n\nIn `__init__`, `kazoo_utils` is used as a local variable for `make_client()`, while it is stored as `self._kazoo_utils` for use in `shutdown()`. This is inconsistent. Both calls should use either the local or the instance attribute — the local variable goes out of scope after `__init__`, which is why `self._kazoo_utils` is needed in `shutdown()`, but the asymmetry within `__init__` itself (local for `make_client`, stored for later use) is slightly confusing. A comment explaining why the module is stored would help.\n\n**3. `kazoo` version pin should be reviewed against `requirements.txt`**\n\n`test-requirements.txt` adds `kazoo\u003e\u003d2.6` as a test dependency. The underlying reason is that `mock.patch(\u0027taskflow.utils.kazoo_utils.make_client\u0027)` requires the module to be importable (Python loads the module to resolve the dotted path). However, `kazoo` is an optional runtime dependency for ZooKeeper deployments. Verify whether `kazoo` already appears (directly or transitively) in `requirements.txt`, and whether the version floor `\u003e\u003d2.6` is appropriate given the `taskflow` version bounds in use.\n\n#### Nits 🟢\n\n- **Test file import ordering** (`test_taskflow_jobboard_driver.py` line 22): `from oslo_config import fixture as oslo_fixture` is placed after the local `from octavia.tests.unit import base` import, violating isort ordering (oslo imports should precede local imports). Move it to the oslo import group above the `from octavia...` imports.\n\n- **Trailing comma style in `job_board()` return** (`taskflow_jobboard_driver.py` lines 106–110): The trailing comma after `client\u003dself._client,` followed by the closing parenthesis on its own line is valid Python but inconsistent with the rest of the file. Either use a single-line return or align consistently with the opening paren.\n\n- **`Signed-off-by` spacing in commit message**: `Signed-off-by: Alicja Filipek\u003calicja.filipek@cleura.com\u003e` is missing a space before the email address. Should be `Alicja Filipek \u003calicja.filipek@cleura.com\u003e`.\n\n---\n\n## Security Analysis\n\n- The shared `KazooClient` holds the ZooKeeper session credentials for the lifetime of the process. Operators should ensure the service account is appropriately scoped.\n- SSL options (`jobboard_zookeeper_ssl_options`) are merged into the `conf` dict and passed to `kazoo_utils.make_client()`. No credential logging is introduced by this change.\n- No new configuration options, credentials, or authentication surfaces are introduced.\n\n*No new security concerns identified beyond the pre-existing ZooKeeper connection security model.*\n\n---\n\n## Documentation Review\n\n- **Docstrings**: ✅ Good — `JobboardTaskFlowDriver.shutdown()` has a clear docstring explaining the no-op default and override intent.\n- **Code Comments**: ⚠️ Needs Improvement — The commented-out code (critical issue above) must be removed. The inline `# Lazy import, kazoo is only required when this driver is selected` comment is helpful and correct.\n- **Commit Message**: ⚠️ Needs Improvement — The technical description is clear and accurate, but it omits the behavioral change at startup (eager ZooKeeper connection) and is missing a space in the `Signed-off-by` trailer. The `Closes-Bug` tag is correct.\n- **Release Notes**: ⚠️ Needed — A bug of this severity (production ZooKeeper session exhaustion during LB operations) warrants a `releasenotes/notes/fix-zookeeper-session-churn-\u003chash\u003e.yaml` entry under the `fixes` section.\n\n---\n\n## Final Verdict\n\n**Overall Assessment**: The core fix is architecturally sound and addresses a real production impact bug with an appropriate solution. However, Patchset 1 is not ready to merge due to leftover development artifacts (commented-out code, dead comments) and a missing blank line that will likely fail the pep8 gate.\n\n**Recommendation**:\n🔄 **Request Changes** (Issues must be addressed)\n\n**Confidence Level**: High\nThe code logic and root-cause analysis are well understood. The issues identified (commented-out code, PEP 8 violations, missing release note) are clear and actionable. The behavioral change at startup and thread-safety concerns are real but may be accepted as acceptable trade-offs by the project — these warrant discussion in the review comments.\n\n---\n\n## Backport Recommendation\n\n**Recommendation:** ⚠️ Insufficient information\n\n---\n*This review was generated by an AI and may contain errors.*","accounts_in_message":[],"_revision_number":1},{"id":"094dfd46ad353df721843a647d116d8d00c9fce7","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-16 12:44:37.000000000","message":"Patch Set 1: Verified-1\n\n(2 comments)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/3ce3617d667a407cab74eb3be1832aa7\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/8df3f15ab6734bcfbab270e643b85ecc : SUCCESS in 5m 07s\n- requirements-check https://zuul.opendev.org/t/openstack/build/101ff50c51634bb5888a00d8bbe47f78 : SUCCESS in 2m 00s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/3d6e587cceba4b069062a2075e8200df : SUCCESS in 6m 57s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/b58b5ba5f28d4befad65f2c6bd14f64a : FAILURE in 3m 44s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/4eb90cffee804296bb9412091f202256 : SUCCESS in 3m 50s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/bb04836dcfc24b159d90b5cd7ed33f15 : SUCCESS in 4m 58s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/8c5cc975e23548779f1026081b7e59aa : SUCCESS in 5m 23s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/cf6ee60ec8724a9b991aba0fee87f8ca : SUCCESS in 7m 52s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/86b17cae1e8640e69fd1860156e8c3ad : SUCCESS in 9m 53s\n- octavia-tox-py313-tips https://zuul.opendev.org/t/openstack/build/60a27db30b304c549b0e0846bec9e5fe : SUCCESS in 4m 49s\n- octavia-tox-functional-py313-tips https://zuul.opendev.org/t/openstack/build/46a2ce9ddcbc479698ac74a72b0a1e70 : SUCCESS in 5m 49s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/b0c75dcdfac04febb8c373b78d7fa592 : SUCCESS in 3m 35s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/187a6b835cec4228ba1ec0d2e798668b : SUCCESS in 5m 21s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/23207ceec9224e97a4473143632e49e7 : SUCCESS in 59m 29s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/81831ce025b4490ea4e1e5b4185b9697 : SUCCESS in 1h 32m 11s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/1080826117344ed8896473031c29c8c2 : SUCCESS in 1h 04m 44s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/590956a3ff7443cfba27554ea9d64d90 : SUCCESS in 1h 34m 36s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/0c510603ad5049deb9d6ee02ee377920 : SUCCESS in 1h 03m 03s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/c74e4f425d9044b798686f255b4187da : SUCCESS in 34m 53s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/74090c7080c3436284dc9eaab8d766b6 : SUCCESS in 50m 36s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/ad2af09efd50466189036e5fefac6f28 : SUCCESS in 41m 31s\n- octavia-v2-act-stdby-dsvm-scenario https://zuul.opendev.org/t/openstack/build/cc734b0868da4cf1a7f0197beec5fd72 : SUCCESS in 34m 48s (non-voting)\n- octavia-v2-dsvm-cinder-amphora https://zuul.opendev.org/t/openstack/build/09bff89f75c94da3aebe83a722eb6d44 : SUCCESS in 35m 39s (non-voting)\n- octavia-v2-dsvm-scenario-two-node https://zuul.opendev.org/t/openstack/build/98497f41da0d45cdb93ec041c1c59a9e : SUCCESS in 2h 23m 39s (non-voting)\n- octavia-v2-dsvm-scenario-ipv6-only https://zuul.opendev.org/t/openstack/build/e6511ee64d754c63a3cc3d07655a078a : SUCCESS in 1h 28m 46s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-traffic-ops https://zuul.opendev.org/t/openstack/build/c33ca791f4ac4826844b8b9129cef6a6 : SUCCESS in 1h 24m 15s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-non-traffic-ops https://zuul.opendev.org/t/openstack/build/d114f66f0dfd49d1a26df662496655e0 : SUCCESS in 58m 40s (non-voting)","accounts_in_message":[],"_revision_number":1},{"id":"d64dba392e58a0ed66e64f4d0176d64f7de1466d","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-16 13:03:14.000000000","message":"Uploaded patch set 2.\n\nOutdated Votes:\n* Backport-Candidate+1 (copy condition: \"changekind:NO_CODE_CHANGE OR changekind:TRIVIAL_REBASE\")\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":2},{"id":"18c8d4f55b7a4914c6d3569eb2e598a071c1f420","tag":"autogenerated:claude-review","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-16 14:04:35.000000000","message":"Patch Set 2:\n\n*Reviewed by claude-sonnet-4-6*\n\n# Code Review: openstack/octavia - Change #993556\n\n**Gerrit URL**: https://review.opendev.org/c/openstack/octavia/+/993556\n**Patchset**: 2\n**Reviewed**: 2026-06-16 15:01:35\n**Reviewer**: claude-sonnet-4-6\n**Patchset 1**\n\n---\n\n## Change Summary\n\nThis change fixes a significant operational bug in `ZookeeperTaskFlowDriver` where a new `KazooClient` was created and destroyed on every `_extend_jobs()` polling cycle (~every 8 seconds), producing continuous ZooKeeper session churn and `kazoo.exceptions.ConnectionLoss` errors during load balancer operations.\n\n**Files Modified**: 6\n**Lines Added**: +199\n**Lines Removed**: -9\n\n### Commit Message\n```\nFix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nBug refs: #2144800\n```\n\n### Purpose\nEliminates continuous ZooKeeper session churn caused by `job_board()` being invoked inside a `with` block (in `_extend_jobs()`), which created and immediately destroyed a `KazooClient` on every ~8-second polling cycle. The fix introduces a shared, lazily-initialised `KazooClient` held for the driver\u0027s lifetime, with proper cleanup on service termination.\n\n### Scope\n- `ZookeeperTaskFlowDriver` (primary fix): lazy client lifecycle management\n- `ControllerWorker` (new `shutdown()` method): delegates to driver cleanup\n- `ConsumerService.terminate()`: calls `worker.shutdown()` during SIGTERM\n- New `shutdown()` hook added to `JobboardTaskFlowDriver` base class (no-op default)\n- New test class `TestZookeeperTaskFlowDriver` with 7 test cases\n- Release note and `test-requirements.txt` update\n\n---\n\n## Test Results\n\n_No test commands configured._\n\n---\n\n## Code Analysis\n\n### Overall Assessment\nThis is a clean, well-reasoned fix to a real operational bug. The approach — lazy initialisation behind a lock, graceful lifecycle propagation, and a no-op base-class fallback — is sound and follows established OpenStack patterns. Test coverage is thorough and includes a meaningful concurrency test. One minor correctness concern around lock scope in `_ensure_client` warrants attention.\n\n### Strengths\n- **Correct root-cause fix**: properly identifies the `with`-block pattern that caused repeated client creation/destruction and eliminates it entirely.\n- **Thread safety**: `threading.Lock` guards both `_ensure_client()` and `shutdown()`, preventing double-creation races between concurrent `job_board()` callers.\n- **Lazy startup preserved**: ZooKeeper unavailability at worker start does not prevent service launch — the client is only created on first actual use.\n- **Backward compatibility**: `JobboardTaskFlowDriver.shutdown()` no-op default means Redis/Etcd drivers require zero changes.\n- **`kazoo` deferred import**: using `from taskflow.utils import kazoo_utils` inside `__init__` avoids importing kazoo in non-ZooKeeper deployments.\n- **Proper kazoo teardown**: uses `finalize_client()` (not raw `client.stop()`) which performs the complete kazoo shutdown sequence.\n- **Comprehensive tests**: 7 test cases covering lazy creation, client reuse, concurrency, shutdown finalisation, idempotent shutdown, and shutdown before any use.\n- **Excellent commit message**: clearly describes the problem, fix, and design tradeoffs.\n- **Release note**: accurate and well-formatted.\n\n### Issues Found\n\n#### Critical Issues 🔴\n*None identified.*\n\n#### Major Issues 🟡\n\n**`_ensure_client()` returns `self._client` outside the lock — potential use-after-free on concurrent shutdown**\n\n```python\ndef _ensure_client(self):\n    with self._client_lock:\n        if self._client is None:\n            ...\n            self._client \u003d client\n    return self._client          # \u003c-- outside the lock\n```\n\nAfter the `with` block exits, a concurrent call to `shutdown()` can acquire `_client_lock`, call `finalize_client(self._client)`, and set `self._client \u003d None` **before** `return self._client` executes. The caller then receives `None`, and the subsequent `job_backends.backend(..., client\u003dNone)` call may fail or silently fall back to creating its own connection (reintroducing the original bug).\n\nAlternatively, if the race loses the other way — `shutdown()` finalises the client while `job_board()` is already using the returned (now-finalized) object — a `kazoo.exceptions.ConnectionLoss` occurs during the operation being submitted.\n\nThe fix is to return from inside the `with` block:\n\n```python\ndef _ensure_client(self):\n    with self._client_lock:\n        if self._client is None:\n            conf \u003d {\u0027hosts\u0027: self._hosts_str}\n            conf.update(CONF.task_flow.jobboard_zookeeper_ssl_options)\n            client \u003d self._kazoo_utils.make_client(conf)\n            client.start()\n            self._client \u003d client\n        return self._client   # inside the lock\n```\n\nThis is a narrow race (requires SIGTERM to arrive in a tiny window during active job submission) but is a real correctness issue in a concurrent service.\n\n#### Minor Issues / Suggestions 🔵\n\n**No unit test for `ControllerWorker.shutdown()`**\n\nThe new `ControllerWorker.shutdown()` method is trivially short but exercises two interesting branches: (1) `jobboard_driver` attribute present → delegates, (2) attribute absent → safe via `getattr` default. A test for these two branches would round out coverage and guard against regressions if `controller_worker.py` is refactored.\n\n**`kazoo\u003e\u003d2.6` minimum version may be too conservative**\n\n`kazoo\u003e\u003d2.6` (2018) is a very low lower bound. The OpenStack requirements files typically track `openstack/requirements` constraints. Confirm that this version is consistent with `upper-constraints.txt` in `openstack/requirements`. If the project already requires a newer minimum (e.g., for TLS/SASL features used via `jobboard_zookeeper_ssl_options`), tightening the bound would make the dependency more informative.\n\n**No reconnection strategy documented for `SessionExpiredError`**\n\nIf the ZooKeeper session expires (e.g., after a prolonged network partition), kazoo raises `SessionExpiredError` on subsequent operations. The current fix does not invalidate `self._client` in response, so future `job_board()` calls will continue to pass a broken client. This is arguably outside scope of this bug fix, but should be documented as a known limitation or filed as a follow-up bug.\n\n#### Nits 🟢\n\n**Missing newline at end of test file**\n\n`octavia/tests/unit/controller/worker/v2/test_taskflow_jobboard_driver.py` is missing a trailing newline. The diff shows `\\ No newline at end of file` on the last line. Most linters (and the `hacking` rules used by OpenStack) require a terminal newline.\n\n**Em dash in inline comment (cosmetic)**\n\n```python\n# Lazy import — kazoo is only required when this driver is selected\n```\n\nThe em dash (`—`) works but is slightly non-standard for Python code comments. An ASCII hyphen-dash or colon would be more conventional:\n\n```python\n# Lazy import: kazoo is only required when this driver is selected\n```\n\n---\n\n## Security Analysis\n\n*No security concerns identified.* The ZooKeeper SSL/TLS options are passed through from `CONF.task_flow.jobboard_zookeeper_ssl_options` unchanged, which is the same behaviour as before. The change does not introduce new configuration options, credential handling, or network endpoints. The shared `KazooClient` is accessible only within the `ZookeeperTaskFlowDriver` instance, reducing (not expanding) the attack surface compared to creating multiple short-lived clients.\n\n---\n\n## Documentation Review\n\n- **Docstrings**: ✅ Good — `_ensure_client()`, `shutdown()` (both base and override) have clear, concise docstrings.\n- **Code Comments**: ✅ Good — The lazy-import rationale is explained inline; locking intent is clear from the `with self._client_lock:` idiom.\n- **Commit Message**: ✅ Good — Excellent; describes problem, solution, design tradeoffs, and shutdown propagation chain. Follows OpenStack `Closes-Bug` / `Change-Id` conventions.\n- **Release Notes**: ✅ Included — Accurate description of the bug and fix with correct Launchpad link.\n\n---\n\n## Changes Since Previous Review\n\n\u003e **Note**: The previous patchset reference in the review prompt was an unfilled template placeholder (`{previous_patchset}` / `{previous_review_content}`). No prior review content was available for comparison. This review is therefore a full first-pass assessment of PS 2.\n\u003e\n\u003e If a PS 1 review exists in another channel, the key PS 2 improvements to verify would be: addition of the concurrency test, shutdown propagation chain through `ConsumerService`, and the `kazoo\u003e\u003d2.6` test-requirements entry.\n\n---\n\n## Final Verdict\n\n**Overall Assessment**: This is a high-quality, production-ready fix to a real and impactful operational bug. The design is well-structured, thread-safe, and backward-compatible. One major correctness issue (returning `_client` outside the lock in `_ensure_client`) should be addressed before merge to eliminate a narrow but real race condition. All other concerns are minor or nits.\n\n**Recommendation**:\n🔄 **Request Changes** (Issues must be addressed)\n\n**Confidence Level**: High\nThe code is readable and well-documented; the single blocking concern (lock scope in `_ensure_client`) is clearly identifiable and has a straightforward fix. Once addressed, this change should be in excellent shape for approval.\n\n---\n\n## Backport Recommendation\n\n**Recommendation:** ⚠️ Insufficient information\n\n**Rationale:** No backport target branches are configured for this project in the review harness, and no local triage report is available for bug #2144800. The bug (`kazoo.exceptions.ConnectionLoss` from session churn) is an operational regression that affects any deployment using `ZookeeperTaskFlowDriver`. If the affected code path (`job_board()` call inside a `with` block in `_extend_jobs()`) is present in stable branches (likely `stable/2024.2` and `stable/2024.1`), a backport would be warranted given the severity. Manual inspection of the stable branch code or a Launchpad triage report (https://bugs.launchpad.net/octavia/+bug/2144800) is needed to confirm affected branches before recommending a specific backport target.\n\n---\n\n## Next Steps\n\n1. **Author**: Fix `_ensure_client()` to return `self._client` inside the `with self._client_lock:` block (Major Issue).\n2. **Author**: Add trailing newline to `test_taskflow_jobboard_driver.py` (Nit).\n3. **Author**: Consider adding a `ControllerWorker.shutdown()` unit test for the two branches (attribute present vs. absent).\n4. **Reviewer**: Verify that `kazoo\u003e\u003d2.6` aligns with `openstack/requirements` upper-constraints for current supported branches.\n5. **Follow-up bug**: Consider filing a separate bug/blueprint for `SessionExpiredError` handling / client invalidation logic in `ZookeeperTaskFlowDriver`.\n6. **Backport**: Once merged to main, assess stable/2024.2 and stable/2024.1 for the same `job_board()`-inside-`with` pattern and backport if confirmed affected.\n\n---\n\n*Generated by Claude Code Review Agent*\n\n---\n*This review was generated by an AI and may contain errors.*","accounts_in_message":[],"_revision_number":2},{"id":"f5378b23d15e4704919afc10db62d55c9af90941","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-16 14:57:53.000000000","message":"Uploaded patch set 3.","accounts_in_message":[],"_revision_number":3},{"id":"b6812a30b61d272e7b4331e6d3194ba33647a4d2","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-16 15:01:19.000000000","message":"Patch Set 3:\n\n(1 comment)","accounts_in_message":[],"_revision_number":3},{"id":"46c2532f8457461f5aa935011c2072c1c6257a64","tag":"autogenerated:claude-review","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-16 15:03:48.000000000","message":"Patch Set 3:\n\n(1 comment)\n\n*Reviewed by claude-sonnet-4-6*\n\n# Code Review: openstack/octavia - Change #993556\n\n**Gerrit URL**: https://review.opendev.org/c/openstack/octavia/+/993556\n**Patchset**: 3\n**Reviewed**: 2026-06-16 16:00:48\n**Reviewer**: claude-sonnet-4-6\n**Previous Patchset**: 2\n\n---\n\n## Change Summary\n\nThis change fixes a ZooKeeper session churn bug in `ZookeeperTaskFlowDriver`\nwhere a new `KazooClient` was created and immediately destroyed on every\n`_extend_jobs()` poll cycle (~every 8 seconds). The fix refactors the driver\nto hold a single shared `KazooClient` for its entire lifetime, using a lazy\ninitialisation pattern (`_ensure_client()`) guarded by a `threading.Lock`.\nA new `shutdown()` hook propagates from `ConsumerService.terminate()` through\n`ControllerWorker.shutdown()` to the driver, finalising the client cleanly on\nSIGTERM.\n\n**Files Modified**: 7\n**Lines Added**: +238\n**Lines Removed**: -9\n\n### Commit Message\n```\nFix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nBug refs: #2144800\n```\n\n### Purpose\nFixes Launchpad bug #2144800: the original code opened and closed a fresh\n`KazooClient` every ~8 seconds because `job_board()` (which created the\nclient) was called inside a `with` context manager in `_extend_jobs()`.\nEach create/destroy cycle consumed a ZooKeeper session slot, causing\n`kazoo.exceptions.ConnectionLoss` noise in operator logs and wasting\ncluster resources.\n\n### Scope\n- `octavia/controller/queue/v2/consumer.py` — shutdown propagation from\n  the cotyledon service layer\n- `octavia/controller/worker/v2/controller_worker.py` — shutdown delegation\n  to the jobboard driver\n- `octavia/controller/worker/v2/taskflow_jobboard_driver.py` — core fix:\n  singleton `KazooClient` with lock-guarded lifecycle\n- Corresponding unit tests and a reno release note\n\n---\n\n## Changes Since Previous Review\n\nNo previous review content was available in the template parameters\n(`{previous_review_content}` was not substituted). This review therefore\ntreats PS 3 as a standalone review. Key observations for PS 3:\n\n- **New ZooKeeper test class** (`TestZookeeperTaskFlowDriver`) was added —\n  a significant improvement in coverage for the new code path.\n- **`test-requirements.txt`** gains `kazoo\u003e\u003d2.6` — needed to import\n  `taskflow.utils.kazoo_utils` in tests.\n- **Idempotent-shutdown test** and a **concurrent-client test** are present\n  — good regression coverage.\n- **Critical regression introduced in PS 3**: the two new tests for\n  `ControllerWorker.shutdown()` are defined at *module scope* instead of\n  inside the `TestControllerWorker` class; they will never be executed by\n  the test runner (see Critical Issues below).\n\n---\n\n## Test Results\n\n_No test commands configured._\n\n---\n\n## Code Analysis\n\n### Overall Assessment\nThe production fix itself is technically sound: the singleton-client\napproach with a `threading.Lock` is the right solution, the lazy init\npattern correctly avoids hard-wiring ZooKeeper as a startup dependency,\nand the shutdown propagation chain is clean. However, the two new\n`ControllerWorker` unit tests are broken due to a severe indentation\nerror — they are module-level functions and will never run, giving false\nconfidence in coverage. This must be corrected before merge.\n\n### Strengths\n- **Correct concurrency model**: `threading.Lock` guards both creation and\n  finalisation; the double-check-if-None pattern inside the lock is\n  correct (no TOCTOU race).\n- **Lazy initialisation**: deferring `KazooClient` creation to the first\n  `job_board()` call preserves startup resilience — a temporarily\n  unavailable ZooKeeper does not block the worker from starting.\n- **Clean shutdown chain**: `ConsumerService.terminate()` →\n  `ControllerWorker.shutdown()` → driver `shutdown()` is minimal and\n  does not require callers to know which driver is in use.\n- **No-op base class `shutdown()`**: Redis and Etcd drivers require zero\n  changes, keeping the diff scoped.\n- **Good test coverage for the driver itself**: lazy init, reuse,\n  concurrency, idempotent shutdown, and pre-job-board shutdown are all\n  tested in `TestZookeeperTaskFlowDriver`.\n- **Release note included**: the reno entry accurately describes the bug\n  and its resolution.\n\n### Issues Found\n\n#### Critical Issues 🔴\n\n**`test_controller_worker.py` — new tests at module scope (never executed)**\n\nBoth `test_shutdown_delegates_to_jobboard_driver` and\n`test_shutdown_safe_without_jobboard_driver` are defined at column 0\n(module level) immediately after the closing line of the final method in\n`TestControllerWorker` (line 2513). They are *not* indented inside the\nclass. The test runner (stestr/unittest) only collects `TestCase` methods,\nso these functions are silently skipped. The code they are intended to\nvalidate (`ControllerWorker.shutdown()`) has zero executed test coverage.\n\nAdditionally, the file is missing a trailing newline (diff shows\n`\\ No newline at end of file`), which is a PEP 8 / hacking violation and\nwill fail `pep8` / `flake8` checks.\n\n#### Major Issues 🟡\n\n**`_ensure_client()` — no cleanup if `client.start()` raises**\n\nIf `client.start()` throws (e.g., ZooKeeper is unreachable and kazoo\nraises immediately rather than retrying), `self._client` is never set but\nthe partially-initialised `client` object is leaked — `finalize_client()`\nwill never be called on it. A try/except around the start call should\neither store None or call `finalize_client()` on the failed client before\nre-raising.\n\n**`job_board()` — `hosts` key in `jobboard_backend_conf` is redundant when\na pre-connected `client` is supplied**\n\n```python\njobboard_backend_conf \u003d {\n    \u0027board\u0027: \u0027zookeeper\u0027,\n    \u0027hosts\u0027: self._hosts_str,   # \u003c-- may be ignored or may cause a\n                                #     second connection attempt\n    ...\n}\nreturn job_backends.backend(..., client\u003dself._ensure_client())\n```\n\nWhen taskflow\u0027s ZooKeeper backend receives an explicit `client\u003d`, it\nshould use that client and ignore `hosts`. However, this relies on\nundocumented internal taskflow behaviour. If a future taskflow version\nchanges this, passing both could cause a new connection to be opened,\nre-introducing the bug. Removing `hosts` from `jobboard_backend_conf`\nwhen an explicit client is supplied would make the intent unambiguous.\n\n#### Minor Issues / Suggestions 🔵\n\n**`shutdown()` — no logging at the driver level**\n\n`ZookeeperTaskFlowDriver.shutdown()` calls `finalize_client()` silently.\nA `LOG.debug(\"Finalising shared KazooClient\")` line (mirroring the style\nin the rest of the file) would aid operator troubleshooting and make it\neasier to confirm clean shutdown in test environments.\n\n**`_ensure_client()` — lock held during `client.start()` (potential\ncontention)**\n\nHolding `_client_lock` while `client.start()` blocks on ZooKeeper\nconnection means all concurrent `job_board()` callers are serialised for\nthe full duration of the first connection. For typical deployments this is\nfine (~seconds at most), but it is worth a comment explaining the\nintentional trade-off so future readers do not refactor it to a\ndouble-checked locking pattern that releases the lock before `start()`.\n\n**`ControllerWorker.shutdown()` — `getattr` guard is unconventional**\n\n```python\ndef shutdown(self):\n    if getattr(self, \u0027jobboard_driver\u0027, None):\n        self.jobboard_driver.shutdown()\n```\n\nUsing `getattr` suggests `jobboard_driver` may not exist as an attribute.\nChecking at initialisation time (e.g., `self.jobboard_driver \u003d None` when\njobboard is disabled) and then `if self.jobboard_driver:` would be clearer\nand more idiomatic.\n\n#### Nits 🟢\n\n- `test_taskflow_jobboard_driver.py` line 392: `mock_make_client.call_args[0][0]`\n  — prefer `mock_make_client.call_args.args[0]` (Python 3.8+ style, used\n  elsewhere in the test suite).\n- The blank line removed between `class ZookeeperTaskFlowDriver` and\n  `def __init__` is a style deviation from all other driver classes in the\n  file (each has a blank line after the class definition line). Restore for\n  consistency.\n\n---\n\n## Security Analysis\n\n*No security concerns identified.* The ZooKeeper TLS configuration is\npassed through from `CONF.task_flow.jobboard_zookeeper_ssl_options` as\nbefore; no credentials are logged or exposed by this change. The\n`threading.Lock` correctly prevents race conditions that could otherwise\nresult in multiple clients being created or a client being finalised while\nin use.\n\n---\n\n## Documentation Review\n\n- **Docstrings**: ✅ Good — `_ensure_client()`, `shutdown()` (base and\n  override), and the class-level laziness comment are clear and accurate.\n- **Code Comments**: ✅ Good — the inline comment explaining the deferred\n  kazoo import is helpful.\n- **Commit Message**: ✅ Good — explains the root cause, the fix, the startup\n  resilience preservation, and the thread-safety rationale. Follows\n  OpenStack format with `Closes-Bug`.\n- **Release Notes**: ✅ Included — the reno entry in\n  `fix-zookeeper-session-churn-51245a1f9a6c3702.yaml` accurately\n  describes the bug and fix.\n\n---\n\n## Final Verdict\n\n**Overall Assessment**: The production-code fix is correct and well-designed,\nbut the two new `ControllerWorker` unit tests are broken — they are defined\nat module scope and will never execute, leaving critical code paths untested\nand giving false CI confidence.\n\n**Recommendation**:\n🔄 **Request Changes** (Issues must be addressed)\n\n**Confidence Level**: High\nThe module-scope indentation bug is unambiguous (confirmed by reading the\nfile; `grep -n \"^class Test\"` shows only one `TestCase` at line 123, and the\nnew `def` lines start at column 0). The production logic is solid; only the\ntest file requires mandatory correction before this change should merge.\n\n---\n\n## Backport Recommendation\n\n**Recommendation:** ⚠️ Insufficient information\n\n**Rationale:** No backport target branches were configured for this review\nrun (the `backport_branches` setting is empty). The underlying bug\n(#2144800 — continuous ZooKeeper session churn) is a correctness/stability\nregression affecting any deployment using the ZooKeeper jobboard backend,\nsuggesting it would be appropriate to backport to supported stable branches\nonce that information is available. The reviewer recommends checking whether\nthe faulty code path is present in `stable/2024.2` and `stable/2024.1`\nbefore marking those branches for backport.\n\n---\n\n## Next Steps\n\n---\n*This review was generated by an AI and may contain errors.*","accounts_in_message":[],"_revision_number":3},{"id":"c5a395702af72c688683e039a60a8623e41923f2","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-16 15:47:05.000000000","message":"Uploaded patch set 4.","accounts_in_message":[],"_revision_number":4},{"id":"8ea7e8355f3cb778489936be45467f8913ca12fa","tag":"autogenerated:claude-review","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-16 16:04:13.000000000","message":"Patch Set 4:\n\n(3 comments)\n\n*Reviewed by claude-sonnet-4-6*\n\n# Code Review: openstack/octavia - Change #993556\n\n**Gerrit URL**: https://review.opendev.org/c/openstack/octavia/+/993556\n**Patchset**: 4\n**Reviewed**: 2026-06-16 17:00:36\n**Reviewer**: claude-sonnet-4-6\n**Patchset 3**\n\n---\n\n## Change Summary\n\nThis change fixes a ZooKeeper session churn bug in `ZookeeperTaskFlowDriver` where a new `KazooClient` was being created and immediately destroyed on every `_extend_jobs()` cycle (~every 8 seconds). The fix holds a single `KazooClient` for the driver\u0027s lifetime, using lazy initialisation and a threading lock for concurrency safety. A new `shutdown()` method propagates client cleanup on SIGTERM through `ConsumerService.terminate()` → `ControllerWorker.shutdown()` → driver `shutdown()`.\n\n**Files Modified**: 7\n**Lines Added**: +257\n**Lines Removed**: -8\n\n### Commit Message\n```\nFix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nBug refs: #2144800\n```\n\n### Purpose\nFixes bug #2144800: continuous `kazoo.exceptions.ConnectionLoss` errors in the Octavia worker log caused by a new `KazooClient` being created and torn down every ~8 seconds inside `_extend_jobs()`. Each short-lived client triggered a full ZooKeeper session establishment/teardown cycle, creating noise in ZK server logs and intermittent connection failures during LB operations.\n\n### Scope\n- `octavia/controller/worker/v2/taskflow_jobboard_driver.py` — core fix (persistent client)\n- `octavia/controller/worker/v2/controller_worker.py` — adds `shutdown()` delegation\n- `octavia/controller/queue/v2/consumer.py` — propagates `shutdown()` call on SIGTERM\n- Tests for all three modified modules\n- Release note\n- `kazoo` added to `test-requirements.txt`\n\n---\n\n## Test Results\n\n_No test commands configured._\n\n---\n\n## Code Analysis\n\n### Overall Assessment\n\nThe fix is correct, well-structured, and follows sound engineering principles: lazy initialisation preserves existing startup-resilience behaviour, the `threading.Lock` is held across the full `client.start()` call to prevent races, and the shutdown chain is clean. The change is minimal in scope — Redis and Etcd drivers are unaffected by design. Test coverage for the new ZooKeeper driver behaviour is comprehensive and includes concurrency testing.\n\n### Strengths\n- **Root cause correctly identified and fixed**: Persistent `KazooClient` eliminates session churn. Passing `client\u003d` to `job_backends.backend()` is the correct taskflow API to use an externally-managed connection.\n- **Lazy initialisation preserves start-up resilience**: A ZooKeeper outage at process start doesn\u0027t prevent the worker from launching, matching previous behaviour.\n- **Lock held through `client.start()`**: The comment explaining why the lock covers the full connection setup (preventing N concurrent first-callers from each creating a client) is accurate and helpful.\n- **Cleanup on failure in `_ensure_client()`**: The `try/except` around `client.start()` correctly calls `finalize_client()` before re-raising, so a half-started client is never leaked.\n- **Idiomatic shutdown chain**: Using `AttributeError` guard in `consumer.py` mirrors the existing `executor.shutdown()` pattern in the same block — consistent and safe.\n- **Comprehensive unit tests**: Covers lazy init, client reuse, concurrent access (real `ThreadPoolExecutor`), shutdown idempotency, shutdown-before-use, and failure-during-start cleanup.\n- **Release note included**: Accurate description with bug reference and RST link.\n- **`kazoo` correctly moved to `test-requirements.txt`**: Required now that tests directly patch `taskflow.utils.kazoo_utils`.\n\n### Issues Found\n\n#### Critical Issues 🔴\n\n*None identified.*\n\n#### Major Issues 🟡\n\n- **SSL options passed twice to the ZooKeeper backend**: In `job_board()`, `jobboard_backend_conf` is updated with `CONF.task_flow.jobboard_zookeeper_ssl_options` even though the same options were already applied to the `KazooClient` during `_ensure_client()`. When taskflow\u0027s `ZookeeperJobBoard` receives an external `client\u003d` argument it should ignore board-level SSL config (since the client already has TLS configured), but this is an implementation detail of taskflow that may not be guaranteed across versions. At minimum it is confusing to maintainers. Consider removing the `jobboard_backend_conf.update(...)` line in `job_board()` when a shared client is in use, or add a comment explaining why the duplication is intentional/harmless.\n\n#### Minor Issues / Suggestions 🔵\n\n- **Missing blank line before new test methods in `test_controller_worker.py`** (line 2513→2514): `test_shutdown_delegates_to_jobboard_driver` starts immediately after the closing parenthesis of the previous test method\u0027s assertion, with no blank line separator. OpenStack\u0027s `hacking`/flake8 checks enforce E301 (expected 1 blank line before a nested definition). This will likely fail the pep8 gate.\n\n- **No test for `JobboardTaskFlowDriver.shutdown()` no-op base class method**: The base-class `shutdown()` (the no-op) is exercised indirectly by the ZooKeeper driver tests but never explicitly. Given the design intent that Redis/Etcd drivers inherit this no-op, a brief unit test in `TestRedisTaskFlowDriver` or `TestEtcdTaskFlowDriver` that calls `driver.shutdown()` and asserts it doesn\u0027t raise would document the contract explicitly.\n\n- **`jobboard_driver` attribute set before conditional block**: In `controller_worker.py` line 73, `self.jobboard_driver \u003d None` is assigned unconditionally, then reassigned inside the `if CONF.task_flow.jobboard_enabled:` block. The assignment is correct and avoids an `AttributeError` in `shutdown()`, but a brief comment explaining the `None` sentinel would aid readability — the existing code initialises all other repos inline, making this pattern stand out.\n\n#### Nits 🟢\n\n- **British vs American English in log message**: `taskflow_jobboard_driver.py` line 123: `\"Finalising shared KazooClient\"` — OpenStack conventions (and the rest of the codebase) use American English. Should be `\"Finalizing shared KazooClient\"`.\n\n---\n\n## Security Analysis\n\n*No security concerns identified.* The change does not introduce new network endpoints, credential handling, or privilege escalation paths. The `KazooClient` uses the same SSL options as before; they are now applied once at client creation rather than per-call, which is strictly safer (fewer connection handshakes, smaller attack surface). The `threading.Lock` prevents TOCTOU races on client creation and teardown.\n\n---\n\n## Documentation Review\n\n- **Docstrings**: ✅ Good — `JobboardTaskFlowDriver.shutdown()` has a clear docstring explaining the no-op default and the override contract.\n- **Code Comments**: ✅ Good — The `_ensure_client()` comment explaining why the lock is held through `client.start()` is particularly valuable.\n- **Commit Message**: ✅ Good — Describes the bug, the fix mechanism, the lazy-init design decision, the shutdown chain, and the kazoo import deferral. Follows OpenStack format with `Closes-Bug`.\n- **Release Notes**: ✅ Included — Accurate, concise, includes bug reference with RST hyperlink.\n\n---\n\n## Final Verdict\n\n**Overall Assessment**: This is a sound, well-reasoned fix for a real operational bug. The design choices (lazy init, lock held through `start()`, no-op base class, explicit shutdown chain) are all correct. There is one pep8 violation that will block the gate and one SSL-duplication concern worth addressing before merge.\n\n**Recommendation**:\n🔄 **Request Changes** (Issues must be addressed)\n\nThe blocking item is the **missing blank line** before `test_shutdown_delegates_to_jobboard_driver` in `test_controller_worker.py` (pep8 gate failure). The **SSL options duplication** in `job_board()` is worth a clarifying comment at minimum. Both are straightforward single-line fixes.\n\n**Confidence Level**: High\nFull file reads were performed on all modified production and test files. The concurrency behaviour, shutdown chain, and taskflow API usage are consistent with how the rest of the codebase interacts with these components.\n\n---\n\n## Backport Recommendation\n\n**Recommendation:** ⚠️ Insufficient information\n\n**Rationale:** No backport target branches are configured for this repository in the review agent\u0027s settings, and no local triage report is available for bug #2144800 to confirm which stable branches are affected. Given the bug causes continuous `ConnectionLoss` errors during normal LB operations (high operational impact), a backport to recent stable branches (e.g., stable/2024.2, stable/2024.1) should be evaluated manually. The fix is non-invasive (no schema changes, no new config options, no API changes) and is a strong candidate for backport once the gate issues are resolved.\n\n---\n\n## Next Steps\n\n1. **Author**: Add a blank line before `test_shutdown_delegates_to_jobboard_driver` in `test_controller_worker.py` (line 2514) to fix the E301 pep8 violation.\n2. **Author**: Address the SSL options duplication in `job_board()` — either remove the `jobboard_backend_conf.update(CONF.task_flow.jobboard_zookeeper_ssl_options)` line (preferred, since the client already carries SSL config) or add an explanatory comment if it must be retained.\n3. **Author**: Optionally fix the `\"Finalising\"` → `\"Finalizing\"` spelling nit and add a clarifying comment on the `self.jobboard_driver \u003d None` sentinel.\n4. **Reviewers**: After pep8 gate passes, verify the SSL duplication behaviour against the taskflow ZooKeeper board implementation to confirm `jobboard_backend_conf` SSL options are truly ignored when an external `client\u003d` is provided.\n5. **Team**: Consider evaluating backport eligibility to stable/2024.2 and stable/2024.1 given the operational impact of the original bug.\n\n---\n\n*Generated by Claude Code Review Agent*\n\nEND OF REPORT\n\n---\n*This review was generated by an AI and may contain errors.*","accounts_in_message":[],"_revision_number":4},{"id":"e7d9d5ab71a714adbb3a0ae07cc6c5d80a963298","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-16 18:27:56.000000000","message":"Patch Set 4: Verified-1\n\n(3 comments)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/50200b8918fe48c5b28ba896094ef53f\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/15de43cb87d14c5e87d2107a7ed02d9d : SUCCESS in 4m 41s\n- requirements-check https://zuul.opendev.org/t/openstack/build/2b4cc69ecb0c434e8093566dccab58c5 : SUCCESS in 2m 24s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/f2ce0ab03cfa4b2084cbc305cfd74b17 : SUCCESS in 5m 33s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/33a5f16e20064877bd484c715261d48b : FAILURE in 2m 42s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/5612e57c13a942bdb2eb7b47ad569d7b : SUCCESS in 4m 36s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/4fc3729ba70f48d981a9135347c024c3 : SUCCESS in 6m 48s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/cf3a6bf8c9494041932ae58169331b92 : SUCCESS in 8m 06s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/2399be3ba6e24d93822b390d43107615 : SUCCESS in 13m 26s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/9cc01be219974c6e9e54aeeea7317419 : SUCCESS in 4m 03s\n- octavia-tox-py313-tips https://zuul.opendev.org/t/openstack/build/53ea945056604c3299b175821d318e80 : SUCCESS in 7m 44s\n- octavia-tox-functional-py313-tips https://zuul.opendev.org/t/openstack/build/607d961c01064d23a15cfca4f7957b8f : SUCCESS in 3m 34s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/502f466271a5448783971d1c77973483 : SUCCESS in 2m 15s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/4ea8d3ed59bc49de98ff7d904aa9048c : SUCCESS in 7m 03s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/0df8e9873be440c98d3318a452853b8d : SUCCESS in 37m 24s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/ac0698b356154288a234a56342837ffc : SUCCESS in 1h 35m 57s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/10b9b726d8d146feb26066e279a6938d : SUCCESS in 1h 04m 48s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/424a58dd49c84ba0a8ffd4e01f242b28 : SUCCESS in 1h 41m 21s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/97ff57008caa4d66ba29056d6c552912 : SUCCESS in 1h 13m 46s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/3bc4cfce6b0449ce87c2f29b1b33bd94 : SUCCESS in 40m 36s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/435ca672ee3f43468debb5ed975ec628 : SUCCESS in 51m 13s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/f3af0f2c446647b283bca9ad59500c26 : FAILURE in 34m 58s\n- octavia-v2-act-stdby-dsvm-scenario https://zuul.opendev.org/t/openstack/build/1843d7c633d34d16b6feaf2ae30fc45b : SUCCESS in 34m 40s (non-voting)\n- octavia-v2-dsvm-cinder-amphora https://zuul.opendev.org/t/openstack/build/449bac3532f34fa0a2928c32369d7425 : SUCCESS in 34m 38s (non-voting)\n- octavia-v2-dsvm-scenario-two-node https://zuul.opendev.org/t/openstack/build/ca40612767ff4f43858e3a80dcefe4f6 : SUCCESS in 2h 38m 23s (non-voting)\n- octavia-v2-dsvm-scenario-ipv6-only https://zuul.opendev.org/t/openstack/build/02f4a668e88e4ed3ac42955f7e81f6c3 : SUCCESS in 1h 33m 56s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-traffic-ops https://zuul.opendev.org/t/openstack/build/68a394f7a6ff498b98146e25a6c4bc7c : SUCCESS in 1h 26m 00s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-non-traffic-ops https://zuul.opendev.org/t/openstack/build/1558c57e57a04fe197921fe8033ae02d : SUCCESS in 1h 06m 33s (non-voting)","accounts_in_message":[],"_revision_number":4},{"id":"1a9fddcdcc6a06388f1f182ecadade7e66b5d23c","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-17 06:57:47.000000000","message":"Uploaded patch set 5.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":5},{"id":"169fa7233e2a4a59803d87295240fa495ddd7c80","tag":"autogenerated:claude-review","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-17 07:02:46.000000000","message":"Patch Set 5:\n\n*Reviewed by claude-sonnet-4-6*\n\n# Code Review: openstack/octavia - Change #993556\n\n**Gerrit URL**: https://review.opendev.org/c/openstack/octavia/+/993556\n**Patchset**: 5\n**Reviewed**: 2026-06-17 08:00:30\n**Reviewer**: claude-sonnet-4-6\n**Patchset 4**\n\n---\n\n## Change Summary\n\nThis change fixes a continuous ZooKeeper session churn bug (LP #2144800) in\n`ZookeeperTaskFlowDriver`. Previously, `job_board()` created and immediately\nclosed a new `KazooClient` on every `_extend_jobs()` cycle (~every 8 seconds),\ncausing `kazoo.exceptions.ConnectionLoss` errors during load-balancer\noperations. The fix holds a single `KazooClient` for the driver\u0027s lifetime,\ncreated lazily with proper thread-safety and graceful cleanup on shutdown.\n\n**Files Modified**: 7\n**Lines Added**: +260\n**Lines Removed**: -11\n\n### Commit Message\n```\nFix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nBug refs: #2144800\n```\n\n### Purpose\nFixes LP bug #2144800: continuous ZooKeeper session churn every ~8 seconds\ncausing `ConnectionLoss` errors during active load-balancer operations,\ndegrading reliability of the taskflow jobboard in ZooKeeper-backed deployments.\n\n### Scope\n- `ZookeeperTaskFlowDriver` (core fix: persistent client lifecycle)\n- `ControllerWorker` (adds `shutdown()` delegation)\n- `ConsumerService.terminate()` (invokes `worker.shutdown()` on graceful stop)\n- Unit tests for both the driver and the worker\n- Release note for the bug fix\n- `test-requirements.txt` (adds `kazoo` for test-time imports)\n\n---\n\n## Test Results\n\n_No test commands configured._\n\n---\n\n## Code Analysis\n\n### Overall Assessment\n\nThis is a clean, well-scoped bug fix with a sound architectural approach. The\nlazy-initialisation + persistent-client pattern is the correct solution. The\nthreading model (lock held through `client.start()`) is deliberate and\nwell-documented. Test coverage is thorough and covers the key concurrency\nand edge-case scenarios.\n\n### Strengths\n\n- **Correct concurrency model**: `threading.Lock` held through `client.start()`\n  prevents multiple threads racing to create separate clients. The trade-off\n  (blocking other callers during the first connection) is intentional and\n  explained in a comment.\n- **Lazy startup**: Client is not created until first use, preserving the\n  original behaviour where ZooKeeper being temporarily unavailable at service\n  start does not prevent the worker from launching.\n- **Fail-safe cleanup in `_ensure_client`**: If `client.start()` raises,\n  `finalize_client()` is called before re-raising, preventing a resource leak.\n- **Idiomatic base-class no-op**: Adding `shutdown()` as a no-op on\n  `JobboardTaskFlowDriver` means Redis and Etcd drivers need zero changes.\n- **Defensive caller code**: Both `executor.shutdown()` and `worker.shutdown()`\n  in `ConsumerService.terminate()` are wrapped in `try/except AttributeError`,\n  consistent with the existing pattern.\n- **Excellent test suite**: Tests cover lazy creation, client reuse, concurrent\n  access, idempotent shutdown, shutdown-before-use, and error cleanup on\n  `start()` failure — all meaningful scenarios.\n- **Release note included**: Properly formatted reST release note linking the\n  bug.\n\n### Issues Found\n\n#### Critical Issues 🔴\n\n*None identified.*\n\n#### Major Issues 🟡\n\n- **Post-shutdown reconnection is possible** (`taskflow_jobboard_driver.py`,\n  `_ensure_client`): After `shutdown()` sets `self._client \u003d None`, a\n  subsequent call to `job_board()` (e.g. from a race at service stop) will\n  silently re-create and start a new `KazooClient`. Depending on how taskflow\n  handles jobs in-flight during shutdown, this could result in an orphaned\n  ZooKeeper session that is never cleaned up. A boolean `_shutdown` guard\n  (set under the lock in `shutdown()`, checked in `_ensure_client()`) would\n  make the intent explicit and prevent this case. This is a real-world edge\n  case at shutdown time, so not blocking for merge, but worth a follow-up\n  or a TODO comment.\n\n#### Minor Issues / Suggestions 🔵\n\n- **No test for `ConsumerService.terminate()` invoking `worker.shutdown()`**:\n  The new code path in `consumer.py` (lines 72–75) is not covered by a unit\n  test. Existing consumer tests may exercise `terminate()` but none appear to\n  assert that `e.worker.shutdown()` is called. A simple test with a mock\n  worker that has a `shutdown` method would close this gap.\n\n- **`kazoo` in `test-requirements.txt` only**: The production code performs a\n  deferred `from taskflow.utils import kazoo_utils` inside `__init__`. If\n  `taskflow.utils.kazoo_utils` itself has a hard import of `kazoo` at its\n  module level, an operator who installs Octavia without `kazoo` and then\n  configures the ZooKeeper jobboard driver will receive an `ImportError` only\n  at runtime (when the first `ZookeeperTaskFlowDriver` is instantiated).\n  The commit message acknowledges this is intentional (\"avoiding requiring\n  kazoo in non-ZooKeeper deployments\"), but the error message in that case\n  could be confusing. A `try/except ImportError` in `__init__` that raises a\n  friendlier `RuntimeError` (\"kazoo is required for the ZooKeeper jobboard\n  driver; install it with `pip install kazoo`\") would significantly improve\n  operator experience. This is a suggestion rather than a blocker.\n\n#### Nits 🟢\n\n- `taskflow_jobboard_driver.py` line 13: `import contextlib` is still\n  present and IS used by `MysqlPersistenceDriver.get_persistence()` — no\n  action needed, but worth confirming the import order still satisfies\n  `flake8-import-order` (stdlib → oslo → taskflow → local).\n\n- `test_taskflow_jobboard_driver.py` line 421: `test_job_board_reuses_client`\n  does not set a `return_value` on `mock_make_client`, so `self._client` will\n  be a `MagicMock`. Consider adding `mock_make_client.return_value \u003d\n  mock.Mock()` for consistency and to avoid accidental auto-speccing surprises.\n\n---\n\n## Security Analysis\n\n*No security concerns identified.* The change does not introduce new\nconfiguration options, credential handling, or network-facing interfaces.\nZooKeeper SSL options are passed through to `kazoo_utils.make_client()` as\nbefore. The persistent `KazooClient` does not change the security surface\ncompared to the (broken) per-call client approach.\n\n---\n\n## Documentation Review\n\n- **Docstrings**: ✅ Good — `shutdown()` on the base class has a clear docstring explaining its no-op default and the expected override contract.\n- **Code Comments**: ✅ Good — The inline NOTE in `_ensure_client()` explaining why the lock is held through `start()` is exactly the right level of detail.\n- **Commit Message**: ✅ Good — Follows OpenStack format, references the bug, explains root cause and fix strategy, and is appropriately detailed.\n- **Release Notes**: ✅ Included — Correctly placed in `releasenotes/notes/`, uses `fixes:` category, links the Launchpad bug.\n\n---\n\n## Final Verdict\n\n**Overall Assessment**: This is a correct, well-tested fix for a real operational\nbug. The architecture is sound — lazy init, persistent client, lock-guarded\nlifecycle — and the test suite covers the important edge cases. The only notable\ngap is the absence of a consumer-level test and the potential for a\npost-shutdown reconnect, neither of which is blocking.\n\n**Recommendation**:\n- ✅ **Approve** (Code is ready to merge)\n\n**Confidence Level**: High\nThe fix is straightforward, the diff is small and focused, the tests directly\nexercise the new logic including concurrency, and the release note is present.\nThe identified minor issues are suggestions for improvement rather than defects.\n\n---\n\n## Backport Recommendation\n\n**Recommendation:** ⚠️ Insufficient information\n\n**Rationale:** No backport target branches are configured for this review\nworkflow, and no local triage report is available for bug #2144800 to determine\nwhich stable branches contain the introducing commit. To make a concrete\nbackport recommendation: (1) identify the commit that introduced the\nper-call `KazooClient` creation pattern in `ZookeeperTaskFlowDriver`, then\n(2) run `git merge-base --is-ancestor \u003cintroducing_commit\u003e origin/\u003cstable_branch\u003e`\nfor each candidate stable branch. Given the bug causes `ConnectionLoss` errors\nduring normal LB operations, it is likely a good backport candidate to any\nstable branch that includes the ZooKeeper jobboard driver.\n\n---\n\n## Next Steps\n\n1. **Author**: Consider adding a `_shutdown` guard in `_ensure_client()` to\n   prevent silent reconnection after `shutdown()` — or at minimum add a TODO\n   comment describing the known edge case.\n2. **Author**: Add a unit test for `ConsumerService.terminate()` that asserts\n   `e.worker.shutdown()` is called on graceful stop.\n3. **Author (optional)**: Add a friendlier `ImportError` handler in\n   `ZookeeperTaskFlowDriver.__init__` for operators who have not installed\n   `kazoo`.\n4. **Reviewers**: Determine the backport target branches by checking which\n   stable branches contain the bug-introducing commit (see Backport\n   Recommendation above).\n\n---\n\n*Generated by Claude Code Review Agent*\n\nEND OF REPORT\n\n---\n*This review was generated by an AI and may contain errors.*","accounts_in_message":[],"_revision_number":5},{"id":"1230e68b8a33a46c40836f19d66b11e9bdd733bd","author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"date":"2026-06-17 08:15:32.000000000","message":"Patch Set 5:\n\n(1 comment)","accounts_in_message":[],"_revision_number":5},{"id":"04998a3236307a1fe7a09e9283f48031607b95a8","author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"date":"2026-06-17 08:34:31.000000000","message":"Patch Set 5: Backport-Candidate+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":5},{"id":"6862796693bfddcf94e65a11df8725a23cc49e0c","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-17 09:40:55.000000000","message":"Patch Set 5: Verified-1\n\n(2 comments)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/405ccaa554f94f54a1e4ecde97917f2d\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/e484365a4c5f4b0fbe2092ee2b12cd99 : SUCCESS in 7m 45s\n- requirements-check https://zuul.opendev.org/t/openstack/build/9fe84b9d0702498886ce8ccb86408e64 : SUCCESS in 2m 18s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/bdd5014c855647319c92a411bf467371 : SUCCESS in 8m 14s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/2f8e359d82024a1f970ae92fb6430946 : FAILURE in 4m 05s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/27848228e23a422b8bfec3516d0eec48 : SUCCESS in 4m 36s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/accdeef467b948b58fcd50b94d1497e6 : SUCCESS in 5m 20s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/c85c95b6443d4e949954bb8a30eccc89 : SUCCESS in 7m 13s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/f7f7842121e041769d370ec763994931 : SUCCESS in 13m 14s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/e6d41099827547e79acc186dcb073d6c : SUCCESS in 9m 26s\n- octavia-tox-py313-tips https://zuul.opendev.org/t/openstack/build/3ba71ebb46f742e39a820148ae7a6ba9 : SUCCESS in 4m 45s\n- octavia-tox-functional-py313-tips https://zuul.opendev.org/t/openstack/build/8cf05c1ae91b44cb99ac890f3cdf78f0 : SUCCESS in 5m 38s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/4e4e4a2f5c984272a80aa5456ddec927 : SUCCESS in 2m 01s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/65142a002fc341668d6e65357617211a : SUCCESS in 3m 07s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/d093e8a81b54440f8d025ebf38173e4b : SUCCESS in 1h 13m 54s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/6cda70b3dd6e4cb49a750932243f9718 : SUCCESS in 1h 31m 34s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/a302b883b451476abe09867133adf356 : SUCCESS in 58m 04s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/5e5b5d45de304c52912a6fde98fef288 : SUCCESS in 1h 34m 21s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/0913df5979e64ecf808a00649eda816e : SUCCESS in 1h 09m 18s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/6dceeaed43f74f2dbed04d3f39ba254d : SUCCESS in 40m 40s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/a94411bca8704b44a1dfbfac8460e302 : SUCCESS in 47m 06s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/dda9bd9c5e0a44fba7d7e1b3f745fc4e : SUCCESS in 40m 50s\n- octavia-v2-act-stdby-dsvm-scenario https://zuul.opendev.org/t/openstack/build/8c629ea95da54f699a44e6909c3d1cbc : SUCCESS in 37m 19s (non-voting)\n- octavia-v2-dsvm-cinder-amphora https://zuul.opendev.org/t/openstack/build/3902a004d43940078a5e56f5519d5320 : SUCCESS in 33m 41s (non-voting)\n- octavia-v2-dsvm-scenario-two-node https://zuul.opendev.org/t/openstack/build/d0258c9d9ed64c6bb61907e65e20a77a : SUCCESS in 2h 41m 39s (non-voting)\n- octavia-v2-dsvm-scenario-ipv6-only https://zuul.opendev.org/t/openstack/build/40c9410930244abd997669e1cf19b981 : SUCCESS in 1h 28m 20s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-traffic-ops https://zuul.opendev.org/t/openstack/build/5cc0a09b05904b399eced44e79d04589 : FAILURE in 1h 36m 12s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-non-traffic-ops https://zuul.opendev.org/t/openstack/build/bcab1278695d45988f7236dce7849cd7 : SUCCESS in 1h 11m 52s (non-voting)","accounts_in_message":[],"_revision_number":5},{"id":"d3883270bb968963d7d95ecd5581d63d1956f88a","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-17 09:48:39.000000000","message":"Patch Set 5:\n\n(1 comment)","accounts_in_message":[],"_revision_number":5},{"id":"01735b93d29c7d0bd73c0b98b275b8aea5b3a602","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-17 10:46:27.000000000","message":"Uploaded patch set 6.\n\nOutdated Votes:\n* Backport-Candidate+1 (copy condition: \"changekind:NO_CODE_CHANGE OR changekind:TRIVIAL_REBASE\")\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":6},{"id":"6a7ca3be70a1baea8130107ff1fa21748c3c0f5f","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-17 11:30:52.000000000","message":"Uploaded patch set 7.","accounts_in_message":[],"_revision_number":7},{"id":"25fe83a2d2d170a295f07ab6e62414bec5d3a56f","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-17 11:49:54.000000000","message":"Uploaded patch set 8.","accounts_in_message":[],"_revision_number":8},{"id":"9339c2f3470e9dac598d34adab8892b92f1af6b1","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-17 12:36:36.000000000","message":"Patch Set 8:\n\n(2 comments)","accounts_in_message":[],"_revision_number":8},{"id":"ecb8aa677b5e3603dd3c2c40edae1c9fec916780","author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"date":"2026-06-17 12:42:02.000000000","message":"Patch Set 8:\n\n(1 comment)","accounts_in_message":[],"_revision_number":8},{"id":"6e1709da5b37160b4520badc4d264dd8173189b3","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-17 13:04:18.000000000","message":"Patch Set 8:\n\n(1 comment)","accounts_in_message":[],"_revision_number":8},{"id":"8ba413bc2c603de068c832fd3d49e25bf376ffb2","author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"date":"2026-06-17 13:08:23.000000000","message":"Patch Set 8:\n\n(1 comment)","accounts_in_message":[],"_revision_number":8},{"id":"d486d8d2ee52975025effb3c654e047eccc63a55","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-17 13:15:27.000000000","message":"Patch Set 8:\n\n(2 comments)","accounts_in_message":[],"_revision_number":8},{"id":"fff39d8fa254ccf43aef45fd90befef0d2e0780f","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-17 14:28:10.000000000","message":"Patch Set 8: Verified-1\n\n(2 comments)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/84574fea728e41d684d3b091c88d1acf\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/7952beb279b44b8bbaa3d20c16507fcf : SUCCESS in 6m 04s\n- requirements-check https://zuul.opendev.org/t/openstack/build/5bb5f53c9c764e5091752279947cbd59 : SUCCESS in 2m 07s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/883ee0c630324affaf91812df974ed7d : SUCCESS in 9m 58s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/e7de80f1e6584b8990f2cff2ef4af193 : FAILURE in 4m 18s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/e9488a9ac66a45369fe877075b2a516d : SUCCESS in 4m 24s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/5ff5632e3a6e48abb29025c90b566227 : SUCCESS in 4m 25s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/389045f341fe47ec8157466e5c039264 : SUCCESS in 7m 02s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/9fc4d15391104146909490f769e32fb2 : SUCCESS in 12m 25s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/44489da0655143aaada038b5b9d3f6d9 : SUCCESS in 8m 44s\n- octavia-tox-py313-tips https://zuul.opendev.org/t/openstack/build/c678ec876c424e2281d43e0b948b9bd9 : SUCCESS in 5m 37s\n- octavia-tox-functional-py313-tips https://zuul.opendev.org/t/openstack/build/5c8c8a5df362468b899a367101f980f8 : SUCCESS in 5m 43s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/8f8fb6d449f446e2a064916eb0ee88fc : SUCCESS in 3m 52s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/f509539421c74b998f315c53e665309c : SUCCESS in 6m 41s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/0da71eafa0f64132ba78e4cf955750c2 : SUCCESS in 1h 08m 10s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/f5ee34918a8a4a969113bef43944dd3a : SUCCESS in 1h 36m 40s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/aa7c625207814e0b930a15022b7b23a9 : SUCCESS in 56m 59s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/a7ca1a42d9a84ee1ba3e4b971425ced7 : SUCCESS in 1h 34m 07s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/dc2ac1b50ed44f9bad3934d177de5094 : SUCCESS in 1h 07m 28s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/d322638433484d88a1d635b5a93eb1ba : SUCCESS in 35m 29s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/033a0a3e38884a3d96f85c4c6846cb2e : SUCCESS in 49m 31s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/e48402f8847a4ecb94644de59a286984 : SUCCESS in 42m 31s\n- octavia-v2-act-stdby-dsvm-scenario https://zuul.opendev.org/t/openstack/build/ab8dbbe1049c4a3ab66b8c7b20c10668 : SUCCESS in 33m 40s (non-voting)\n- octavia-v2-dsvm-cinder-amphora https://zuul.opendev.org/t/openstack/build/7b7f48d80c4c4800ade7d5153afdc4b0 : SUCCESS in 35m 18s (non-voting)\n- octavia-v2-dsvm-scenario-two-node https://zuul.opendev.org/t/openstack/build/53c28783eda24363846ae3f3e88ad2fa : SUCCESS in 2h 36m 48s (non-voting)\n- octavia-v2-dsvm-scenario-ipv6-only https://zuul.opendev.org/t/openstack/build/e685cc96d4ad4dc5afff2d054352a3cb : SUCCESS in 1h 33m 06s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-traffic-ops https://zuul.opendev.org/t/openstack/build/3ed92a3ce038472e9c05cca122b7211c : SUCCESS in 1h 24m 42s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-non-traffic-ops https://zuul.opendev.org/t/openstack/build/71a0161880a14e3f8483bc64bf08833e : SUCCESS in 1h 07m 11s (non-voting)","accounts_in_message":[],"_revision_number":8},{"id":"66da31db2cfc709239fc5179ca6235a9d4196320","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-18 06:42:13.000000000","message":"Uploaded patch set 9.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":9},{"id":"5b55228c61c3fd8834d60fd8eb9d06ed7e8ae96b","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-18 09:19:11.000000000","message":"Patch Set 9: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/418cb8cafa6545b4a9428a3808c6cc8e\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/e59fdc9322474d4ba958345f5220cc97 : SUCCESS in 3m 32s\n- requirements-check https://zuul.opendev.org/t/openstack/build/88b506d1967c4c06894d41630d7acd3a : SUCCESS in 2m 16s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/49027fdf8e884c4eada79451606568ee : SUCCESS in 5m 56s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/3720f54c2b9e42c5bd8f64051383ef24 : SUCCESS in 5m 49s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/2ff06d076b1d43bdb3054ff9f0bfc957 : SUCCESS in 4m 12s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/3d377e73f5cf4146978066a82367caea : SUCCESS in 4m 27s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/119fb940a3e0441db058d70e27e89a39 : SUCCESS in 7m 11s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/8ea6c970982342a3b2f6f9c195116974 : SUCCESS in 5m 53s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/9d2d1f83c7f6486e8f3311d54fa5c70c : SUCCESS in 5m 59s\n- octavia-tox-py313-tips https://zuul.opendev.org/t/openstack/build/6855d2c0f66e4a5e8d1f0dc4052245a9 : SUCCESS in 4m 50s\n- octavia-tox-functional-py313-tips https://zuul.opendev.org/t/openstack/build/76a499e769394255bbe130038c9aa441 : SUCCESS in 4m 08s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/8ff585c30b344056bb9a594401efedbb : SUCCESS in 2m 11s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/bd7d09a6f8394bb2bec62f6befca1e5f : SUCCESS in 5m 37s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/e6d2e58291994c4c90b7d33ef44a456a : SUCCESS in 1h 04m 42s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/f26069d2fdab445b913c4c4340dde920 : SUCCESS in 1h 46m 56s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/e84981fd307c44f88375be7eca26a366 : SUCCESS in 1h 03m 51s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/6799f05f9c434cb6898d2c83f1e0cc22 : SUCCESS in 1h 57m 54s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/71c69c7f59684c219b9ae639b5d15a06 : SUCCESS in 1h 17m 30s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/fbbbf7090ff44d5e96749cf9b4b72426 : SUCCESS in 34m 51s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/14785512d6334a729d6c0fbb25f51010 : SUCCESS in 47m 05s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/f0a7895b75e340a78454761108bcbeb3 : SUCCESS in 48m 27s\n- octavia-v2-act-stdby-dsvm-scenario https://zuul.opendev.org/t/openstack/build/7c37ed1c820d45418b8da4ed9cf0498e : SUCCESS in 44m 36s (non-voting)\n- octavia-v2-dsvm-cinder-amphora https://zuul.opendev.org/t/openstack/build/66491e89ea9c4c09a204f0f41d551c81 : SUCCESS in 40m 32s (non-voting)\n- octavia-v2-dsvm-scenario-two-node https://zuul.opendev.org/t/openstack/build/b1bb233f694d40628627f124af79321d : SUCCESS in 2h 35m 27s (non-voting)\n- octavia-v2-dsvm-scenario-ipv6-only https://zuul.opendev.org/t/openstack/build/fd5cdf1253064e03a222561bb7d7ab49 : SUCCESS in 1h 31m 15s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-traffic-ops https://zuul.opendev.org/t/openstack/build/33d3a7e6d5304c1f9a2a7f4ce1cfac5e : SUCCESS in 1h 25m 15s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-non-traffic-ops https://zuul.opendev.org/t/openstack/build/26c7fa899e534016992a258662ec113e : SUCCESS in 1h 09m 28s (non-voting)","accounts_in_message":[],"_revision_number":9},{"id":"39421355e6dbf5f6aceed9d06439f6c4a560dfef","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-18 09:28:16.000000000","message":"Patch Set 9: Code-Review+1\n\n(2 comments)","accounts_in_message":[],"_revision_number":9},{"id":"f10eb085b3b338925579de7c56b24d653bfe357b","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-18 09:44:00.000000000","message":"Patch Set 9:\n\n(1 comment)","accounts_in_message":[],"_revision_number":9},{"id":"06dbe6e618a5bc88cff60c9b4fbb5d48399711f4","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-06-18 10:04:21.000000000","message":"Patch Set 9:\n\n(1 comment)","accounts_in_message":[],"_revision_number":9},{"id":"ababb6ef8a33cea5b56fb62b3a851cbfae316391","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-18 14:27:29.000000000","message":"Patch Set 9: Backport-Candidate+1 Code-Review+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":9},{"id":"4f65accfd628f3989247d195850fe2a3f5d5881a","author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"date":"2026-06-23 10:21:45.000000000","message":"Patch Set 9: Backport-Candidate+1 Code-Review+1\n\n(2 comments)","accounts_in_message":[],"_revision_number":9},{"id":"f81d7c7342eda2bc5bc841918296d031b33f06a9","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-29 11:57:57.000000000","message":"Patch Set 9:\n\n(1 comment)","accounts_in_message":[],"_revision_number":9},{"id":"b9827f6c83b56c6bac97c6ae9edae6ccddbe0559","author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"date":"2026-06-29 13:04:29.000000000","message":"Patch Set 9:\n\n(1 comment)","accounts_in_message":[],"_revision_number":9},{"id":"f3213d4d59cc907b8b597ebda8968848547ddd4c","tag":"autogenerated:zuul:experimental","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-29 15:11:45.000000000","message":"Patch Set 9:\n\nBuild succeeded (experimental pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/d195071d421e4ac0aee4ccdee8fc7133\n\n- openstack-tox-py313-with-oslo-master https://zuul.opendev.org/t/openstack/build/9c9ce3c6b42443d9879d7f4b423c79fc : SUCCESS in 5m 25s\n- octavia-v2-dsvm-scenario-nftables https://zuul.opendev.org/t/openstack/build/08372b7c3492432a9edc2277f43e8105 : SUCCESS in 2h 05m 31s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard-etcd https://zuul.opendev.org/t/openstack/build/95c0b091ad2547c0aa865f05cbaf27cc : SUCCESS in 1h 34m 31s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard-etcd https://zuul.opendev.org/t/openstack/build/7554bd6ac5eb42338887613169cf9cfa : SUCCESS in 1h 17m 01s","accounts_in_message":[],"_revision_number":9},{"id":"8b5f8ebd89bc5cd7eebb1500d23492e8a8555abd","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-30 11:32:14.000000000","message":"Patch Set 9:\n\n(1 comment)","accounts_in_message":[],"_revision_number":9},{"id":"e589f95d38cc048c3e54f952772787bf423f05bd","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-30 11:38:58.000000000","message":"Patch Set 10: Published edit on patch set 9.\n\nOutdated Votes:\n* Backport-Candidate+1 (copy condition: \"changekind:NO_CODE_CHANGE OR changekind:TRIVIAL_REBASE\")\n* Code-Review+1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":10},{"id":"c5f7a6c437c7d69fe3bbbc66c6bc03bc61b8f67f","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-30 11:39:03.000000000","message":"Patch Set 11: Patch Set 10 was rebased","accounts_in_message":[],"_revision_number":11},{"id":"8d5b1716c7d97e81916cdba2c28e8758f5362f71","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-30 11:39:24.000000000","message":"Patch Set 12: Published edit on patch set 11.","accounts_in_message":[],"_revision_number":12},{"id":"afc5647f6a5e98d0946d7bdba1d820982f2d9e26","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-30 11:39:45.000000000","message":"Patch Set 12: Backport-Candidate+1 Code-Review+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":12},{"id":"1c757884a78d0b4dae5a32542552eb1f2034a866","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-06-30 12:14:38.000000000","message":"Patch Set 12:\n\n(1 comment)","accounts_in_message":[],"_revision_number":12},{"id":"e977b92fc26c8741b336409b6368d2b0fc5f4530","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-30 13:59:12.000000000","message":"Patch Set 12: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/e546c641d2044897bd88ef00aa9646a7\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/edb2a4aa62fb49deb90ff9848ed8125d : SUCCESS in 6m 12s\n- requirements-check https://zuul.opendev.org/t/openstack/build/a5abd8dc71094b18a5f14e66ecb5c61f : SUCCESS in 2m 39s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/aa21f5a0c7e14903996566ead6f82532 : SUCCESS in 9m 29s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/8dc3c03fbc68439190b4ac243c5a0bce : SUCCESS in 3m 31s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/e394c55742c548e5a8a8f19db4a85a54 : SUCCESS in 4m 46s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/04db22ef41f94ed5a6459f82c1dd9141 : SUCCESS in 3m 43s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/d70bce6033334bd8bb2567721bd4b67c : SUCCESS in 5m 33s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/949058dc04ba4fd09decd068b4e3c40d : SUCCESS in 11m 06s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/d2290fbdd01a4496b04fca38b47d10d0 : SUCCESS in 4m 28s\n- octavia-tox-py313-tips https://zuul.opendev.org/t/openstack/build/348f7302a0124a8ea701e27440f23414 : SUCCESS in 5m 09s\n- octavia-tox-functional-py313-tips https://zuul.opendev.org/t/openstack/build/77739318d03b4993912ca846b06de213 : SUCCESS in 6m 10s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/49b34102495c47df8d8ae06a85d21409 : SUCCESS in 4m 04s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/bc81da64630d4410927926d3d433f500 : SUCCESS in 5m 34s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/0a6f6a9e00f843d8bbd4fb34116b92ec : SUCCESS in 48m 33s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/e238ab545c884309beed8a371628535f : SUCCESS in 1h 31m 44s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/ceb71155d18c4201b04848c2f90c55ce : SUCCESS in 1h 05m 44s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/aa1b9d18e70f46b89625a0dc071c0dde : SUCCESS in 1h 35m 46s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/fb11d08e3ce74491a9499eaa433208d6 : SUCCESS in 1h 03m 58s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/d902598ea72047d6a77d468c3d8c5280 : SUCCESS in 39m 23s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/3363db28390744f0b22194d68a0a58a6 : SUCCESS in 44m 37s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/94c5ff4f0047455c86e9a951f6d59dd4 : SUCCESS in 46m 02s\n- octavia-v2-act-stdby-dsvm-scenario https://zuul.opendev.org/t/openstack/build/173a144879784b75a945b336d24d9111 : SUCCESS in 34m 52s (non-voting)\n- octavia-v2-dsvm-cinder-amphora https://zuul.opendev.org/t/openstack/build/843cd0bf1e9442d396f2532c40311c82 : SUCCESS in 35m 20s (non-voting)\n- octavia-v2-dsvm-scenario-two-node https://zuul.opendev.org/t/openstack/build/522ddd69257b476482f5823971eed25d : SUCCESS in 2h 16m 45s (non-voting)\n- octavia-v2-dsvm-scenario-ipv6-only https://zuul.opendev.org/t/openstack/build/d7f5fa90dd474a81a239aa4650d57f6f : SUCCESS in 1h 31m 38s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-traffic-ops https://zuul.opendev.org/t/openstack/build/c7f48696943243e5aee802f481928eaf : SUCCESS in 1h 23m 40s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-non-traffic-ops https://zuul.opendev.org/t/openstack/build/eacdd0f77a28409e9be2911a9be666c3 : SUCCESS in 1h 09m 51s (non-voting)","accounts_in_message":[],"_revision_number":12},{"id":"c9f15ae2d7f752f555e68a8358bde8904e6f0166","author":{"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},"date":"2026-06-30 14:15:38.000000000","message":"Patch Set 12: Backport-Candidate+1 Code-Review+1\n\n(2 comments)","accounts_in_message":[],"_revision_number":12},{"id":"e0bf18988467bd8bdb8aa4b0e0e901fa008b045b","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-07-01 16:38:55.000000000","message":"Uploaded patch set 13.\n\nOutdated Votes:\n* Backport-Candidate+1 (copy condition: \"changekind:NO_CODE_CHANGE OR changekind:TRIVIAL_REBASE\")\n* Code-Review+1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":13},{"id":"4d386be274a26450273614c84aa5c6ec3fca9a66","author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"date":"2026-07-01 16:40:25.000000000","message":"Patch Set 12:\n\n(1 comment)","accounts_in_message":[],"_revision_number":12},{"id":"0ea1049254e5a0ebfe048c9d29f427f3f4361cc4","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-07-01 17:50:20.000000000","message":"Patch Set 13: Backport-Candidate+1 Code-Review+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":13},{"id":"8145a9bc6cbe7aef251f4d1f7f39c63aa1758923","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-01 19:16:17.000000000","message":"Patch Set 13: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/5c03e992e4c9497e81870e155b7bf17e\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/0ee6ab3eddcc4e4a9412996044de7f1e : SUCCESS in 6m 16s\n- requirements-check https://zuul.opendev.org/t/openstack/build/043d0bc90cfa45e08269019b17b8e013 : SUCCESS in 2m 13s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/544d315e2f0848679099f66cd5b995e9 : SUCCESS in 10m 13s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/19b9fe8325094239885f6fb0de7f1abf : SUCCESS in 4m 57s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/a68fd62d57fe484586e169105a7bfba9 : SUCCESS in 4m 24s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/b5c59b0e5772481f9841d8bca504f6fa : SUCCESS in 4m 59s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/7d0a7652a4344cfc9d2f421e046cae82 : SUCCESS in 5m 44s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/c5938a21c0584c7abe114e35a55eccda : SUCCESS in 12m 41s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/aaad251b834446d684e513236017bb80 : SUCCESS in 4m 49s\n- octavia-tox-py313-tips https://zuul.opendev.org/t/openstack/build/498dc9e9f55f4f4492f0c74bd0f83e58 : SUCCESS in 5m 19s\n- octavia-tox-functional-py313-tips https://zuul.opendev.org/t/openstack/build/f88cb9592dbb4971b53e6438c04c2be2 : SUCCESS in 4m 12s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/b7f2da8eab234cf7a80b7b73b3a3512d : SUCCESS in 3m 43s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/711bc81b9bc6429c8c888e6a7cc23e85 : SUCCESS in 5m 31s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/c0f1e8b5f99c434883bbf22d7bf38c37 : SUCCESS in 1h 04m 03s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/7c949578388743cc872ed6d2be6a051d : SUCCESS in 1h 29m 13s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/61748cf15c1f4cce98527805d7563190 : SUCCESS in 57m 12s\n- octavia-v2-dsvm-scenario-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/b52962eef8ba4122b158f94a47b08481 : SUCCESS in 1h 40m 40s\n- octavia-v2-dsvm-scenario-non-traffic-ops-jobboard https://zuul.opendev.org/t/openstack/build/e043080f936a42e8a28590622a24bb0f : SUCCESS in 1h 09m 31s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/0e58616f200d44d39cf76025824118f7 : SUCCESS in 41m 39s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/76d490c86a7f4500a4efce2eff7a0066 : SUCCESS in 53m 37s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/ccbe48e83460496aa8f33a044a6f0202 : SUCCESS in 42m 44s\n- octavia-v2-act-stdby-dsvm-scenario https://zuul.opendev.org/t/openstack/build/27dd97132c814ee9b4336720308d17db : SUCCESS in 32m 17s (non-voting)\n- octavia-v2-dsvm-cinder-amphora https://zuul.opendev.org/t/openstack/build/719221b5e79c4c12a33655567901d57d : SUCCESS in 34m 45s (non-voting)\n- octavia-v2-dsvm-scenario-two-node https://zuul.opendev.org/t/openstack/build/d494f590876e4849abb63de910399422 : SUCCESS in 2h 35m 49s (non-voting)\n- octavia-v2-dsvm-scenario-ipv6-only https://zuul.opendev.org/t/openstack/build/dc6916db9cec479c9f225828da15a7f5 : SUCCESS in 1h 27m 49s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-traffic-ops https://zuul.opendev.org/t/openstack/build/0dae24bcc7c3468192c62e22d5a8e348 : TIMED_OUT in 2h 33m 32s (non-voting)\n- octavia-v2-dsvm-scenario-centos-10-stream-non-traffic-ops https://zuul.opendev.org/t/openstack/build/de76b4fc36014afca2217f58828f2497 : SUCCESS in 1h 47m 49s (non-voting)","accounts_in_message":[],"_revision_number":13},{"id":"afb566db5f809920b6ea4ad69653688364b2b6c6","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-07-08 18:09:33.000000000","message":"Patch Set 13:\n\n(1 comment)","accounts_in_message":[],"_revision_number":13},{"id":"6ab71ecaae9488fd0c1fecf5103226806216e13c","author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"date":"2026-07-27 06:39:33.000000000","message":"Patch Set 13: Code-Review+2","accounts_in_message":[],"_revision_number":13},{"id":"4daab67ff9042ceba86f1da305818190728f246b","author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"date":"2026-07-28 08:45:56.000000000","message":"Patch Set 13: Code-Review+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":13},{"id":"9d3c9b7ba438eed3194473855cf809f80f10b822","author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"date":"2026-07-28 08:48:11.000000000","message":"Patch Set 13: Workflow+1","accounts_in_message":[],"_revision_number":13},{"id":"9bf9d31281a4cd8b17b4aeab36b5a3681505b819","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-28 08:48:55.000000000","message":"Patch Set 13: -Verified\n\nStarting gate jobs.","accounts_in_message":[],"_revision_number":13},{"id":"5188e5a265b467b989d45c4e4cc080ace8cf6bbf","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-28 10:21:44.000000000","message":"Patch Set 13: Verified+2\n\nBuild succeeded (gate pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/f7104889d5dd43a19988c50b213f49b6\n\n- build-openstack-api-ref https://zuul.opendev.org/t/openstack/build/e9a68176bafc45f6a8a00831e8191ce9 : SUCCESS in 6m 22s\n- requirements-check https://zuul.opendev.org/t/openstack/build/0cd3d9d539a14db48fd372624c28f097 : SUCCESS in 2m 42s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/7af2f65b913b4ecaa0d218f7fcc721e1 : SUCCESS in 4m 53s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/c0344a40053841cc8b717265768bff95 : SUCCESS in 5m 00s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/7c65ceaf7eca4d1f96c1883537dcf470 : SUCCESS in 5m 17s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/c05637a6d8f04e49bd25e78a22b13840 : SUCCESS in 12m 59s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/2b119c60510d4eebbc9ef6a96fed13a4 : SUCCESS in 9m 33s\n- openstack-tox-pip-check-reqs https://zuul.opendev.org/t/openstack/build/9ffad3e11ad74b64aacd43fc5ca0d7bb : SUCCESS in 4m 11s\n- openstack-tox-functional-py313 https://zuul.opendev.org/t/openstack/build/fd451806604a4c218ea51ee21b43e500 : SUCCESS in 6m 47s\n- octavia-v2-dsvm-noop-api https://zuul.opendev.org/t/openstack/build/c6724559d8e543e487c1e8579f34c604 : SUCCESS in 40m 11s\n- octavia-v2-dsvm-scenario-traffic-ops https://zuul.opendev.org/t/openstack/build/c4c1be90139a4bfe9f30811441a16cd8 : SUCCESS in 1h 32m 19s\n- octavia-v2-dsvm-scenario-non-traffic-ops https://zuul.opendev.org/t/openstack/build/5ed91ba429c74f44b731bc324a61d3e2 : SUCCESS in 1h 10m 30s\n- octavia-v2-dsvm-tls-barbican https://zuul.opendev.org/t/openstack/build/b3f416d0be724669b381992261abe985 : SUCCESS in 42m 26s\n- octavia-grenade https://zuul.opendev.org/t/openstack/build/9ec1b41ae8b245599674eb45cca647d9 : SUCCESS in 53m 37s\n- octavia-grenade-skip-level https://zuul.opendev.org/t/openstack/build/f92406a9ddc64495b601dfd35e708c2a : SUCCESS in 50m 52s","accounts_in_message":[],"_revision_number":13},{"id":"51d91852edfdb8878579e9bb458e1ba37aab119b","tag":"autogenerated:gerrit:merged","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-28 10:21:44.000000000","message":"Change has been successfully merged","accounts_in_message":[],"_revision_number":13},{"id":"cac023a4edc4b9713a41281e4d164ddac47aa21c","tag":"autogenerated:zuul:promote","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-28 10:23:06.000000000","message":"Patch Set 13:\n\nBuild succeeded (promote pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/6218f89cc2d647349ab962bd8df1467d\n\n- promote-api-ref https://zuul.opendev.org/t/openstack/build/72ded855735f4fd1b028e40808da8915 : SUCCESS in 54s\n- promote-openstack-tox-docs https://zuul.opendev.org/t/openstack/build/c4971f6d9b0343d0b4b96f4446278a04 : SUCCESS in 1m 08s\n- promote-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/f51b3820aa5245c4bc219cd4659ebc1a : SUCCESS in 45s","accounts_in_message":[],"_revision_number":13}],"current_revision_number":13,"current_revision":"ee5dc8f3356d3725800e61973e66df8a02ba6fc8","revisions":{"29db3533e5425a00c66dcabc1a2bf7ec7390dad4":{"kind":"REWORK","_number":1,"created":"2026-06-16 10:19:06.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/1"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:56:19.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime,\npassed to ZookeeperJobBoard via the existing `client\u003d` kwarg so\nthe board\u0027s close() no longer tears down the connection.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek\u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/29db3533e5425a00c66dcabc1a2bf7ec7390dad4"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/29db3533e5425a00c66dcabc1a2bf7ec7390dad4"}]},"branch":"refs/heads/master"},"0fa62fabcbe4a596fef18ef8216070ac6b078574":{"kind":"REWORK","_number":2,"created":"2026-06-16 13:03:14.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/2"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 12:50:40.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/0fa62fabcbe4a596fef18ef8216070ac6b078574"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/0fa62fabcbe4a596fef18ef8216070ac6b078574"}]},"branch":"refs/heads/master"},"c7cc56a8d7fd438a085a38639e860888d38dc954":{"kind":"REWORK","_number":3,"created":"2026-06-16 14:57:53.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/3","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/3","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/3"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 14:57:28.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/c7cc56a8d7fd438a085a38639e860888d38dc954"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/c7cc56a8d7fd438a085a38639e860888d38dc954"}]},"branch":"refs/heads/master"},"252dff33dbf8f01c5702adcc9268d08cdc6e5a4b":{"kind":"REWORK","_number":4,"created":"2026-06-16 15:47:05.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/4","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/4","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/4 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/4 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/4 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/4"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 15:37:29.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/252dff33dbf8f01c5702adcc9268d08cdc6e5a4b"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/252dff33dbf8f01c5702adcc9268d08cdc6e5a4b"}]},"branch":"refs/heads/master"},"d4cd6b1a9d79cd59743b14e5947f69f8cc693a32":{"kind":"REWORK","_number":5,"created":"2026-06-17 06:57:47.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/5","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/5","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/5 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/5 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/5 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/5"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-17 06:57:31.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/d4cd6b1a9d79cd59743b14e5947f69f8cc693a32"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/d4cd6b1a9d79cd59743b14e5947f69f8cc693a32"}]},"branch":"refs/heads/master"},"c7afdd987499359279ccaaaab3044cdefa7c4a2d":{"kind":"REWORK","_number":6,"created":"2026-06-17 10:46:27.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/6","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/6","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/6 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/6 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/6 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/6"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-17 10:41:34.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/c7afdd987499359279ccaaaab3044cdefa7c4a2d"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/c7afdd987499359279ccaaaab3044cdefa7c4a2d"}]},"branch":"refs/heads/master"},"ee970c85b6e2873663dbe3e07f2d7bad8d4b25a2":{"kind":"REWORK","_number":7,"created":"2026-06-17 11:30:52.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/7","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/7","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/7 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/7 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/7 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/7"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-17 11:30:35.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/ee970c85b6e2873663dbe3e07f2d7bad8d4b25a2"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/ee970c85b6e2873663dbe3e07f2d7bad8d4b25a2"}]},"branch":"refs/heads/master"},"7f23cdd6436d73dd9edf359cecbe397c309104df":{"kind":"REWORK","_number":8,"created":"2026-06-17 11:49:54.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/8","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/8","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/8 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/8 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/8 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/8"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-17 11:49:36.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/7f23cdd6436d73dd9edf359cecbe397c309104df"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/7f23cdd6436d73dd9edf359cecbe397c309104df"}]},"branch":"refs/heads/master"},"e6bd327554e0decdd28ebc19bb4901b6edf2f2b3":{"kind":"REWORK","_number":9,"created":"2026-06-18 06:42:13.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/9","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/9","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/9 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/9 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/9 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/9"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-18 06:41:48.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/e6bd327554e0decdd28ebc19bb4901b6edf2f2b3"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/e6bd327554e0decdd28ebc19bb4901b6edf2f2b3"}]},"branch":"refs/heads/master"},"c042ff2c7c5c0121e7eab12a31fa633ffa516a10":{"kind":"REWORK","_number":10,"created":"2026-06-30 11:38:58.000000000","uploader":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"ref":"refs/changes/56/993556/10","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/10","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/10 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/10 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/10 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/10"}}},"commit":{"parents":[{"commit":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","subject":"Merge \"Drop Python 3.10\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/9ff4683c8212e4c043af69f1b5ebadc21651dc58"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Ivan Anfimov","email":"lazekteam@gmail.com","date":"2026-06-30 11:38:56.000000000","tz":0},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/c042ff2c7c5c0121e7eab12a31fa633ffa516a10"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/c042ff2c7c5c0121e7eab12a31fa633ffa516a10"}]},"branch":"refs/heads/master"},"b448edf31b840340a3b9633ec4c0fa6d02f41ac6":{"kind":"TRIVIAL_REBASE","_number":11,"created":"2026-06-30 11:39:03.000000000","uploader":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"ref":"refs/changes/56/993556/11","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/11","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/11 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/11 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/11 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/11"}}},"commit":{"parents":[{"commit":"05d3b16dac1b93afa5d689b790c740d034d61c7b","subject":"Fix octavia-worker multiprocessing for Python 3.14","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/05d3b16dac1b93afa5d689b790c740d034d61c7b"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Ivan Anfimov","email":"lazekteam@gmail.com","date":"2026-06-30 11:39:03.000000000","tz":0},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/b448edf31b840340a3b9633ec4c0fa6d02f41ac6"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/b448edf31b840340a3b9633ec4c0fa6d02f41ac6"}]},"branch":"refs/heads/master","description":"Rebase","conflicts":{"base":"9ff4683c8212e4c043af69f1b5ebadc21651dc58","ours":"c042ff2c7c5c0121e7eab12a31fa633ffa516a10","theirs":"05d3b16dac1b93afa5d689b790c740d034d61c7b","merge_strategy":"recursive","contains_conflicts":false}},"589b4c0984477da85e5295437ab48a9bf51d5428":{"kind":"REWORK","_number":12,"created":"2026-06-30 11:39:24.000000000","uploader":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"ref":"refs/changes/56/993556/12","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/12","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/12 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/12 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/12 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/12"}}},"commit":{"parents":[{"commit":"05d3b16dac1b93afa5d689b790c740d034d61c7b","subject":"Fix octavia-worker multiprocessing for Python 3.14","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/05d3b16dac1b93afa5d689b790c740d034d61c7b"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Ivan Anfimov","email":"lazekteam@gmail.com","date":"2026-06-30 11:39:24.000000000","tz":0},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/589b4c0984477da85e5295437ab48a9bf51d5428"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/589b4c0984477da85e5295437ab48a9bf51d5428"}]},"branch":"refs/heads/master"},"ee5dc8f3356d3725800e61973e66df8a02ba6fc8":{"kind":"REWORK","_number":13,"created":"2026-07-01 16:38:55.000000000","uploader":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"ref":"refs/changes/56/993556/13","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/octavia","ref":"refs/changes/56/993556/13","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/13 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/13 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/octavia refs/changes/56/993556/13 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/octavia refs/changes/56/993556/13"}}},"commit":{"parents":[{"commit":"920a62fe806f3a172c1bed18e5e72ef55a90ae6f","subject":"Merge \"Feature: allow denylist of network_ids\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/920a62fe806f3a172c1bed18e5e72ef55a90ae6f"}]}],"author":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-06-16 09:51:31.000000000","tz":120},"committer":{"name":"Alicja Filipek","email":"alicja.filipek@cleura.com","date":"2026-07-01 16:38:21.000000000","tz":120},"subject":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver","message":"Fix ZooKeeper session churn in ZookeeperTaskFlowDriver\n\nZookeeperTaskFlowDriver.job_board() was called inside a `with`\nblock in _extend_jobs(), creating and immediately closing a new\nKazooClient every ~8 seconds. This caused continuous ZooKeeper\nsession churn and kazoo.exceptions.ConnectionLoss errors during\nLB operations.\n\nFix by holding a single KazooClient for the driver\u0027s lifetime.\nThe client is created lazily on first job_board() call via\n_ensure_client(), preserving the previous behaviour where a\nbriefly-unavailable ZooKeeper at startup does not prevent the\nworker from starting. A threading.Lock guards _client access in\nboth _ensure_client() and shutdown() to prevent races between\nconcurrent job_board() calls and service shutdown.\n\nA new shutdown() method finalizes the client on SIGTERM via\nConsumerService.terminate() -\u003e ControllerWorker.shutdown(). A\nno-op base class shutdown() means Redis and Etcd drivers need\nno changes. The kazoo import is deferred to __init__ to avoid\nrequiring kazoo in non-ZooKeeper deployments.\n\nCloses-Bug: #2144800\nChange-Id: Ia026781af131da7c91642470802d342eca259b05\nSigned-off-by: Alicja Filipek \u003calicja.filipek@cleura.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/ee5dc8f3356d3725800e61973e66df8a02ba6fc8"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/octavia/commit/ee5dc8f3356d3725800e61973e66df8a02ba6fc8"}]},"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":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"}},{"label":"Workflow","status":"MAY","applied_by":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"}},{"label":"Backport-Candidate","status":"MAY","applied_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"}}]}],"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":"Backport-Candidate","description":"Backport candidate status","status":"NOT_APPLICABLE","is_legacy":false,"applicability_expression_result":{"fulfilled":false,"status":"FAIL"},"submittability_expression_result":{"expression":"is:true","fulfilled":true,"status":"NOT_EVALUATED","passing_atoms":[],"failing_atoms":[],"atom_explanations":{}}},{"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":""}}}]}
