)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcbf600c8dfcd743848d3d9d8e687d5a538222f1","unresolved":true,"context_lines":[{"line_number":22,"context_line":"- the spurious eviction of a live entry (caught by a size assertion)"},{"line_number":23,"context_line":"- the eventual KeyError crash (caught by try/except)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Co-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"},{"line_number":26,"context_line":"Change-Id: I6b35a1a2c7e6df683fe1cd3d75d1fa573e01820e"},{"line_number":27,"context_line":"Signed-off-by: John Dickinson \u003cme@not.mn\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"6916ee6e_c959a983","line":25,"updated":"2026-03-24 20:43:01.000000000","message":"I agree that it shouldn\u0027t rise to the level of co-authorship, but I think it\u0027s also worth us noting when patches are AI-assisted -- I know I\u0027ve [previously used](https://review.opendev.org/c/openstack/liberasurecode/+/961579) something like\n```\nAssisted-by: claude-4-sonnet\n```\nFWIW it looks like [the Linux kernel wants](https://github.com/torvalds/linux/blob/master/Documentation/process/coding-assistants.rst#attribution) something more like\n```\nAssisted-by: Claude:claude-4.6-sonnet\n```\nGot a preference on format?","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0e2cb049e26545a77eb838ce193f838ec6e59f01","unresolved":false,"context_lines":[{"line_number":22,"context_line":"- the spurious eviction of a live entry (caught by a size assertion)"},{"line_number":23,"context_line":"- the eventual KeyError crash (caught by try/except)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Co-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"},{"line_number":26,"context_line":"Change-Id: I6b35a1a2c7e6df683fe1cd3d75d1fa573e01820e"},{"line_number":27,"context_line":"Signed-off-by: John Dickinson \u003cme@not.mn\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"a04bbaa6_7acd9b03","line":25,"in_reply_to":"6916ee6e_c959a983","updated":"2026-03-25 16:49:20.000000000","message":"Done","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f40f17da64f00d397ce38962ffccea5d62a16a61","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"aa491bcb_e516a2f6","updated":"2026-03-16 17:12:26.000000000","message":"I\u0027ll make a bug report and add it to the commit message. For now, comments are addressed and new patch set submitted.","commit_id":"636ba7fa1674fbe2253489a8233217f48c4ca13d"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"73148f22c3966b3aaefc219ade54c3ca1bb90108","unresolved":true,"context_lines":[{"line_number":2868,"context_line":"        while len(self.mapping) \u003e\u003d self.maxsize:"},{"line_number":2869,"context_line":"            old_next, old_key \u003d self.head[self.NEXT][self.NEXT:self.NEXT + 2]"},{"line_number":2870,"context_line":"            self.head[self.NEXT], old_next[self.PREV] \u003d old_next, self.head"},{"line_number":2871,"context_line":"            del self.mapping[old_key]"},{"line_number":2872,"context_line":"        last \u003d self.tail[self.PREV]"},{"line_number":2873,"context_line":"        link \u003d [last, self.tail, key, time.time(), value]"},{"line_number":2874,"context_line":"        self.mapping[key] \u003d last[self.NEXT] \u003d self.tail[self.PREV] \u003d link"}],"source_content_type":"text/x-python","patch_set":1,"id":"3918bcd1_26fd6ac0","line":2871,"updated":"2026-03-14 00:56:42.000000000","message":"OK, so this is where things could blow up -- have we gone searching logs for tracebacks with `self.mapping[old_key]` in them yet?","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"73148f22c3966b3aaefc219ade54c3ca1bb90108","unresolved":true,"context_lines":[{"line_number":2870,"context_line":"            self.head[self.NEXT], old_next[self.PREV] \u003d old_next, self.head"},{"line_number":2871,"context_line":"            del self.mapping[old_key]"},{"line_number":2872,"context_line":"        last \u003d self.tail[self.PREV]"},{"line_number":2873,"context_line":"        link \u003d [last, self.tail, key, time.time(), value]"},{"line_number":2874,"context_line":"        self.mapping[key] \u003d last[self.NEXT] \u003d self.tail[self.PREV] \u003d link"},{"line_number":2875,"context_line":"        return value"},{"line_number":2876,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"78b55c35_aa794fa2","line":2873,"updated":"2026-03-14 00:56:42.000000000","message":"Man, now I want to turn these into dataclasses.","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7039451c5cfe6f3cf80d31bd80f63e68044f62e2","unresolved":false,"context_lines":[{"line_number":2870,"context_line":"            self.head[self.NEXT], old_next[self.PREV] \u003d old_next, self.head"},{"line_number":2871,"context_line":"            del self.mapping[old_key]"},{"line_number":2872,"context_line":"        last \u003d self.tail[self.PREV]"},{"line_number":2873,"context_line":"        link \u003d [last, self.tail, key, time.time(), value]"},{"line_number":2874,"context_line":"        self.mapping[key] \u003d last[self.NEXT] \u003d self.tail[self.PREV] \u003d link"},{"line_number":2875,"context_line":"        return value"},{"line_number":2876,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"39854080_10d3fc44","line":2873,"in_reply_to":"78b55c35_aa794fa2","updated":"2026-03-24 21:12:35.000000000","message":"https://review.opendev.org/c/openstack/swift/+/982011","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"73148f22c3966b3aaefc219ade54c3ca1bb90108","unresolved":true,"context_lines":[{"line_number":5101,"context_line":"        # deletes the live mapping entry under the same key, and leaves an"},{"line_number":5102,"context_line":"        # orphaned link in the list. The next time that key is re-cached, a"},{"line_number":5103,"context_line":"        # second eviction of the orphan attempts del mapping[key] again and"},{"line_number":5104,"context_line":"        # raises KeyError."},{"line_number":5105,"context_line":"        #"},{"line_number":5106,"context_line":"        # Trigger sequence (maxsize\u003d2):"},{"line_number":5107,"context_line":"        #   1. cache 1, 2; promote 1 to MRU → LRU order: 2(LRU), 1(MRU)"}],"source_content_type":"text/x-python","patch_set":1,"id":"94525899_5cd71231","line":5104,"updated":"2026-03-14 00:56:42.000000000","message":"I feel like this description would be better in a bug report ;-)","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f40f17da64f00d397ce38962ffccea5d62a16a61","unresolved":false,"context_lines":[{"line_number":5101,"context_line":"        # deletes the live mapping entry under the same key, and leaves an"},{"line_number":5102,"context_line":"        # orphaned link in the list. The next time that key is re-cached, a"},{"line_number":5103,"context_line":"        # second eviction of the orphan attempts del mapping[key] again and"},{"line_number":5104,"context_line":"        # raises KeyError."},{"line_number":5105,"context_line":"        #"},{"line_number":5106,"context_line":"        # Trigger sequence (maxsize\u003d2):"},{"line_number":5107,"context_line":"        #   1. cache 1, 2; promote 1 to MRU → LRU order: 2(LRU), 1(MRU)"}],"source_content_type":"text/x-python","patch_set":1,"id":"adc60189_d2025296","line":5104,"in_reply_to":"94525899_5cd71231","updated":"2026-03-16 17:12:26.000000000","message":"Acknowledged","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"73148f22c3966b3aaefc219ade54c3ca1bb90108","unresolved":true,"context_lines":[{"line_number":5128,"context_line":"        future \u003d now + 31"},{"line_number":5129,"context_line":""},{"line_number":5130,"context_line":"        with patch(\u0027time.time\u0027, lambda: now):"},{"line_number":5131,"context_line":"            f(1)   # list: 1"},{"line_number":5132,"context_line":"            f(2)   # list: 1, 2"},{"line_number":5133,"context_line":"            f(1)   # hit; 1 promoted to MRU → LRU order: 2, 1"},{"line_number":5134,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ce36dd35_8f4afb8c","line":5131,"updated":"2026-03-14 00:56:42.000000000","message":"Not actually needed, right? We could just do\n```\nf(2)\nf(1)\n```\nand get to the same state.","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f40f17da64f00d397ce38962ffccea5d62a16a61","unresolved":false,"context_lines":[{"line_number":5128,"context_line":"        future \u003d now + 31"},{"line_number":5129,"context_line":""},{"line_number":5130,"context_line":"        with patch(\u0027time.time\u0027, lambda: now):"},{"line_number":5131,"context_line":"            f(1)   # list: 1"},{"line_number":5132,"context_line":"            f(2)   # list: 1, 2"},{"line_number":5133,"context_line":"            f(1)   # hit; 1 promoted to MRU → LRU order: 2, 1"},{"line_number":5134,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9239cdfd_ec905348","line":5131,"in_reply_to":"ce36dd35_8f4afb8c","updated":"2026-03-16 17:12:26.000000000","message":"Done","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"73148f22c3966b3aaefc219ade54c3ca1bb90108","unresolved":true,"context_lines":[{"line_number":5130,"context_line":"        with patch(\u0027time.time\u0027, lambda: now):"},{"line_number":5131,"context_line":"            f(1)   # list: 1"},{"line_number":5132,"context_line":"            f(2)   # list: 1, 2"},{"line_number":5133,"context_line":"            f(1)   # hit; 1 promoted to MRU → LRU order: 2, 1"},{"line_number":5134,"context_line":""},{"line_number":5135,"context_line":"        with patch(\u0027time.time\u0027, lambda: future):"},{"line_number":5136,"context_line":"            # Refresh expired key 1.  The fix removes the ghost link and"}],"source_content_type":"text/x-python","patch_set":1,"id":"dcc79f61_51b70191","line":5133,"range":{"start_line":5133,"start_character":44,"end_line":5133,"end_character":45},"updated":"2026-03-14 00:56:42.000000000","message":"Oh god, I\u0027m going to need to go searching everywhere for arrows and em dashes, aren\u0027t I? IDK about others, but I\u0027ve got a strong preference for `-\u003e` and `--` instead (and in general, ASCII in my source).","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f40f17da64f00d397ce38962ffccea5d62a16a61","unresolved":false,"context_lines":[{"line_number":5130,"context_line":"        with patch(\u0027time.time\u0027, lambda: now):"},{"line_number":5131,"context_line":"            f(1)   # list: 1"},{"line_number":5132,"context_line":"            f(2)   # list: 1, 2"},{"line_number":5133,"context_line":"            f(1)   # hit; 1 promoted to MRU → LRU order: 2, 1"},{"line_number":5134,"context_line":""},{"line_number":5135,"context_line":"        with patch(\u0027time.time\u0027, lambda: future):"},{"line_number":5136,"context_line":"            # Refresh expired key 1.  The fix removes the ghost link and"}],"source_content_type":"text/x-python","patch_set":1,"id":"2b6dc08a_50521283","line":5133,"range":{"start_line":5133,"start_character":44,"end_line":5133,"end_character":45},"in_reply_to":"dcc79f61_51b70191","updated":"2026-03-16 17:12:26.000000000","message":"Done","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"73148f22c3966b3aaefc219ade54c3ca1bb90108","unresolved":true,"context_lines":[{"line_number":5141,"context_line":"                             \u0027key 2 was spuriously evicted during expiry \u0027"},{"line_number":5142,"context_line":"                             \u0027refresh of key 1\u0027)"},{"line_number":5143,"context_line":""},{"line_number":5144,"context_line":"            # Add entries to push the ghost link through to the eviction point."},{"line_number":5145,"context_line":"            # Under the bug this sequence ends with an orphaned fresh_1 link"},{"line_number":5146,"context_line":"            # still in the list; the next call to f(1) crashes with KeyError."},{"line_number":5147,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"e93b065c_61904162","line":5144,"range":{"start_line":5144,"start_character":14,"end_line":5144,"end_character":79},"updated":"2026-03-14 00:56:42.000000000","message":"Didn\u0027t we just say that we fixed it so there is no ghost link?","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f40f17da64f00d397ce38962ffccea5d62a16a61","unresolved":false,"context_lines":[{"line_number":5141,"context_line":"                             \u0027key 2 was spuriously evicted during expiry \u0027"},{"line_number":5142,"context_line":"                             \u0027refresh of key 1\u0027)"},{"line_number":5143,"context_line":""},{"line_number":5144,"context_line":"            # Add entries to push the ghost link through to the eviction point."},{"line_number":5145,"context_line":"            # Under the bug this sequence ends with an orphaned fresh_1 link"},{"line_number":5146,"context_line":"            # still in the list; the next call to f(1) crashes with KeyError."},{"line_number":5147,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"e3e52ec2_73dafa5e","line":5144,"range":{"start_line":5144,"start_character":14,"end_line":5144,"end_character":79},"in_reply_to":"e93b065c_61904162","updated":"2026-03-16 17:12:26.000000000","message":"Done","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"73148f22c3966b3aaefc219ade54c3ca1bb90108","unresolved":true,"context_lines":[{"line_number":5148,"context_line":"                f(3)"},{"line_number":5149,"context_line":"                f(4)"},{"line_number":5150,"context_line":"                f(1)"},{"line_number":5151,"context_line":"            except KeyError:"},{"line_number":5152,"context_line":"                self.fail("},{"line_number":5153,"context_line":"                    \u0027KeyError raised: ghost link was left in the linked list \u0027"},{"line_number":5154,"context_line":"                    \u0027after an expiry refresh, corrupting subsequent evictions\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"80743a0a_1c64b367","line":5151,"updated":"2026-03-14 00:56:42.000000000","message":"This somewhat hides which call raised the `KeyError` -- might be better to scope the `try`/`except` to just `f(1)` (or drop it all together).","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f40f17da64f00d397ce38962ffccea5d62a16a61","unresolved":false,"context_lines":[{"line_number":5148,"context_line":"                f(3)"},{"line_number":5149,"context_line":"                f(4)"},{"line_number":5150,"context_line":"                f(1)"},{"line_number":5151,"context_line":"            except KeyError:"},{"line_number":5152,"context_line":"                self.fail("},{"line_number":5153,"context_line":"                    \u0027KeyError raised: ghost link was left in the linked list \u0027"},{"line_number":5154,"context_line":"                    \u0027after an expiry refresh, corrupting subsequent evictions\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1e7f3efc_01b092f1","line":5151,"in_reply_to":"80743a0a_1c64b367","updated":"2026-03-16 17:12:26.000000000","message":"Done","commit_id":"e58ff9641b547c5c1de48142ddd533d918335d06"}]}
