)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38767,"name":"Wael Halbawi","display_name":"Wael Halbawi","email":"whalbawi@nvidia.com","username":"whalbawi"},"change_message_id":"bc3eb9309fa07c6feaffbc4b3516ceb6ef557dff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"265ad42d_d868cbf7","updated":"2026-04-20 16:06:02.000000000","message":"LGTM!","commit_id":"0ab7285d14deccfa1a9bc0e86a4187536286cec0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51c6f83e55339d275030597ad8283269aad19020","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"603ea4df_15c6f363","updated":"2026-04-20 18:53:57.000000000","message":"LGTM!  But I think this change actually exposes some pre-existing duplication in the test setup:\n\n985534: tests: less churn in stub object dirs | https://review.opendev.org/c/openstack/swift/+/985534","commit_id":"0ab7285d14deccfa1a9bc0e86a4187536286cec0"}],"test/unit/cli/test_relinker.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51c6f83e55339d275030597ad8283269aad19020","unresolved":true,"context_lines":[{"line_number":136,"context_line":"                                   get_policy_string(\u0027objects\u0027, policy))"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if remove_objects_dir:"},{"line_number":139,"context_line":"            shutil.rmtree(objects_dir, ignore_errors\u003dTrue)"},{"line_number":140,"context_line":"        if not os.path.exists(objects_dir):"},{"line_number":141,"context_line":"            os.mkdir(objects_dir)"},{"line_number":142,"context_line":"        objdir \u003d os.path.join(objects_dir, str(part), _hash[-3:], _hash)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ce3610a1_f0add7a3","side":"PARENT","line":139,"updated":"2026-04-20 18:53:57.000000000","message":"i\u0027m *fairly* ambivolent about this change - *except* for this being a DEFAULT side-effect of `_create_object` \n\n... removing that seems like a huge win.","commit_id":"ee4237795d7eb3414e32f4209b0376af9749788e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51c6f83e55339d275030597ad8283269aad19020","unresolved":true,"context_lines":[{"line_number":83,"context_line":"                                    \u0027objects\u0027)"},{"line_number":84,"context_line":"        self.policy \u003d StoragePolicy(0, \u0027platinum\u0027, True)"},{"line_number":85,"context_line":"        storage_policy._POLICIES \u003d StoragePolicyCollection([self.policy])"},{"line_number":86,"context_line":"        self._setup_object(policy\u003dself.policy)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        patcher \u003d mock.patch(\u0027swift.cli.relinker.hubs\u0027)"},{"line_number":89,"context_line":"        self.mock_hubs \u003d patcher.start()"}],"source_content_type":"text/x-python","patch_set":1,"id":"98c28e39_fd7664bb","line":86,"updated":"2026-04-20 18:53:57.000000000","message":"N.B. we now *always* create the `self.policy` data/object dir on the `existing_device`","commit_id":"0ab7285d14deccfa1a9bc0e86a4187536286cec0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51c6f83e55339d275030597ad8283269aad19020","unresolved":true,"context_lines":[{"line_number":159,"context_line":"        self.part \u003d part"},{"line_number":160,"context_line":"        self.next_part \u003d next_part"},{"line_number":161,"context_line":"        self.obj_path \u003d obj_path"},{"line_number":162,"context_line":"        objects_dir \u003d self._recreate_objects_dir(policy)"},{"line_number":163,"context_line":"        self.objdir, self.object_fname, self.obj_ts \u003d self._create_object("},{"line_number":164,"context_line":"            policy, part, _hash, ext)"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ed65fc10_9951f419","line":162,"updated":"2026-04-20 18:53:57.000000000","message":"this is a win from an abstraction pov - we move the initial setup into the parent setup - it\u0027s also the reason there\u0027s not more churn than there is.","commit_id":"0ab7285d14deccfa1a9bc0e86a4187536286cec0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51c6f83e55339d275030597ad8283269aad19020","unresolved":true,"context_lines":[{"line_number":2598,"context_line":"        part2 \u003d utils.get_partition_for_hash(hash2, self.rb.part_power)"},{"line_number":2599,"context_line":"        self.assertEqual(part1, part2)"},{"line_number":2600,"context_line":""},{"line_number":2601,"context_line":"        policy \u003d 0"},{"line_number":2602,"context_line":"        self._recreate_objects_dir(policy)"},{"line_number":2603,"context_line":"        objdir1, fname1, _ \u003d self._create_object(policy, part1, hash1)"},{"line_number":2604,"context_line":"        objdir2, fname2, _ \u003d self._create_object(policy, part2, hash2)"}],"source_content_type":"text/x-python","patch_set":1,"id":"34d3bf5f_476b0254","line":2601,"updated":"2026-04-20 18:53:57.000000000","message":"this preserves existing behavior of the test most clearly; but I think it\u0027d be a minor improvement for maintainability if the test used `self.policy`\n\n```\nself.policy \u003d StoragePolicy(0, \u0027platinum\u0027, True)\n```","commit_id":"0ab7285d14deccfa1a9bc0e86a4187536286cec0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51c6f83e55339d275030597ad8283269aad19020","unresolved":true,"context_lines":[{"line_number":2599,"context_line":"        self.assertEqual(part1, part2)"},{"line_number":2600,"context_line":""},{"line_number":2601,"context_line":"        policy \u003d 0"},{"line_number":2602,"context_line":"        self._recreate_objects_dir(policy)"},{"line_number":2603,"context_line":"        objdir1, fname1, _ \u003d self._create_object(policy, part1, hash1)"},{"line_number":2604,"context_line":"        objdir2, fname2, _ \u003d self._create_object(policy, part2, hash2)"},{"line_number":2605,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"f3fd7d35_2a37cfbd","line":2602,"updated":"2026-04-20 18:53:57.000000000","message":"*actually* we call `_setup_object` in `setUp` - so this isn\u0027t needed either.","commit_id":"0ab7285d14deccfa1a9bc0e86a4187536286cec0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51c6f83e55339d275030597ad8283269aad19020","unresolved":true,"context_lines":[{"line_number":2705,"context_line":"        # next part *will* be handled during cleanup"},{"line_number":2706,"context_line":"        _hash, pol_1_part, pol_1_next_part, objpath \u003d self._get_object_name("},{"line_number":2707,"context_line":"            lambda part: part \u003c 2 ** (PART_POWER - 1))"},{"line_number":2708,"context_line":"        self._recreate_objects_dir(POLICIES[1])"},{"line_number":2709,"context_line":"        self._create_object(POLICIES[1], pol_1_part, _hash)"},{"line_number":2710,"context_line":""},{"line_number":2711,"context_line":"        state_files \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"6f9def63_f31bc94c","line":2708,"updated":"2026-04-20 18:53:57.000000000","message":"un-needed in my test - this test already calls `_setup_object` on L2703","commit_id":"0ab7285d14deccfa1a9bc0e86a4187536286cec0"}]}
