)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"569ba778442e2147d2752014e54b7abcdaba115b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"721dc538_8aa6f282","updated":"2026-06-03 05:47:26.000000000","message":"recheck\n\nopenstack.exceptions.ConflictException 409 The Stack (test_stack) already exists.","commit_id":"f9a15e3ac1c99e90b352259945c8b431bfd184f8"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dcdd1222bbf4dcca41619601ff4a6f60f1cff01b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"47091288_db4f2d34","updated":"2026-07-02 00:30:25.000000000","message":"OK so in this version we\u0027re just adding the tables, intialising and resizing as approriate. That\u0027s a nice small chuck to review.\n\nQuestion, wan\u0027t the last_parts_moved support to grow into the new ring like moves table?","commit_id":"1fca45f3a163b469a6987b2c55f9a178f4bd7ee3"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"3185ef5e3884e703340b4b6e75a06c7555fd5162","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"741084ae_9aa4b954","updated":"2026-07-28 14:03:19.000000000","message":"Data structures, knobs, serialization, and normalization are all correct. The 255 vs 254 upper bound is fixed in 991133 and is a non-issue for atomic deployment. Looks good to me!","commit_id":"e09510e0a38365d2269db9bc4f5f3e9784650a17"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b30b432d51c25546705a81d8503be6e2fdc54e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"67d10865_71ceceb3","updated":"2026-07-27 07:50:27.000000000","message":"Went back to the design doc, and re-loaded the plan into my head. got last_parts_moved and can_part_moved swapped in my memory, Yes cen_part_moved and history moved tables is number of min_part_hours (or rebalances) ago.\n\nNow that\u0027s it loaded up, let\u0027s work through them again!","commit_id":"e09510e0a38365d2269db9bc4f5f3e9784650a17"}],"swift/common/ring/builder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dcdd1222bbf4dcca41619601ff4a6f60f1cff01b","unresolved":true,"context_lines":[{"line_number":282,"context_line":"            self._replica2part2dev \u003d builder._replica2part2dev"},{"line_number":283,"context_line":"            self._history_replica2part2dev \u003d getattr("},{"line_number":284,"context_line":"                builder, \u0027_history_replica2part2dev\u0027, None)"},{"line_number":285,"context_line":"            self._replica2part2last_moved \u003d getattr("},{"line_number":286,"context_line":"                builder, \u0027_replica2part2last_moved\u0027, None)"},{"line_number":287,"context_line":"            self.max_history_cycles \u003d getattr("},{"line_number":288,"context_line":"                builder, \u0027max_history_cycles\u0027, 7)"}],"source_content_type":"text/x-python","patch_set":2,"id":"434d7486_06f1047a","line":285,"range":{"start_line":285,"start_character":12,"end_line":285,"end_character":41},"updated":"2026-07-02 00:30:25.000000000","message":"Was this going to be replacing the _last_parts_moved? I thought it was basically that but per replica rather then per partition?","commit_id":"1fca45f3a163b469a6987b2c55f9a178f4bd7ee3"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"548f24e75ed36d2810e70d227e99a315136610a9","unresolved":true,"context_lines":[{"line_number":282,"context_line":"            self._replica2part2dev \u003d builder._replica2part2dev"},{"line_number":283,"context_line":"            self._history_replica2part2dev \u003d getattr("},{"line_number":284,"context_line":"                builder, \u0027_history_replica2part2dev\u0027, None)"},{"line_number":285,"context_line":"            self._replica2part2last_moved \u003d getattr("},{"line_number":286,"context_line":"                builder, \u0027_replica2part2last_moved\u0027, None)"},{"line_number":287,"context_line":"            self.max_history_cycles \u003d getattr("},{"line_number":288,"context_line":"                builder, \u0027max_history_cycles\u0027, 7)"}],"source_content_type":"text/x-python","patch_set":2,"id":"8abd9500_00f4d245","line":285,"range":{"start_line":285,"start_character":12,"end_line":285,"end_character":41},"in_reply_to":"434d7486_06f1047a","updated":"2026-07-24 09:24:47.000000000","message":"No, the two coexist. _last_part_moves is unchanged: per partition, in hours, only used to enforce min_part_hours.\n\n_replica2part2last_moved has the same shape as _replica2part2dev (per cell - replica x partition), not the flat per-partition shape of _last_part_moves. It  counts rebalance cycles, not hours, and is used for max_history_cycles / failure_grace_cycles in 991131 and 991132. So it\u0027s an addition, not a replacement.","commit_id":"1fca45f3a163b469a6987b2c55f9a178f4bd7ee3"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d9a4910dc11f4ddb6cfc9d6d41f59f7483c70afb","unresolved":true,"context_lines":[{"line_number":282,"context_line":"            self._replica2part2dev \u003d builder._replica2part2dev"},{"line_number":283,"context_line":"            self._history_replica2part2dev \u003d getattr("},{"line_number":284,"context_line":"                builder, \u0027_history_replica2part2dev\u0027, None)"},{"line_number":285,"context_line":"            self._replica2part2last_moved \u003d getattr("},{"line_number":286,"context_line":"                builder, \u0027_replica2part2last_moved\u0027, None)"},{"line_number":287,"context_line":"            self.max_history_cycles \u003d getattr("},{"line_number":288,"context_line":"                builder, \u0027max_history_cycles\u0027, 7)"}],"source_content_type":"text/x-python","patch_set":2,"id":"11813844_38177b33","line":285,"range":{"start_line":285,"start_character":12,"end_line":285,"end_character":41},"in_reply_to":"8abd9500_00f4d245","updated":"2026-07-27 05:03:05.000000000","message":"oh ok, so \"how many rebalances ago did this particular replica of this partition\" move, not that it moved x many hours ago. Fair enough, I thouhght it was going to be the latter, kk, I guess I should work down (or up) the chain.","commit_id":"1fca45f3a163b469a6987b2c55f9a178f4bd7ee3"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b30b432d51c25546705a81d8503be6e2fdc54e9","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        # Retention knobs. The age table is uint8, so a cap above 255 is"},{"line_number":126,"context_line":"        # unreachable."},{"line_number":127,"context_line":"        self.max_history_cycles \u003d 7"},{"line_number":128,"context_line":"        self.failure_grace_cycles \u003d 1"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        # _last_part_moves is an array of unsigned bytes representing"},{"line_number":131,"context_line":"        # the number of hours since a given partition was last moved."}],"source_content_type":"text/x-python","patch_set":3,"id":"60ca6029_6f4685a9","line":128,"updated":"2026-07-27 07:50:27.000000000","message":"I assume `replica_history_overload` is something we\u0027ll deal with later, once we get a better feel for the initial version with these knobs?","commit_id":"e09510e0a38365d2269db9bc4f5f3e9784650a17"}]}
