)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"f01331a93a5f4b5eb588648dc3910a8926442151","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"97685d27_4a80dd6b","updated":"2022-08-25 05:30:48.000000000","message":"only two minor comments, okay with all others.","commit_id":"61348fb0385db889c355f20b3e030b005a4ec719"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9b96c666_f8ae2b95","updated":"2022-08-25 20:41:53.000000000","message":"I\u0027m a little confused about the subshard.is_child_of(root) behavior -- do we have a use-case already for that?","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ee599ea94a1bac58d5b8ca4fc8621494c1237a8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"44cfc8e4_8c755592","updated":"2022-08-26 23:18:26.000000000","message":"recheck\nfailure looks related to system issue, retry it again.","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5beb03cc2413c59265779c547a8994f0da86e75d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"428864ec_371f0cfb","updated":"2022-08-26 12:08:14.000000000","message":"thanks for the reviews","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d9c9389a60b6f3d86a228428a1f01278b1b6e4ec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"54da535c_386c8657","updated":"2022-09-01 17:14:27.000000000","message":"I see that Tim has shrugged off spending more cycles on this - but the fact that he and Al both saw Jian working on this and came to dramatically different conclusions about how to make it MOST clear seems to me that maybe there\u0027s actually some (unneccessary?) complexity here that we could _try_ to beat back a little harder?\n\nmaybe it\u0027s a bigger change if we start tracking shards\u0027s .account_prefix and .parent_account separately and explicitly, but maybe it would be more clear (and helpful to future us)?\n\n... or maybe passing around the required (but often ignored) arg is more expedient?","commit_id":"26b7bf2dd81f6976b1ff87da1a5e5beabb4c144a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"89c52afa_6821818c","updated":"2022-09-08 19:17:18.000000000","message":"I think this is already pretty great as is!\n\nBut if we want we could keep working on it (or squash):\n\nhttps://review.opendev.org/c/openstack/swift/+/856559","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"33279374419fe2a550d58b475b87fa2282a5cef8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"665bfdec_b39c8d84","updated":"2022-09-08 20:53:00.000000000","message":"recheck\n\nBombed out in tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON which (as best I can tell) in no way touches Swift.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"}],"swift/common/utils.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"f01331a93a5f4b5eb588648dc3910a8926442151","unresolved":true,"context_lines":[{"line_number":5147,"context_line":"                 parent_container_hash,"},{"line_number":5148,"context_line":"                 timestamp,"},{"line_number":5149,"context_line":"                 index):"},{"line_number":5150,"context_line":"        if None in (account, root_container, parent_container_hash,"},{"line_number":5151,"context_line":"                    timestamp, index):"},{"line_number":5152,"context_line":"            raise ValueError(\u0027args must not be None\u0027)"},{"line_number":5153,"context_line":"        self.account \u003d self._validate(account)"}],"source_content_type":"text/x-python","patch_set":2,"id":"659b4ffd_ab5801a7","line":5150,"updated":"2022-08-25 05:30:48.000000000","message":"we can remove this line, after we perform \"self._validate\" on \"timestamp\" and \"index\"? then we will get detailed info on which parameter is None, if any of them is.","commit_id":"61348fb0385db889c355f20b3e030b005a4ec719"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7adc72715af45a90cd1e9d4889442c66b663eca9","unresolved":false,"context_lines":[{"line_number":5147,"context_line":"                 parent_container_hash,"},{"line_number":5148,"context_line":"                 timestamp,"},{"line_number":5149,"context_line":"                 index):"},{"line_number":5150,"context_line":"        if None in (account, root_container, parent_container_hash,"},{"line_number":5151,"context_line":"                    timestamp, index):"},{"line_number":5152,"context_line":"            raise ValueError(\u0027args must not be None\u0027)"},{"line_number":5153,"context_line":"        self.account \u003d self._validate(account)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfad206a_3c308283","line":5150,"in_reply_to":"659b4ffd_ab5801a7","updated":"2022-08-25 09:24:43.000000000","message":"Done","commit_id":"61348fb0385db889c355f20b3e030b005a4ec719"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"f01331a93a5f4b5eb588648dc3910a8926442151","unresolved":true,"context_lines":[{"line_number":5182,"context_line":""},{"line_number":5183,"context_line":"    @classmethod"},{"line_number":5184,"context_line":"    def parse(cls, name):"},{"line_number":5185,"context_line":"        account, container \u003d name.split(\u0027/\u0027, 2)"},{"line_number":5186,"context_line":"        parts \u003d container.rsplit(\u0027-\u0027, 3)"},{"line_number":5187,"context_line":"        if len(parts) !\u003d 4:"},{"line_number":5188,"context_line":"            raise ValueError(\u0027invalid name\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"36e42bcb_4ab5c3c6","line":5185,"updated":"2022-08-25 05:30:48.000000000","message":"should be name.split(\u0027/\u0027, 1)?","commit_id":"61348fb0385db889c355f20b3e030b005a4ec719"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7adc72715af45a90cd1e9d4889442c66b663eca9","unresolved":true,"context_lines":[{"line_number":5182,"context_line":""},{"line_number":5183,"context_line":"    @classmethod"},{"line_number":5184,"context_line":"    def parse(cls, name):"},{"line_number":5185,"context_line":"        account, container \u003d name.split(\u0027/\u0027, 2)"},{"line_number":5186,"context_line":"        parts \u003d container.rsplit(\u0027-\u0027, 3)"},{"line_number":5187,"context_line":"        if len(parts) !\u003d 4:"},{"line_number":5188,"context_line":"            raise ValueError(\u0027invalid name\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5855393e_ecb48cb5","line":5185,"in_reply_to":"36e42bcb_4ab5c3c6","updated":"2022-08-25 09:24:43.000000000","message":"good catch! I make the mistake of thinking in terms of 2 parts rather than 1 split","commit_id":"61348fb0385db889c355f20b3e030b005a4ec719"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"f9d0fd1ef7f39d2bca20bb81309496d6900d812f","unresolved":false,"context_lines":[{"line_number":5182,"context_line":""},{"line_number":5183,"context_line":"    @classmethod"},{"line_number":5184,"context_line":"    def parse(cls, name):"},{"line_number":5185,"context_line":"        account, container \u003d name.split(\u0027/\u0027, 2)"},{"line_number":5186,"context_line":"        parts \u003d container.rsplit(\u0027-\u0027, 3)"},{"line_number":5187,"context_line":"        if len(parts) !\u003d 4:"},{"line_number":5188,"context_line":"            raise ValueError(\u0027invalid name\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae8588f_8a652eb9","line":5185,"in_reply_to":"5855393e_ecb48cb5","updated":"2022-08-25 16:49:59.000000000","message":"Done","commit_id":"61348fb0385db889c355f20b3e030b005a4ec719"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":5185,"context_line":"                container.rsplit(\u0027-\u0027, 3)"},{"line_number":5186,"context_line":"        except ValueError:"},{"line_number":5187,"context_line":"            raise ValueError(\u0027invalid name: %s\u0027 % name)"},{"line_number":5188,"context_line":"        return cls(account, root_container, parent_container, timestamp, index)"},{"line_number":5189,"context_line":""},{"line_number":5190,"context_line":""},{"line_number":5191,"context_line":"class ShardRange(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"d9d50d17_8c878fe1","line":5188,"updated":"2022-08-25 20:41:53.000000000","message":"I wonder if we should move the return inside the try block, in case the Timestamp() or int() throws a ValueError.","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5beb03cc2413c59265779c547a8994f0da86e75d","unresolved":false,"context_lines":[{"line_number":5185,"context_line":"                container.rsplit(\u0027-\u0027, 3)"},{"line_number":5186,"context_line":"        except ValueError:"},{"line_number":5187,"context_line":"            raise ValueError(\u0027invalid name: %s\u0027 % name)"},{"line_number":5188,"context_line":"        return cls(account, root_container, parent_container, timestamp, index)"},{"line_number":5189,"context_line":""},{"line_number":5190,"context_line":""},{"line_number":5191,"context_line":"class ShardRange(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"28438eef_7b307d50","line":5188,"in_reply_to":"d9d50d17_8c878fe1","updated":"2022-08-26 12:08:14.000000000","message":"Done","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":5335,"context_line":"                                shards_account_prefix + parent.account):"},{"line_number":5336,"context_line":"            return False"},{"line_number":5337,"context_line":""},{"line_number":5338,"context_line":"        parsed_name \u003d ShardName.parse(self.name)"},{"line_number":5339,"context_line":"        if parent.container \u003d\u003d parsed_name.root_container:"},{"line_number":5340,"context_line":"            # my parent is also my root"},{"line_number":5341,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"4b369ebf_be84efd6","line":5338,"updated":"2022-08-25 20:41:53.000000000","message":"This will throw a ValueError if this is an own-shard-range of a root account -- is that intentional?","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5beb03cc2413c59265779c547a8994f0da86e75d","unresolved":false,"context_lines":[{"line_number":5335,"context_line":"                                shards_account_prefix + parent.account):"},{"line_number":5336,"context_line":"            return False"},{"line_number":5337,"context_line":""},{"line_number":5338,"context_line":"        parsed_name \u003d ShardName.parse(self.name)"},{"line_number":5339,"context_line":"        if parent.container \u003d\u003d parsed_name.root_container:"},{"line_number":5340,"context_line":"            # my parent is also my root"},{"line_number":5341,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"87677c52_f3e05416","line":5338,"in_reply_to":"4b369ebf_be84efd6","updated":"2022-08-26 12:08:14.000000000","message":"Done","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":5338,"context_line":"        parsed_name \u003d ShardName.parse(self.name)"},{"line_number":5339,"context_line":"        if parent.container \u003d\u003d parsed_name.root_container:"},{"line_number":5340,"context_line":"            # my parent is also my root"},{"line_number":5341,"context_line":"            return True"},{"line_number":5342,"context_line":""},{"line_number":5343,"context_line":"        try:"},{"line_number":5344,"context_line":"            parsed_parent_name \u003d ShardName.parse(parent.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"587aff9a_9d23549f","line":5341,"updated":"2022-08-25 20:41:53.000000000","message":"Wait, so a sub-sub-sub-shard is also a child of the root, in addition to whatever sub-sub-shard? Feels a little sloppy...","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5beb03cc2413c59265779c547a8994f0da86e75d","unresolved":false,"context_lines":[{"line_number":5338,"context_line":"        parsed_name \u003d ShardName.parse(self.name)"},{"line_number":5339,"context_line":"        if parent.container \u003d\u003d parsed_name.root_container:"},{"line_number":5340,"context_line":"            # my parent is also my root"},{"line_number":5341,"context_line":"            return True"},{"line_number":5342,"context_line":""},{"line_number":5343,"context_line":"        try:"},{"line_number":5344,"context_line":"            parsed_parent_name \u003d ShardName.parse(parent.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"87a425e8_c6e9f892","line":5341,"in_reply_to":"587aff9a_9d23549f","updated":"2022-08-26 12:08:14.000000000","message":"that\u0027s a bug!","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":5355,"context_line":"        if str(potential_child_name) \u003d\u003d str(parsed_name):"},{"line_number":5356,"context_line":"            return True"},{"line_number":5357,"context_line":""},{"line_number":5358,"context_line":"        return False"},{"line_number":5359,"context_line":""},{"line_number":5360,"context_line":"    @classmethod"},{"line_number":5361,"context_line":"    def make_path(cls, shards_account, root_container, parent_container,"}],"source_content_type":"text/x-python","patch_set":3,"id":"29bf1d3c_83711af3","line":5358,"updated":"2022-08-25 20:41:53.000000000","message":"I\u0027m inclined to rewrite this all as something more like\n\n        try:\n            parsed_name \u003d ShardName.parse(self.name)\n        except ValueError:\n            # not a shard; can\u0027t be a child\n            return False\n\n        try:\n            parsed_parent \u003d ShardName.parse(parent.name)\n            root_container \u003d parsed_parent.root_container\n            shard_account \u003d parsed_parent.account\n        except ValueError:\n            root_container \u003d parent.container\n            shard_account \u003d shards_account_prefix + parent.account\n\n        potential_child_name \u003d ShardName.create(\n            shard_account,\n            root_container,\n            parent.container,\n            parsed_name.timestamp,\n            parsed_name.index)\n        return str(potential_child_name) \u003d\u003d str(parsed_name)","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5beb03cc2413c59265779c547a8994f0da86e75d","unresolved":false,"context_lines":[{"line_number":5355,"context_line":"        if str(potential_child_name) \u003d\u003d str(parsed_name):"},{"line_number":5356,"context_line":"            return True"},{"line_number":5357,"context_line":""},{"line_number":5358,"context_line":"        return False"},{"line_number":5359,"context_line":""},{"line_number":5360,"context_line":"    @classmethod"},{"line_number":5361,"context_line":"    def make_path(cls, shards_account, root_container, parent_container,"}],"source_content_type":"text/x-python","patch_set":3,"id":"848af1a3_db5c3211","line":5358,"in_reply_to":"29bf1d3c_83711af3","updated":"2022-08-26 12:08:14.000000000","message":"ok, that works","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcf03be7745baa37c0d67d757d0f601af6121843","unresolved":true,"context_lines":[{"line_number":5352,"context_line":"            root_container \u003d parsed_parent_name.root_container"},{"line_number":5353,"context_line":"        except ValueError:"},{"line_number":5354,"context_line":"            root_container \u003d parent.container"},{"line_number":5355,"context_line":"            child_account \u003d shards_account_prefix + parent.account"},{"line_number":5356,"context_line":""},{"line_number":5357,"context_line":"        potential_child_name \u003d ShardName.create("},{"line_number":5358,"context_line":"            child_account,"}],"source_content_type":"text/x-python","patch_set":4,"id":"458f9645_100bdbd7","line":5355,"range":{"start_line":5355,"start_character":28,"end_line":5355,"end_character":49},"updated":"2022-08-26 23:29:29.000000000","message":"Still feels a little weird that we need to pass this around -- I wonder if we could do something like\n\n if not parsed_name.account.endswith(parent.account):\n     return False\n child_account \u003d parsed_name.account\n\nso we could (or, might be able to?) tolerate us doing something stupid like changing the shards account prefix...","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":false,"context_lines":[{"line_number":5352,"context_line":"            root_container \u003d parsed_parent_name.root_container"},{"line_number":5353,"context_line":"        except ValueError:"},{"line_number":5354,"context_line":"            root_container \u003d parent.container"},{"line_number":5355,"context_line":"            child_account \u003d shards_account_prefix + parent.account"},{"line_number":5356,"context_line":""},{"line_number":5357,"context_line":"        potential_child_name \u003d ShardName.create("},{"line_number":5358,"context_line":"            child_account,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ae9705f_ca5adb1f","line":5355,"range":{"start_line":5355,"start_character":28,"end_line":5355,"end_character":49},"in_reply_to":"458f9645_100bdbd7","updated":"2022-09-08 09:54:31.000000000","message":"Done","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcf03be7745baa37c0d67d757d0f601af6121843","unresolved":true,"context_lines":[{"line_number":5384,"context_line":"            ``timestamp``."},{"line_number":5385,"context_line":"        :return: a string of the form \u003caccount_name\u003e/\u003ccontainer_name\u003e"},{"line_number":5386,"context_line":"        \"\"\""},{"line_number":5387,"context_line":"        timestamp \u003d cls._to_timestamp(timestamp)"},{"line_number":5388,"context_line":"        return str(ShardName.create(shards_account,"},{"line_number":5389,"context_line":"                                    root_container,"},{"line_number":5390,"context_line":"                                    parent_container,"}],"source_content_type":"text/x-python","patch_set":4,"id":"17c9292a_aa9e76da","line":5387,"updated":"2022-08-26 23:29:29.000000000","message":"Isn\u0027t this supposed to already be a Timestamp?\n\n :param timestamp: an instance of :class:`~swift.common.utils.Timestamp`\n\n*shrug* Better safe than sorry, I suppose.","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"740c4ac090962b19b3a674d40d7dbf7a5aa74540","unresolved":false,"context_lines":[{"line_number":5384,"context_line":"            ``timestamp``."},{"line_number":5385,"context_line":"        :return: a string of the form \u003caccount_name\u003e/\u003ccontainer_name\u003e"},{"line_number":5386,"context_line":"        \"\"\""},{"line_number":5387,"context_line":"        timestamp \u003d cls._to_timestamp(timestamp)"},{"line_number":5388,"context_line":"        return str(ShardName.create(shards_account,"},{"line_number":5389,"context_line":"                                    root_container,"},{"line_number":5390,"context_line":"                                    parent_container,"}],"source_content_type":"text/x-python","patch_set":4,"id":"672e5ce9_0d6147c2","line":5387,"in_reply_to":"17c9292a_aa9e76da","updated":"2022-09-07 23:47:48.000000000","message":"\u0027_to_timestamp\u0027 will skip the conversion if it\u0027s a Timestamp already, it\u0027s previous used inside \u0027_make_container_name\u0027 as well.","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d9c9389a60b6f3d86a228428a1f01278b1b6e4ec","unresolved":true,"context_lines":[{"line_number":5340,"context_line":"        \"\"\""},{"line_number":5341,"context_line":"        Test if this shard range is a child of another shard range. The"},{"line_number":5342,"context_line":"        parent-child relationship is inferred from the names of the shard"},{"line_number":5343,"context_line":"        ranges."},{"line_number":5344,"context_line":""},{"line_number":5345,"context_line":"        :param parent: an instance of ``ShardRange``."},{"line_number":5346,"context_line":"        :param shards_account_prefix: the prefix used for the hidden shard"}],"source_content_type":"text/x-python","patch_set":6,"id":"5c94669b_4918910b","line":5343,"updated":"2022-09-01 17:14:27.000000000","message":"it\u0027s not obvious to me form this doc-string what the expected answer is for *grand-children*\n\nI guess an earlier version had a bug where any shard that points to the root is considered a child of the root?  even if it was birthed by another shard (who would *also* be considered a parent?) ... maybe that\u0027s all that confused me since the current version doesn\u0027t seem to have any ambiguity about grand-children.","commit_id":"26b7bf2dd81f6976b1ff87da1a5e5beabb4c144a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":false,"context_lines":[{"line_number":5340,"context_line":"        \"\"\""},{"line_number":5341,"context_line":"        Test if this shard range is a child of another shard range. The"},{"line_number":5342,"context_line":"        parent-child relationship is inferred from the names of the shard"},{"line_number":5343,"context_line":"        ranges."},{"line_number":5344,"context_line":""},{"line_number":5345,"context_line":"        :param parent: an instance of ``ShardRange``."},{"line_number":5346,"context_line":"        :param shards_account_prefix: the prefix used for the hidden shard"}],"source_content_type":"text/x-python","patch_set":6,"id":"eb3bccb7_aee343c9","line":5343,"in_reply_to":"012bd2e5_4563d1dd","updated":"2022-09-08 09:54:31.000000000","message":"Done","commit_id":"26b7bf2dd81f6976b1ff87da1a5e5beabb4c144a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c63d375a7dfb2db98b20ad1aee0d2d6235e2c7a2","unresolved":true,"context_lines":[{"line_number":5340,"context_line":"        \"\"\""},{"line_number":5341,"context_line":"        Test if this shard range is a child of another shard range. The"},{"line_number":5342,"context_line":"        parent-child relationship is inferred from the names of the shard"},{"line_number":5343,"context_line":"        ranges."},{"line_number":5344,"context_line":""},{"line_number":5345,"context_line":"        :param parent: an instance of ``ShardRange``."},{"line_number":5346,"context_line":"        :param shards_account_prefix: the prefix used for the hidden shard"}],"source_content_type":"text/x-python","patch_set":6,"id":"012bd2e5_4563d1dd","line":5343,"in_reply_to":"5c94669b_4918910b","updated":"2022-09-02 15:22:54.000000000","message":"I\u0027m not sure what the perceived ambiguity is: \"parent-child\" is a quite specific relationship:\n\n  :return: True if ``parent`` is the parent of this shard range, False\n            otherwise.\n\nUnfortunately I don\u0027t think it is possible to infer the more general is_descendant_of from the container names.","commit_id":"26b7bf2dd81f6976b1ff87da1a5e5beabb4c144a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":true,"context_lines":[{"line_number":5178,"context_line":"                                   self.index)"},{"line_number":5179,"context_line":""},{"line_number":5180,"context_line":"    @classmethod"},{"line_number":5181,"context_line":"    def hash_container_name(cls, container_name):"},{"line_number":5182,"context_line":"        cls._validate(container_name)"},{"line_number":5183,"context_line":"        if not isinstance(container_name, bytes):"},{"line_number":5184,"context_line":"            container_name \u003d container_name.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"0fc9bc04_ab236070","line":5181,"updated":"2022-09-08 09:54:31.000000000","message":"add docstring","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b208933215874dc9ea48e1fc2567d2b4b60b6b55","unresolved":false,"context_lines":[{"line_number":5178,"context_line":"                                   self.index)"},{"line_number":5179,"context_line":""},{"line_number":5180,"context_line":"    @classmethod"},{"line_number":5181,"context_line":"    def hash_container_name(cls, container_name):"},{"line_number":5182,"context_line":"        cls._validate(container_name)"},{"line_number":5183,"context_line":"        if not isinstance(container_name, bytes):"},{"line_number":5184,"context_line":"            container_name \u003d container_name.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ac488c0_e0286ea7","line":5181,"in_reply_to":"0fc9bc04_ab236070","updated":"2022-09-08 10:57:15.000000000","message":"Done","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":true,"context_lines":[{"line_number":5186,"context_line":"        return hash"},{"line_number":5187,"context_line":""},{"line_number":5188,"context_line":"    @classmethod"},{"line_number":5189,"context_line":"    def create(cls, account, root_container, parent_container,"},{"line_number":5190,"context_line":"               timestamp, index):"},{"line_number":5191,"context_line":"        parent_container_hash \u003d cls.hash_container_name(parent_container)"},{"line_number":5192,"context_line":"        return cls(account, root_container, parent_container_hash, timestamp,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3dc4f754_9d478086","line":5189,"updated":"2022-09-08 09:54:31.000000000","message":"add docstring","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b208933215874dc9ea48e1fc2567d2b4b60b6b55","unresolved":false,"context_lines":[{"line_number":5186,"context_line":"        return hash"},{"line_number":5187,"context_line":""},{"line_number":5188,"context_line":"    @classmethod"},{"line_number":5189,"context_line":"    def create(cls, account, root_container, parent_container,"},{"line_number":5190,"context_line":"               timestamp, index):"},{"line_number":5191,"context_line":"        parent_container_hash \u003d cls.hash_container_name(parent_container)"},{"line_number":5192,"context_line":"        return cls(account, root_container, parent_container_hash, timestamp,"}],"source_content_type":"text/x-python","patch_set":8,"id":"6e815b00_a0693755","line":5189,"in_reply_to":"3dc4f754_9d478086","updated":"2022-09-08 10:57:15.000000000","message":"Done","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":true,"context_lines":[{"line_number":5193,"context_line":"                   index)"},{"line_number":5194,"context_line":""},{"line_number":5195,"context_line":"    @classmethod"},{"line_number":5196,"context_line":"    def parse(cls, name):"},{"line_number":5197,"context_line":"        try:"},{"line_number":5198,"context_line":"            account, container \u003d name.split(\u0027/\u0027, 1)"},{"line_number":5199,"context_line":"            root_container, parent_container_hash, timestamp, index \u003d \\"}],"source_content_type":"text/x-python","patch_set":8,"id":"bc4e4b84_153f4bf2","line":5196,"updated":"2022-09-08 09:54:31.000000000","message":"add docstring","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b208933215874dc9ea48e1fc2567d2b4b60b6b55","unresolved":false,"context_lines":[{"line_number":5193,"context_line":"                   index)"},{"line_number":5194,"context_line":""},{"line_number":5195,"context_line":"    @classmethod"},{"line_number":5196,"context_line":"    def parse(cls, name):"},{"line_number":5197,"context_line":"        try:"},{"line_number":5198,"context_line":"            account, container \u003d name.split(\u0027/\u0027, 1)"},{"line_number":5199,"context_line":"            root_container, parent_container_hash, timestamp, index \u003d \\"}],"source_content_type":"text/x-python","patch_set":8,"id":"2fee5495_abe96fd6","line":5196,"in_reply_to":"bc4e4b84_153f4bf2","updated":"2022-09-08 10:57:15.000000000","message":"Done","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":true,"context_lines":[{"line_number":5344,"context_line":"        \"\"\""},{"line_number":5345,"context_line":"        Test if this shard range is a child of another shard range. The"},{"line_number":5346,"context_line":"        parent-child relationship is inferred from the names of the shard"},{"line_number":5347,"context_line":"        ranges. This method is limited to work only within the scope of the"},{"line_number":5348,"context_line":"        same account."},{"line_number":5349,"context_line":""},{"line_number":5350,"context_line":"        :param parent: an instance of ``ShardRange``."},{"line_number":5351,"context_line":"        :return: True if ``parent`` is the parent of this shard range, False"}],"source_content_type":"text/x-python","patch_set":8,"id":"48e45ddd_023e6eea","line":5348,"range":{"start_line":5347,"start_character":16,"end_line":5348,"end_character":21},"updated":"2022-09-08 09:54:31.000000000","message":"ok! nice and clear.","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1cd87dd88c9e1cb2dcc37baf77374e056f5d41ba","unresolved":false,"context_lines":[{"line_number":5344,"context_line":"        \"\"\""},{"line_number":5345,"context_line":"        Test if this shard range is a child of another shard range. The"},{"line_number":5346,"context_line":"        parent-child relationship is inferred from the names of the shard"},{"line_number":5347,"context_line":"        ranges. This method is limited to work only within the scope of the"},{"line_number":5348,"context_line":"        same account."},{"line_number":5349,"context_line":""},{"line_number":5350,"context_line":"        :param parent: an instance of ``ShardRange``."},{"line_number":5351,"context_line":"        :return: True if ``parent`` is the parent of this shard range, False"}],"source_content_type":"text/x-python","patch_set":8,"id":"5eaf5b19_4216220f","line":5348,"range":{"start_line":5347,"start_character":16,"end_line":5348,"end_character":21},"in_reply_to":"48e45ddd_023e6eea","updated":"2022-09-08 18:52:15.000000000","message":"Done","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":true,"context_lines":[{"line_number":5351,"context_line":"        :return: True if ``parent`` is the parent of this shard range, False"},{"line_number":5352,"context_line":"            otherwise, assuming that they are within the same account."},{"line_number":5353,"context_line":"        \"\"\""},{"line_number":5354,"context_line":"        # note: We limit the usages of this method to be within the same"},{"line_number":5355,"context_line":"        # account, because account shard prefix is configurable and it\u0027s hard"},{"line_number":5356,"context_line":"        # to perform checking without breaking backward-compatibility."},{"line_number":5357,"context_line":"        try:"},{"line_number":5358,"context_line":"            self_parsed_name \u003d ShardName.parse(self.name)"},{"line_number":5359,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"c58e7b84_29d9c2c4","line":5356,"range":{"start_line":5354,"start_character":8,"end_line":5356,"end_character":70},"updated":"2022-09-08 09:54:31.000000000","message":"great! we also have a reminder to future us as to *why* the method has limited scope","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1cd87dd88c9e1cb2dcc37baf77374e056f5d41ba","unresolved":false,"context_lines":[{"line_number":5351,"context_line":"        :return: True if ``parent`` is the parent of this shard range, False"},{"line_number":5352,"context_line":"            otherwise, assuming that they are within the same account."},{"line_number":5353,"context_line":"        \"\"\""},{"line_number":5354,"context_line":"        # note: We limit the usages of this method to be within the same"},{"line_number":5355,"context_line":"        # account, because account shard prefix is configurable and it\u0027s hard"},{"line_number":5356,"context_line":"        # to perform checking without breaking backward-compatibility."},{"line_number":5357,"context_line":"        try:"},{"line_number":5358,"context_line":"            self_parsed_name \u003d ShardName.parse(self.name)"},{"line_number":5359,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9834d836_e6db24c5","line":5356,"range":{"start_line":5354,"start_character":8,"end_line":5356,"end_character":70},"in_reply_to":"c58e7b84_29d9c2c4","updated":"2022-09-08 18:52:15.000000000","message":"Done","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":true,"context_lines":[{"line_number":5371,"context_line":"            self_parsed_name.root_container \u003d\u003d parent_root_container"},{"line_number":5372,"context_line":"            and self_parsed_name.parent_container_hash"},{"line_number":5373,"context_line":"            \u003d\u003d ShardName.hash_container_name(parent.container)"},{"line_number":5374,"context_line":"        )"},{"line_number":5375,"context_line":""},{"line_number":5376,"context_line":"    @classmethod"},{"line_number":5377,"context_line":"    def make_path(cls, shards_account, root_container, parent_container,"}],"source_content_type":"text/x-python","patch_set":8,"id":"0ec6252d_0da54007","line":5374,"updated":"2022-09-08 09:54:31.000000000","message":"ok, this is a little slicker that the previous version.\n\nI did slightly prefer re-constructing a ShardName and comparing the two instances of ShardName, because it seemed robust to make the name again in the *exact* same way as self.name was made. But I can\u0027t really justify it or find fault with this version. Plus, this version avoids the awkward serialize-names-to-strings-and-compare-strings","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1cd87dd88c9e1cb2dcc37baf77374e056f5d41ba","unresolved":true,"context_lines":[{"line_number":5371,"context_line":"            self_parsed_name.root_container \u003d\u003d parent_root_container"},{"line_number":5372,"context_line":"            and self_parsed_name.parent_container_hash"},{"line_number":5373,"context_line":"            \u003d\u003d ShardName.hash_container_name(parent.container)"},{"line_number":5374,"context_line":"        )"},{"line_number":5375,"context_line":""},{"line_number":5376,"context_line":"    @classmethod"},{"line_number":5377,"context_line":"    def make_path(cls, shards_account, root_container, parent_container,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ec49b71e_7407789e","line":5374,"in_reply_to":"0ec6252d_0da54007","updated":"2022-09-08 18:52:15.000000000","message":"I thought about this too. ShardName has \"account\" name in it, I feel it\u0027s not right to call its constructor using a not reliable account name. In the mean time, I feel ShardName does need \"account\" name in it.","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":true,"context_lines":[{"line_number":5154,"context_line":"    Note: not all instances of :class:`~swift.common.utils.ShardRange` have"},{"line_number":5155,"context_line":"    names that will parse as a :class:`~swift.common.utils.ShardName`; root"},{"line_number":5156,"context_line":"    container own shard ranges, for example, have a simpler name format of"},{"line_number":5157,"context_line":"    \u003caccount\u003e/\u003croot_container\u003e."},{"line_number":5158,"context_line":"    \"\"\""},{"line_number":5159,"context_line":"    def __init__(self, account, root_container,"},{"line_number":5160,"context_line":"                 parent_container_hash,"}],"source_content_type":"text/x-python","patch_set":9,"id":"f93c1d63_c54f81c4","line":5157,"updated":"2022-09-08 19:17:18.000000000","message":"I mis-read this at first.  If you just glance past the first \"not\" the rest reads like it\u0027s saying the opposite.  Maybe more robust as:\n\n+    N.B. some instances of :class:`~swift.common.utils.ShardRange` have names\n+    that will NOT parse as a :class:`~swift.common.utils.ShardName`; e.g. a\n+    root container\u0027s own shard range will have a name format of\n+    \u003caccount\u003e/\u003croot_container\u003e which will raise ValueError if passed to parse.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":true,"context_lines":[{"line_number":5204,"context_line":"            container belongs."},{"line_number":5205,"context_line":"        :param root_container: the name of the root container for the shard."},{"line_number":5206,"context_line":"        :param parent_container: the name of the parent container for the"},{"line_number":5207,"context_line":"            shard."},{"line_number":5208,"context_line":"        :param timestamp: an instance of :class:`~swift.common.utils.Timestamp`"},{"line_number":5209,"context_line":"        :param index: a unique index that will distinguish the path from any"},{"line_number":5210,"context_line":"            other path generated using the same combination of"}],"source_content_type":"text/x-python","patch_set":9,"id":"f578ece8_a0d6c249","line":5207,"updated":"2022-09-08 19:17:18.000000000","message":"so for a sub-shard parent_container is the name of the shard container (in the .shards_ account), but maybe this param can also be the name of the root if the ShardName is one of the initial shards?\n\nI\u0027m not sure I\u0027m seeing testing for that...","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6caf78dc2f56c0b4a994570459e8bf49bcb2c125","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 account."},{"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":9,"id":"f7fc148a_38b96d4b","line":5389,"updated":"2022-09-08 19:30:41.000000000","message":"\"within the scope of the same account\" is a little odd when we\u0027re talking about a concept that regularly uses two accounts (e.g., \"AUTH_test\" and \".shards_AUTH_test\") but I think I get it -- it should work so long as we know that these are all to do with the same *user-facing* account, and we already know that any shard range table in any cluster should satisfy that.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dcd7ecc668745e25e7207a624f95ad1bc455c14b","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 account."},{"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":9,"id":"e5d56df5_349d1127","line":5389,"in_reply_to":"7d68d813_996c8ee9","updated":"2022-09-09 05:13:26.000000000","message":"Done","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5b6e8245ca7a54a9b836977ca35f07c9d393958d","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 account."},{"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":9,"id":"7d68d813_996c8ee9","line":5389,"in_reply_to":"f7fc148a_38b96d4b","updated":"2022-09-09 00:19:30.000000000","message":"second this, let\u0027s add *user-facing* into the comments.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":true,"context_lines":[{"line_number":5405,"context_line":"            parsed_parent_name \u003d ShardName.parse(parent.name)"},{"line_number":5406,"context_line":"            parent_root_container \u003d parsed_parent_name.root_container"},{"line_number":5407,"context_line":"        except ValueError:"},{"line_number":5408,"context_line":"            # parent is a root container."},{"line_number":5409,"context_line":"            parent_root_container \u003d parent.container"},{"line_number":5410,"context_line":""},{"line_number":5411,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":9,"id":"13c79fb2_c72fccf9","line":5408,"updated":"2022-09-08 19:17:18.000000000","message":"is this an unfair assumption for *ANY* ValueError?","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5b6e8245ca7a54a9b836977ca35f07c9d393958d","unresolved":false,"context_lines":[{"line_number":5405,"context_line":"            parsed_parent_name \u003d ShardName.parse(parent.name)"},{"line_number":5406,"context_line":"            parent_root_container \u003d parsed_parent_name.root_container"},{"line_number":5407,"context_line":"        except ValueError:"},{"line_number":5408,"context_line":"            # parent is a root container."},{"line_number":5409,"context_line":"            parent_root_container \u003d parent.container"},{"line_number":5410,"context_line":""},{"line_number":5411,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":9,"id":"6a5922ac_2cf61083","line":5408,"in_reply_to":"13c79fb2_c72fccf9","updated":"2022-09-09 00:19:30.000000000","message":"since parent is already a valid ShardRange instance, \"ValueError\" will only be the case that parent is a root container.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":true,"context_lines":[{"line_number":5409,"context_line":"            parent_root_container \u003d parent.container"},{"line_number":5410,"context_line":""},{"line_number":5411,"context_line":"        return ("},{"line_number":5412,"context_line":"            self_parsed_name.root_container \u003d\u003d parent_root_container"},{"line_number":5413,"context_line":"            and self_parsed_name.parent_container_hash"},{"line_number":5414,"context_line":"            \u003d\u003d ShardName.hash_container_name(parent.container)"},{"line_number":5415,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":9,"id":"9b43ca8d_fb443a16","line":5412,"updated":"2022-09-08 19:17:18.000000000","message":"so we can\u0027t say that both shards come from the same account, but we can require they\u0027re both from the same root-container... otherwise we could have two shards from different roots with a matching parent container hash evaluated as having a parent-child relationship but really they shouldn\u0027t even be in the same shard_range table.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5b6e8245ca7a54a9b836977ca35f07c9d393958d","unresolved":false,"context_lines":[{"line_number":5409,"context_line":"            parent_root_container \u003d parent.container"},{"line_number":5410,"context_line":""},{"line_number":5411,"context_line":"        return ("},{"line_number":5412,"context_line":"            self_parsed_name.root_container \u003d\u003d parent_root_container"},{"line_number":5413,"context_line":"            and self_parsed_name.parent_container_hash"},{"line_number":5414,"context_line":"            \u003d\u003d ShardName.hash_container_name(parent.container)"},{"line_number":5415,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":9,"id":"17cb4124_7f4fb547","line":5412,"in_reply_to":"9b43ca8d_fb443a16","updated":"2022-09-09 00:19:30.000000000","message":"Ack","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":true,"context_lines":[{"line_number":5411,"context_line":"        return ("},{"line_number":5412,"context_line":"            self_parsed_name.root_container \u003d\u003d parent_root_container"},{"line_number":5413,"context_line":"            and self_parsed_name.parent_container_hash"},{"line_number":5414,"context_line":"            \u003d\u003d ShardName.hash_container_name(parent.container)"},{"line_number":5415,"context_line":"        )"},{"line_number":5416,"context_line":""},{"line_number":5417,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":9,"id":"bb1a9232_83c2a205","line":5414,"updated":"2022-09-08 19:17:18.000000000","message":"And even if we DO have a parsed_parent_name, we don\u0027t want to compare OUR self_parsed_name.parent_container_hash to parsed_parent_name.parent_container_hash because we\u0027re not testing \"is sibling\" we\u0027re testing \"is parent\" - and we don\u0027t know the hash of the parent.container until we calculate it right here.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5b6e8245ca7a54a9b836977ca35f07c9d393958d","unresolved":false,"context_lines":[{"line_number":5411,"context_line":"        return ("},{"line_number":5412,"context_line":"            self_parsed_name.root_container \u003d\u003d parent_root_container"},{"line_number":5413,"context_line":"            and self_parsed_name.parent_container_hash"},{"line_number":5414,"context_line":"            \u003d\u003d ShardName.hash_container_name(parent.container)"},{"line_number":5415,"context_line":"        )"},{"line_number":5416,"context_line":""},{"line_number":5417,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":9,"id":"993d2d91_b97d117c","line":5414,"in_reply_to":"bb1a9232_83c2a205","updated":"2022-09-09 00:19:30.000000000","message":"yes, that\u0027s right.","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":true,"context_lines":[{"line_number":5426,"context_line":"        :param root_container: the name of the root container for the shard."},{"line_number":5427,"context_line":"        :param parent_container: the name of the parent container for the"},{"line_number":5428,"context_line":"            shard; for initial first generation shards this should be the same"},{"line_number":5429,"context_line":"            as ``root_container``; for shards of shards this should be the name"},{"line_number":5430,"context_line":"            of the sharding shard container."},{"line_number":5431,"context_line":"        :param timestamp: an instance of :class:`~swift.common.utils.Timestamp`"},{"line_number":5432,"context_line":"        :param index: a unique index that will distinguish the path from any"}],"source_content_type":"text/x-python","patch_set":9,"id":"b9b89906_b8819f42","line":5429,"updated":"2022-09-08 19:17:18.000000000","message":"here we discuss how root_container and parent_container can be the same - maybe this could be added to tests/docstring for ShardName","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":8920,"context_line":"        parent_path \u003d utils.ShardRange.make_path("},{"line_number":8921,"context_line":"            \u0027.shards_a\u0027, \u0027root\u0027, \u0027grandparent\u0027, ts_parent, 1)"},{"line_number":8922,"context_line":"        parent \u003d utils.ShardRange(parent_path, ts_parent)"},{"line_number":8923,"context_line":"        self.assertTrue(parent.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8924,"context_line":"        self.assertFalse(parent.is_child_of(root, \u0027.other_\u0027))"},{"line_number":8925,"context_line":"        # different shards account prefix"},{"line_number":8926,"context_line":"        self.assertFalse(root.is_child_of(parent, \u0027.shards_\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"26a40499_91210e79","line":8923,"updated":"2022-08-25 20:41:53.000000000","message":"This feels weird to me. Why do we want this?","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5beb03cc2413c59265779c547a8994f0da86e75d","unresolved":false,"context_lines":[{"line_number":8920,"context_line":"        parent_path \u003d utils.ShardRange.make_path("},{"line_number":8921,"context_line":"            \u0027.shards_a\u0027, \u0027root\u0027, \u0027grandparent\u0027, ts_parent, 1)"},{"line_number":8922,"context_line":"        parent \u003d utils.ShardRange(parent_path, ts_parent)"},{"line_number":8923,"context_line":"        self.assertTrue(parent.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8924,"context_line":"        self.assertFalse(parent.is_child_of(root, \u0027.other_\u0027))"},{"line_number":8925,"context_line":"        # different shards account prefix"},{"line_number":8926,"context_line":"        self.assertFalse(root.is_child_of(parent, \u0027.shards_\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"b88d80a1_68b541e0","line":8923,"in_reply_to":"26a40499_91210e79","updated":"2022-08-26 12:08:14.000000000","message":"the recurring flaw in the test is that the parent level shard ranges were meant to be children of root but in fact are not.","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":8923,"context_line":"        self.assertTrue(parent.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8924,"context_line":"        self.assertFalse(parent.is_child_of(root, \u0027.other_\u0027))"},{"line_number":8925,"context_line":"        # different shards account prefix"},{"line_number":8926,"context_line":"        self.assertFalse(root.is_child_of(parent, \u0027.shards_\u0027))"},{"line_number":8927,"context_line":""},{"line_number":8928,"context_line":"        ts_child \u003d next(self.ts_iter)"},{"line_number":8929,"context_line":"        child_path \u003d utils.ShardRange.make_path("}],"source_content_type":"text/x-python","patch_set":3,"id":"2e042047_f25482fd","line":8926,"updated":"2022-08-25 20:41:53.000000000","message":"Might as well add\n\n self.assertFalse(parent.is_child_of(parent, \u0027.shards_\u0027))","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5beb03cc2413c59265779c547a8994f0da86e75d","unresolved":false,"context_lines":[{"line_number":8923,"context_line":"        self.assertTrue(parent.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8924,"context_line":"        self.assertFalse(parent.is_child_of(root, \u0027.other_\u0027))"},{"line_number":8925,"context_line":"        # different shards account prefix"},{"line_number":8926,"context_line":"        self.assertFalse(root.is_child_of(parent, \u0027.shards_\u0027))"},{"line_number":8927,"context_line":""},{"line_number":8928,"context_line":"        ts_child \u003d next(self.ts_iter)"},{"line_number":8929,"context_line":"        child_path \u003d utils.ShardRange.make_path("}],"source_content_type":"text/x-python","patch_set":3,"id":"04fb81db_e85e45f2","line":8926,"in_reply_to":"2e042047_f25482fd","updated":"2022-08-26 12:08:14.000000000","message":"Done","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":8950,"context_line":"        parent_sibling_path \u003d utils.ShardRange.make_path("},{"line_number":8951,"context_line":"            \u0027.shards_a\u0027, \u0027root\u0027, \u0027grandparent\u0027, ts_parent, 4)  # other index"},{"line_number":8952,"context_line":"        parent_sibling \u003d utils.ShardRange(parent_sibling_path, ts_parent)"},{"line_number":8953,"context_line":"        self.assertTrue(parent_sibling.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8954,"context_line":"        self.assertFalse(root.is_child_of(parent_sibling, \u0027.shards_\u0027))"},{"line_number":8955,"context_line":"        self.assertFalse(child.is_child_of(parent_sibling, \u0027.shards_\u0027))"},{"line_number":8956,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"be1304e1_0143a1d6","line":8953,"updated":"2022-08-25 20:41:53.000000000","message":"Yet we assert it again... any shard (with appropriate root account/container info) is a \"child\" of the root, regardless of the history.","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcf03be7745baa37c0d67d757d0f601af6121843","unresolved":false,"context_lines":[{"line_number":8950,"context_line":"        parent_sibling_path \u003d utils.ShardRange.make_path("},{"line_number":8951,"context_line":"            \u0027.shards_a\u0027, \u0027root\u0027, \u0027grandparent\u0027, ts_parent, 4)  # other index"},{"line_number":8952,"context_line":"        parent_sibling \u003d utils.ShardRange(parent_sibling_path, ts_parent)"},{"line_number":8953,"context_line":"        self.assertTrue(parent_sibling.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8954,"context_line":"        self.assertFalse(root.is_child_of(parent_sibling, \u0027.shards_\u0027))"},{"line_number":8955,"context_line":"        self.assertFalse(child.is_child_of(parent_sibling, \u0027.shards_\u0027))"},{"line_number":8956,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"09b087c2_e05f6340","line":8953,"in_reply_to":"be1304e1_0143a1d6","updated":"2022-08-26 23:29:29.000000000","message":"Done","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ee329e446aba3c1f138fb4700f0062e627fac1f","unresolved":true,"context_lines":[{"line_number":8958,"context_line":"        distant_path \u003d utils.ShardRange.make_path("},{"line_number":8959,"context_line":"            \u0027.shards_a\u0027, \u0027root\u0027, \u0027stranger\u0027, ts_parent, 1)"},{"line_number":8960,"context_line":"        distant \u003d utils.ShardRange(distant_path, ts_parent)"},{"line_number":8961,"context_line":"        self.assertTrue(distant.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8962,"context_line":"        self.assertFalse(child.is_child_of(distant, \u0027.shards_\u0027))"},{"line_number":8963,"context_line":""},{"line_number":8964,"context_line":"    def test_expand(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"cea3418b_777a15c7","line":8961,"updated":"2022-08-25 20:41:53.000000000","message":"... and again...","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcf03be7745baa37c0d67d757d0f601af6121843","unresolved":false,"context_lines":[{"line_number":8958,"context_line":"        distant_path \u003d utils.ShardRange.make_path("},{"line_number":8959,"context_line":"            \u0027.shards_a\u0027, \u0027root\u0027, \u0027stranger\u0027, ts_parent, 1)"},{"line_number":8960,"context_line":"        distant \u003d utils.ShardRange(distant_path, ts_parent)"},{"line_number":8961,"context_line":"        self.assertTrue(distant.is_child_of(root, \u0027.shards_\u0027))"},{"line_number":8962,"context_line":"        self.assertFalse(child.is_child_of(distant, \u0027.shards_\u0027))"},{"line_number":8963,"context_line":""},{"line_number":8964,"context_line":"    def test_expand(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ce3884e9_accce928","line":8961,"in_reply_to":"cea3418b_777a15c7","updated":"2022-08-26 23:29:29.000000000","message":"Done","commit_id":"7822cfcf95776b4e75bf8fb3f3ec6e7e75948725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcf03be7745baa37c0d67d757d0f601af6121843","unresolved":true,"context_lines":[{"line_number":9013,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1, \u0027.shards_\u0027))"},{"line_number":9014,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1_c1, \u0027.shards_\u0027))"},{"line_number":9015,"context_line":""},{"line_number":9016,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1, \u0027.shards_\u0027))"},{"line_number":9017,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r2, \u0027.shards_\u0027))"},{"line_number":9018,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a2_r1, \u0027.shards_\u0027))"},{"line_number":9019,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1_gp2, \u0027.shards_\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"ca7b3f8b_86421783","line":9016,"updated":"2022-08-26 23:29:29.000000000","message":"Check -- sub-shards are no longer considered children of the root.","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c63d375a7dfb2db98b20ad1aee0d2d6235e2c7a2","unresolved":true,"context_lines":[{"line_number":9013,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1, \u0027.shards_\u0027))"},{"line_number":9014,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1_c1, \u0027.shards_\u0027))"},{"line_number":9015,"context_line":""},{"line_number":9016,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1, \u0027.shards_\u0027))"},{"line_number":9017,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r2, \u0027.shards_\u0027))"},{"line_number":9018,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a2_r1, \u0027.shards_\u0027))"},{"line_number":9019,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1_gp2, \u0027.shards_\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"aead923c_38067b4b","line":9016,"in_reply_to":"0b2feaff_4b9d5818","updated":"2022-09-02 15:22:54.000000000","message":"The arg is annoying but it does affect the outcome, just not in the cases you chose, which you could only choose by already knowing the outcome.\n\nI can\u0027t see a way to reliably infer the root account from the shard\u0027s account, given that (AFAICT) the shards account prefix can be arbitrary. It\u0027s actually the auto account prefix that is configurable (with default \u0027.\u0027); the \u0027shards_\u0027 part is hard-coded. And frustratingly a configurable auto account prefix has been deprecated for a long time but still supported. \n\nEven more frustratingly, past us has cursed us with allowing stupid choices like the auto account prefix being .shards_ i.e. shard account names like .shards_shards_foo are possible. So we can\u0027t just search for the first occurrence of the \u0027shards_\u0027. I *wish* that was not so!\n\nSo I think we\u0027re left with a style debate between:\n\n1. passing the prefix into the method as a required arg\n2. making it a required attribute of ShardRange (annoying because it\u0027s effectively deprecated)\n3. unbinding the is_child_of method to a module function is_parent_child(shard1, shard2, prefix)\n\nI don\u0027t *like* any of the options.\n\nI admit I did not consider option 2 before. If we make the prefix a member of ShardRange what do we do about the signature of make_path? We\u0027d either need to change the definition of that public interface or ignore the prefix member that we added to ShardRange (because the account passed to make_path already has a prefix).\n\nI did consider 3 but preferred the is_child_of semantic of 1. Making it a bound method avoids confusion about which arg is parent and which is child in a module method. Plus we already pass the prefix (albeit as part of the account name) to ShardRange.make_path.","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":false,"context_lines":[{"line_number":9013,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1, \u0027.shards_\u0027))"},{"line_number":9014,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1_c1, \u0027.shards_\u0027))"},{"line_number":9015,"context_line":""},{"line_number":9016,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1, \u0027.shards_\u0027))"},{"line_number":9017,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r2, \u0027.shards_\u0027))"},{"line_number":9018,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a2_r1, \u0027.shards_\u0027))"},{"line_number":9019,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1_gp2, \u0027.shards_\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"f6f681ae_fab38cdf","line":9016,"in_reply_to":"aead923c_38067b4b","updated":"2022-09-08 09:54:31.000000000","message":"Done","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d9c9389a60b6f3d86a228428a1f01278b1b6e4ec","unresolved":true,"context_lines":[{"line_number":9013,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1, \u0027.shards_\u0027))"},{"line_number":9014,"context_line":"        self.assertFalse(a1_r1_gp1.is_child_of(a1_r1_gp1_p1_c1, \u0027.shards_\u0027))"},{"line_number":9015,"context_line":""},{"line_number":9016,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1, \u0027.shards_\u0027))"},{"line_number":9017,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r2, \u0027.shards_\u0027))"},{"line_number":9018,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a2_r1, \u0027.shards_\u0027))"},{"line_number":9019,"context_line":"        self.assertFalse(a1_r1_gp1_p1.is_child_of(a1_r1_gp2, \u0027.shards_\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"0b2feaff_4b9d5818","line":9016,"in_reply_to":"ca7b3f8b_86421783","updated":"2022-09-01 17:14:27.000000000","message":"I feel like this comment is somewhat damning - why do we have a *required* argument that can\u0027t effect the out-come of the evaluation?\n\nwhat\u0027s the point of configuring it and passing it around if neither of these should be true?\n\n(Pdb) other_a1_r1_gp1_p1.is_child_of(a1_r1_gp1, \u0027.other_\u0027)\nFalse\n(Pdb) a1_r1_gp1_p1.is_child_of(other_a1_r1_gp1, \u0027.other_\u0027)\nFalse\n\nit\u0027s like the *only* time it matters is when testing if a shard is a parent of a root and we act like it depends on what the account prefix is because otherwise we couldn\u0027t possibly properly parse out the real root account name from the shard\u0027s prefixed account name...  is that\u0027s so maybe make_path or other ShardRange constructors should require this configurable kwarg and shards can have specific attributes for .account_prefix and .parent_account that we use in is_child_of","commit_id":"4569d80ab7437260bdef64d346e13eb4d259ac88"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"412583fd541a2d0ca57399f6bcffbc1b7ca22c32","unresolved":true,"context_lines":[{"line_number":8965,"context_line":"            \u0027.shards_a1\u0027, \u0027r1\u0027, \u0027r1\u0027, ts, 1)[:-2], ts)"},{"line_number":8966,"context_line":"        # different shards account prefix"},{"line_number":8967,"context_line":"        other_a1_r1_gp1 \u003d utils.ShardRange(utils.ShardRange.make_path("},{"line_number":8968,"context_line":"            \u0027.other_a1\u0027, \u0027r1\u0027, a1_r1.container, ts, 2), ts)"},{"line_number":8969,"context_line":"        other_a1_r1_gp1_p1 \u003d utils.ShardRange(utils.ShardRange.make_path("},{"line_number":8970,"context_line":"            \u0027.other_a1\u0027, \u0027r1\u0027, other_a1_r1_gp1.container, ts, 2), ts)"},{"line_number":8971,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"2d689b0e_bad08679","line":8968,"range":{"start_line":8968,"start_character":13,"end_line":8968,"end_character":22},"updated":"2022-09-07 12:58:25.000000000","message":"this is not realistic: only the hidden account prefix can be configured, the \u0027shards_\u0027 part is hard-coded.\n\nA better \u0027strange\u0027 prefix would be .shards_shards_","commit_id":"26b7bf2dd81f6976b1ff87da1a5e5beabb4c144a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":false,"context_lines":[{"line_number":8965,"context_line":"            \u0027.shards_a1\u0027, \u0027r1\u0027, \u0027r1\u0027, ts, 1)[:-2], ts)"},{"line_number":8966,"context_line":"        # different shards account prefix"},{"line_number":8967,"context_line":"        other_a1_r1_gp1 \u003d utils.ShardRange(utils.ShardRange.make_path("},{"line_number":8968,"context_line":"            \u0027.other_a1\u0027, \u0027r1\u0027, a1_r1.container, ts, 2), ts)"},{"line_number":8969,"context_line":"        other_a1_r1_gp1_p1 \u003d utils.ShardRange(utils.ShardRange.make_path("},{"line_number":8970,"context_line":"            \u0027.other_a1\u0027, \u0027r1\u0027, other_a1_r1_gp1.container, ts, 2), ts)"},{"line_number":8971,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9bc858ce_f6acd0d6","line":8968,"range":{"start_line":8968,"start_character":13,"end_line":8968,"end_character":22},"in_reply_to":"2d689b0e_bad08679","updated":"2022-09-08 09:54:31.000000000","message":"Done","commit_id":"26b7bf2dd81f6976b1ff87da1a5e5beabb4c144a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"252107a50a9f07ef5bd8a04fb4c281fac717dd12","unresolved":true,"context_lines":[{"line_number":5733,"context_line":"    \"\"\""},{"line_number":5734,"context_line":"    Like range(limit), but with extra context switching to screw things up."},{"line_number":5735,"context_line":"    \"\"\""},{"line_number":5736,"context_line":""},{"line_number":5737,"context_line":"    def __init__(self, upper_bound):"},{"line_number":5738,"context_line":"        self.current \u003d 0"},{"line_number":5739,"context_line":"        self.concurrent_calls \u003d 0"}],"source_content_type":"text/x-python","patch_set":8,"id":"747fb94d_5b1c5b50","line":5736,"updated":"2022-09-08 09:54:31.000000000","message":"unnecessary change","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b208933215874dc9ea48e1fc2567d2b4b60b6b55","unresolved":false,"context_lines":[{"line_number":5733,"context_line":"    \"\"\""},{"line_number":5734,"context_line":"    Like range(limit), but with extra context switching to screw things up."},{"line_number":5735,"context_line":"    \"\"\""},{"line_number":5736,"context_line":""},{"line_number":5737,"context_line":"    def __init__(self, upper_bound):"},{"line_number":5738,"context_line":"        self.current \u003d 0"},{"line_number":5739,"context_line":"        self.concurrent_calls \u003d 0"}],"source_content_type":"text/x-python","patch_set":8,"id":"79cde971_2622d695","line":5736,"in_reply_to":"747fb94d_5b1c5b50","updated":"2022-09-08 10:57:15.000000000","message":"Done","commit_id":"5bcaaae5cc40f68ca43d225f97523f327f7c663e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2cf705427506ab1248db291ac9481d5a756a99d0","unresolved":true,"context_lines":[{"line_number":7976,"context_line":"            utils.ShardName.parse(\u0027a\u0027)"},{"line_number":7977,"context_line":"        self.assertEqual(\u0027invalid name: a\u0027, str(cm.exception))"},{"line_number":7978,"context_line":"        with self.assertRaises(ValueError) as cm:"},{"line_number":7979,"context_line":"            utils.ShardName.parse(\u0027a/c\u0027)"},{"line_number":7980,"context_line":"        self.assertEqual(\u0027invalid name: a/c\u0027, str(cm.exception))"},{"line_number":7981,"context_line":"        with self.assertRaises(ValueError) as cm:"},{"line_number":7982,"context_line":"            utils.ShardName.parse(\u0027a/root-hash-bad\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"c6e40d27_b668f43c","line":7979,"updated":"2022-09-08 19:17:18.000000000","message":"OK, we definately can NOT represent a root name like a/c as a ShardName","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5b6e8245ca7a54a9b836977ca35f07c9d393958d","unresolved":false,"context_lines":[{"line_number":7976,"context_line":"            utils.ShardName.parse(\u0027a\u0027)"},{"line_number":7977,"context_line":"        self.assertEqual(\u0027invalid name: a\u0027, str(cm.exception))"},{"line_number":7978,"context_line":"        with self.assertRaises(ValueError) as cm:"},{"line_number":7979,"context_line":"            utils.ShardName.parse(\u0027a/c\u0027)"},{"line_number":7980,"context_line":"        self.assertEqual(\u0027invalid name: a/c\u0027, str(cm.exception))"},{"line_number":7981,"context_line":"        with self.assertRaises(ValueError) as cm:"},{"line_number":7982,"context_line":"            utils.ShardName.parse(\u0027a/root-hash-bad\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"84f293de_68789d7b","line":7979,"in_reply_to":"c6e40d27_b668f43c","updated":"2022-09-09 00:19:30.000000000","message":"Ack","commit_id":"73bce6331221a7ac71f798f3868ba2fdeed55b9d"}]}
