)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b0c252ce2b559dae316ddcb80a9654c7b63eed9a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"809e65bd_f2b3209f","updated":"2021-12-08 18:41:02.000000000","message":"I have a few concerns about the shard range recursion. I\u0027ll try to spend some more time to perhaps propose fixes.","commit_id":"89546dc1c5e8c36e9d921104c7c687261fb0a65a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f194e449c0de0428f151179bff1de1138eef9d76","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"6e845b95_e8cd52a7","updated":"2022-07-25 23:49:40.000000000","message":"(woops, forgot a bunch of draft replies apparently)","commit_id":"0d83bdea0830f363ba30d71189fc38dc11205acc"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d21138c20a4fae4f29266da5dbebf60cd01e52db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c1fd0914_d7aab342","updated":"2023-12-14 05:35:35.000000000","message":"just a rebase, feels like a good start before I dig in!","commit_id":"8821739668612172ae210c1662932976b3398f60"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"35ec16cfbcc0ae01f283fda72385336648a60599","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"f006f549_3b039725","updated":"2023-12-15 04:32:33.000000000","message":"OK, added a last ditch try and pull objects if a shard (or root more likely) it checked twice. Added states\u003dlisting, and using the smaller Namespace object because we don\u0027t care about all the stats.\n\nAlso did a drive by added a test for the call back for objects and a case when it fails to show it stops.\n\nWill let this go trhough zuul. Then might take another quick look and maybe merge it.. this has been around long enough and it\u0027s better then what it was, this makes it shard aware at least.","commit_id":"3bc30b56d8b8ff0850f81239b567049362652bf2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"298c9ead7c3eac532f8f5f18b55a67eb99f3d2fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"a7b9675b_21ed852d","updated":"2024-01-09 07:52:39.000000000","message":"I agree, I think the notes I added tells people to be careful when using the delete. I think this makes things much better then they were before! So I say let\u0027s merge the thing.","commit_id":"6b91334298446352ef21f12cc64325e772083a57"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"d3843ad9fadd3332d632c07b3189d0abfdbabb3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"8f98b044_e158be2c","updated":"2024-01-09 05:51:46.000000000","message":"I\u0027m okay with this, including the attempt to get objects added in patch 12.","commit_id":"6b91334298446352ef21f12cc64325e772083a57"}],"swift/obj/watchers/dark_data.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1124e4aff3999f1a6ec503cf4f222bc2fa59c4dd","unresolved":true,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def check_container(account_name, container_name):"},{"line_number":136,"context_line":"        if (account_name, container_name) in visited:"},{"line_number":137,"context_line":"            return None  #Already queried; guess we\u0027re out of luck"},{"line_number":138,"context_line":"        visited.add((account_name, container_name))"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        container_part, container_nodes \u003d \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ddd9bbe_39219f65","line":137,"range":{"start_line":137,"start_character":12,"end_line":137,"end_character":24},"updated":"2021-04-23 11:04:16.000000000","message":"force record_type\u003dobject as per the proxy getter? we expect the root to sometimes return its own shard range","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a9726b0a08a0fa64f11a1e573aed078bd7d14003","unresolved":true,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def check_container(account_name, container_name):"},{"line_number":136,"context_line":"        if (account_name, container_name) in visited:"},{"line_number":137,"context_line":"            return None  #Already queried; guess we\u0027re out of luck"},{"line_number":138,"context_line":"        visited.add((account_name, container_name))"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        container_part, container_nodes \u003d \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"d3274cc4_072f9e9f","line":137,"range":{"start_line":137,"start_character":12,"end_line":137,"end_character":24},"in_reply_to":"7ddd9bbe_39219f65","updated":"2021-07-17 03:17:43.000000000","message":"I looked at the code of swift/container/server.py:GET and I do not see just how it would ever return its own shard range unless the request includes \u0027x-backend-record-type\u0027 header.","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9243c36e6a89afa5897aca650cfbc55077d5bc7","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def check_container(account_name, container_name):"},{"line_number":136,"context_line":"        if (account_name, container_name) in visited:"},{"line_number":137,"context_line":"            return None  #Already queried; guess we\u0027re out of luck"},{"line_number":138,"context_line":"        visited.add((account_name, container_name))"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        container_part, container_nodes \u003d \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"ab019ae7_2cb961fb","line":137,"range":{"start_line":137,"start_character":12,"end_line":137,"end_character":24},"in_reply_to":"d3274cc4_072f9e9f","updated":"2023-12-15 06:07:05.000000000","message":"Done","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1124e4aff3999f1a6ec503cf4f222bc2fa59c4dd","unresolved":true,"context_lines":[{"line_number":156,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":157,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":158,"context_line":"            except (ClientException, Timeout):"},{"line_number":159,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":160,"context_line":"                continue"},{"line_number":161,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":162,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":163,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"}],"source_content_type":"text/x-python","patch_set":1,"id":"f488d7f4_5b54c771","line":160,"range":{"start_line":159,"start_character":16,"end_line":160,"end_character":24},"updated":"2021-04-23 11:04:16.000000000","message":"this is way too weak - surely we should not just ignore a node that doesn\u0027t reply?\n\nhttps://bugs.launchpad.net/swift/+bug/1925782","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e22740b22c47270ab5dac4e5ebe4fb3e217fdf26","unresolved":true,"context_lines":[{"line_number":156,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":157,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":158,"context_line":"            except (ClientException, Timeout):"},{"line_number":159,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":160,"context_line":"                continue"},{"line_number":161,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":162,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":163,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"}],"source_content_type":"text/x-python","patch_set":1,"id":"dd2e0028_20dc2152","line":160,"range":{"start_line":159,"start_character":16,"end_line":160,"end_character":24},"in_reply_to":"ea0fba39_92d35a04","updated":"2021-05-22 02:44:37.000000000","message":"Per our discussion in the IRC meeting, I agreed that it\u0027s safer to obtain replies from all container servers and made a separate change to address it:\n https://review.opendev.org/c/openstack/swift/+/792713\n\nI think we can rebase this easily if that one merges first or vice versa.","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"2a7468e25ef88de0f18267a63b08c0024818c767","unresolved":true,"context_lines":[{"line_number":156,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":157,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":158,"context_line":"            except (ClientException, Timeout):"},{"line_number":159,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":160,"context_line":"                continue"},{"line_number":161,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":162,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":163,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"}],"source_content_type":"text/x-python","patch_set":1,"id":"ea0fba39_92d35a04","line":160,"range":{"start_line":159,"start_character":16,"end_line":160,"end_character":24},"in_reply_to":"f488d7f4_5b54c771","updated":"2021-05-15 01:34:23.000000000","message":"I\u0027m going to answer because Tim inherited this logic from my code. My reasoning was that objects are considered dark (returned as dark from get_info_1() only if all replies that are returned without error do not contain the object. Therefore, it is possible that all nodes that contain listings returned error, and all of those that returned something, returned no record, and therefore the object would be considered dark. However, I see no practical way to negate that scenario if we are to declare objects as dark in presence of any failures. The only alternative is to require that all nodes in the ring were reacheable and returned an empty record. Let me know if you think that is a better condition, of if I miss another possiblity.","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1124e4aff3999f1a6ec503cf4f222bc2fa59c4dd","unresolved":true,"context_lines":[{"line_number":159,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":160,"context_line":"                continue"},{"line_number":161,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":162,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":163,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"},{"line_number":164,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":165,"context_line":"                continue"},{"line_number":166,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"}],"source_content_type":"text/x-python","patch_set":1,"id":"25ec453d_09c4cd1c","line":163,"range":{"start_line":162,"start_character":16,"end_line":163,"end_character":71},"updated":"2021-04-23 11:04:16.000000000","message":"I think the server can filter for us if we send an \u0027includes\u0027 param","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f194e449c0de0428f151179bff1de1138eef9d76","unresolved":true,"context_lines":[{"line_number":159,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":160,"context_line":"                continue"},{"line_number":161,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":162,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":163,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"},{"line_number":164,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":165,"context_line":"                continue"},{"line_number":166,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3c4ef9eb_3d5f2a65","line":163,"range":{"start_line":162,"start_character":16,"end_line":163,"end_character":71},"in_reply_to":"25ec453d_09c4cd1c","updated":"2022-07-25 23:49:40.000000000","message":"ok, the code makes sense. It can return empty though.","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9243c36e6a89afa5897aca650cfbc55077d5bc7","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":160,"context_line":"                continue"},{"line_number":161,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":162,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":163,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"},{"line_number":164,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":165,"context_line":"                continue"},{"line_number":166,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"}],"source_content_type":"text/x-python","patch_set":1,"id":"60434c8d_7586005c","line":163,"range":{"start_line":162,"start_character":16,"end_line":163,"end_character":71},"in_reply_to":"3c4ef9eb_3d5f2a65","updated":"2023-12-15 06:07:05.000000000","message":"Done","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a35e84edcf9c42890d5f92079b973b3f80145298","unresolved":true,"context_lines":[{"line_number":161,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":162,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":163,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"},{"line_number":164,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":165,"context_line":"                continue"},{"line_number":166,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"},{"line_number":167,"context_line":"                dark_flag[0] +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"7545c393_5067fc8a","line":164,"updated":"2021-04-23 03:12:54.000000000","message":"Is it possible for account name for the shard to be different from the root?","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1124e4aff3999f1a6ec503cf4f222bc2fa59c4dd","unresolved":true,"context_lines":[{"line_number":164,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":165,"context_line":"                continue"},{"line_number":166,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"},{"line_number":167,"context_line":"                dark_flag[0] +\u003d 1"},{"line_number":168,"context_line":"                continue"},{"line_number":169,"context_line":"            return objs_or_shards[0]"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ea94c90e_d0473808","line":167,"updated":"2021-04-23 11:04:16.000000000","message":"does the age of the object get checked anywhere before it is marked as dark? what if it\u0027s in async_pending?","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e22740b22c47270ab5dac4e5ebe4fb3e217fdf26","unresolved":true,"context_lines":[{"line_number":164,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":165,"context_line":"                continue"},{"line_number":166,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"},{"line_number":167,"context_line":"                dark_flag[0] +\u003d 1"},{"line_number":168,"context_line":"                continue"},{"line_number":169,"context_line":"            return objs_or_shards[0]"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"724b26ef_ae5e6199","line":167,"in_reply_to":"ea94c90e_d0473808","updated":"2021-05-22 02:44:37.000000000","message":"See https://review.opendev.org/c/openstack/swift/+/788398","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1124e4aff3999f1a6ec503cf4f222bc2fa59c4dd","unresolved":true,"context_lines":[{"line_number":168,"context_line":"                continue"},{"line_number":169,"context_line":"            return objs_or_shards[0]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        # If we got back some shards, recurse"},{"line_number":172,"context_line":"        for account_name, container_name in shards:"},{"line_number":173,"context_line":"            res \u003d check_container(account_name, container_name)"},{"line_number":174,"context_line":"            if res:"}],"source_content_type":"text/x-python","patch_set":1,"id":"8c07de68_4bf40ba7","line":171,"updated":"2021-04-23 11:04:16.000000000","message":"related to comment above about age - the object record might be misplaced or not yet in the shard, if sharding or shrinking is in progress","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f194e449c0de0428f151179bff1de1138eef9d76","unresolved":true,"context_lines":[{"line_number":168,"context_line":"                continue"},{"line_number":169,"context_line":"            return objs_or_shards[0]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        # If we got back some shards, recurse"},{"line_number":172,"context_line":"        for account_name, container_name in shards:"},{"line_number":173,"context_line":"            res \u003d check_container(account_name, container_name)"},{"line_number":174,"context_line":"            if res:"}],"source_content_type":"text/x-python","patch_set":1,"id":"b36d0b22_f161c2ad","line":171,"in_reply_to":"8c07de68_4bf40ba7","updated":"2022-07-25 23:49:40.000000000","message":"But the states\u003dlisting only makes it worse for us, right?\n\nI think the answer here is not run a watcher with a permission to delete objects if your cluster is undergoing an upheaval.","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9243c36e6a89afa5897aca650cfbc55077d5bc7","unresolved":true,"context_lines":[{"line_number":168,"context_line":"                continue"},{"line_number":169,"context_line":"            return objs_or_shards[0]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        # If we got back some shards, recurse"},{"line_number":172,"context_line":"        for account_name, container_name in shards:"},{"line_number":173,"context_line":"            res \u003d check_container(account_name, container_name)"},{"line_number":174,"context_line":"            if res:"}],"source_content_type":"text/x-python","patch_set":1,"id":"b98cf303_49f8909d","line":171,"in_reply_to":"b36d0b22_f161c2ad","updated":"2023-12-15 06:07:05.000000000","message":"yeah, this is still an edgecase.. but as it currently is its better then the current version that doesn\u0027t support shards at all.","commit_id":"c2270d74a96dbcdc8d93f6cb20cd077803b1431d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"afae64571ef84985cabc08e76dbc58d5cdd76ea2","unresolved":true,"context_lines":[{"line_number":173,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":174,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":175,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"},{"line_number":176,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":177,"context_line":"                continue"},{"line_number":178,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"},{"line_number":179,"context_line":"                dark_flag[0] +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"976a80f0_07d73345","line":176,"range":{"start_line":176,"start_character":28,"end_line":176,"end_character":39},"updated":"2021-07-19 11:25:56.000000000","message":"I think this could be None when recursing: shard_x namespace contains object name, shard_x returns shards y, z, shard y namespace does not container object, shard_range \u003d None","commit_id":"fc062f3e6fb7c38a5fae876c115e79508b314236"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"c172bff3d2ea6b63a071eb095b6810f5dc01a871","unresolved":true,"context_lines":[{"line_number":173,"context_line":"            if headers.get(\u0027X-Backend-Record-Type\u0027) \u003d\u003d \u0027shard\u0027:"},{"line_number":174,"context_line":"                shard_range \u003d find_shard_range(obj_name, ["},{"line_number":175,"context_line":"                    ShardRange.from_dict(sr) for sr in objs_or_shards])"},{"line_number":176,"context_line":"                shards.add((shard_range.account, shard_range.container))"},{"line_number":177,"context_line":"                continue"},{"line_number":178,"context_line":"            if not objs_or_shards or objs_or_shards[0][\u0027name\u0027] !\u003d obj_name:"},{"line_number":179,"context_line":"                dark_flag[0] +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"240762fc_51cdf2a8","line":176,"range":{"start_line":176,"start_character":28,"end_line":176,"end_character":39},"in_reply_to":"976a80f0_07d73345","updated":"2021-07-21 03:20:11.000000000","message":"You\u0027re absolutely right.\n\nThe fix seems very simple, just continue looking for shards containing item, if any.","commit_id":"fc062f3e6fb7c38a5fae876c115e79508b314236"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b0c252ce2b559dae316ddcb80a9654c7b63eed9a","unresolved":true,"context_lines":[{"line_number":149,"context_line":"    def check_container(account_name, container_name):"},{"line_number":150,"context_line":"        if (account_name, container_name) in visited:"},{"line_number":151,"context_line":"            # Already queried; guess we\u0027re out of luck."},{"line_number":152,"context_line":"            return None"},{"line_number":153,"context_line":"        visited.add((account_name, container_name))"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        container_part, container_nodes \u003d \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"5d308084_6d6600ec","line":152,"updated":"2021-12-08 18:41:02.000000000","message":"I think that here we should be issuing a get with \u0027x-backend-record-type\u003dobject\u0027, particularly if we add \u0027states\u003dlisting\u0027 to the original request, because the shard ranges may be pointing back to the root.","commit_id":"89546dc1c5e8c36e9d921104c7c687261fb0a65a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b0c252ce2b559dae316ddcb80a9654c7b63eed9a","unresolved":true,"context_lines":[{"line_number":169,"context_line":"            try:"},{"line_number":170,"context_line":"                headers, objs_or_shards \u003d direct_get_container("},{"line_number":171,"context_line":"                    node, container_part, account_name, container_name,"},{"line_number":172,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":173,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":174,"context_line":"            except (ClientException, Timeout):"},{"line_number":175,"context_line":"                # Something is wrong with that server, treat as an error."}],"source_content_type":"text/x-python","patch_set":5,"id":"ca7ed6fe_6139ebb9","line":172,"range":{"start_line":172,"start_character":20,"end_line":172,"end_character":35},"updated":"2021-12-08 18:41:02.000000000","message":"prefix is ignored by a shard range GET, so I think we\u0027ll get back the entire set of shards, then search them all for the object 😞 IDK, maybe that is the intent?\n\nmarker/end_marker is respected for shard range GET, or send \u0027includes\u003dobj_name\u0027 as well as prefix","commit_id":"89546dc1c5e8c36e9d921104c7c687261fb0a65a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f194e449c0de0428f151179bff1de1138eef9d76","unresolved":true,"context_lines":[{"line_number":169,"context_line":"            try:"},{"line_number":170,"context_line":"                headers, objs_or_shards \u003d direct_get_container("},{"line_number":171,"context_line":"                    node, container_part, account_name, container_name,"},{"line_number":172,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":173,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":174,"context_line":"            except (ClientException, Timeout):"},{"line_number":175,"context_line":"                # Something is wrong with that server, treat as an error."}],"source_content_type":"text/x-python","patch_set":5,"id":"ef8bcb66_b67f4bf8","line":172,"range":{"start_line":172,"start_character":20,"end_line":172,"end_character":35},"in_reply_to":"ca7ed6fe_6139ebb9","updated":"2022-07-25 23:49:40.000000000","message":"I verified that including includes\u003dobj_name was the right thing to do. It required updating the direct client.","commit_id":"89546dc1c5e8c36e9d921104c7c687261fb0a65a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9243c36e6a89afa5897aca650cfbc55077d5bc7","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            try:"},{"line_number":170,"context_line":"                headers, objs_or_shards \u003d direct_get_container("},{"line_number":171,"context_line":"                    node, container_part, account_name, container_name,"},{"line_number":172,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":173,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":174,"context_line":"            except (ClientException, Timeout):"},{"line_number":175,"context_line":"                # Something is wrong with that server, treat as an error."}],"source_content_type":"text/x-python","patch_set":5,"id":"d5c9978b_8b4f3a14","line":172,"range":{"start_line":172,"start_character":20,"end_line":172,"end_character":35},"in_reply_to":"ef8bcb66_b67f4bf8","updated":"2023-12-15 06:07:05.000000000","message":"Done","commit_id":"89546dc1c5e8c36e9d921104c7c687261fb0a65a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b0c252ce2b559dae316ddcb80a9654c7b63eed9a","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                headers, objs_or_shards \u003d direct_get_container("},{"line_number":171,"context_line":"                    node, container_part, account_name, container_name,"},{"line_number":172,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":173,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":174,"context_line":"            except (ClientException, Timeout):"},{"line_number":175,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":176,"context_line":"                err_flag +\u003d 1"}],"source_content_type":"text/x-python","patch_set":5,"id":"a3c821d7_c838f7fc","line":173,"updated":"2021-12-08 18:41:02.000000000","message":"I wonder if we shouldn\u0027t be sending the \u0027states\u003dlisting\u0027 param so that we only get back shard ranged when the shards might be expected to have the object row","commit_id":"89546dc1c5e8c36e9d921104c7c687261fb0a65a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f194e449c0de0428f151179bff1de1138eef9d76","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                headers, objs_or_shards \u003d direct_get_container("},{"line_number":171,"context_line":"                    node, container_part, account_name, container_name,"},{"line_number":172,"context_line":"                    prefix\u003dobj_name, limit\u003d1,"},{"line_number":173,"context_line":"                    headers\u003d{\u0027X-Backend-Record-Type\u0027: \u0027auto\u0027})"},{"line_number":174,"context_line":"            except (ClientException, Timeout):"},{"line_number":175,"context_line":"                # Something is wrong with that server, treat as an error."},{"line_number":176,"context_line":"                err_flag +\u003d 1"}],"source_content_type":"text/x-python","patch_set":5,"id":"d8a67545_1b1096a7","line":173,"in_reply_to":"a3c821d7_c838f7fc","updated":"2022-07-25 23:49:40.000000000","message":"The \"states\u003dlisting\" seems like a good idea, but I do not entirely follow the implications. I\u0027m not certain if this works correctly too: I do not see where names are converted into state numbers before _get_shard_range_rows issues a DB query. I\u0027m going to leave this as-is for now.","commit_id":"89546dc1c5e8c36e9d921104c7c687261fb0a65a"}]}
