)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9f28f0081c473cfc7cf11b534bf324f38ab564d","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"swift-manage-shard-ranges repair: check for parent-child overlaps."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Stuck shard ranges have been seen in the production, root cause has been traced back to that s-m-s-r failed to detect parent-child relationship in overlaps and it either shrinked child shard ranges into parents or the other way around. A patch has been added to check minimum age before s-m-s-r performs repair, which will most likely prevent this from happening again, but we also need to check for parent-child relationship in overlaps explicitly during repairs. This partch will do that and remove parent or child shard ranges from doners, and prevent s-m-s-r from shrinking them into acceptor shard ranges."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":12,"context_line":"Change-Id: Iaa89e94a2746ba939fb62449e24bdab9666d7bab"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bf599a09_aeb33502","line":9,"range":{"start_line":9,"start_character":470,"end_line":9,"end_character":476},"updated":"2022-08-30 09:31:36.000000000","message":"typo: s/partch/patch/","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"33a4458406abab2a445ac64518e31784b3365542","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"swift-manage-shard-ranges repair: check for parent-child overlaps."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Stuck shard ranges have been seen in the production, root cause has been traced back to that s-m-s-r failed to detect parent-child relationship in overlaps and it either shrinked child shard ranges into parents or the other way around. A patch has been added to check minimum age before s-m-s-r performs repair, which will most likely prevent this from happening again, but we also need to check for parent-child relationship in overlaps explicitly during repairs. This partch will do that and remove parent or child shard ranges from doners, and prevent s-m-s-r from shrinking them into acceptor shard ranges."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":12,"context_line":"Change-Id: Iaa89e94a2746ba939fb62449e24bdab9666d7bab"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"e3ef0e6c_fc675a04","line":9,"range":{"start_line":9,"start_character":470,"end_line":9,"end_character":476},"in_reply_to":"bf599a09_aeb33502","updated":"2022-09-01 15:57:05.000000000","message":"Done","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"db8790ace62743d9039bcbd6694bf2bb6c39e362","unresolved":true,"context_lines":[{"line_number":7,"context_line":"swift-manage-shard-ranges repair: check for parent-child overlaps."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Stuck shard ranges have been seen in the production, root cause has been"},{"line_number":10,"context_line":"traced back to that s-m-s-r failed to detect parent-child relationship in"},{"line_number":11,"context_line":"overlaps and it either shrinked child shard ranges into parents or the"},{"line_number":12,"context_line":"other way around. A patch has been added to check minimum age before"},{"line_number":13,"context_line":"s-m-s-r performs repair, which will most likely prevent this from happening"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"8acf4f46_c7d0636f","line":10,"updated":"2022-09-05 16:01:48.000000000","message":"nit: line wrap, and below","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"16b1e10db3dabeb954d6d5efe3120a854438cf02","unresolved":false,"context_lines":[{"line_number":7,"context_line":"swift-manage-shard-ranges repair: check for parent-child overlaps."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Stuck shard ranges have been seen in the production, root cause has been"},{"line_number":10,"context_line":"traced back to that s-m-s-r failed to detect parent-child relationship in"},{"line_number":11,"context_line":"overlaps and it either shrinked child shard ranges into parents or the"},{"line_number":12,"context_line":"other way around. A patch has been added to check minimum age before"},{"line_number":13,"context_line":"s-m-s-r performs repair, which will most likely prevent this from happening"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"7ea1dcf4_cbe07dc3","line":10,"in_reply_to":"8acf4f46_c7d0636f","updated":"2022-09-08 21:27:29.000000000","message":"Done","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9f28f0081c473cfc7cf11b534bf324f38ab564d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ab45aff6_9a142623","updated":"2022-08-30 09:31:36.000000000","message":"-1 because account prefix needs to be configurable, otherwise looks great","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1a2402f7c24a9a5b1bd9ce6db16262fbce274059","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"dc1e7f9d_f69de29d","updated":"2022-08-30 05:10:46.000000000","message":"this patch breaks below probe test, because this probe test intentionally creates a gap by repairing overlapping parent-child shard ranges. I will add a new probe test for this patch, but how do we deal with this existing probe test, add an option to disable parent-child checking?\n\ntest/probe/test_sharder.py:TestManagedContainerSharding.test_manage_shard_ranges_repair_root_shrinking_gaps","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0273f28a2f9dfa64cd68571ba7fad7b8083fd286","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"36d709f4_cafaadba","updated":"2022-09-01 19:54:40.000000000","message":"i don\u0027t like options to turn of safety checks in the public cli interface","commit_id":"8c4074ddf154b6d1c813683fff5405b5b71f4345"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c7eb391431701fdb35bedc176cbd3c84545d58a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c9a707b1_2ab25de3","updated":"2022-09-02 14:52:42.000000000","message":"@JianJian I made a first pass at fixing the now-obsolete probe test https://review.opendev.org/c/openstack/swift/+/855670 . If the s-m-s-r merge command merges to master then the test could be modified to use that.\n\nI also rebased this patch on a fix for the historic TODO in the probe test.","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"db8790ace62743d9039bcbd6694bf2bb6c39e362","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"03023b45_dc011989","updated":"2022-09-05 16:01:48.000000000","message":"just some pep8 to fix","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9f6b939ddc4ab35910ce29ac7cf48aada6336212","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"cdedae27_79ac11c6","updated":"2022-09-06 14:33:29.000000000","message":"seems to be going in the right direction - I\u0027m not sure about the status of the dependency.\n\nI fixed pep8 in my follow-on for the probe test: https://review.opendev.org/c/openstack/swift/+/855681","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"018716e5e5a3fae627031a046903109a1f5d1f6f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"78cf2b37_1552ecc2","updated":"2022-09-02 22:51:37.000000000","message":"thanks so much for the reviews and help!","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"87bf206d4d7878b7deb549d510f5aa87fa4cbba2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"402f5cac_182ea182","updated":"2022-09-08 18:35:08.000000000","message":"this all seems reasonable, please squash https://review.opendev.org/c/openstack/swift/+/856484","commit_id":"69183e3e53d880558ec46ca80ff05f017cc365f4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"076e149c50cfa3a4bc9efff3ccd990d03e5594d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a93dfc93_1ba45172","updated":"2022-09-08 23:54:23.000000000","message":"recheck\n\nFailure was somewhere in openstack.tests.functional.cloud.test_project_cleanup.TestProjectCleanup.test_block_storage_cleanup -- nothing to do with Swift.","commit_id":"f0faccea6701c9ab6be99e65152bae148cf7c1b9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"71eca4631009d73ec2dbee51a7703b9041b70fa1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"8d05ec01_5de65927","updated":"2022-09-09 08:57:10.000000000","message":"great work JianJian\n\nI\u0027m holding back on merging because it wasn\u0027t clear from the discussion on https://review.opendev.org/c/openstack/swift/+/856484 if you were intending to change the filter_nodes signature","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"37bb75ab06658673840cff350f3f8588959b9293","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"f55668d4_5c2a1feb","updated":"2022-09-09 18:21:54.000000000","message":"Thanks a lot!","commit_id":"a53270a15a97c4e4d1c384a1cd10fef0a36af9b5"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"17a514a7a54386528af36fbf0ca7eb3651bbea5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"c297a233_47884d05","updated":"2022-09-09 21:49:05.000000000","message":"recheck\none of tempest test case failed due to ssh timeout.\n\"socket.timeout: timed out\ntempest.lib.exceptions.SSHTimeout: Connection to the 172.24.5.121 via SSH timed out.\"","commit_id":"a53270a15a97c4e4d1c384a1cd10fef0a36af9b5"}],"swift/cli/manage_shard_ranges.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9f28f0081c473cfc7cf11b534bf324f38ab564d","unresolved":true,"context_lines":[{"line_number":568,"context_line":"        acceptor_path, overlapping_donors, args):"},{"line_number":569,"context_line":"    # Check parent-children relationship in overlaps between acceptors and"},{"line_number":570,"context_line":"    # donors, remove any overlapping parent or child shard range from donors."},{"line_number":571,"context_line":"    prefix \u003d \u0027.shards_\u0027"},{"line_number":572,"context_line":"    # We can use set() here, since shard range object is hashed by id and"},{"line_number":573,"context_line":"    # all shard ranges in overlapping_donors are unique already."},{"line_number":574,"context_line":"    parent_child_donors \u003d set()"}],"source_content_type":"text/x-python","patch_set":3,"id":"6eec5dc8_c2e4a8d3","line":571,"range":{"start_line":571,"start_character":13,"end_line":571,"end_character":23},"updated":"2022-08-30 09:31:36.000000000","message":"we should allow this to be modified by the command line args rather than hard code. See _add_account_prefix_arg.\n\n(the fact that the prefix can be configured has turned out to be a pain, but we need to cope with that)","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"33a4458406abab2a445ac64518e31784b3365542","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        acceptor_path, overlapping_donors, args):"},{"line_number":569,"context_line":"    # Check parent-children relationship in overlaps between acceptors and"},{"line_number":570,"context_line":"    # donors, remove any overlapping parent or child shard range from donors."},{"line_number":571,"context_line":"    prefix \u003d \u0027.shards_\u0027"},{"line_number":572,"context_line":"    # We can use set() here, since shard range object is hashed by id and"},{"line_number":573,"context_line":"    # all shard ranges in overlapping_donors are unique already."},{"line_number":574,"context_line":"    parent_child_donors \u003d set()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ff3688b_8dc961ec","line":571,"range":{"start_line":571,"start_character":13,"end_line":571,"end_character":23},"in_reply_to":"6eec5dc8_c2e4a8d3","updated":"2022-09-01 15:57:05.000000000","message":"Done","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9f28f0081c473cfc7cf11b534bf324f38ab564d","unresolved":true,"context_lines":[{"line_number":576,"context_line":"        parent_child_donors.update("},{"line_number":577,"context_line":"            [donor for donor in overlapping_donors"},{"line_number":578,"context_line":"             if acceptor.is_child_of(donor, prefix) or donor.is_child_of("},{"line_number":579,"context_line":"                 acceptor, prefix)])"},{"line_number":580,"context_line":"    if parent_child_donors:"},{"line_number":581,"context_line":"        overlapping_donors \u003d ShardRangeList("},{"line_number":582,"context_line":"            [sr for sr in overlapping_donors"}],"source_content_type":"text/x-python","patch_set":3,"id":"88e4f523_8f62c15e","line":579,"updated":"2022-08-30 09:31:36.000000000","message":"+1 check both directions","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"33a4458406abab2a445ac64518e31784b3365542","unresolved":false,"context_lines":[{"line_number":576,"context_line":"        parent_child_donors.update("},{"line_number":577,"context_line":"            [donor for donor in overlapping_donors"},{"line_number":578,"context_line":"             if acceptor.is_child_of(donor, prefix) or donor.is_child_of("},{"line_number":579,"context_line":"                 acceptor, prefix)])"},{"line_number":580,"context_line":"    if parent_child_donors:"},{"line_number":581,"context_line":"        overlapping_donors \u003d ShardRangeList("},{"line_number":582,"context_line":"            [sr for sr in overlapping_donors"}],"source_content_type":"text/x-python","patch_set":3,"id":"efc4d195_9e515a50","line":579,"in_reply_to":"88e4f523_8f62c15e","updated":"2022-09-01 15:57:05.000000000","message":"Done","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9f28f0081c473cfc7cf11b534bf324f38ab564d","unresolved":true,"context_lines":[{"line_number":581,"context_line":"        overlapping_donors \u003d ShardRangeList("},{"line_number":582,"context_line":"            [sr for sr in overlapping_donors"},{"line_number":583,"context_line":"             if sr not in parent_child_donors])"},{"line_number":584,"context_line":"        print(\u0027%d donor shards removed due to parent-child relationship \u0027"},{"line_number":585,"context_line":"              \u0027checks\u0027 % len(parent_child_donors))"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    # Check minimum age requirement in overlaps between acceptors and donors."}],"source_content_type":"text/x-python","patch_set":3,"id":"79c65d5a_7b4dd11d","line":584,"range":{"start_line":584,"start_character":31,"end_line":584,"end_character":38},"updated":"2022-08-30 09:31:36.000000000","message":"nit: for consistency with the other logging, change this to \u0027ignored\u0027","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"33a4458406abab2a445ac64518e31784b3365542","unresolved":false,"context_lines":[{"line_number":581,"context_line":"        overlapping_donors \u003d ShardRangeList("},{"line_number":582,"context_line":"            [sr for sr in overlapping_donors"},{"line_number":583,"context_line":"             if sr not in parent_child_donors])"},{"line_number":584,"context_line":"        print(\u0027%d donor shards removed due to parent-child relationship \u0027"},{"line_number":585,"context_line":"              \u0027checks\u0027 % len(parent_child_donors))"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    # Check minimum age requirement in overlaps between acceptors and donors."}],"source_content_type":"text/x-python","patch_set":3,"id":"7d2f2523_d4734424","line":584,"range":{"start_line":584,"start_character":31,"end_line":584,"end_character":38},"in_reply_to":"79c65d5a_7b4dd11d","updated":"2022-09-01 15:57:05.000000000","message":"Done","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9f28f0081c473cfc7cf11b534bf324f38ab564d","unresolved":true,"context_lines":[{"line_number":601,"context_line":"        return acceptor_path, None"},{"line_number":602,"context_line":"    # Remove those overlapping donors whose overlapping acceptors were created"},{"line_number":603,"context_line":"    # within age limit."},{"line_number":604,"context_line":"    donors_with_young_overlap_acceptor \u003d set()"},{"line_number":605,"context_line":"    for acceptor_sr in acceptor_path:"},{"line_number":606,"context_line":"        if float(acceptor_sr.timestamp) + args.min_shard_age \u003c float(ts_now):"},{"line_number":607,"context_line":"            continue"}],"source_content_type":"text/x-python","patch_set":3,"id":"82226d22_ab0a58d2","line":604,"updated":"2022-08-30 09:31:36.000000000","message":"+1 for var name change","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"33a4458406abab2a445ac64518e31784b3365542","unresolved":false,"context_lines":[{"line_number":601,"context_line":"        return acceptor_path, None"},{"line_number":602,"context_line":"    # Remove those overlapping donors whose overlapping acceptors were created"},{"line_number":603,"context_line":"    # within age limit."},{"line_number":604,"context_line":"    donors_with_young_overlap_acceptor \u003d set()"},{"line_number":605,"context_line":"    for acceptor_sr in acceptor_path:"},{"line_number":606,"context_line":"        if float(acceptor_sr.timestamp) + args.min_shard_age \u003c float(ts_now):"},{"line_number":607,"context_line":"            continue"}],"source_content_type":"text/x-python","patch_set":3,"id":"4172690c_9492c6ec","line":604,"in_reply_to":"82226d22_ab0a58d2","updated":"2022-09-01 15:57:05.000000000","message":"Done","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0273f28a2f9dfa64cd68571ba7fad7b8083fd286","unresolved":true,"context_lines":[{"line_number":568,"context_line":"        acceptor_path, overlapping_donors, args):"},{"line_number":569,"context_line":"    # Check parent-children relationship in overlaps between acceptors and"},{"line_number":570,"context_line":"    # donors, remove any overlapping parent or child shard range from donors."},{"line_number":571,"context_line":"    if not args.no_ignore_parent_child:"},{"line_number":572,"context_line":"        # Note: we can use set() here, since shard range object is hashed by"},{"line_number":573,"context_line":"        # id and all shard ranges in overlapping_donors are unique already."},{"line_number":574,"context_line":"        parent_child_donors \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"cff7b91b_c4389778","line":571,"updated":"2022-09-01 19:54:40.000000000","message":"When would we recommend turning off this behavior - it seems like it\u0027s always necessary and more correct\n\nI don\u0027t like this condition reads as a double negative (you can configure the parser to action\u003dstore_false if needed)\n\nhttps://docs.python.org/3/library/argparse.html#action","commit_id":"8c4074ddf154b6d1c813683fff5405b5b71f4345"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"018716e5e5a3fae627031a046903109a1f5d1f6f","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        acceptor_path, overlapping_donors, args):"},{"line_number":569,"context_line":"    # Check parent-children relationship in overlaps between acceptors and"},{"line_number":570,"context_line":"    # donors, remove any overlapping parent or child shard range from donors."},{"line_number":571,"context_line":"    if not args.no_ignore_parent_child:"},{"line_number":572,"context_line":"        # Note: we can use set() here, since shard range object is hashed by"},{"line_number":573,"context_line":"        # id and all shard ranges in overlapping_donors are unique already."},{"line_number":574,"context_line":"        parent_child_donors \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fe892e8_a62a2ba7","line":571,"in_reply_to":"cff7b91b_c4389778","updated":"2022-09-02 22:51:37.000000000","message":"Done","commit_id":"8c4074ddf154b6d1c813683fff5405b5b71f4345"}],"swift/common/utils.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"71eca4631009d73ec2dbee51a7703b9041b70fa1","unresolved":true,"context_lines":[{"line_number":5386,"context_line":"        Test if this shard range is a child of another shard range. The"},{"line_number":5387,"context_line":"        parent-child relationship is inferred from the names of the shard"},{"line_number":5388,"context_line":"        ranges. This method is limited to work only within the scope of the"},{"line_number":5389,"context_line":"        same user-facing account (with and without shard prefix)."},{"line_number":5390,"context_line":""},{"line_number":5391,"context_line":"        :param parent: an instance of ``ShardRange``."},{"line_number":5392,"context_line":"        :return: True if ``parent`` is the parent of this shard range, False"}],"source_content_type":"text/x-python","patch_set":12,"id":"9c4665f1_b3d815ff","line":5389,"updated":"2022-09-09 08:57:10.000000000","message":"+1 thanks","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"37bb75ab06658673840cff350f3f8588959b9293","unresolved":false,"context_lines":[{"line_number":5386,"context_line":"        Test if this shard range is a child of another shard range. The"},{"line_number":5387,"context_line":"        parent-child relationship is inferred from the names of the shard"},{"line_number":5388,"context_line":"        ranges. This method is limited to work only within the scope of the"},{"line_number":5389,"context_line":"        same user-facing account (with and without shard prefix)."},{"line_number":5390,"context_line":""},{"line_number":5391,"context_line":"        :param parent: an instance of ``ShardRange``."},{"line_number":5392,"context_line":"        :return: True if ``parent`` is the parent of this shard range, False"}],"source_content_type":"text/x-python","patch_set":12,"id":"4eb77f66_1ee0162d","line":5389,"in_reply_to":"9c4665f1_b3d815ff","updated":"2022-09-09 18:21:54.000000000","message":"Done","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"}],"test/probe/common.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"11c67d2869f21832bb40c19f5c85ed005da3198e","unresolved":true,"context_lines":[{"line_number":346,"context_line":"    next \u003d __next__"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"def filter_nodes(nodes, excludes):"},{"line_number":350,"context_line":"    \"\"\""},{"line_number":351,"context_line":"    Iterate over ``nodes`` yielding only those not in ``excludes``."},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"27227ae6_a95d048e","line":349,"updated":"2022-09-09 17:46:44.000000000","message":"I think the consensus from conversation is to change this signature to\n\n  exclude_nodes(nodes, *excludes)","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"37bb75ab06658673840cff350f3f8588959b9293","unresolved":false,"context_lines":[{"line_number":346,"context_line":"    next \u003d __next__"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"def filter_nodes(nodes, excludes):"},{"line_number":350,"context_line":"    \"\"\""},{"line_number":351,"context_line":"    Iterate over ``nodes`` yielding only those not in ``excludes``."},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fefbfcab_03008a82","line":349,"in_reply_to":"27227ae6_a95d048e","updated":"2022-09-09 18:21:54.000000000","message":"Done","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"11c67d2869f21832bb40c19f5c85ed005da3198e","unresolved":true,"context_lines":[{"line_number":356,"context_line":"    which the nodes were generated."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    :param nodes: an iterable of node dicts."},{"line_number":359,"context_line":"    :param excludes: a node dict or iterable of node dicts that should not be"},{"line_number":360,"context_line":"        yielded."},{"line_number":361,"context_line":"    :return: yields node dicts."},{"line_number":362,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"288cb163_37147647","line":359,"updated":"2022-09-09 17:46:44.000000000","message":"then change this\n\n  one or more node dicts that should not be yielded","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"37bb75ab06658673840cff350f3f8588959b9293","unresolved":false,"context_lines":[{"line_number":356,"context_line":"    which the nodes were generated."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    :param nodes: an iterable of node dicts."},{"line_number":359,"context_line":"    :param excludes: a node dict or iterable of node dicts that should not be"},{"line_number":360,"context_line":"        yielded."},{"line_number":361,"context_line":"    :return: yields node dicts."},{"line_number":362,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"6d695855_3f5c2afb","line":359,"in_reply_to":"288cb163_37147647","updated":"2022-09-09 18:21:54.000000000","message":"Done","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"11c67d2869f21832bb40c19f5c85ed005da3198e","unresolved":true,"context_lines":[{"line_number":360,"context_line":"        yielded."},{"line_number":361,"context_line":"    :return: yields node dicts."},{"line_number":362,"context_line":"    \"\"\""},{"line_number":363,"context_line":"    if not isinstance(excludes, (set, list, tuple)):"},{"line_number":364,"context_line":"        excludes \u003d [excludes]"},{"line_number":365,"context_line":"    for node in nodes:"},{"line_number":366,"context_line":"        match_node \u003d {k: mock.ANY if k \u003d\u003d \u0027index\u0027 else v"},{"line_number":367,"context_line":"                      for k, v in node.items()}"}],"source_content_type":"text/x-python","patch_set":12,"id":"575ec013_fcc048cb","line":364,"range":{"start_line":363,"start_character":4,"end_line":364,"end_character":29},"updated":"2022-09-09 17:46:44.000000000","message":"delete these lines","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"37bb75ab06658673840cff350f3f8588959b9293","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        yielded."},{"line_number":361,"context_line":"    :return: yields node dicts."},{"line_number":362,"context_line":"    \"\"\""},{"line_number":363,"context_line":"    if not isinstance(excludes, (set, list, tuple)):"},{"line_number":364,"context_line":"        excludes \u003d [excludes]"},{"line_number":365,"context_line":"    for node in nodes:"},{"line_number":366,"context_line":"        match_node \u003d {k: mock.ANY if k \u003d\u003d \u0027index\u0027 else v"},{"line_number":367,"context_line":"                      for k, v in node.items()}"}],"source_content_type":"text/x-python","patch_set":12,"id":"bc1da30b_9bab4407","line":364,"range":{"start_line":363,"start_character":4,"end_line":364,"end_character":29},"in_reply_to":"575ec013_fcc048cb","updated":"2022-09-09 18:21:54.000000000","message":"Done","commit_id":"64e5fcc74171549a478b1cd7ad53269dd62d4585"}],"test/probe/test_sharder.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0273f28a2f9dfa64cd68571ba7fad7b8083fd286","unresolved":true,"context_lines":[{"line_number":3543,"context_line":"        # we are allowed to fix the overlap..."},{"line_number":3544,"context_line":"        msg \u003d self.assert_subprocess_success("},{"line_number":3545,"context_line":"            [\u0027swift-manage-shard-ranges\u0027, root_0_db_file, \u0027repair\u0027, \u0027--yes\u0027,"},{"line_number":3546,"context_line":"             \u0027--no-ignore-parent-child\u0027, \u0027--min-shard-age\u0027, \u00270\u0027])"},{"line_number":3547,"context_line":"        self.assertIn("},{"line_number":3548,"context_line":"            b\u0027Repairs necessary to remove overlapping shard ranges.\u0027, msg)"},{"line_number":3549,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"96d04fd6_0e77732e","line":3546,"updated":"2022-09-01 19:54:40.000000000","message":"I hate having to add this option just to let the repair command work in this probetest - can we change the setup so it\u0027s more realistic?\n\nif we can\u0027t setup a reasonable overlap to repair without having to turn of safety checks, maybe we could break things more realistically with a manual s-m-s-r *merge* command?","commit_id":"8c4074ddf154b6d1c813683fff5405b5b71f4345"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"018716e5e5a3fae627031a046903109a1f5d1f6f","unresolved":false,"context_lines":[{"line_number":3543,"context_line":"        # we are allowed to fix the overlap..."},{"line_number":3544,"context_line":"        msg \u003d self.assert_subprocess_success("},{"line_number":3545,"context_line":"            [\u0027swift-manage-shard-ranges\u0027, root_0_db_file, \u0027repair\u0027, \u0027--yes\u0027,"},{"line_number":3546,"context_line":"             \u0027--no-ignore-parent-child\u0027, \u0027--min-shard-age\u0027, \u00270\u0027])"},{"line_number":3547,"context_line":"        self.assertIn("},{"line_number":3548,"context_line":"            b\u0027Repairs necessary to remove overlapping shard ranges.\u0027, msg)"},{"line_number":3549,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"c7b0a85a_5948a2e1","line":3546,"in_reply_to":"6c0fc485_fe0d053a","updated":"2022-09-02 22:51:37.000000000","message":"Done","commit_id":"8c4074ddf154b6d1c813683fff5405b5b71f4345"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"4ba6f006f3260ead88fb67636597077738d677fe","unresolved":true,"context_lines":[{"line_number":3543,"context_line":"        # we are allowed to fix the overlap..."},{"line_number":3544,"context_line":"        msg \u003d self.assert_subprocess_success("},{"line_number":3545,"context_line":"            [\u0027swift-manage-shard-ranges\u0027, root_0_db_file, \u0027repair\u0027, \u0027--yes\u0027,"},{"line_number":3546,"context_line":"             \u0027--no-ignore-parent-child\u0027, \u0027--min-shard-age\u0027, \u00270\u0027])"},{"line_number":3547,"context_line":"        self.assertIn("},{"line_number":3548,"context_line":"            b\u0027Repairs necessary to remove overlapping shard ranges.\u0027, msg)"},{"line_number":3549,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fdb70d1b_40423a76","line":3546,"in_reply_to":"96d04fd6_0e77732e","updated":"2022-09-02 05:15:08.000000000","message":"good idea! this probe test creates and fixes a shard range gap, but this patch prevents this probe test from creating a gap, that\u0027s what got me into adding this new option. I took a look at the pending *merge* command, it looks great, and can be used to create a gap too. Yeah, we should do this instead.","commit_id":"8c4074ddf154b6d1c813683fff5405b5b71f4345"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c7eb391431701fdb35bedc176cbd3c84545d58a","unresolved":true,"context_lines":[{"line_number":3543,"context_line":"        # we are allowed to fix the overlap..."},{"line_number":3544,"context_line":"        msg \u003d self.assert_subprocess_success("},{"line_number":3545,"context_line":"            [\u0027swift-manage-shard-ranges\u0027, root_0_db_file, \u0027repair\u0027, \u0027--yes\u0027,"},{"line_number":3546,"context_line":"             \u0027--no-ignore-parent-child\u0027, \u0027--min-shard-age\u0027, \u00270\u0027])"},{"line_number":3547,"context_line":"        self.assertIn("},{"line_number":3548,"context_line":"            b\u0027Repairs necessary to remove overlapping shard ranges.\u0027, msg)"},{"line_number":3549,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"6c0fc485_fe0d053a","line":3546,"in_reply_to":"fdb70d1b_40423a76","updated":"2022-09-02 14:52:42.000000000","message":"+1 let\u0027s not have an \"--ignore-...\" option but instead modify this test to simply prove that arbitrary gap repair is possible","commit_id":"8c4074ddf154b6d1c813683fff5405b5b71f4345"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c7eb391431701fdb35bedc176cbd3c84545d58a","unresolved":true,"context_lines":[{"line_number":3477,"context_line":"            shard_ranges[0].account, shard_ranges[0].container)"},{"line_number":3478,"context_line":"        self.container_replicators.once("},{"line_number":3479,"context_line":"            additional_args\u003d\u0027--partitions\u003d%s\u0027 % shard_part)"},{"line_number":3480,"context_line":"        # TODO: get this assertion working (node filtering wonky??)"},{"line_number":3481,"context_line":"        # for node in [n for n in shard_nodes if n !\u003d self.brain.nodes[0]]:"},{"line_number":3482,"context_line":"        #     self.assert_container_state("},{"line_number":3483,"context_line":"        #         node, \u0027unsharded\u0027, 2, account\u003dshard_ranges[0].account,"},{"line_number":3484,"context_line":"        #         container\u003dshard_ranges[0].container, part\u003dshard_part)"},{"line_number":3485,"context_line":"        self.sharders_once(additional_args\u003d\u0027--partitions\u003d%s\u0027 % shard_part)"},{"line_number":3486,"context_line":"        # get shards to update state from parent..."},{"line_number":3487,"context_line":"        self.sharders_once()"}],"source_content_type":"text/x-python","patch_set":5,"id":"614fc431_eb88f541","line":3484,"range":{"start_line":3480,"start_character":8,"end_line":3484,"end_character":71},"updated":"2022-09-02 14:52:42.000000000","message":"looks like an oversight that this got merged with the original test :(","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"018716e5e5a3fae627031a046903109a1f5d1f6f","unresolved":false,"context_lines":[{"line_number":3477,"context_line":"            shard_ranges[0].account, shard_ranges[0].container)"},{"line_number":3478,"context_line":"        self.container_replicators.once("},{"line_number":3479,"context_line":"            additional_args\u003d\u0027--partitions\u003d%s\u0027 % shard_part)"},{"line_number":3480,"context_line":"        # TODO: get this assertion working (node filtering wonky??)"},{"line_number":3481,"context_line":"        # for node in [n for n in shard_nodes if n !\u003d self.brain.nodes[0]]:"},{"line_number":3482,"context_line":"        #     self.assert_container_state("},{"line_number":3483,"context_line":"        #         node, \u0027unsharded\u0027, 2, account\u003dshard_ranges[0].account,"},{"line_number":3484,"context_line":"        #         container\u003dshard_ranges[0].container, part\u003dshard_part)"},{"line_number":3485,"context_line":"        self.sharders_once(additional_args\u003d\u0027--partitions\u003d%s\u0027 % shard_part)"},{"line_number":3486,"context_line":"        # get shards to update state from parent..."},{"line_number":3487,"context_line":"        self.sharders_once()"}],"source_content_type":"text/x-python","patch_set":5,"id":"613c22f7_ae32e060","line":3484,"range":{"start_line":3480,"start_character":8,"end_line":3484,"end_character":71},"in_reply_to":"614fc431_eb88f541","updated":"2022-09-02 22:51:37.000000000","message":"Done","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c7eb391431701fdb35bedc176cbd3c84545d58a","unresolved":true,"context_lines":[{"line_number":3546,"context_line":"             \u0027--min-shard-age\u0027, \u00270\u0027])"},{"line_number":3547,"context_line":"        self.assertIn("},{"line_number":3548,"context_line":"            b\u00271 donor shards ignored due to parent-child relationship checks\u0027,"},{"line_number":3549,"context_line":"            msg)"},{"line_number":3550,"context_line":""},{"line_number":3551,"context_line":"        # verify parent-child checks has prevented repair to be done."},{"line_number":3552,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":5,"id":"30a83a29_e3e83c16","line":3549,"updated":"2022-09-02 14:52:42.000000000","message":"yay! wish we\u0027d had this a few months ago :)","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"018716e5e5a3fae627031a046903109a1f5d1f6f","unresolved":false,"context_lines":[{"line_number":3546,"context_line":"             \u0027--min-shard-age\u0027, \u00270\u0027])"},{"line_number":3547,"context_line":"        self.assertIn("},{"line_number":3548,"context_line":"            b\u00271 donor shards ignored due to parent-child relationship checks\u0027,"},{"line_number":3549,"context_line":"            msg)"},{"line_number":3550,"context_line":""},{"line_number":3551,"context_line":"        # verify parent-child checks has prevented repair to be done."},{"line_number":3552,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":5,"id":"296ebf18_d179b21b","line":3549,"in_reply_to":"30a83a29_e3e83c16","updated":"2022-09-02 22:51:37.000000000","message":"Done","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c7eb391431701fdb35bedc176cbd3c84545d58a","unresolved":true,"context_lines":[{"line_number":3556,"context_line":"             (ShardRange.ACTIVE, False, obj_names[1], ShardRange.MAX)],"},{"line_number":3557,"context_line":"            [(sr.state, sr.deleted, sr.lower, sr.upper)"},{"line_number":3558,"context_line":"             for sr in root_brokers[0].get_shard_ranges(include_deleted\u003dTrue)])"},{"line_number":3559,"context_line":""},{"line_number":3560,"context_line":"        self.sharders_once()"},{"line_number":3561,"context_line":"        self.sharders_once()"},{"line_number":3562,"context_line":"        self.container_replicators.once()"}],"source_content_type":"text/x-python","patch_set":5,"id":"b3fc9dcc_99d1c2b0","line":3559,"updated":"2022-09-02 14:52:42.000000000","message":"pls add a comment here:\n\n# the transient overlap is \u0027fixed\u0027 in subsequent sharder cycles...","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"018716e5e5a3fae627031a046903109a1f5d1f6f","unresolved":false,"context_lines":[{"line_number":3556,"context_line":"             (ShardRange.ACTIVE, False, obj_names[1], ShardRange.MAX)],"},{"line_number":3557,"context_line":"            [(sr.state, sr.deleted, sr.lower, sr.upper)"},{"line_number":3558,"context_line":"             for sr in root_brokers[0].get_shard_ranges(include_deleted\u003dTrue)])"},{"line_number":3559,"context_line":""},{"line_number":3560,"context_line":"        self.sharders_once()"},{"line_number":3561,"context_line":"        self.sharders_once()"},{"line_number":3562,"context_line":"        self.container_replicators.once()"}],"source_content_type":"text/x-python","patch_set":5,"id":"f69770f5_a9d011b7","line":3559,"in_reply_to":"b3fc9dcc_99d1c2b0","updated":"2022-09-02 22:51:37.000000000","message":"Done","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c7eb391431701fdb35bedc176cbd3c84545d58a","unresolved":true,"context_lines":[{"line_number":3568,"context_line":"                 (ShardRange.SHARDED, True, ShardRange.MIN, obj_names[1]),"},{"line_number":3569,"context_line":"                 (ShardRange.ACTIVE, False, obj_names[1], ShardRange.MAX)],"},{"line_number":3570,"context_line":"                [(sr.state, sr.deleted, sr.lower, sr.upper)"},{"line_number":3571,"context_line":"                 for sr in broker.get_shard_ranges(include_deleted\u003dTrue)])"},{"line_number":3572,"context_line":""},{"line_number":3573,"context_line":"    def test_manage_shard_ranges_repair_root_shrinking_gaps(self):"},{"line_number":3574,"context_line":"        # provoke shrinking/shrunk gaps by prematurely repairing a transient"}],"source_content_type":"text/x-python","patch_set":5,"id":"47815aba_ffa74e0b","line":3571,"updated":"2022-09-02 14:52:42.000000000","message":"+1 for demonstrating that the overlap disappears eventually","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"018716e5e5a3fae627031a046903109a1f5d1f6f","unresolved":false,"context_lines":[{"line_number":3568,"context_line":"                 (ShardRange.SHARDED, True, ShardRange.MIN, obj_names[1]),"},{"line_number":3569,"context_line":"                 (ShardRange.ACTIVE, False, obj_names[1], ShardRange.MAX)],"},{"line_number":3570,"context_line":"                [(sr.state, sr.deleted, sr.lower, sr.upper)"},{"line_number":3571,"context_line":"                 for sr in broker.get_shard_ranges(include_deleted\u003dTrue)])"},{"line_number":3572,"context_line":""},{"line_number":3573,"context_line":"    def test_manage_shard_ranges_repair_root_shrinking_gaps(self):"},{"line_number":3574,"context_line":"        # provoke shrinking/shrunk gaps by prematurely repairing a transient"}],"source_content_type":"text/x-python","patch_set":5,"id":"339f9506_558cdd74","line":3571,"in_reply_to":"47815aba_ffa74e0b","updated":"2022-09-02 22:51:37.000000000","message":"Done","commit_id":"82d2732972a37f74a652f3e483806bfb0646ce66"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"db8790ace62743d9039bcbd6694bf2bb6c39e362","unresolved":true,"context_lines":[{"line_number":432,"context_line":"        return self.run_custom_daemon(ContainerSharder, \u0027container-sharder\u0027,"},{"line_number":433,"context_line":"                                      conf_index, custom_conf, **kwargs)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def pop_index(self, node):"},{"line_number":436,"context_line":"        # helper method: sometimes we need to compare node dicts ignoring the"},{"line_number":437,"context_line":"        # part-specific index"},{"line_number":438,"context_line":"        node_copy \u003d dict(node)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fce9fc73_3ec06112","line":435,"updated":"2022-09-05 16:01:48.000000000","message":"my bad: Clay pointed out that this could be a module function https://review.opendev.org/c/openstack/swift/+/855669/comment/8da140d6_1913a6a6/","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"37bb75ab06658673840cff350f3f8588959b9293","unresolved":false,"context_lines":[{"line_number":432,"context_line":"        return self.run_custom_daemon(ContainerSharder, \u0027container-sharder\u0027,"},{"line_number":433,"context_line":"                                      conf_index, custom_conf, **kwargs)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def pop_index(self, node):"},{"line_number":436,"context_line":"        # helper method: sometimes we need to compare node dicts ignoring the"},{"line_number":437,"context_line":"        # part-specific index"},{"line_number":438,"context_line":"        node_copy \u003d dict(node)"}],"source_content_type":"text/x-python","patch_set":7,"id":"0d4d4a93_811ecaa8","line":435,"in_reply_to":"5ba0df3f_474d8f5f","updated":"2022-09-09 18:21:54.000000000","message":"Done","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"16b1e10db3dabeb954d6d5efe3120a854438cf02","unresolved":false,"context_lines":[{"line_number":432,"context_line":"        return self.run_custom_daemon(ContainerSharder, \u0027container-sharder\u0027,"},{"line_number":433,"context_line":"                                      conf_index, custom_conf, **kwargs)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def pop_index(self, node):"},{"line_number":436,"context_line":"        # helper method: sometimes we need to compare node dicts ignoring the"},{"line_number":437,"context_line":"        # part-specific index"},{"line_number":438,"context_line":"        node_copy \u003d dict(node)"}],"source_content_type":"text/x-python","patch_set":7,"id":"b2120b00_dd7ac1fe","line":435,"in_reply_to":"83aaeb99_d7503142","updated":"2022-09-08 21:27:29.000000000","message":"Done","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"71eca4631009d73ec2dbee51a7703b9041b70fa1","unresolved":true,"context_lines":[{"line_number":432,"context_line":"        return self.run_custom_daemon(ContainerSharder, \u0027container-sharder\u0027,"},{"line_number":433,"context_line":"                                      conf_index, custom_conf, **kwargs)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def pop_index(self, node):"},{"line_number":436,"context_line":"        # helper method: sometimes we need to compare node dicts ignoring the"},{"line_number":437,"context_line":"        # part-specific index"},{"line_number":438,"context_line":"        node_copy \u003d dict(node)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5ba0df3f_474d8f5f","line":435,"in_reply_to":"83aaeb99_d7503142","updated":"2022-09-09 08:57:10.000000000","message":"an alternative (trying to reach some common ground) https://review.opendev.org/c/openstack/swift/+/856484","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9f6b939ddc4ab35910ce29ac7cf48aada6336212","unresolved":true,"context_lines":[{"line_number":432,"context_line":"        return self.run_custom_daemon(ContainerSharder, \u0027container-sharder\u0027,"},{"line_number":433,"context_line":"                                      conf_index, custom_conf, **kwargs)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def pop_index(self, node):"},{"line_number":436,"context_line":"        # helper method: sometimes we need to compare node dicts ignoring the"},{"line_number":437,"context_line":"        # part-specific index"},{"line_number":438,"context_line":"        node_copy \u003d dict(node)"}],"source_content_type":"text/x-python","patch_set":7,"id":"83aaeb99_d7503142","line":435,"in_reply_to":"fce9fc73_3ec06112","updated":"2022-09-06 14:33:29.000000000","message":"actually, it annoyed me enough I played with it a little:\n\nhttps://review.opendev.org/c/openstack/swift/+/855681\n\n^ what do you think?","commit_id":"9c566c41708ba925f39bb81c5f871d920722d2bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"87bf206d4d7878b7deb549d510f5aa87fa4cbba2","unresolved":true,"context_lines":[{"line_number":3558,"context_line":"        self.sharders_once()"},{"line_number":3559,"context_line":"        self.container_replicators.once()"},{"line_number":3560,"context_line":""},{"line_number":3561,"context_line":"        # boo :\u0027( ... we made gap"},{"line_number":3562,"context_line":"        for broker in root_brokers:"},{"line_number":3563,"context_line":"            self.assertEqual("},{"line_number":3564,"context_line":"                [(ShardRange.ACTIVE, False, ShardRange.MIN, obj_names[0]),"}],"source_content_type":"text/x-python","patch_set":9,"id":"bbbc4090_fa8954b8","side":"PARENT","line":3561,"updated":"2022-09-08 18:35:08.000000000","message":"heck yeah remove this comment yay!","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"16b1e10db3dabeb954d6d5efe3120a854438cf02","unresolved":false,"context_lines":[{"line_number":3558,"context_line":"        self.sharders_once()"},{"line_number":3559,"context_line":"        self.container_replicators.once()"},{"line_number":3560,"context_line":""},{"line_number":3561,"context_line":"        # boo :\u0027( ... we made gap"},{"line_number":3562,"context_line":"        for broker in root_brokers:"},{"line_number":3563,"context_line":"            self.assertEqual("},{"line_number":3564,"context_line":"                [(ShardRange.ACTIVE, False, ShardRange.MIN, obj_names[0]),"}],"source_content_type":"text/x-python","patch_set":9,"id":"05e12a6d_fd5dde8e","side":"PARENT","line":3561,"in_reply_to":"bbbc4090_fa8954b8","updated":"2022-09-08 21:27:29.000000000","message":"Done","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"87bf206d4d7878b7deb549d510f5aa87fa4cbba2","unresolved":true,"context_lines":[{"line_number":3559,"context_line":"        self.assertEqual("},{"line_number":3560,"context_line":"            [(ShardRange.ACTIVE, False, ShardRange.MIN, obj_names[1]),"},{"line_number":3561,"context_line":"             # note: overlap!"},{"line_number":3562,"context_line":"             (ShardRange.ACTIVE, False, obj_names[0], obj_names[1]),"},{"line_number":3563,"context_line":"             (ShardRange.ACTIVE, False, obj_names[1], ShardRange.MAX)],"},{"line_number":3564,"context_line":"            [(sr.state, sr.deleted, sr.lower, sr.upper)"},{"line_number":3565,"context_line":"             for sr in root_brokers[0].get_shard_ranges(include_deleted\u003dTrue)])"}],"source_content_type":"text/x-python","patch_set":9,"id":"23c9b5f7_8f74b8d6","line":3562,"updated":"2022-09-08 18:35:08.000000000","message":"so intead of making the child sub-shard to shrink, we do nothing and thinks naturally make progress.","commit_id":"69183e3e53d880558ec46ca80ff05f017cc365f4"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"16b1e10db3dabeb954d6d5efe3120a854438cf02","unresolved":false,"context_lines":[{"line_number":3559,"context_line":"        self.assertEqual("},{"line_number":3560,"context_line":"            [(ShardRange.ACTIVE, False, ShardRange.MIN, obj_names[1]),"},{"line_number":3561,"context_line":"             # note: overlap!"},{"line_number":3562,"context_line":"             (ShardRange.ACTIVE, False, obj_names[0], obj_names[1]),"},{"line_number":3563,"context_line":"             (ShardRange.ACTIVE, False, obj_names[1], ShardRange.MAX)],"},{"line_number":3564,"context_line":"            [(sr.state, sr.deleted, sr.lower, sr.upper)"},{"line_number":3565,"context_line":"             for sr in root_brokers[0].get_shard_ranges(include_deleted\u003dTrue)])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fcad8ff_363b431a","line":3562,"in_reply_to":"23c9b5f7_8f74b8d6","updated":"2022-09-08 21:27:29.000000000","message":"yes, the created overlap is transient during sharding and it will be gone after subsequent sharder runs.","commit_id":"69183e3e53d880558ec46ca80ff05f017cc365f4"}],"test/unit/cli/test_manage_shard_ranges.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9f28f0081c473cfc7cf11b534bf324f38ab564d","unresolved":true,"context_lines":[{"line_number":2500,"context_line":"        # Expect no change to shard ranges."},{"line_number":2501,"context_line":"        expected \u003d sorted([parent_shard] + child_shards,"},{"line_number":2502,"context_line":"                          key\u003dShardRange.sort_key)"},{"line_number":2503,"context_line":"        self.assert_shard_ranges_equal(expected, updated_ranges)"},{"line_number":2504,"context_line":""},{"line_number":2505,"context_line":"    @with_tempdir"},{"line_number":2506,"context_line":"    def test_show_and_analyze(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":3,"id":"4c5ef04c_5405f601","line":2503,"updated":"2022-08-30 09:31:36.000000000","message":"check: tests fail when I revert changes","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"33a4458406abab2a445ac64518e31784b3365542","unresolved":false,"context_lines":[{"line_number":2500,"context_line":"        # Expect no change to shard ranges."},{"line_number":2501,"context_line":"        expected \u003d sorted([parent_shard] + child_shards,"},{"line_number":2502,"context_line":"                          key\u003dShardRange.sort_key)"},{"line_number":2503,"context_line":"        self.assert_shard_ranges_equal(expected, updated_ranges)"},{"line_number":2504,"context_line":""},{"line_number":2505,"context_line":"    @with_tempdir"},{"line_number":2506,"context_line":"    def test_show_and_analyze(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":3,"id":"f8a90dec_1404e9cf","line":2503,"in_reply_to":"4c5ef04c_5405f601","updated":"2022-09-01 15:57:05.000000000","message":"Done","commit_id":"4d8cdd2241a117a59cf571e8da2283cc3a38f049"}]}
