)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"61712aac36745e170f277faa347c4a798b118fbf","unresolved":true,"context_lines":[{"line_number":40,"context_line":"group membership and are unaffected (raise NotImplemented, tests"},{"line_number":41,"context_line":"auto-skip via SkipNotImplementedMeta)."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Endpoint-health plumbing"},{"line_number":44,"context_line":"------------------------"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Membership liveness tells a consumer that a member\u0027s process is alive"},{"line_number":47,"context_line":"(its session/lease/TTL is current), but not that the endpoint it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"f6d01e92_e76d3b44","line":44,"range":{"start_line":43,"start_character":0,"end_line":44,"end_character":24},"updated":"2026-07-19 15:06:04.000000000","message":"Can we split this part to a separate change because these two don\u0027t have to be in a single commit ?","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"36e768ec0ca6dfd7a9899cde99fd04c919fcc1b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"75297cf3_c90890a8","line":44,"in_reply_to":"f6d01e92_e76d3b44","updated":"2026-07-20 11:08:14.000000000","message":"Done. Split into two changes: this one now contains only get_members_with_capabilities(), and the endpoint-health plumbing (provides_endpoint_health + healthcheck_endpoint_url) moved to a new change: https://review.opendev.org/c/openstack/tooz/+/997959","commit_id":"92884b42d14b95a9f3145063baad9419e69809de"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"6a30756868ccfa080beeb0acd3c5c85fb05729b3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4bb31cdb_eec5e142","updated":"2026-07-20 11:25:27.000000000","message":"Thanks. The update looks almost good. Could you also add a new test case for this API ? (See tooz/tests/test_coordination.py )","commit_id":"92884b42d14b95a9f3145063baad9419e69809de"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"7052e37df88572433d33660bc8343f1cca114d6a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d51f8837_2a5e22c6","in_reply_to":"4bb31cdb_eec5e142","updated":"2026-07-20 11:26:02.000000000","message":"Ignore it. There was some problem with view (was not checking diff from master ...)","commit_id":"92884b42d14b95a9f3145063baad9419e69809de"}],"tooz/coordination.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"61712aac36745e170f277faa347c4a798b118fbf","unresolved":true,"context_lines":[{"line_number":297,"context_line":"    current) tells a consumer that the member\u0027s *process* is alive, but not"},{"line_number":298,"context_line":"    that the service it advertises is actually reachable and answering.  A"},{"line_number":299,"context_line":"    driver sets this to ``True`` when the backing store additionally probes"},{"line_number":300,"context_line":"    the advertised endpoint (for example, Consul\u0027s server-side HTTP health"},{"line_number":301,"context_line":"    check) so that :meth:`get_members` / :meth:`get_members_with_capabilities`"},{"line_number":302,"context_line":"    only return members whose endpoint has been verified healthy."},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"87178a78_8ad6855b","line":300,"range":{"start_line":300,"start_character":29,"end_line":300,"end_character":40},"updated":"2026-07-19 15:06:04.000000000","message":"(we could discuss this further once this is split out to a separate commit but) I wonder if we expect that this may be implemented really in different backends in a near future ?","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"8abbfe5376eb04fab43472d19857e62b84f6a20e","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    current) tells a consumer that the member\u0027s *process* is alive, but not"},{"line_number":298,"context_line":"    that the service it advertises is actually reachable and answering.  A"},{"line_number":299,"context_line":"    driver sets this to ``True`` when the backing store additionally probes"},{"line_number":300,"context_line":"    the advertised endpoint (for example, Consul\u0027s server-side HTTP health"},{"line_number":301,"context_line":"    check) so that :meth:`get_members` / :meth:`get_members_with_capabilities`"},{"line_number":302,"context_line":"    only return members whose endpoint has been verified healthy."},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2d10552a_d0f8652b","line":300,"range":{"start_line":300,"start_character":29,"end_line":300,"end_character":40},"in_reply_to":"5f753803_19718a27","updated":"2026-07-22 07:03:35.000000000","message":"Let\u0027s move the discussion in the separate patch. As I mentioned in my comment in another place I agree we could implement the healthcheck but am not too sure how much we should expose these publicly for now, and am concerned with implementing more and more interfaces which are effectively specific to the specific backend.","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ac40436da00e62ae1a83e7fefd8ec8ebe2e5661c","unresolved":true,"context_lines":[{"line_number":297,"context_line":"    current) tells a consumer that the member\u0027s *process* is alive, but not"},{"line_number":298,"context_line":"    that the service it advertises is actually reachable and answering.  A"},{"line_number":299,"context_line":"    driver sets this to ``True`` when the backing store additionally probes"},{"line_number":300,"context_line":"    the advertised endpoint (for example, Consul\u0027s server-side HTTP health"},{"line_number":301,"context_line":"    check) so that :meth:`get_members` / :meth:`get_members_with_capabilities`"},{"line_number":302,"context_line":"    only return members whose endpoint has been verified healthy."},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f753803_19718a27","line":300,"range":{"start_line":300,"start_character":29,"end_line":300,"end_character":40},"in_reply_to":"87178a78_8ad6855b","updated":"2026-07-20 11:13:30.000000000","message":"So, presently Consul is the only one to natively support it, but it\u0027s kind of essential that it go at this layer -- I looked at whether I could do it in the consuming side, but I really don\u0027t think it is possible, and this feature is a huge reason for using Consul. I actually have some code to do this functionality generically, so we could actually use that as the default function and just override Consul\u0027s behavior to use its native health checking, but it felt like that was a bit heavyweight to try to put inside tooz (since it\u0027s supposed to just be a lightweight wrapper primarily? not contain a ton of its own logic), but I\u0027d love to discuss if you have time.","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"1db8e5f91164e0aa462581aef31d5cc32ff0c7ee","unresolved":true,"context_lines":[{"line_number":920,"context_line":"    \"\"\""},{"line_number":921,"context_line":"    if not capabilities:"},{"line_number":922,"context_line":"        return None"},{"line_number":923,"context_line":"    return capabilities.get(\u0027health_url\u0027) or None"},{"line_number":924,"context_line":""},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"def get_coordinator("}],"source_content_type":"text/x-python","patch_set":3,"id":"9081fc92_26d03855","line":923,"range":{"start_line":923,"start_character":29,"end_line":923,"end_character":39},"updated":"2026-07-19 15:30:12.000000000","message":"I\u0027d prefer more explicit naming such as healthcheck_endpoint_url","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"36e768ec0ca6dfd7a9899cde99fd04c919fcc1b7","unresolved":false,"context_lines":[{"line_number":920,"context_line":"# TODO(harlowja): We\u0027ll have to figure out a way to remove this \u0027alias\u0027 at"},{"line_number":921,"context_line":"# some point in the future (when we have a better way to tell people it has"},{"line_number":922,"context_line":"# moved without messing up their exception catching hierarchy)."},{"line_number":923,"context_line":"ToozError \u003d tooz.ToozError"},{"line_number":924,"context_line":""},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"class ToozDriverChosenPoorly(tooz.ToozError):"}],"source_content_type":"text/x-python","patch_set":4,"id":"c2b1a237_979703b3","line":923,"range":{"start_line":923,"start_character":29,"end_line":923,"end_character":39},"in_reply_to":"9081fc92_26d03855","updated":"2026-07-20 11:08:14.000000000","message":"Done, renamed to healthcheck_endpoint_url (and moved it to the split-out endpoint-health change 997959).","commit_id":"92884b42d14b95a9f3145063baad9419e69809de"}],"tooz/drivers/etcd3gw.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"1db8e5f91164e0aa462581aef31d5cc32ff0c7ee","unresolved":true,"context_lines":[{"line_number":501,"context_line":"                    group_found \u003d True"},{"line_number":502,"context_line":"                else:"},{"line_number":503,"context_line":"                    member_id \u003d metadata[\u0027key\u0027][len(prefix_group) :]"},{"line_number":504,"context_line":"                    caps \u003d utils.loads(value) if value else None"},{"line_number":505,"context_line":"                    result["},{"line_number":506,"context_line":"                        member_id.encode()"},{"line_number":507,"context_line":"                        if isinstance(member_id, str)"}],"source_content_type":"text/x-python","patch_set":3,"id":"cd0362fb_bf128d2a","line":504,"range":{"start_line":504,"start_character":55,"end_line":504,"end_character":64},"updated":"2026-07-19 15:30:12.000000000","message":"I wonder if we should rather drop the key because I think we don\u0027t really expect members without capabilities.","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ac93ad31389e42f30618bd36aba64814b9f4add0","unresolved":false,"context_lines":[{"line_number":501,"context_line":"                    group_found \u003d True"},{"line_number":502,"context_line":"                else:"},{"line_number":503,"context_line":"                    member_id \u003d metadata[\u0027key\u0027][len(prefix_group) :]"},{"line_number":504,"context_line":"                    caps \u003d utils.loads(value) if value else None"},{"line_number":505,"context_line":"                    result["},{"line_number":506,"context_line":"                        member_id.encode()"},{"line_number":507,"context_line":"                        if isinstance(member_id, str)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bb48eda1_7545b12e","line":504,"range":{"start_line":504,"start_character":55,"end_line":504,"end_character":64},"in_reply_to":"cd0362fb_bf128d2a","updated":"2026-07-19 15:34:52.000000000","message":"nevermind. join_group supports capabilities\u003dNone so we should expect that.","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"1db8e5f91164e0aa462581aef31d5cc32ff0c7ee","unresolved":true,"context_lines":[{"line_number":502,"context_line":"                else:"},{"line_number":503,"context_line":"                    member_id \u003d metadata[\u0027key\u0027][len(prefix_group) :]"},{"line_number":504,"context_line":"                    caps \u003d utils.loads(value) if value else None"},{"line_number":505,"context_line":"                    result["},{"line_number":506,"context_line":"                        member_id.encode()"},{"line_number":507,"context_line":"                        if isinstance(member_id, str)"},{"line_number":508,"context_line":"                        else member_id"},{"line_number":509,"context_line":"                    ] \u003d cast(coordination.Capabilities | None, caps)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"            if not group_found:"}],"source_content_type":"text/x-python","patch_set":3,"id":"883c7970_2b1f82e6","line":508,"range":{"start_line":505,"start_character":27,"end_line":508,"end_character":38},"updated":"2026-07-19 15:30:12.000000000","message":"get_member does not contain this encode. Can we remove it ?","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"36e768ec0ca6dfd7a9899cde99fd04c919fcc1b7","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                    result[member_id] \u003d cast("},{"line_number":506,"context_line":"                        coordination.Capabilities | None, caps"},{"line_number":507,"context_line":"                    )"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"            if not group_found:"},{"line_number":510,"context_line":"                raise coordination.GroupNotCreated(group_id)"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3d035998_8f388164","line":508,"range":{"start_line":505,"start_character":27,"end_line":508,"end_character":38},"in_reply_to":"883c7970_2b1f82e6","updated":"2026-07-20 11:08:14.000000000","message":"ah yeah, removed. member_id here is always bytes I guess (a slice of metadata[\u0027key\u0027])","commit_id":"92884b42d14b95a9f3145063baad9419e69809de"}],"tooz/drivers/zookeeper.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"61712aac36745e170f277faa347c4a798b118fbf","unresolved":true,"context_lines":[{"line_number":445,"context_line":"            _get_member_capabilities,"},{"line_number":446,"context_line":"            timeout_exception\u003dself._timeout_exception,"},{"line_number":447,"context_line":"            group_id\u003dgroup_id,"},{"line_number":448,"context_line":"            member_id\u003dmember_id,"},{"line_number":449,"context_line":"        )"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def get_members_with_capabilities("}],"source_content_type":"text/x-python","patch_set":3,"id":"8b705bb4_9901d81d","line":448,"range":{"start_line":448,"start_character":22,"end_line":448,"end_character":31},"updated":"2026-07-19 15:06:04.000000000","message":"This looks like a bug we should separately fix.","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d54a770484f65335129a7197a713aea410896a02","unresolved":true,"context_lines":[{"line_number":445,"context_line":"            _get_member_capabilities,"},{"line_number":446,"context_line":"            timeout_exception\u003dself._timeout_exception,"},{"line_number":447,"context_line":"            group_id\u003dgroup_id,"},{"line_number":448,"context_line":"            member_id\u003dmember_id,"},{"line_number":449,"context_line":"        )"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def get_members_with_capabilities("}],"source_content_type":"text/x-python","patch_set":3,"id":"b828677a_1c952278","line":448,"range":{"start_line":448,"start_character":22,"end_line":448,"end_character":31},"in_reply_to":"8b705bb4_9901d81d","updated":"2026-07-19 15:09:17.000000000","message":"I\u0027ve proposed https://review.opendev.org/c/openstack/tooz/+/997877 to fix this.","commit_id":"98499819b894fca228813dd4b767be41c850f9ef"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"36e768ec0ca6dfd7a9899cde99fd04c919fcc1b7","unresolved":false,"context_lines":[{"line_number":445,"context_line":"            _get_member_capabilities,"},{"line_number":446,"context_line":"            timeout_exception\u003dself._timeout_exception,"},{"line_number":447,"context_line":"            group_id\u003dgroup_id,"},{"line_number":448,"context_line":"            member_id\u003dmember_id,"},{"line_number":449,"context_line":"        )"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def get_members_with_capabilities("}],"source_content_type":"text/x-python","patch_set":4,"id":"3707b677_28447b18","line":448,"range":{"start_line":448,"start_character":22,"end_line":448,"end_character":31},"in_reply_to":"b828677a_1c952278","updated":"2026-07-20 11:08:14.000000000","message":"Probably could have just left that fix here? but I guess you wanted to merge it ASAP without the baggage of this chain -- that\u0027s fine I guess, I rebased to I picked it up from your patch","commit_id":"92884b42d14b95a9f3145063baad9419e69809de"}]}
