)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"80d473a96bf25501ee3f865b036b7fbbea1d0aeb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"82248c85_bc93ea21","updated":"2022-07-29 16:07:54.000000000","message":"this all seems reasonable, but i\u0027m not sure how big of a problem it is \"if you configure it wrong it doesn\u0027t work right\"\n\nI guess reconstructor doesn\u0027t have a handoff_delete because a data frag revert always goes to the node index matching the frag index.  ec tombstones are more like replication, but they\u0027re kind of a special case:  https://github.com/openstack/swift/blob/master/swift/obj/reconstructor.py#L1261-L1266","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c56253dff7f3b5bdab7d24261609f64a7123972","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"98927f93_364cd711","in_reply_to":"82248c85_bc93ea21","updated":"2022-07-29 18:44:24.000000000","message":"The thing that pushed me over toward addressing it is a situation like\n\n* policy A, 4 replicas\n* policy B, 2 replicas\n* handoff_delete \u003d 3\n\nOn master, it all works as expected for policy A -- but policy B can\u0027t delete rebalanced data at all.","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b8c235ee0422fff04b3508f5738152d8c10f163d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5c922260_e6250b9e","updated":"2024-05-20 19:44:18.000000000","message":"Been a couple years, still seems like a reasonable idea.","commit_id":"336c97bbf8a577a5f74dacec4dd245663d626289"}],"swift/obj/replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"80d473a96bf25501ee3f865b036b7fbbea1d0aeb","unresolved":true,"context_lines":[{"line_number":561,"context_line":"                    # delete handoff if we have had handoff_delete successes"},{"line_number":562,"context_line":"                    successes_count \u003d len([resp for resp in responses if resp])"},{"line_number":563,"context_line":"                    delete_handoff \u003d successes_count \u003e\u003d min("},{"line_number":564,"context_line":"                        self.handoff_delete, len(job[\u0027nodes\u0027]))"},{"line_number":565,"context_line":"                else:"},{"line_number":566,"context_line":"                    # delete handoff if all syncs were successful"},{"line_number":567,"context_line":"                    delete_handoff \u003d len(responses) \u003d\u003d len(job[\u0027nodes\u0027]) and \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"04d9905c_5f80300d","line":564,"updated":"2022-07-29 16:07:54.000000000","message":"yeah capping at len(job[\u0027node\u0027]) is probably reasonable!","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b83e6b38a772217021c4e04d6852400f5807e3b","unresolved":false,"context_lines":[{"line_number":561,"context_line":"                    # delete handoff if we have had handoff_delete successes"},{"line_number":562,"context_line":"                    successes_count \u003d len([resp for resp in responses if resp])"},{"line_number":563,"context_line":"                    delete_handoff \u003d successes_count \u003e\u003d min("},{"line_number":564,"context_line":"                        self.handoff_delete, len(job[\u0027nodes\u0027]))"},{"line_number":565,"context_line":"                else:"},{"line_number":566,"context_line":"                    # delete handoff if all syncs were successful"},{"line_number":567,"context_line":"                    delete_handoff \u003d len(responses) \u003d\u003d len(job[\u0027nodes\u0027]) and \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"629bcf53_8dac897f","line":564,"in_reply_to":"04d9905c_5f80300d","updated":"2023-05-22 20:34:43.000000000","message":"Ack","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"}],"test/unit/common/test_db_replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"80d473a96bf25501ee3f865b036b7fbbea1d0aeb","unresolved":true,"context_lines":[{"line_number":894,"context_line":"                ({\u0027handoff_delete\u0027: 1}, [True, True, False], True),"},{"line_number":895,"context_line":"                ({\u0027handoff_delete\u0027: 1}, [True, False, False], True),"},{"line_number":896,"context_line":"                # if we configure it too high, handle it gracefully"},{"line_number":897,"context_line":"                ({\u0027handoff_delete\u0027: 5}, [True] * 3, True),"},{"line_number":898,"context_line":"        ):"},{"line_number":899,"context_line":"            do_test(cfg, repl_results, expected_delete)"},{"line_number":900,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"914ad856_e12a4f86","line":897,"updated":"2022-07-29 16:07:54.000000000","message":"previous code fails this\n\n\t\t\t# if we configure it too high, handle it gracefully\n\t\t\t({\u0027handoff_delete\u0027: 5}, [True] * 3, True),\n\t\t):\n\t\u003e           do_test(cfg, repl_results, expected_delete)\n\n\tswift/test/unit/common/test_db_replicator.py:899: \n\t_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\tswift/test/unit/common/test_db_replicator.py:872: in do_test\n\t    self.assertEqual([\u0027/path/to/file\u0027], self.delete_db_calls)\n\tE   AssertionError: Lists differ: [\u0027/path/to/file\u0027] !\u003d []\n\tE   \n\tE   First list contains 1 additional elements.\n\tE   First extra element 0:\n\tE   \u0027/path/to/file\u0027\n\tE   \n\tE   - [\u0027/path/to/file\u0027]\n\tE   + []\n\n\n... to say nothing of the new warnings","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b83e6b38a772217021c4e04d6852400f5807e3b","unresolved":false,"context_lines":[{"line_number":894,"context_line":"                ({\u0027handoff_delete\u0027: 1}, [True, True, False], True),"},{"line_number":895,"context_line":"                ({\u0027handoff_delete\u0027: 1}, [True, False, False], True),"},{"line_number":896,"context_line":"                # if we configure it too high, handle it gracefully"},{"line_number":897,"context_line":"                ({\u0027handoff_delete\u0027: 5}, [True] * 3, True),"},{"line_number":898,"context_line":"        ):"},{"line_number":899,"context_line":"            do_test(cfg, repl_results, expected_delete)"},{"line_number":900,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"4e8e9e35_4c3e878f","line":897,"in_reply_to":"914ad856_e12a4f86","updated":"2023-05-22 20:34:43.000000000","message":"Ack","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"}],"test/unit/obj/test_replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c56253dff7f3b5bdab7d24261609f64a7123972","unresolved":true,"context_lines":[{"line_number":221,"context_line":"            ring.RingData(intended_replica2part2dev_id,"},{"line_number":222,"context_line":"                          intended_devs, intended_part_shift, next_part_power),"},{"line_number":223,"context_line":"            f)"},{"line_number":224,"context_line":"    print(\u0027created\u0027, testgz)"},{"line_number":225,"context_line":"    for policy in POLICIES:"},{"line_number":226,"context_line":"        policy.object_ring \u003d None  # force reload"},{"line_number":227,"context_line":"    return"}],"source_content_type":"text/x-python","patch_set":2,"id":"d6c69290_4f3f3652","line":224,"updated":"2022-07-29 18:44:24.000000000","message":"I should take this out. I\u0027m still not clear on *why* I needed to pass swift_dir in the config for test_massive_handoff_delete_setting_warnings, but this is leftover from me debugging that.","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b83e6b38a772217021c4e04d6852400f5807e3b","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            ring.RingData(intended_replica2part2dev_id,"},{"line_number":222,"context_line":"                          intended_devs, intended_part_shift, next_part_power),"},{"line_number":223,"context_line":"            f)"},{"line_number":224,"context_line":"    print(\u0027created\u0027, testgz)"},{"line_number":225,"context_line":"    for policy in POLICIES:"},{"line_number":226,"context_line":"        policy.object_ring \u003d None  # force reload"},{"line_number":227,"context_line":"    return"}],"source_content_type":"text/x-python","patch_set":2,"id":"8f7577e1_010ecd33","line":224,"in_reply_to":"d6c69290_4f3f3652","updated":"2023-05-22 20:34:43.000000000","message":"Done","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"80d473a96bf25501ee3f865b036b7fbbea1d0aeb","unresolved":true,"context_lines":[{"line_number":1423,"context_line":"                    (ret_code, \u0027\u0027, [\u0027rsync\u0027, whole_path_from, rsync_mod]))"},{"line_number":1424,"context_line":"            with _mock_process(process_arg_checker):"},{"line_number":1425,"context_line":"                self.replicator.replicate()"},{"line_number":1426,"context_line":"            self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":1427,"context_line":""},{"line_number":1428,"context_line":"    def test_delete_partition_with_handoff_delete_failures(self):"},{"line_number":1429,"context_line":"        with mock.patch(\u0027swift.obj.replicator.http_connect\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"e325c447_10af009c","line":1426,"updated":"2022-07-29 16:07:54.000000000","message":"\u003e           self.assertFalse(os.access(part_path, os.F_OK))\n\tE           AssertionError: True is not false\n\n\nvs\n\n\t\u003e           self.assertFalse(os.path.exists(part_path))\n\tE           AssertionError: True is not false\n\nfor me the \"exists\" boolean is more obvious than the access/F_OK check","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b83e6b38a772217021c4e04d6852400f5807e3b","unresolved":false,"context_lines":[{"line_number":1423,"context_line":"                    (ret_code, \u0027\u0027, [\u0027rsync\u0027, whole_path_from, rsync_mod]))"},{"line_number":1424,"context_line":"            with _mock_process(process_arg_checker):"},{"line_number":1425,"context_line":"                self.replicator.replicate()"},{"line_number":1426,"context_line":"            self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":1427,"context_line":""},{"line_number":1428,"context_line":"    def test_delete_partition_with_handoff_delete_failures(self):"},{"line_number":1429,"context_line":"        with mock.patch(\u0027swift.obj.replicator.http_connect\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"d8248afd_0818ebed","line":1426,"in_reply_to":"25a0f2ba_09caeac9","updated":"2023-05-22 20:34:43.000000000","message":"Done","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c56253dff7f3b5bdab7d24261609f64a7123972","unresolved":true,"context_lines":[{"line_number":1423,"context_line":"                    (ret_code, \u0027\u0027, [\u0027rsync\u0027, whole_path_from, rsync_mod]))"},{"line_number":1424,"context_line":"            with _mock_process(process_arg_checker):"},{"line_number":1425,"context_line":"                self.replicator.replicate()"},{"line_number":1426,"context_line":"            self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":1427,"context_line":""},{"line_number":1428,"context_line":"    def test_delete_partition_with_handoff_delete_failures(self):"},{"line_number":1429,"context_line":"        with mock.patch(\u0027swift.obj.replicator.http_connect\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"25a0f2ba_09caeac9","line":1426,"in_reply_to":"e325c447_10af009c","updated":"2022-07-29 18:44:24.000000000","message":"*shrug* Cribbed from the test above. Will fix on a respin.","commit_id":"8235feff4c74b2838ef47244f265911a42718e77"}]}
