)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fa5fa86bd094eda2c8f2e784fb34473396ad790c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"84281d3b_7f9f2662","updated":"2026-08-11 09:17:06.000000000","message":"LGTM\n\nthis is the only test_reconstructor.py unit test that fails with this regression:\n\n```\ndiff --git a/swift/obj/reconstructor.py b/swift/obj/reconstructor.py\nindex cb37d73ef..f7dcbb54c 100644\n--- a/swift/obj/reconstructor.py\n+++ b/swift/obj/reconstructor.py\n@@ -1154,7 +1154,7 @@ class ObjectReconstructor(Daemon):\n         # find all the fi\u0027s in the part, and which suffixes have them\n         try:\n             hashes \u003d self._get_hashes(local_dev[\u0027device\u0027], partition, policy,\n-                                      do_listdir\u003dTrue)\n+                                      do_listdir\u003dFalse)\n         except OSError as e:\n             if e.errno !\u003d errno.ENOTDIR:\n                 raise\n\n```","commit_id":"338b4f93d649574ab3290a7a113d9c4172938dd1"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fa5fa86bd094eda2c8f2e784fb34473396ad790c","unresolved":true,"context_lines":[{"line_number":1671,"context_line":"        self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":1672,"context_line":""},{"line_number":1673,"context_line":"    def test_stale_hashes_do_not_delete_populated_partition(self):"},{"line_number":1674,"context_line":"        # part 2 is predefined to have all revert jobs"},{"line_number":1675,"context_line":"        part_path \u003d os.path.join(self.objects_1, \u00272\u0027)"},{"line_number":1676,"context_line":"        os.unlink(os.path.join(part_path, \u0027hashes.invalid\u0027))"},{"line_number":1677,"context_line":"        with open(os.path.join(part_path, \u0027hashes.pkl\u0027), \u0027wb\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c51c1434_100ceae4","line":1674,"updated":"2026-08-11 09:17:06.000000000","message":"nit: \n\n```\npart 2 is predefined to have two revert jobs\n```","commit_id":"338b4f93d649574ab3290a7a113d9c4172938dd1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fa5fa86bd094eda2c8f2e784fb34473396ad790c","unresolved":true,"context_lines":[{"line_number":1675,"context_line":"        part_path \u003d os.path.join(self.objects_1, \u00272\u0027)"},{"line_number":1676,"context_line":"        os.unlink(os.path.join(part_path, \u0027hashes.invalid\u0027))"},{"line_number":1677,"context_line":"        with open(os.path.join(part_path, \u0027hashes.pkl\u0027), \u0027wb\u0027) as f:"},{"line_number":1678,"context_line":"            pickle.dump({\u0027valid\u0027: True, \u0027updated\u0027: time.time()}, f)"},{"line_number":1679,"context_line":""},{"line_number":1680,"context_line":"        self.assertFalse(self.reconstructor._get_hashes("},{"line_number":1681,"context_line":"            \u0027sda1\u0027, 2, self.policy, do_listdir\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"8a02827d_e99824ce","line":1678,"updated":"2026-08-11 09:17:06.000000000","message":"make cached hashes look good","commit_id":"338b4f93d649574ab3290a7a113d9c4172938dd1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fa5fa86bd094eda2c8f2e784fb34473396ad790c","unresolved":true,"context_lines":[{"line_number":1678,"context_line":"            pickle.dump({\u0027valid\u0027: True, \u0027updated\u0027: time.time()}, f)"},{"line_number":1679,"context_line":""},{"line_number":1680,"context_line":"        self.assertFalse(self.reconstructor._get_hashes("},{"line_number":1681,"context_line":"            \u0027sda1\u0027, 2, self.policy, do_listdir\u003dFalse))"},{"line_number":1682,"context_line":""},{"line_number":1683,"context_line":"        ssync_calls \u003d []"},{"line_number":1684,"context_line":"        with mock.patch(\u0027swift.obj.reconstructor.ssync_sender\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"c5df1eb2_35350fc5","line":1681,"updated":"2026-08-11 09:17:06.000000000","message":"verify that we\u0027d get no hashes with do_listdir false","commit_id":"338b4f93d649574ab3290a7a113d9c4172938dd1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fa5fa86bd094eda2c8f2e784fb34473396ad790c","unresolved":true,"context_lines":[{"line_number":1685,"context_line":"                        self._make_fake_ssync(ssync_calls)):"},{"line_number":1686,"context_line":"            self.reconstructor.reconstruct(override_partitions\u003d[2])"},{"line_number":1687,"context_line":""},{"line_number":1688,"context_line":"        expected_ssync_calls \u003d sorted(["},{"line_number":1689,"context_line":"            (u\u002710.0.0.0\u0027, REVERT, 2, [u\u00273c1\u0027], True),"},{"line_number":1690,"context_line":"            (u\u002710.0.0.2\u0027, REVERT, 2, [u\u0027061\u0027], True),"},{"line_number":1691,"context_line":"        ])"}],"source_content_type":"text/x-python","patch_set":1,"id":"31775b68_5380c410","line":1688,"updated":"2026-08-11 09:17:06.000000000","message":"```\n# these are the predefined revert jobs\n```","commit_id":"338b4f93d649574ab3290a7a113d9c4172938dd1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fa5fa86bd094eda2c8f2e784fb34473396ad790c","unresolved":true,"context_lines":[{"line_number":1688,"context_line":"        expected_ssync_calls \u003d sorted(["},{"line_number":1689,"context_line":"            (u\u002710.0.0.0\u0027, REVERT, 2, [u\u00273c1\u0027], True),"},{"line_number":1690,"context_line":"            (u\u002710.0.0.2\u0027, REVERT, 2, [u\u0027061\u0027], True),"},{"line_number":1691,"context_line":"        ])"},{"line_number":1692,"context_line":"        self.assertEqual(expected_ssync_calls, sorted(("},{"line_number":1693,"context_line":"            c[\u0027node\u0027][\u0027ip\u0027],"},{"line_number":1694,"context_line":"            c[\u0027job\u0027][\u0027job_type\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"089c1b43_a0e2a9e7","line":1691,"updated":"2026-08-11 09:17:06.000000000","message":"do_listdir must have been true","commit_id":"338b4f93d649574ab3290a7a113d9c4172938dd1"}]}
