)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2026-08-17 07:38:52 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"sysinv: Add etcd cluster health helpers, audit alarm and upgrade gate"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduce the etcd cluster health surface used across the"},{"line_number":10,"context_line":"Active+Active control plane work:"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"bb8bce86_1b814979","line":8,"updated":"2026-08-17 21:23:39.000000000","message":"this is brutal to read. There are lots of detailed design choices and implementation write up in the commit message, including designer names, and it seems to read like a patch-set learning and fixes and test log that evolved over time; seems to be using that to explain yourself.\n\nThis has to be reformatted into a higher level that is applicable to the final revision. Can still have decent level of info since this is a complex topic. Remove architect/designer names. Remove incremental coding learnings removed, especially since those \"bugs\" are not actually present in the code you submit.  You can extract whatever is relevant into the specific code areas for specific comments (seems some of that already done) if it not already obvious.\n\nKeep the final TEST PLAN section near the end.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2026-08-17 07:38:52 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"sysinv: Add etcd cluster health helpers, audit alarm and upgrade gate"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduce the etcd cluster health surface used across the"},{"line_number":10,"context_line":"Active+Active control plane work:"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"271598db_23fc1210","line":8,"in_reply_to":"bb8bce86_1b814979","updated":"2026-08-18 11:09:52.000000000","message":"Rewritten in ps28: 66 lines, single test plan, no designer names or patchset history. Kept only the reasoning that isn\u0027t recoverable from the diff — why learners, why peer-URL matching, why not loopback.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"342fb9e37a363e1092e5374d70c99e3443ef6750","unresolved":true,"context_lines":[{"line_number":32,"context_line":"- tests/common/test_etcd.py, test_health.py: unit tests"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Test Plan:"},{"line_number":35,"context_line":"PASS: duplex - three members reported, cluster health (3, 3,[])"},{"line_number":36,"context_line":"PASS: simplex - endpoints deduplicate to one address,"},{"line_number":37,"context_line":"health (1, 1,[])"},{"line_number":38,"context_line":"PASS: endpoints resolve to addresses, never to names"},{"line_number":39,"context_line":"PASS: a registered but unstarted member is found by peer URL"},{"line_number":40,"context_line":"PASS: 850.003 raised on member loss and cleared on recovery"},{"line_number":41,"context_line":"PASS: a degraded cluster fails the base health query;"},{"line_number":42,"context_line":"the Kubernetes upgrade and root CA paths are unaffected"},{"line_number":43,"context_line":"Story: 2010302"},{"line_number":44,"context_line":"Task: 51206"},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/starlingx/fault/+/998292"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"2732ed2a_be8f5b47","line":42,"range":{"start_line":35,"start_character":0,"end_line":42,"end_character":55},"updated":"2026-08-31 22:36:59.000000000","message":"try to align how you document testcases with other reviews.\neg, configs AIO-SX, AIO-DX, ..., logical groupings, and what the test operation is for each, and perhaps what you are verifying (assuming the reader just wants to look at the system without knowing too much). These mainly read as detailed verification steps for an operation that not specified. The verification should spell it out the high-level step a little more.\n\neg, PASS: AIO-DX: etcdctl endpoint health shows 3 members.\nVerify: a. b. c\n\ne.g., \nPASS: AIO-DX: Did step A to get degraded etcd cluster.\nVerify: \u0027etcdctl member list\u0027 shows X, \u0027etcdctl endpoint status\u0027 shows Y. \nVerify \"system health-health\" check fails.","commit_id":"1934b54cb1d3579ac741a9a503238d93a55f68b6"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"295ac428c5eb8c6ee5d4c6ac49c92660b23a5510","unresolved":false,"context_lines":[{"line_number":32,"context_line":"- tests/common/test_etcd.py, test_health.py: unit tests"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Test Plan:"},{"line_number":35,"context_line":"PASS: duplex - three members reported, cluster health (3, 3,[])"},{"line_number":36,"context_line":"PASS: simplex - endpoints deduplicate to one address,"},{"line_number":37,"context_line":"health (1, 1,[])"},{"line_number":38,"context_line":"PASS: endpoints resolve to addresses, never to names"},{"line_number":39,"context_line":"PASS: a registered but unstarted member is found by peer URL"},{"line_number":40,"context_line":"PASS: 850.003 raised on member loss and cleared on recovery"},{"line_number":41,"context_line":"PASS: a degraded cluster fails the base health query;"},{"line_number":42,"context_line":"the Kubernetes upgrade and root CA paths are unaffected"},{"line_number":43,"context_line":"Story: 2010302"},{"line_number":44,"context_line":"Task: 51206"},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/starlingx/fault/+/998292"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"cc29a99b_4628c6f9","line":42,"range":{"start_line":35,"start_character":0,"end_line":42,"end_character":55},"in_reply_to":"2732ed2a_be8f5b47","updated":"2026-09-01 14:15:41.000000000","message":"Restructured in ps36 to match the other reviews — grouped by AIO-SX, AIO-DX, any-configuration and gate, each naming the operation and how it was verified. Each case is listed only under the configuration it was actually exercised on.","commit_id":"1934b54cb1d3579ac741a9a503238d93a55f68b6"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":39350,"name":"Mahesh","display_name":"msaptasa","email":"mahesh.saptasagar@windriver.com","username":"sapta"},"change_message_id":"3d63d97f048089f06796ef00c6ff973559819687","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"215355b8_383de19e","updated":"2026-08-24 15:32:09.000000000","message":"pls resolve dependency error.","commit_id":"e27cb077d59ef8ab219868557f3c3f7cdd576321"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"342fb9e37a363e1092e5374d70c99e3443ef6750","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"1df2ac7e_22b03fd2","updated":"2026-08-31 22:36:59.000000000","message":"think i am oK with the code, needs more reviewers","commit_id":"1934b54cb1d3579ac741a9a503238d93a55f68b6"}],"sysinv/sysinv/sysinv/sysinv/common/etcd.py":[{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":38,"context_line":"    from io import StringIO"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"ETCD_API_ENV_VAR \u003d {\"ETCDCTL_API\": \"3\"}"},{"line_number":41,"context_line":"os.environ.update(ETCD_API_ENV_VAR)"},{"line_number":42,"context_line":"ETCD_SNAPSHOT_FILE_NAME \u003d \"stx_etcd.snap\""},{"line_number":43,"context_line":"ETCD_SNAPSHOT_FULL_FILE_PATH \u003d os.path.join("},{"line_number":44,"context_line":"    kubernetes.KUBE_CONTROL_PLANE_ETCD_BACKUP_PATH, ETCD_SNAPSHOT_FILE_NAME)"}],"source_content_type":"text/x-python","patch_set":25,"id":"d6e6fd80_6fd9d8b3","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":35},"updated":"2026-08-17 21:23:39.000000000","message":"you sure you want to make ALL processes have this environment variable, versus like the specific commands needing it? Review how other commands pass ENV variables.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    from io import StringIO"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"ETCD_API_ENV_VAR \u003d {\"ETCDCTL_API\": \"3\"}"},{"line_number":41,"context_line":"os.environ.update(ETCD_API_ENV_VAR)"},{"line_number":42,"context_line":"ETCD_SNAPSHOT_FILE_NAME \u003d \"stx_etcd.snap\""},{"line_number":43,"context_line":"ETCD_SNAPSHOT_FULL_FILE_PATH \u003d os.path.join("},{"line_number":44,"context_line":"    kubernetes.KUBE_CONTROL_PLANE_ETCD_BACKUP_PATH, ETCD_SNAPSHOT_FILE_NAME)"}],"source_content_type":"text/x-python","patch_set":25,"id":"d5830019_a70cda32","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":35},"in_reply_to":"d6e6fd80_6fd9d8b3","updated":"2026-08-18 11:09:52.000000000","message":"Leaving this one open for your steer. Worth noting the module already passes env\u003dETCD_API_ENV_VAR explicitly at the one subprocess call site, so the global os.environ.update() looks redundant here rather than load-bearing. I\u0027d like to confirm nothing outside this module relies on it before removing it — if you\u0027re happy that it doesn\u0027t, I\u0027ll drop it","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":417,"context_line":"#     - duplex/standard: the fixed instance on controller-1 (fixed-1)"},{"line_number":418,"context_line":"#   Members are added with --initial-cluster-state\u003dexisting."},{"line_number":419,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"ETCD_CA_FILE \u003d \u0027/etc/etcd/ca.crt\u0027"},{"line_number":422,"context_line":"ETCD_CLIENT_CERT \u003d \u0027/etc/etcd/etcd-client.crt\u0027"},{"line_number":423,"context_line":"ETCD_CLIENT_KEY \u003d \u0027/etc/etcd/etcd-client.key\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"bd4add41_ac4dac5e","line":420,"updated":"2026-08-17 21:23:39.000000000","message":"consider co-locate these definitions with the other ETCD definitions near top of file","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":417,"context_line":"#     - duplex/standard: the fixed instance on controller-1 (fixed-1)"},{"line_number":418,"context_line":"#   Members are added with --initial-cluster-state\u003dexisting."},{"line_number":419,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"ETCD_CA_FILE \u003d \u0027/etc/etcd/ca.crt\u0027"},{"line_number":422,"context_line":"ETCD_CLIENT_CERT \u003d \u0027/etc/etcd/etcd-client.crt\u0027"},{"line_number":423,"context_line":"ETCD_CLIENT_KEY \u003d \u0027/etc/etcd/etcd-client.key\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"a41b5b55_1717a619","line":420,"in_reply_to":"bd4add41_ac4dac5e","updated":"2026-08-18 11:09:52.000000000","message":"Done in ps28 — ETCD_CA_FILE, ETCD_CLIENT_CERT and ETCD_CLIENT_KEY now sit with the other ETCD_* definitions at lines 57–59.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":472,"context_line":"    \"\"\""},{"line_number":473,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027member\u0027, \u0027list\u0027, \u0027-w\u0027, \u0027json\u0027]"},{"line_number":474,"context_line":"    try:"},{"line_number":475,"context_line":"        out, _ \u003d utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":476,"context_line":"        return json.loads(out).get(\u0027members\u0027, [])"},{"line_number":477,"context_line":"    except Exception as e:"},{"line_number":478,"context_line":"        LOG.warning(\"Failed to list etcd members via %s: %s\", endpoint, e)"}],"source_content_type":"text/x-python","patch_set":25,"id":"67b48062_ad5a2e78","line":475,"range":{"start_line":475,"start_character":0,"end_line":475,"end_character":54},"updated":"2026-08-17 21:23:39.000000000","message":"consider small timeout here","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":472,"context_line":"    \"\"\""},{"line_number":473,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027member\u0027, \u0027list\u0027, \u0027-w\u0027, \u0027json\u0027]"},{"line_number":474,"context_line":"    try:"},{"line_number":475,"context_line":"        out, _ \u003d utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":476,"context_line":"        return json.loads(out).get(\u0027members\u0027, [])"},{"line_number":477,"context_line":"    except Exception as e:"},{"line_number":478,"context_line":"        LOG.warning(\"Failed to list etcd members via %s: %s\", endpoint, e)"}],"source_content_type":"text/x-python","patch_set":25,"id":"0ade6932_14ad1145","line":475,"range":{"start_line":475,"start_character":0,"end_line":475,"end_character":54},"in_reply_to":"67b48062_ad5a2e78","updated":"2026-08-18 11:09:52.000000000","message":"Done — ETCD_CMD_TIMEOUT_SHORT (20s). Read-only member list: it either answers promptly or it isn\u0027t going to.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":584,"context_line":"    if learner:"},{"line_number":585,"context_line":"        cmd.append(\u0027--learner\u0027)"},{"line_number":586,"context_line":"    try:"},{"line_number":587,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":588,"context_line":"        LOG.info(\"Added etcd member \u0027%s\u0027%s with peer URL %s\", name,"},{"line_number":589,"context_line":"                 \" as a learner\" if learner else \"\", peer_url)"},{"line_number":590,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":25,"id":"f6d299c9_b4bc236b","line":587,"range":{"start_line":587,"start_character":0,"end_line":587,"end_character":45},"updated":"2026-08-17 21:23:39.000000000","message":"consider medium timeout here","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":584,"context_line":"    if learner:"},{"line_number":585,"context_line":"        cmd.append(\u0027--learner\u0027)"},{"line_number":586,"context_line":"    try:"},{"line_number":587,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":588,"context_line":"        LOG.info(\"Added etcd member \u0027%s\u0027%s with peer URL %s\", name,"},{"line_number":589,"context_line":"                 \" as a learner\" if learner else \"\", peer_url)"},{"line_number":590,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":25,"id":"f81df7c1_011d46ae","line":587,"range":{"start_line":587,"start_character":0,"end_line":587,"end_character":45},"in_reply_to":"f6d299c9_b4bc236b","updated":"2026-08-18 11:09:52.000000000","message":"Done — ETCD_CMD_TIMEOUT_MEDIUM (60s) on member add; the leader has to commit the membership change through raft before replying.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":635,"context_line":""},{"line_number":636,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027member\u0027, \u0027promote\u0027, member_id]"},{"line_number":637,"context_line":"    try:"},{"line_number":638,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":639,"context_line":"        LOG.info(\"Promoted etcd member \u0027%s\u0027 (id %s) to a voting member\","},{"line_number":640,"context_line":"                 name, member_id)"},{"line_number":641,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":25,"id":"49b9eac6_2b216d65","line":638,"range":{"start_line":638,"start_character":0,"end_line":638,"end_character":45},"updated":"2026-08-17 21:23:39.000000000","message":"consider medium timeout here","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":635,"context_line":""},{"line_number":636,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027member\u0027, \u0027promote\u0027, member_id]"},{"line_number":637,"context_line":"    try:"},{"line_number":638,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":639,"context_line":"        LOG.info(\"Promoted etcd member \u0027%s\u0027 (id %s) to a voting member\","},{"line_number":640,"context_line":"                 name, member_id)"},{"line_number":641,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":25,"id":"380e9669_2d5afe8c","line":638,"range":{"start_line":638,"start_character":0,"end_line":638,"end_character":45},"in_reply_to":"49b9eac6_2b216d65","updated":"2026-08-18 11:09:52.000000000","message":"Done — MEDIUM on member promote, same raft-commit reasoning as the add.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":668,"context_line":""},{"line_number":669,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027member\u0027, \u0027remove\u0027, member_id]"},{"line_number":670,"context_line":"    try:"},{"line_number":671,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":672,"context_line":"        LOG.info(\"Removed etcd member \u0027%s\u0027 (id %s)\", name, member_id)"},{"line_number":673,"context_line":"    except Exception as e:"},{"line_number":674,"context_line":"        raise exception.SysinvException("}],"source_content_type":"text/x-python","patch_set":25,"id":"e7d5ff74_22380d31","line":671,"range":{"start_line":671,"start_character":0,"end_line":671,"end_character":45},"updated":"2026-08-17 21:23:39.000000000","message":"consider medium timeout here","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":668,"context_line":""},{"line_number":669,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027member\u0027, \u0027remove\u0027, member_id]"},{"line_number":670,"context_line":"    try:"},{"line_number":671,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":672,"context_line":"        LOG.info(\"Removed etcd member \u0027%s\u0027 (id %s)\", name, member_id)"},{"line_number":673,"context_line":"    except Exception as e:"},{"line_number":674,"context_line":"        raise exception.SysinvException("}],"source_content_type":"text/x-python","patch_set":25,"id":"cd9e7da1_a12c6ae4","line":671,"range":{"start_line":671,"start_character":0,"end_line":671,"end_character":45},"in_reply_to":"e7d5ff74_22380d31","updated":"2026-08-18 11:09:52.000000000","message":"Done — MEDIUM on member remove.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":677,"context_line":""},{"line_number":678,"context_line":"def is_endpoint_healthy(endpoint):"},{"line_number":679,"context_line":"    \"\"\"Return True if the given etcd endpoint reports healthy.\"\"\""},{"line_number":680,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027endpoint\u0027, \u0027health\u0027]"},{"line_number":681,"context_line":"    try:"},{"line_number":682,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":683,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":25,"id":"c1d2ab32_06eb086d","line":680,"range":{"start_line":680,"start_character":0,"end_line":680,"end_character":58},"updated":"2026-08-17 21:23:39.000000000","message":"i think we need consider a timeout wrapper for most of the etcdctl commands, eg,\n```\netcdctl endpoint health\netcdctl endpoint status\netcdctl member list\netcdctl get ...\n```\n\nThese can hang while waiting for:\n- network connectivity\n- DNS resolution\n- TLS handshakes\n- leader election completion\n- requests to a slow or overloaded cluster\n\nEven the following can run long:\n```\netcdctl snapshot save ...\netcdctl defrag ...\netcdctl check perf\n```\n\nThere is timeout option for subprocess.run, eg,\n```\nsubprocess.run(\n    cmd,\n    capture_output\u003dTrue,\n    text\u003dTrue,\n    timeout\u003d30,\n    check\u003dTrue,\n)\n```\n\nWe already have a timeout 60 mechanism on the \u0027snapshot_save\u0027 function,\n\nWe have also extended the sysinv utility helper execute() to have: delay_on_retry, attempts, and timeout parameters.  I think you should at least add timeout\u003dX for some/all of these, and a particularly small timeout for the is_endpoint_healthy, since you are wait polling that routine. you already have the try block and exception. Perhaps \"SOME\" of the use cases require a LOG.error, but probably not the is_endpoint_healthy","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":677,"context_line":""},{"line_number":678,"context_line":"def is_endpoint_healthy(endpoint):"},{"line_number":679,"context_line":"    \"\"\"Return True if the given etcd endpoint reports healthy.\"\"\""},{"line_number":680,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027endpoint\u0027, \u0027health\u0027]"},{"line_number":681,"context_line":"    try:"},{"line_number":682,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":683,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":25,"id":"a1068bd7_c6896d4b","line":680,"range":{"start_line":680,"start_character":0,"end_line":680,"end_character":58},"in_reply_to":"c1d2ab32_06eb086d","updated":"2026-08-18 11:09:52.000000000","message":"Agreed, and the right catch. Every etcdctl invocation in the file is now bounded — two constants at the top, SHORT for read-only queries and MEDIUM for membership changes. utils.execute already accepts timeout\u003d, so no new wrapper was needed. A hung call in the periodic audit would have held the conductor greenthread for its duration.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":679,"context_line":"    \"\"\"Return True if the given etcd endpoint reports healthy.\"\"\""},{"line_number":680,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027endpoint\u0027, \u0027health\u0027]"},{"line_number":681,"context_line":"    try:"},{"line_number":682,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":683,"context_line":"        return True"},{"line_number":684,"context_line":"    except Exception:"},{"line_number":685,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":25,"id":"a2918ea7_0bb23774","line":682,"range":{"start_line":682,"start_character":0,"end_line":682,"end_character":45},"updated":"2026-08-17 21:23:39.000000000","message":"consider small timeout here","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":679,"context_line":"    \"\"\"Return True if the given etcd endpoint reports healthy.\"\"\""},{"line_number":680,"context_line":"    cmd \u003d _etcdctl_base(endpoint) + [\u0027endpoint\u0027, \u0027health\u0027]"},{"line_number":681,"context_line":"    try:"},{"line_number":682,"context_line":"        utils.execute(*cmd, run_as_root\u003dTrue)"},{"line_number":683,"context_line":"        return True"},{"line_number":684,"context_line":"    except Exception:"},{"line_number":685,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":25,"id":"6bfeb952_9189ac57","line":682,"range":{"start_line":682,"start_character":0,"end_line":682,"end_character":45},"in_reply_to":"a2918ea7_0bb23774","updated":"2026-08-18 11:09:52.000000000","message":"Done — SHORT on endpoint health.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":736,"context_line":"# Cluster-host names for every member. Present in /etc/hosts on all"},{"line_number":737,"context_line":"# controllers, and correct in every system mode: on simplex both the floating"},{"line_number":738,"context_line":"# and controller-0 names resolve to the same address."},{"line_number":739,"context_line":"ETCD_CLUSTER_HOST_NAMES \u003d ("},{"line_number":740,"context_line":"    \u0027controller-cluster-host\u0027,"},{"line_number":741,"context_line":"    \u0027controller-0-cluster-host\u0027,"},{"line_number":742,"context_line":"    \u0027controller-1-cluster-host\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"60e6fbf5_152790cc","line":739,"range":{"start_line":739,"start_character":0,"end_line":739,"end_character":27},"updated":"2026-08-17 21:23:39.000000000","message":"perhaps co-located near top of file with the other ETCD definitions","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":736,"context_line":"# Cluster-host names for every member. Present in /etc/hosts on all"},{"line_number":737,"context_line":"# controllers, and correct in every system mode: on simplex both the floating"},{"line_number":738,"context_line":"# and controller-0 names resolve to the same address."},{"line_number":739,"context_line":"ETCD_CLUSTER_HOST_NAMES \u003d ("},{"line_number":740,"context_line":"    \u0027controller-cluster-host\u0027,"},{"line_number":741,"context_line":"    \u0027controller-0-cluster-host\u0027,"},{"line_number":742,"context_line":"    \u0027controller-1-cluster-host\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"efa8d366_05b4d04d","line":739,"range":{"start_line":739,"start_character":0,"end_line":739,"end_character":27},"in_reply_to":"60e6fbf5_152790cc","updated":"2026-08-18 11:09:52.000000000","message":"Done — ETCD_CLUSTER_HOST_NAMES moved up to line 64 with the rest.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":850,"context_line":"        if not client_urls:"},{"line_number":851,"context_line":"            unhealthy.append(name)"},{"line_number":852,"context_line":"            continue"},{"line_number":853,"context_line":"        if is_endpoint_healthy(client_urls[0]):"},{"line_number":854,"context_line":"            healthy +\u003d 1"},{"line_number":855,"context_line":"        else:"},{"line_number":856,"context_line":"            unhealthy.append(name)"}],"source_content_type":"text/x-python","patch_set":25,"id":"c3c29b65_1cfd52ed","line":853,"range":{"start_line":853,"start_character":0,"end_line":853,"end_character":47},"updated":"2026-08-17 21:23:39.000000000","message":"this could get slow if we have lots of members and if this routine waits for max timeout. essentially you end up shelling out \u0027etcdctl\u0027 commands multiple times\n\nIf this function is used heavily, in audit, we could adopt mechanism we had for checking K8S endpoints in parallel. It\u0027s very similar in concept. The problem we used to have, was: too many heavy CLI commands taking too much CPU realtime, and taking too much elapsed time for simple audit.\n\nThis ends up being used for the system health check, so we don\u0027t want to be slower.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        if not client_urls:"},{"line_number":851,"context_line":"            unhealthy.append(name)"},{"line_number":852,"context_line":"            continue"},{"line_number":853,"context_line":"        if is_endpoint_healthy(client_urls[0]):"},{"line_number":854,"context_line":"            healthy +\u003d 1"},{"line_number":855,"context_line":"        else:"},{"line_number":856,"context_line":"            unhealthy.append(name)"}],"source_content_type":"text/x-python","patch_set":25,"id":"13db54a9_3a2b2e7f","line":853,"range":{"start_line":853,"start_character":0,"end_line":853,"end_character":47},"in_reply_to":"c3c29b65_1cfd52ed","updated":"2026-08-18 11:09:52.000000000","message":"Fair point, and not done. I\u0027d rather do it as its own change than fold it in: it alters the audit\u0027s runtime behaviour, and if the parallel version gets error handling wrong it could report a degraded cluster as healthy. Could you point me at the K8s endpoint-check code you have in mind so I match the existing pattern?","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"04658038c5b7478a22ad423454f427681906e165","unresolved":true,"context_lines":[{"line_number":76,"context_line":"# Short is for read-only queries that either answer at once or are not going to."},{"line_number":77,"context_line":"# Medium is for membership changes, which the leader has to commit through raft"},{"line_number":78,"context_line":"# before replying."},{"line_number":79,"context_line":"ETCD_CMD_TIMEOUT_SHORT \u003d 20"},{"line_number":80,"context_line":"ETCD_CMD_TIMEOUT_MEDIUM \u003d 60"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"ETCD_VERSIONED_BINARIES_ROOT \u003d \u0027/usr/local/etcd/\u0027"},{"line_number":83,"context_line":"ETCD_SYMLINKS_ROOT \u003d \u0027/var/lib/etcd/\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"36d4ed8f_f8f8b96d","line":80,"range":{"start_line":79,"start_character":0,"end_line":80,"end_character":28},"updated":"2026-08-21 13:41:01.000000000","message":"Need to align with now the timeout now done in:\nhttps://review.opendev.org/c/starlingx/stx-puppet/+/1001123/21/puppet-manifests/debian/trixie/src/bin/etcd_duplex_migration.py\n\nThere is the command and dial timeout. We decided to have 5s command, 2s dial.\nBut, for specific actions, a custom larger value TBD based on the operation.\n\nThink you should create constants for default and specific timeouts, and put them directly on specific commands or have helper function. Between this source and those external scripts, we should align our defintions of short/medium/long/default. I wanted to make sure that \"health\" operations, especially where we wait for completion, were quicker status. Also between this and external script some differences in the choices: 20s, 30s, 60s, vs the default {5s, 2s}.\n\nSeems tht there is the etcdctl timeout options, and the popen/subprocess command timeout available. We have tighter control using the etcdctl options. Perhaps just the etcdctl options sufficient, but in theory we could have both (e,g, on command options, and for Popen/utils.execute (larger overall value \u003d dial + command + 1s). The 1s is safety margin.\n\nWhy wait \"20s\" for a list operation?  Given that etcd is a HA critical service, if we have responsiveness \u003e2s we are pretty much overloaded and dead.\n\nGet agreement and adjust. I do think the code is much more robust handling the timeout though.","commit_id":"5facc568a048af416912ee50bdc3aa49f5ec84f9"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"56df3c4b9ec5d6694c8c07ece01300bf466d6c6c","unresolved":true,"context_lines":[{"line_number":76,"context_line":"# Short is for read-only queries that either answer at once or are not going to."},{"line_number":77,"context_line":"# Medium is for membership changes, which the leader has to commit through raft"},{"line_number":78,"context_line":"# before replying."},{"line_number":79,"context_line":"ETCD_CMD_TIMEOUT_SHORT \u003d 20"},{"line_number":80,"context_line":"ETCD_CMD_TIMEOUT_MEDIUM \u003d 60"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"ETCD_VERSIONED_BINARIES_ROOT \u003d \u0027/usr/local/etcd/\u0027"},{"line_number":83,"context_line":"ETCD_SYMLINKS_ROOT \u003d \u0027/var/lib/etcd/\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"0480555c_70262226","line":80,"range":{"start_line":79,"start_character":0,"end_line":80,"end_character":28},"in_reply_to":"36d4ed8f_f8f8b96d","updated":"2026-08-21 13:44:21.000000000","message":"eg, other review has this:\n```\ndef etcdctl_timeouts(command_timeout\u003dNone, dial_timeout\u003dNone):\n    \"\"\"Return timeout flags for etcdctl commands.\"\"\"\n    ct \u003d command_timeout or ETCDCTL_COMMAND_TIMEOUT\n    dt \u003d dial_timeout or ETCDCTL_DIAL_TIMEOUT\n    return [\"--command-timeout\", ct, \"--dial-timeout\", dt]\n```\n\nand similarly does custom command timeout depending on the action.","commit_id":"5facc568a048af416912ee50bdc3aa49f5ec84f9"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"04658038c5b7478a22ad423454f427681906e165","unresolved":true,"context_lines":[{"line_number":317,"context_line":"        proc \u003d subprocess.Popen(command, stdout\u003dsubprocess.PIPE,"},{"line_number":318,"context_line":"                                stderr\u003dsubprocess.PIPE, env\u003dETCD_API_ENV_VAR)"},{"line_number":319,"context_line":"        try:"},{"line_number":320,"context_line":"            stdout, stderr \u003d proc.communicate(timeout\u003d60)"},{"line_number":321,"context_line":"        except subprocess.TimeoutExpired:"},{"line_number":322,"context_line":"            proc.kill()"},{"line_number":323,"context_line":"            LOG.error(\"Command %s: timed out.\" % command)"}],"source_content_type":"text/x-python","patch_set":28,"id":"6b5f8502_9d16ce27","line":320,"range":{"start_line":320,"start_character":0,"end_line":320,"end_character":57},"updated":"2026-08-21 13:41:01.000000000","message":"get agreement for etcdctl snapshot save.\nThis has 60s timeout. The other script doing snapshot save has different value.\n\nWant to specify for the given command, optionally for Popen or utils execute .\nI\u0027m thinking we should unify how we do this:\neg, command_opts: {command, dial}; wrapper: command + dial + saftey_margin","commit_id":"5facc568a048af416912ee50bdc3aa49f5ec84f9"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"8256641515d9a057997d718c39ec3c6528f0b9e9","unresolved":true,"context_lines":[{"line_number":77,"context_line":"# Medium is for membership changes, which the leader has to commit through raft"},{"line_number":78,"context_line":"# before replying."},{"line_number":79,"context_line":"ETCD_CMD_TIMEOUT_SHORT \u003d 20"},{"line_number":80,"context_line":"ETCD_CMD_TIMEOUT_MEDIUM \u003d 60"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"ETCD_VERSIONED_BINARIES_ROOT \u003d \u0027/usr/local/etcd/\u0027"},{"line_number":83,"context_line":"ETCD_SYMLINKS_ROOT \u003d \u0027/var/lib/etcd/\u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"ea5a6cb5_1f8379c7","line":80,"in_reply_to":"0480555c_70262226","updated":"2026-08-22 10:59:34.000000000","message":"Aligned, with the same constants as the change you linked: 5s command and 2s dial for ordinary calls, 15s command for membership operations, 30s for snapshot. The subprocess ceiling is derived as dial + command + 1 rather than set independently, so the outer bound cannot be shorter than the inner one.\n\nMeasured on an AIO-DX lab (build 740, SRC 2068, etcd 3.6.9), against an unroutable endpoint so the bound is what returns the call:\n\n  5s command timeout   -\u003e 5.83s\n  15s command timeout  -\u003e 15.84s\n\nDerived subprocess ceilings: 8s default, 18s membership, 33s snapshot.\n\nOne honest correction to how I would have described this earlier: the 5s default does not make ordinary calls faster, because etcdctl already defaults to a 5s command timeout -- the explicit flag is for clarity and to make the membership and snapshot cases differ deliberately. What does change is the previous 20s wait on a member list, which is now 5s.\n\nNot in this patchset yet. Leaving the thread open until it is.","commit_id":"c8e9aa12e53caf8d562ff93324c82568bd21cc9b"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"8256641515d9a057997d718c39ec3c6528f0b9e9","unresolved":true,"context_lines":[{"line_number":317,"context_line":"        proc \u003d subprocess.Popen(command, stdout\u003dsubprocess.PIPE,"},{"line_number":318,"context_line":"                                stderr\u003dsubprocess.PIPE, env\u003dETCD_API_ENV_VAR)"},{"line_number":319,"context_line":"        try:"},{"line_number":320,"context_line":"            stdout, stderr \u003d proc.communicate(timeout\u003d60)"},{"line_number":321,"context_line":"        except subprocess.TimeoutExpired:"},{"line_number":322,"context_line":"            proc.kill()"},{"line_number":323,"context_line":"            LOG.error(\"Command %s: timed out.\" % command)"}],"source_content_type":"text/x-python","patch_set":29,"id":"c173347b_a6359c31","line":320,"in_reply_to":"6b5f8502_9d16ce27","updated":"2026-08-22 10:59:34.000000000","message":"Asking rather than deciding, since you asked for agreement.\n\nThe value I have used is 30s for the snapshot command, against the 60s you noted elsewhere. Reasoning: a snapshot is a local read of the database, and measured on an AIO-DX lab it takes well under a second -- 0.09 to 0.11 seconds for a 23 MB, 2125-key database. So 30s is already about 300x the observed duration and functions as a stall guard rather than a duration estimate.\n\nIf the other script\u0027s 60s is deliberate -- for a much larger database, or slower storage than the lab -- then I would rather match it than have two values in the tree. Which would you prefer? I will take 60s if you want them consistent.","commit_id":"c8e9aa12e53caf8d562ff93324c82568bd21cc9b"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"ce2b165b566ac6020d4700cb9ff698bcb2b5e2c0","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        proc \u003d subprocess.Popen(command, stdout\u003dsubprocess.PIPE,"},{"line_number":318,"context_line":"                                stderr\u003dsubprocess.PIPE, env\u003dETCD_API_ENV_VAR)"},{"line_number":319,"context_line":"        try:"},{"line_number":320,"context_line":"            stdout, stderr \u003d proc.communicate(timeout\u003d60)"},{"line_number":321,"context_line":"        except subprocess.TimeoutExpired:"},{"line_number":322,"context_line":"            proc.kill()"},{"line_number":323,"context_line":"            LOG.error(\"Command %s: timed out.\" % command)"}],"source_content_type":"text/x-python","patch_set":29,"id":"f55935e2_84f00530","line":320,"range":{"start_line":320,"start_character":0,"end_line":320,"end_character":57},"in_reply_to":"c173347b_a6359c31","updated":"2026-08-31 20:51:25.000000000","message":"Addressed in ps35. The restore path no longer carries a bare literal; it uses ETCD_SNAPSHOT_RESTORE_TIMEOUT, declared with the other etcd timeouts. It is deliberately larger than the save timeout because restoring is local and offline, bounding the process rather than an etcdctl command, and writes the whole keyspace to disk. Every timeout in etcd.py is now a named constant.","commit_id":"c8e9aa12e53caf8d562ff93324c82568bd21cc9b"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"2c27e8e0c2b6bb597a875179698043abbe09a7c9","unresolved":false,"context_lines":[{"line_number":77,"context_line":"# a couple of seconds is overloaded rather than slow, so the defaults are short"},{"line_number":78,"context_line":"# and only the operations that genuinely take longer raise them."},{"line_number":79,"context_line":"ETCDCTL_COMMAND_TIMEOUT \u003d \u00275s\u0027"},{"line_number":80,"context_line":"ETCDCTL_DIAL_TIMEOUT \u003d \u00272s\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"# Membership changes are committed through raft before the leader replies, and"},{"line_number":83,"context_line":"# a snapshot save streams the whole keyspace."}],"source_content_type":"text/x-python","patch_set":30,"id":"f099ea3b_1f6491ef","line":80,"in_reply_to":"0480555c_70262226","updated":"2026-08-22 14:45:13.000000000","message":"Delivered in patchset 30. Same constants as your linked change: 5s command and 2s dial for ordinary calls, 15s for membership operations, 30s for snapshot. The subprocess ceiling is derived as dial + command + 1 rather than set separately, so it cannot be shorter than the inner timeout -- 8s, 18s and 33s respectively.\n\nThe global os.environ.update is also gone; ETCDCTL_API is now set per call and only where the etcd version needs it.\n\nMeasured against an unroutable endpoint so the bound is what ends the call: 5.83s for the 5s command timeout, 15.84s for the 15s one.","commit_id":"f50c0fdd7ff83babc38776afc5f745af8c2296ec"}],"sysinv/sysinv/sysinv/sysinv/conductor/manager.py":[{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":11433,"context_line":"                entity_instance_id\u003dentity_instance_id,"},{"line_number":11434,"context_line":"                severity\u003dfm_constants.FM_ALARM_SEVERITY_CRITICAL,"},{"line_number":11435,"context_line":"                reason_text\u003dreason_text,"},{"line_number":11436,"context_line":"                alarm_type\u003dfm_constants.FM_ALARM_TYPE_1,"},{"line_number":11437,"context_line":"                probable_cause\u003dfm_constants.ALARM_PROBABLE_CAUSE_7,"},{"line_number":11438,"context_line":"                proposed_repair_action\u003d_(\"Add image-conversion filesystem on both controllers.\""},{"line_number":11439,"context_line":"                                         \"Consult the System Administration Manual \""}],"source_content_type":"text/x-python","patch_set":25,"id":"2b68f92e_c52f4808","line":11436,"range":{"start_line":11436,"start_character":0,"end_line":11436,"end_character":56},"updated":"2026-08-17 21:23:39.000000000","message":"why changing this?","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":11433,"context_line":"                entity_instance_id\u003dentity_instance_id,"},{"line_number":11434,"context_line":"                severity\u003dfm_constants.FM_ALARM_SEVERITY_CRITICAL,"},{"line_number":11435,"context_line":"                reason_text\u003dreason_text,"},{"line_number":11436,"context_line":"                alarm_type\u003dfm_constants.FM_ALARM_TYPE_1,"},{"line_number":11437,"context_line":"                probable_cause\u003dfm_constants.ALARM_PROBABLE_CAUSE_7,"},{"line_number":11438,"context_line":"                proposed_repair_action\u003d_(\"Add image-conversion filesystem on both controllers.\""},{"line_number":11439,"context_line":"                                         \"Consult the System Administration Manual \""}],"source_content_type":"text/x-python","patch_set":25,"id":"dd5cbbbb_e984bf13","line":11436,"range":{"start_line":11436,"start_character":0,"end_line":11436,"end_character":56},"in_reply_to":"2b68f92e_c52f4808","updated":"2026-08-18 11:09:52.000000000","message":"It shouldn\u0027t have been — accidental churn. Six unrelated alarms had been flipped from FM_ALARM_TYPE_4 to TYPE_1 (image-conversion, network-port ×2,storage-backend). Reverted; ps28 now adds exactly one FM_ALARM_TYPE_1, the new etcd alarm, matching the communication type already declared for 850.003. \nGood catch.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":28715,"name":"Jim Gauld","email":"James.Gauld@windriver.com","username":"jgauld"},"change_message_id":"11cbfd4053877d627aed5a255facc4e033509daf","unresolved":true,"context_lines":[{"line_number":11456,"context_line":"            entity_instance_id\u003dentity_instance_id,"},{"line_number":11457,"context_line":"            severity\u003dfm_constants.FM_ALARM_SEVERITY_CRITICAL,"},{"line_number":11458,"context_line":"            reason_text\u003dreason_text,"},{"line_number":11459,"context_line":"            alarm_type\u003dfm_constants.FM_ALARM_TYPE_1,"},{"line_number":11460,"context_line":"            probable_cause\u003dfm_constants.ALARM_PROBABLE_CAUSE_7,"},{"line_number":11461,"context_line":"            proposed_repair_action\u003d_(\"Update storage backend configuration to retry. \""},{"line_number":11462,"context_line":"                                     \"Consult the System Administration Manual \""}],"source_content_type":"text/x-python","patch_set":25,"id":"fa04cee6_8e0bed16","line":11459,"range":{"start_line":11459,"start_character":0,"end_line":11459,"end_character":52},"updated":"2026-08-17 21:23:39.000000000","message":"why changing this","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"},{"author":{"_account_id":39267,"name":"Bhushan Bhaskar Dhikale","display_name":"bdhikale","email":"BhushanBhaskar.Dhikale@windriver.com","username":"bdhikale"},"change_message_id":"e4a21b37170bc9c0d82323ff26c48b09f69fa095","unresolved":false,"context_lines":[{"line_number":11456,"context_line":"            entity_instance_id\u003dentity_instance_id,"},{"line_number":11457,"context_line":"            severity\u003dfm_constants.FM_ALARM_SEVERITY_CRITICAL,"},{"line_number":11458,"context_line":"            reason_text\u003dreason_text,"},{"line_number":11459,"context_line":"            alarm_type\u003dfm_constants.FM_ALARM_TYPE_1,"},{"line_number":11460,"context_line":"            probable_cause\u003dfm_constants.ALARM_PROBABLE_CAUSE_7,"},{"line_number":11461,"context_line":"            proposed_repair_action\u003d_(\"Update storage backend configuration to retry. \""},{"line_number":11462,"context_line":"                                     \"Consult the System Administration Manual \""}],"source_content_type":"text/x-python","patch_set":25,"id":"1dca3aad_2e0ab439","line":11459,"range":{"start_line":11459,"start_character":0,"end_line":11459,"end_character":52},"in_reply_to":"fa04cee6_8e0bed16","updated":"2026-08-18 11:09:52.000000000","message":"Done.","commit_id":"0036afea6158f4f17d96d6e6be3153579ef09e54"}]}
