)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":10,"context_line":"this is problematic as we support dealing with misplaced objects in deleted"},{"line_number":11,"context_line":"shards. Which is required."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Currently, when we deal with misplaced objects in shard a broker marked as"},{"line_number":14,"context_line":"deleted we push the objects into a handoff broker and set this brokers"},{"line_number":15,"context_line":"root_path attribute from the deleted shard. Unfortunately, root_path"},{"line_number":16,"context_line":"is itself stored in sysmeta, which has been removed. So instead it falls"},{"line_number":17,"context_line":"back to using it\u0027s own account and container in the root_path."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"34fc8c78_3633825d","line":14,"range":{"start_line":13,"start_character":50,"end_line":14,"end_character":7},"updated":"2021-02-03 12:58:26.000000000","message":"should this be \u0027a shard broker marked as deleted\u0027","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":18,"context_line":"This in turn gets pushed to the shard responsible for the misplaced"},{"line_number":19,"context_line":"objects and because these objects are pushed by replication the"},{"line_number":20,"context_line":"root_path meta has a newer timestamp, replacing the shards pointer to"},{"line_number":21,"context_line":"the root."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"As a consequence listings all still works because it\u0027s root driven, but"},{"line_number":24,"context_line":"the shard will never pull the latest shard range details from the _real_"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"83dd5f9b_b719b695","line":21,"updated":"2021-02-03 12:58:26.000000000","message":"could do with more clarity over the source vs destination brokers/shards in the above paragraph","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"As a consequence listings all still works because it\u0027s root driven, but"},{"line_number":24,"context_line":"the shard will never pull the latest shard range details from the _real_"},{"line_number":25,"context_line":"root container during audits."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This patch contains a probe test that demonstrates this issue and also"},{"line_number":28,"context_line":"fixes it my making \u0027X-Container-Sysmeta-Shard-Quoted-Root\u0027 and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"77012a91_e8e853cb","line":25,"updated":"2021-02-03 12:58:26.000000000","message":"although it is now pulling ranges from the imposter \u0027root\u0027 shard, but unfortunately the imposter shard is no longer pulling from root, so there\u0027s no way for the broken shard to ever get updates :(","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":25,"context_line":"root container during audits."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This patch contains a probe test that demonstrates this issue and also"},{"line_number":28,"context_line":"fixes it my making \u0027X-Container-Sysmeta-Shard-Quoted-Root\u0027 and"},{"line_number":29,"context_line":"\u0027X-Container-Sysmeta-Shard-Root\u0027 whitelisted from being cleared on"},{"line_number":30,"context_line":"delete. Meaning a deleted shard retains it\u0027s knowledge of root so"},{"line_number":31,"context_line":"it can correctly deal with misplaced objects."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3c1f6201_28c9f273","line":28,"updated":"2021-02-03 12:58:26.000000000","message":"s/my/by/","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"}],"swift/common/db.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":230,"context_line":"class DatabaseBroker(object):"},{"line_number":231,"context_line":"    \"\"\"Encapsulates working with a database.\"\"\""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    delete_meta_whitelist \u003d []"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def __init__(self, db_file, timeout\u003dBROKER_TIMEOUT, logger\u003dNone,"},{"line_number":236,"context_line":"                 account\u003dNone, container\u003dNone, pending_timeout\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"cb476cea_0b6e6a3f","line":233,"updated":"2021-02-03 12:58:26.000000000","message":"hmmm, should we unit test the general feature in test_db as well as the specific test you added in test_backend - it wouldn\u0027t hurt, but more work, so not sure.","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":false,"context_lines":[{"line_number":230,"context_line":"class DatabaseBroker(object):"},{"line_number":231,"context_line":"    \"\"\"Encapsulates working with a database.\"\"\""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    delete_meta_whitelist \u003d []"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def __init__(self, db_file, timeout\u003dBROKER_TIMEOUT, logger\u003dNone,"},{"line_number":236,"context_line":"                 account\u003dNone, container\u003dNone, pending_timeout\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9eaf6c9a_a4af1da7","line":233,"in_reply_to":"cb476cea_0b6e6a3f","updated":"2021-02-04 01:48:25.000000000","message":"Done","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":368,"context_line":"        # first, clear the metadata"},{"line_number":369,"context_line":"        cleared_meta \u003d {}"},{"line_number":370,"context_line":"        for k in self.metadata:"},{"line_number":371,"context_line":"            if k in self.delete_meta_whitelist:"},{"line_number":372,"context_line":"                continue"},{"line_number":373,"context_line":"            cleared_meta[k] \u003d (\u0027\u0027, timestamp)"},{"line_number":374,"context_line":"        self.update_metadata(cleared_meta)"}],"source_content_type":"text/x-python","patch_set":1,"id":"71b3feca_ec36e61a","line":371,"updated":"2021-02-03 12:58:26.000000000","message":"are we ok to assume keys are always title case?","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        # first, clear the metadata"},{"line_number":369,"context_line":"        cleared_meta \u003d {}"},{"line_number":370,"context_line":"        for k in self.metadata:"},{"line_number":371,"context_line":"            if k in self.delete_meta_whitelist:"},{"line_number":372,"context_line":"                continue"},{"line_number":373,"context_line":"            cleared_meta[k] \u003d (\u0027\u0027, timestamp)"},{"line_number":374,"context_line":"        self.update_metadata(cleared_meta)"}],"source_content_type":"text/x-python","patch_set":1,"id":"42c0cbfa_72af2961","line":371,"in_reply_to":"71b3feca_ec36e61a","updated":"2021-02-04 01:48:25.000000000","message":"Done","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"}],"test/probe/test_sharder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2319,"context_line":"        self.assert_container_object_count(1)"},{"line_number":2320,"context_line":"        self.assert_container_delete_fails()"},{"line_number":2321,"context_line":""},{"line_number":2322,"context_line":"    def test_misplaced_object_movement_from_deleted_shard(self):"},{"line_number":2323,"context_line":"        def merge_object(shard_range, name, deleted\u003d0):"},{"line_number":2324,"context_line":"            # it\u0027s hard to get a test to put a misplaced object into a shard,"},{"line_number":2325,"context_line":"            # so this hack is used force an object record directly into a shard"}],"source_content_type":"text/x-python","patch_set":1,"id":"a58afc67_6f3d3775","line":2322,"updated":"2021-02-03 12:58:26.000000000","message":"reverted fix and test fails:\n\n  \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nFAIL: test_misplaced_object_movement_from_deleted_shard (test.probe.test_sharder.TestContainerSharding)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"/vagrant/swift/test/probe/test_sharder.py\", line 2408, in test_misplaced_object_movement_from_deleted_shard\n    shard_1_broker.root_path)\nAssertionError: \u0027AUTH_test/container-6610e611-b395-4dbc-8e46-d98a50b3b805\u0027 !\u003d \u0027.shards_AUTH_test/container-6610e611-b395-4dbc-8e46-d98a50b3b805-b1bb391e2be5b4b98c0964c85fdb0b02-1612356448.63735-0\u0027\n-------------------- \u003e\u003e begin captured stdout \u003c\u003c ---------------------","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2325,"context_line":"            # so this hack is used force an object record directly into a shard"},{"line_number":2326,"context_line":"            # container db. Note: the actual object won\u0027t exist, we\u0027re just"},{"line_number":2327,"context_line":"            # using this to test object records in container dbs."},{"line_number":2328,"context_line":"            shard_part, shard_nodes \u003d self.brain.ring.get_nodes("},{"line_number":2329,"context_line":"                shard_range.account, shard_range.container)"},{"line_number":2330,"context_line":"            shard_broker \u003d self.get_broker("},{"line_number":2331,"context_line":"                shard_part, shard_nodes[0], shard_range.account,"},{"line_number":2332,"context_line":"                shard_range.container)"},{"line_number":2333,"context_line":"            # In this test we want to merge into a deleted container shard"},{"line_number":2334,"context_line":"            shard_broker.delete_db(Timestamp.now().internal)"},{"line_number":2335,"context_line":"            shard_broker.merge_items("},{"line_number":2336,"context_line":"                [{\u0027name\u0027: name, \u0027created_at\u0027: Timestamp.now().internal,"}],"source_content_type":"text/x-python","patch_set":1,"id":"535d220a_5c062fed","line":2333,"range":{"start_line":2328,"start_character":1,"end_line":2333,"end_character":1},"updated":"2021-02-03 12:58:26.000000000","message":"get_shard_broker(shard_range) ? 😊","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":false,"context_lines":[{"line_number":2325,"context_line":"            # so this hack is used force an object record directly into a shard"},{"line_number":2326,"context_line":"            # container db. Note: the actual object won\u0027t exist, we\u0027re just"},{"line_number":2327,"context_line":"            # using this to test object records in container dbs."},{"line_number":2328,"context_line":"            shard_part, shard_nodes \u003d self.brain.ring.get_nodes("},{"line_number":2329,"context_line":"                shard_range.account, shard_range.container)"},{"line_number":2330,"context_line":"            shard_broker \u003d self.get_broker("},{"line_number":2331,"context_line":"                shard_part, shard_nodes[0], shard_range.account,"},{"line_number":2332,"context_line":"                shard_range.container)"},{"line_number":2333,"context_line":"            # In this test we want to merge into a deleted container shard"},{"line_number":2334,"context_line":"            shard_broker.delete_db(Timestamp.now().internal)"},{"line_number":2335,"context_line":"            shard_broker.merge_items("},{"line_number":2336,"context_line":"                [{\u0027name\u0027: name, \u0027created_at\u0027: Timestamp.now().internal,"}],"source_content_type":"text/x-python","patch_set":1,"id":"0205408a_fd32a326","line":2333,"range":{"start_line":2328,"start_character":1,"end_line":2333,"end_character":1},"in_reply_to":"535d220a_5c062fed","updated":"2021-02-04 01:48:25.000000000","message":"ops, obviously pulled it from there then never replaced it :P\n\nDone","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2340,"context_line":"                  \u0027storage_policy_index\u0027: shard_broker.storage_policy_index}])"},{"line_number":2341,"context_line":"            return shard_nodes[0]"},{"line_number":2342,"context_line":""},{"line_number":2343,"context_line":"        def get_shard_broker(shard_range):"},{"line_number":2344,"context_line":"            shard_part, shard_nodes \u003d self.brain.ring.get_nodes("},{"line_number":2345,"context_line":"                shard_range.account, shard_range.container)"},{"line_number":2346,"context_line":"            return self.get_broker("}],"source_content_type":"text/x-python","patch_set":1,"id":"fbf235e7_b3317df1","line":2343,"updated":"2021-02-03 12:58:26.000000000","message":"this would probably be useful to have up in BaseTestContainerSharding (maybe with a node_index arg)","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":false,"context_lines":[{"line_number":2340,"context_line":"                  \u0027storage_policy_index\u0027: shard_broker.storage_policy_index}])"},{"line_number":2341,"context_line":"            return shard_nodes[0]"},{"line_number":2342,"context_line":""},{"line_number":2343,"context_line":"        def get_shard_broker(shard_range):"},{"line_number":2344,"context_line":"            shard_part, shard_nodes \u003d self.brain.ring.get_nodes("},{"line_number":2345,"context_line":"                shard_range.account, shard_range.container)"},{"line_number":2346,"context_line":"            return self.get_broker("}],"source_content_type":"text/x-python","patch_set":1,"id":"d60fded0_d9c281f6","line":2343,"in_reply_to":"fbf235e7_b3317df1","updated":"2021-02-04 01:48:25.000000000","message":"good idea!","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2371,"context_line":"        shard_1_objects \u003d [name for name in all_obj_names"},{"line_number":2372,"context_line":"                           if name in shard_ranges[1]]"},{"line_number":2373,"context_line":"        self.delete_objects(shard_0_objects)"},{"line_number":2374,"context_line":"        self.assert_container_listing(shard_1_objects)"},{"line_number":2375,"context_line":"        self.assert_container_post_ok(\u0027has objects\u0027)"},{"line_number":2376,"context_line":""},{"line_number":2377,"context_line":"        # run sharder on first shard container to update root stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"3215be09_55e3a06b","line":2374,"updated":"2021-02-03 12:58:26.000000000","message":"this asserts that the root object count is len(shard_1_objects) - is that expected at this point?","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":true,"context_lines":[{"line_number":2371,"context_line":"        shard_1_objects \u003d [name for name in all_obj_names"},{"line_number":2372,"context_line":"                           if name in shard_ranges[1]]"},{"line_number":2373,"context_line":"        self.delete_objects(shard_0_objects)"},{"line_number":2374,"context_line":"        self.assert_container_listing(shard_1_objects)"},{"line_number":2375,"context_line":"        self.assert_container_post_ok(\u0027has objects\u0027)"},{"line_number":2376,"context_line":""},{"line_number":2377,"context_line":"        # run sharder on first shard container to update root stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fed692f_de3472a1","line":2374,"in_reply_to":"3215be09_55e3a06b","updated":"2021-02-04 01:48:25.000000000","message":"Yup, because it\u0027s doing a GET to a sharded root, it\u0027ll go check the shards for object lists and the object-count returned will be the number of objects merged in the proxy container controller.\n\nIf it was a HEAD this probably wouldn\u0027t work.","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87b09348b7647588321485cf6e609f39c0af587d","unresolved":false,"context_lines":[{"line_number":2371,"context_line":"        shard_1_objects \u003d [name for name in all_obj_names"},{"line_number":2372,"context_line":"                           if name in shard_ranges[1]]"},{"line_number":2373,"context_line":"        self.delete_objects(shard_0_objects)"},{"line_number":2374,"context_line":"        self.assert_container_listing(shard_1_objects)"},{"line_number":2375,"context_line":"        self.assert_container_post_ok(\u0027has objects\u0027)"},{"line_number":2376,"context_line":""},{"line_number":2377,"context_line":"        # run sharder on first shard container to update root stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"29c42198_2501811b","line":2374,"in_reply_to":"9fed692f_de3472a1","updated":"2021-02-04 10:25:09.000000000","message":"ok, got it, GET actually counts the number of objects in the listing rather than read container metadata (I ought to know that!)","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2376,"context_line":""},{"line_number":2377,"context_line":"        # run sharder on first shard container to update root stats"},{"line_number":2378,"context_line":"        self.run_sharders(shard_ranges[0])"},{"line_number":2379,"context_line":"        self.assert_container_object_count(len(shard_1_objects))"},{"line_number":2380,"context_line":""},{"line_number":2381,"context_line":"        # First, test a misplaced object moving from one shard to another."},{"line_number":2382,"context_line":"        # run sharder on root to discover first shrink candidate"}],"source_content_type":"text/x-python","patch_set":1,"id":"d3d297b8_ea7bbb76","line":2379,"updated":"2021-02-03 12:58:26.000000000","message":"...so did we need to run sharder for this to be true?","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87b09348b7647588321485cf6e609f39c0af587d","unresolved":false,"context_lines":[{"line_number":2376,"context_line":""},{"line_number":2377,"context_line":"        # run sharder on first shard container to update root stats"},{"line_number":2378,"context_line":"        self.run_sharders(shard_ranges[0])"},{"line_number":2379,"context_line":"        self.assert_container_object_count(len(shard_1_objects))"},{"line_number":2380,"context_line":""},{"line_number":2381,"context_line":"        # First, test a misplaced object moving from one shard to another."},{"line_number":2382,"context_line":"        # run sharder on root to discover first shrink candidate"}],"source_content_type":"text/x-python","patch_set":1,"id":"957d5d00_09d7ff8c","line":2379,"in_reply_to":"b52cdfcc_fa4ce4b9","updated":"2021-02-04 10:25:09.000000000","message":"right, thanks for reminding me of the HEAD vs GET","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":true,"context_lines":[{"line_number":2376,"context_line":""},{"line_number":2377,"context_line":"        # run sharder on first shard container to update root stats"},{"line_number":2378,"context_line":"        self.run_sharders(shard_ranges[0])"},{"line_number":2379,"context_line":"        self.assert_container_object_count(len(shard_1_objects))"},{"line_number":2380,"context_line":""},{"line_number":2381,"context_line":"        # First, test a misplaced object moving from one shard to another."},{"line_number":2382,"context_line":"        # run sharder on root to discover first shrink candidate"}],"source_content_type":"text/x-python","patch_set":1,"id":"b52cdfcc_fa4ce4b9","line":2379,"in_reply_to":"d3d297b8_ea7bbb76","updated":"2021-02-04 01:48:25.000000000","message":"Yeah, this assert runs a HEAD so will use the object count stored in the container, so we need to run the sharder to update the now empty shard\u0027s stats in root.","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2402,"context_line":"        self.assert_container_object_count(len(shard_1_objects))"},{"line_number":2403,"context_line":""},{"line_number":2404,"context_line":"        # check to see if the deleted shard and pushed the wrong root path"},{"line_number":2405,"context_line":"        # into the other container."},{"line_number":2406,"context_line":"        shard_1_broker \u003d get_shard_broker(shard_ranges[1])"},{"line_number":2407,"context_line":"        self.assertEqual(\"%s/%s\" % (self.account, self.container_name),"},{"line_number":2408,"context_line":"                         shard_1_broker.root_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"203e5f73_a3d0fc3a","line":2405,"updated":"2021-02-03 12:58:26.000000000","message":"\"check the deleted shard did not push the wrong root path into the other container\" maybe","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":false,"context_lines":[{"line_number":2402,"context_line":"        self.assert_container_object_count(len(shard_1_objects))"},{"line_number":2403,"context_line":""},{"line_number":2404,"context_line":"        # check to see if the deleted shard and pushed the wrong root path"},{"line_number":2405,"context_line":"        # into the other container."},{"line_number":2406,"context_line":"        shard_1_broker \u003d get_shard_broker(shard_ranges[1])"},{"line_number":2407,"context_line":"        self.assertEqual(\"%s/%s\" % (self.account, self.container_name),"},{"line_number":2408,"context_line":"                         shard_1_broker.root_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"45ac2b36_5806b122","line":2405,"in_reply_to":"203e5f73_a3d0fc3a","updated":"2021-02-04 01:48:25.000000000","message":"Done","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2403,"context_line":""},{"line_number":2404,"context_line":"        # check to see if the deleted shard and pushed the wrong root path"},{"line_number":2405,"context_line":"        # into the other container."},{"line_number":2406,"context_line":"        shard_1_broker \u003d get_shard_broker(shard_ranges[1])"},{"line_number":2407,"context_line":"        self.assertEqual(\"%s/%s\" % (self.account, self.container_name),"},{"line_number":2408,"context_line":"                         shard_1_broker.root_path)"},{"line_number":2409,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"f074ff12_a274f9f9","line":2406,"updated":"2021-02-03 12:58:26.000000000","message":"maybe we should check all the replicas for good measure","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":false,"context_lines":[{"line_number":2403,"context_line":""},{"line_number":2404,"context_line":"        # check to see if the deleted shard and pushed the wrong root path"},{"line_number":2405,"context_line":"        # into the other container."},{"line_number":2406,"context_line":"        shard_1_broker \u003d get_shard_broker(shard_ranges[1])"},{"line_number":2407,"context_line":"        self.assertEqual(\"%s/%s\" % (self.account, self.container_name),"},{"line_number":2408,"context_line":"                         shard_1_broker.root_path)"},{"line_number":2409,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"33dd5326_d0346dd7","line":2406,"in_reply_to":"f074ff12_a274f9f9","updated":"2021-02-04 01:48:25.000000000","message":"Done","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d81a6f20c16e1f5f850d3d7cb68397e06faaabc8","unresolved":true,"context_lines":[{"line_number":2405,"context_line":"        # into the other container."},{"line_number":2406,"context_line":"        shard_1_broker \u003d get_shard_broker(shard_ranges[1])"},{"line_number":2407,"context_line":"        self.assertEqual(\"%s/%s\" % (self.account, self.container_name),"},{"line_number":2408,"context_line":"                         shard_1_broker.root_path)"},{"line_number":2409,"context_line":""},{"line_number":2410,"context_line":"    def test_replication_to_sharded_container_from_unsharded_old_primary(self):"},{"line_number":2411,"context_line":"        primary_ids \u003d [n[\u0027id\u0027] for n in self.brain.nodes]"}],"source_content_type":"text/x-python","patch_set":1,"id":"86b080fc_d766fc02","line":2408,"updated":"2021-02-03 12:58:26.000000000","message":"Nice!\n\nI think it would be worth getting the root updated to verify misplaced object was indeed replicated from a deleted shard, as a bonus - that also verifies that the remaining shards root path is functionally correct","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ae6777bd25841fb2c9d07927f853c284b725ce54","unresolved":false,"context_lines":[{"line_number":2405,"context_line":"        # into the other container."},{"line_number":2406,"context_line":"        shard_1_broker \u003d get_shard_broker(shard_ranges[1])"},{"line_number":2407,"context_line":"        self.assertEqual(\"%s/%s\" % (self.account, self.container_name),"},{"line_number":2408,"context_line":"                         shard_1_broker.root_path)"},{"line_number":2409,"context_line":""},{"line_number":2410,"context_line":"    def test_replication_to_sharded_container_from_unsharded_old_primary(self):"},{"line_number":2411,"context_line":"        primary_ids \u003d [n[\u0027id\u0027] for n in self.brain.nodes]"}],"source_content_type":"text/x-python","patch_set":1,"id":"c806fa4e_956834a7","line":2408,"in_reply_to":"86b080fc_d766fc02","updated":"2021-02-04 01:48:25.000000000","message":"Done","commit_id":"bad6ab686c7fd0cbab8cf70f5583a56b695677be"}]}
