)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"57416f4b2f9b451185092e8c37d0a203cb1abb16","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"bb518122_88094606","updated":"2026-03-30 04:13:31.000000000","message":"This refactoring patch looks great, using node_key to trace responses does show the complete info in error logging, thanks! \n\nwill merge it after the missing ``len(self.frag_etags)`` assertion is added back.","commit_id":"26e9fa73078d55549d79a83ac539bb1fed432e08"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c51420477f86e0f4f543c4896997fcc5cf83c9b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5186c270_bc31a08f","updated":"2026-03-31 00:02:18.000000000","message":"Yeah that assert-is-durable phrasing on master still looks really bad - I\u0027m glad you like this cleanup!","commit_id":"26e9fa73078d55549d79a83ac539bb1fed432e08"}],"test/probe/test_reconstructor_rebuild.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c51420477f86e0f4f543c4896997fcc5cf83c9b1","unresolved":true,"context_lines":[{"line_number":783,"context_line":"        self.frag_headers \u003d {}"},{"line_number":784,"context_line":"        frag_failures \u003d {}"},{"line_number":785,"context_line":"        for node in self.ec_nodes:"},{"line_number":786,"context_line":"            node_key \u003d _format_node(node)"},{"line_number":787,"context_line":"            try:"},{"line_number":788,"context_line":"                hdrs, etag \u003d self.direct_get(node, self.ec_part)"},{"line_number":789,"context_line":"                self.frag_etags[node_key] \u003d etag"}],"source_content_type":"text/x-python","patch_set":1,"id":"79138ea3_96f67f7c","line":786,"updated":"2026-03-31 00:02:18.000000000","message":"maybe it\u0027s not obvious that `_format_node(node)` will never return the same key for two different nodes, but it will always be unique b/c it includes the `node[\u0027index\u0027]`","commit_id":"26e9fa73078d55549d79a83ac539bb1fed432e08"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"57416f4b2f9b451185092e8c37d0a203cb1abb16","unresolved":true,"context_lines":[{"line_number":794,"context_line":"            self.fail(\u0027\\n\u0027.join(["},{"line_number":795,"context_line":"                \u0027    Node %r raised %r\u0027 % (node, exc)"},{"line_number":796,"context_line":"                for (node, exc) in frag_failures.items()"},{"line_number":797,"context_line":"            ]))"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        # Verify the timestamp has an offset (added by reconciler)"},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bd7e82bf_941c372e","line":797,"updated":"2026-03-30 04:13:31.000000000","message":"after refactoring, this verification was gone. It\u0027ll be good to add it back\n\n```\n        # we need at least ec_ndata fragments for reconstruction\n        self.assertGreaterEqual(\n            len(self.frag_etags), self.ec_policy.ec_ndata,\n            \u0027Not enough EC fragments found after reconciliation: \u0027\n            \u0027found %d, need %d\u0027 % (len(self.frag_etags),\n                                   self.ec_policy.ec_ndata))\n```","commit_id":"26e9fa73078d55549d79a83ac539bb1fed432e08"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c51420477f86e0f4f543c4896997fcc5cf83c9b1","unresolved":true,"context_lines":[{"line_number":794,"context_line":"            self.fail(\u0027\\n\u0027.join(["},{"line_number":795,"context_line":"                \u0027    Node %r raised %r\u0027 % (node, exc)"},{"line_number":796,"context_line":"                for (node, exc) in frag_failures.items()"},{"line_number":797,"context_line":"            ]))"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        # Verify the timestamp has an offset (added by reconciler)"},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"a404ebff_9d5ff5b5","line":797,"in_reply_to":"bd7e82bf_941c372e","updated":"2026-03-31 00:02:18.000000000","message":"I sort of remember that assertion coming up when I was refactoring... I forget why I removed it\n\nlooking again it seems it\u0027s because this `if frag_failures` ensures we have a stronger implied assertion post-refactor:\n\n`len(self.frag_etags) \u003d\u003d\u003d len(self.ec_nodes)`\n\n... because post-cleanup we don\u0027t allow for any of them to not respond?\n\nNevertheless I think it would ALSO be fine to say more about the invariants.","commit_id":"26e9fa73078d55549d79a83ac539bb1fed432e08"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"57416f4b2f9b451185092e8c37d0a203cb1abb16","unresolved":false,"context_lines":[{"line_number":918,"context_line":"                                          self.obj_timestamp.internal))"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        # Verify the rebuilt fragment is durable"},{"line_number":921,"context_line":"        self.assertEqual(rebuilt_hdrs[\u0027X-Backend-Data-Timestamp\u0027],"},{"line_number":922,"context_line":"                         rebuilt_hdrs[\u0027X-Backend-Durable-Timestamp\u0027])"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"        # Proxy GET should still return correct data"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ade55f0_bfff399c","line":921,"updated":"2026-03-30 04:13:31.000000000","message":"good check on this. \u0027X-Backend-Durable-Timestamp\u0027 has to be equal to \u0027X-Backend-Data-Timestamp\u0027 if this frag is durable.","commit_id":"26e9fa73078d55549d79a83ac539bb1fed432e08"}]}
