)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c736385f574e59527e2d1a1f9a696a9a972607d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fdaf0112_db22330b","updated":"2025-10-22 19:06:31.000000000","message":"LGTM\nA release note would be nice","commit_id":"51c6f4f840cb87a823c92ccffa321e843d812063"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"0342dad9a5e322b45f27937cc7b8ee4131af311d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ec5966cd_22a733d5","in_reply_to":"fdaf0112_db22330b","updated":"2025-12-16 14:55:53.000000000","message":"Fixed parameter docs for function and added a simple release note.","commit_id":"51c6f4f840cb87a823c92ccffa321e843d812063"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"ce9958487dd1305c5b465f59fcd328280d82b298","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"94115ce2_ecc65aef","updated":"2026-03-25 07:24:24.000000000","message":"CR-1 to raise awareness of my question","commit_id":"c21c4d9e95b835e6d6ef24c8e184805178094844"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"ea9f04b6def5aee63d6716f1a281212e1517d6c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f529cdb5_52bfc05c","in_reply_to":"94115ce2_ecc65aef","updated":"2026-03-25 10:08:01.000000000","message":"Good idea, what do you think about it now?","commit_id":"c21c4d9e95b835e6d6ef24c8e184805178094844"},{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"change_message_id":"26147598f08ab79be0814c021d897f2061202b41","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"df0392e4_1897c198","updated":"2026-05-26 08:57:59.000000000","message":"LGTM, reviewed with assistance from Claude Sonnet 4.6","commit_id":"83460320690cdbb38d834246f888b5df384fc549"},{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"change_message_id":"043f3d72b3259c5db1e516a6299c06a0a69db79d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"449d1361_6ccc9977","updated":"2026-08-06 12:58:14.000000000","message":"LGTM","commit_id":"993a7c34f24c5a067db5cd6f76596ea3012aacc0"}],"octavia_dashboard/api/rest/lbaasv2.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"ce9958487dd1305c5b465f59fcd328280d82b298","unresolved":true,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def poll_loadbalancer_status(request, loadbalancer_id, callback,"},{"line_number":59,"context_line":"                             from_state\u003d\u0027PENDING_UPDATE\u0027, to_state\u003d\u0027ACTIVE\u0027,"},{"line_number":60,"context_line":"                             callback_kwargs\u003dNone, timeout\u003d300):"},{"line_number":61,"context_line":"    \"\"\"Poll for the status of the load balancer."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    Polls for the status of the load balancer and calls a function when the"}],"source_content_type":"text/x-python","patch_set":3,"id":"97132e52_4c855dab","line":60,"range":{"start_line":60,"start_character":51,"end_line":60,"end_character":62},"updated":"2026-03-25 07:24:24.000000000","message":"I\u0027m wondering if 300 is enough, with the default settings, the timeout when creating a LB (and only the LB, not the child resources) in octavia is ~20min\n\ncan we make it configurable?\nor could we set a bigger value by default? (600 sec?)","commit_id":"c21c4d9e95b835e6d6ef24c8e184805178094844"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"ea9f04b6def5aee63d6716f1a281212e1517d6c7","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def poll_loadbalancer_status(request, loadbalancer_id, callback,"},{"line_number":59,"context_line":"                             from_state\u003d\u0027PENDING_UPDATE\u0027, to_state\u003d\u0027ACTIVE\u0027,"},{"line_number":60,"context_line":"                             callback_kwargs\u003dNone, timeout\u003d300):"},{"line_number":61,"context_line":"    \"\"\"Poll for the status of the load balancer."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    Polls for the status of the load balancer and calls a function when the"}],"source_content_type":"text/x-python","patch_set":3,"id":"6d2cee90_9caa0fc5","line":60,"range":{"start_line":60,"start_character":51,"end_line":60,"end_character":62},"in_reply_to":"97132e52_4c855dab","updated":"2026-03-25 10:08:01.000000000","message":"Done","commit_id":"c21c4d9e95b835e6d6ef24c8e184805178094844"},{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"tag":"autogenerated:claude-review","change_message_id":"ef3cbfd3d2def40b0600af2766410b4af5615b19","unresolved":false,"context_lines":[{"line_number":30,"context_line":"neutronclient \u003d neutron.neutronclient"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"try:"},{"line_number":34,"context_line":"    POLL_LOADBALANCER_STATUS_TIMEOUT \u003d ("},{"line_number":35,"context_line":"        settings.POLL_LOADBALANCER_STATUS_TIMEOUT)"},{"line_number":36,"context_line":"except AttributeError:"},{"line_number":37,"context_line":"    POLL_LOADBALANCER_STATUS_TIMEOUT \u003d 600"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _sdk_object_to_list(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5c335c24_1378d1f5","line":37,"range":{"start_line":33,"start_character":0,"end_line":37,"end_character":0},"updated":"2026-05-26 08:17:49.000000000","message":"`try/except AttributeError` pattern for Django settings access. Prefer `getattr(settings, \u0027POLL_LOADBALANCER_STATUS_TIMEOUT\u0027, 600)`.","commit_id":"83460320690cdbb38d834246f888b5df384fc549"},{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"tag":"autogenerated:claude-review","change_message_id":"ef3cbfd3d2def40b0600af2766410b4af5615b19","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def poll_loadbalancer_status(request, loadbalancer_id, callback,"},{"line_number":67,"context_line":"                             from_state\u003d\u0027PENDING_UPDATE\u0027, to_state\u003d\u0027ACTIVE\u0027,"},{"line_number":68,"context_line":"                             callback_kwargs\u003dNone, timeout\u003dNone):"},{"line_number":69,"context_line":"    \"\"\"Poll for the status of the load balancer."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    Polls for the status of the load balancer and calls a function when the"}],"source_content_type":"text/x-python","patch_set":4,"id":"f507c313_5c1e8e24","line":68,"updated":"2026-05-26 08:17:49.000000000","message":"`timeout\u003dNone` addition is correct and backward-compatible. ✅","commit_id":"83460320690cdbb38d834246f888b5df384fc549"},{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"tag":"autogenerated:claude-review","change_message_id":"ef3cbfd3d2def40b0600af2766410b4af5615b19","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    None will use POLL_LOADBALANCER_STATUS_TIMEOUT settings"},{"line_number":82,"context_line":"                    or fallback to 600 seconds."},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":"    poll_timeout \u003d timeout or POLL_LOADBALANCER_STATUS_TIMEOUT"},{"line_number":85,"context_line":"    interval \u003d conf.HORIZON_CONFIG[\u0027ajax_poll_interval\u0027] / 1000.0"},{"line_number":86,"context_line":"    status \u003d from_state"},{"line_number":87,"context_line":"    start \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":4,"id":"2d3df66d_762bf03a","line":84,"updated":"2026-05-26 08:17:49.000000000","message":"Semantically incorrect for `timeout\u003d0`. Use `if timeout is None` check.","commit_id":"83460320690cdbb38d834246f888b5df384fc549"},{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"tag":"autogenerated:claude-review","change_message_id":"ef3cbfd3d2def40b0600af2766410b4af5615b19","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    start \u003d time.time()"},{"line_number":88,"context_line":"    while status \u003d\u003d from_state:"},{"line_number":89,"context_line":"        if time.time() - start \u003e\u003d poll_timeout:"},{"line_number":90,"context_line":"            raise TimeoutError(\"poll_loadbalancer_status timeout\")"},{"line_number":91,"context_line":"        time.sleep(interval)"},{"line_number":92,"context_line":"        conn \u003d get_sdk_connection(request)"},{"line_number":93,"context_line":"        lb \u003d conn.load_balancer.get_load_balancer(loadbalancer_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"28f2a5b2_f84e2bc5","line":90,"updated":"2026-05-26 08:17:49.000000000","message":"Include `loadbalancer_id` in the message for better diagnostics.","commit_id":"83460320690cdbb38d834246f888b5df384fc549"},{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"tag":"autogenerated:claude-review","change_message_id":"ef3cbfd3d2def40b0600af2766410b4af5615b19","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    poll_timeout \u003d timeout or POLL_LOADBALANCER_STATUS_TIMEOUT"},{"line_number":85,"context_line":"    interval \u003d conf.HORIZON_CONFIG[\u0027ajax_poll_interval\u0027] / 1000.0"},{"line_number":86,"context_line":"    status \u003d from_state"},{"line_number":87,"context_line":"    start \u003d time.time()"},{"line_number":88,"context_line":"    while status \u003d\u003d from_state:"},{"line_number":89,"context_line":"        if time.time() - start \u003e\u003d poll_timeout:"},{"line_number":90,"context_line":"            raise TimeoutError(\"poll_loadbalancer_status timeout\")"},{"line_number":91,"context_line":"        time.sleep(interval)"},{"line_number":92,"context_line":"        conn \u003d get_sdk_connection(request)"},{"line_number":93,"context_line":"        lb \u003d conn.load_balancer.get_load_balancer(loadbalancer_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"75585cbe_b5698e33","line":90,"range":{"start_line":87,"start_character":0,"end_line":90,"end_character":0},"updated":"2026-05-26 08:17:49.000000000","message":"No logging before raising. `TimeoutError` in `_thread.start_new_thread` context is silently discarded. Add `LOG.error(...)`.","commit_id":"83460320690cdbb38d834246f888b5df384fc549"}],"octavia_dashboard/local_settings.d/_1499_load_balancer_settings.py":[{"author":{"_account_id":38562,"name":"Richard Cruise","email":"rcruise@redhat.com","username":"rcruise"},"tag":"autogenerated:claude-review","change_message_id":"ef3cbfd3d2def40b0600af2766410b4af5615b19","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \u0027load-balancer\u0027: \u0027octavia_policy.yaml\u0027,"},{"line_number":22,"context_line":"})"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"POLL_LOADBALANCER_STATUS_TIMEOUT \u003d 600"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Sample"},{"line_number":27,"context_line":"# settings.LOGGING[\u0027loggers\u0027].update({"}],"source_content_type":"text/x-python","patch_set":4,"id":"11616586_2a5389f3","line":24,"updated":"2026-05-26 08:17:49.000000000","message":"A brief comment explaining this is the poll timeout (in seconds) and the thread behavior on expiry would help operators understand what to tune. E.g.:\n```python\n# Timeout in seconds for poll_loadbalancer_status background threads.\n# If a load balancer stays in PENDING_* state longer than this, the\n# polling thread will be terminated. Increase for slow environments.\nPOLL_LOADBALANCER_STATUS_TIMEOUT \u003d 600\n```","commit_id":"83460320690cdbb38d834246f888b5df384fc549"}]}
