)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"bc9e0e8586ab7101db54ff651b2b96ef21bd2159","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1befa567_b5afbe4f","updated":"2026-06-27 09:24:45.000000000","message":"recheck\n\nRun timed out shortly before finishing uploading logs. Unrelated to this change","commit_id":"dcdd97de28ab153eb5f436386e96c0c138f5fa22"},{"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":"74647f3b5f1a322df7268ed3c8e0cf28afd363fe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5eeafa91_135dea08","updated":"2026-07-28 14:36:35.000000000","message":"Looks good to me. Here a few things I analyzed:\n\n- Great test coverage\n- Tested live-history gate: age\u003d0 blocks, age\u003dthreshold releases (strict \u003c)\n- Tested ring v2 persistence: history round-trips, tier classification works (1 important, 2 normal), v1 excludes history\n- Tested pretend_min_part_hours_passed: ages set to 0xff, gate released\n- And overall code quality","commit_id":"62d27807a7de63dafb6796c43c2009741ab252ca"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fe34d1f998d1cad2a87200a29b4cdd83e95d707f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0cac87e1_86cefdd8","updated":"2026-07-31 04:49:36.000000000","message":"Yeah, this is looking good, some comments in-line but nothing I can see as blocking.","commit_id":"62d27807a7de63dafb6796c43c2009741ab252ca"}],"swift/common/ring/builder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fe34d1f998d1cad2a87200a29b4cdd83e95d707f","unresolved":true,"context_lines":[{"line_number":1228,"context_line":"        if self._replica2part2last_moved is not None:"},{"line_number":1229,"context_line":"            for age_row in self._replica2part2last_moved:"},{"line_number":1230,"context_line":"                for p in range(len(age_row)):"},{"line_number":1231,"context_line":"                    age_row[p] \u003d 0xff"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    def get_part_devices(self, part):"},{"line_number":1234,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"9562af7e_06964d73","line":1231,"updated":"2026-07-31 04:49:36.000000000","message":"OK this is where this new design is a little problematic. We\u0027ll have min_part_hours which should pass but then we have max_history_cycles which means this live in history which is a multiplier for min_part_hours. So what should happen in this case?\n\nIt seems to clear the history too, is that what it should do? The function name pretend_min_part_hours_passed would indicate only one histroy cycle is complete... but we know this function really just clears the blocks so we can do a proper rebalance again. I mean, even the doc string basically says, jump to 255 so what you\u0027re doing here is correct, but I really don\u0027t like this name any more.. but for legacy reasons it needs to stay.. but still it feels confusing.\n\nNot that I know what to do here, but annoys me 😉","commit_id":"62d27807a7de63dafb6796c43c2009741ab252ca"}],"swift/common/ring/ring.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fe34d1f998d1cad2a87200a29b4cdd83e95d707f","unresolved":true,"context_lines":[{"line_number":103,"context_line":"            raise ValueError("},{"line_number":104,"context_line":"                \u0027history row count %d does not match assignment %d\u0027"},{"line_number":105,"context_line":"                % (len(history), len(current)))"},{"line_number":106,"context_line":"        for r, hist_row in enumerate(history):"},{"line_number":107,"context_line":"            cur_row \u003d current[r]"},{"line_number":108,"context_line":"            if len(hist_row) !\u003d len(cur_row):"},{"line_number":109,"context_line":"                raise ValueError("}],"source_content_type":"text/x-python","patch_set":3,"id":"c2a114a4_a9ca5d72","line":106,"updated":"2026-07-31 04:49:36.000000000","message":"Could also:\n```\nfor r (hist_row, cur_row) in enumerate(zip(history, current)):\n```\n\nBut maybe your way is more readable. So cool.","commit_id":"62d27807a7de63dafb6796c43c2009741ab252ca"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fe34d1f998d1cad2a87200a29b4cdd83e95d707f","unresolved":true,"context_lines":[{"line_number":222,"context_line":"        if \u0027swift/ring/history\u0027 in reader:"},{"line_number":223,"context_line":"            with reader.open_section(\u0027swift/ring/history\u0027) as section:"},{"line_number":224,"context_line":"                ring_dict[\u0027history\u0027] \u003d section.read_ring_table("},{"line_number":225,"context_line":"                    ring_dict[\u0027dev_id_bytes\u0027], partition_count)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        return ring_dict"},{"line_number":228,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"aa72cfa0_2e958eb9","line":225,"updated":"2026-07-31 04:49:36.000000000","message":"Nice, it\u0027s cool with this history structure we can just use the existing read_ring_table as it has the same shape, dev_id_bytes and historic index is also saved, love it.\n\nThe new moved structure only exists in the builder pickle so not required here too. (for those playing along at home).\n\nOne day, I do want to merge the 2 (builders and rings v2 that is)","commit_id":"62d27807a7de63dafb6796c43c2009741ab252ca"}],"test/unit/common/ring/test_builder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fe34d1f998d1cad2a87200a29b4cdd83e95d707f","unresolved":true,"context_lines":[{"line_number":5731,"context_line":"        rb._history_replica2part2dev[0][0] \u003d ("},{"line_number":5732,"context_line":"            (rb._replica2part2dev[0][0] + 1) % 4)"},{"line_number":5733,"context_line":"        path \u003d os.path.join(self.testdir, \u0027roundtrip.ring.gz\u0027)"},{"line_number":5734,"context_line":"        rb.get_ring().save(path, format_version\u003d2)"},{"line_number":5735,"context_line":"        loaded \u003d ring.RingData.load(path)"},{"line_number":5736,"context_line":"        self.assertIsNotNone(loaded._history_replica2part2dev_id)"},{"line_number":5737,"context_line":"        for builder_row, disk_row in zip(rb._history_replica2part2dev,"}],"source_content_type":"text/x-python","patch_set":3,"id":"8f630f1c_71d8754e","line":5734,"range":{"start_line":5734,"start_character":33,"end_line":5734,"end_character":50},"updated":"2026-07-31 04:49:36.000000000","message":"This is completely off-topic, but I wonder when we should just default to format_version\u003d2?","commit_id":"62d27807a7de63dafb6796c43c2009741ab252ca"}]}
