)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"894b32decd19b42e0c7c0450551f83db4ec33211","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"b4deff57_17a588fe","updated":"2021-11-03 23:27:30.000000000","message":"Guess i forgot to vote.","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f4f39232_67cfa769","updated":"2021-11-03 23:26:39.000000000","message":"Mostly looks good.  A few minor things noted inline, and something slightly larger in host_manager.py, where the code may be clearer (to me anyway) if an assert statement is moved (though feel free to disagree).","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"664ef5e8f0c0f4625a46ff6348c3bcee1905e894","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"75e87eef_5aec7e03","updated":"2021-11-08 17:09:24.000000000","message":"Changes look good, hopefully Zuul will agree.  One followup observation or question or something noted inline.","commit_id":"5df7daabeead6f99ddae36f0a275135e3338a484"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"e145f0a9ba5abde08ac48cb7683b78c678c74c55","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"bf3da2d6_3e60ff59","updated":"2021-11-08 19:19:23.000000000","message":"I think this has gone through sufficent interations.  Merging.","commit_id":"5df7daabeead6f99ddae36f0a275135e3338a484"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9557cf7f24c4e03b5b5d7ce0b727f5e5fdc5ed9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0de88d0a_92925497","updated":"2021-11-08 17:35:43.000000000","message":"LGTM!","commit_id":"5df7daabeead6f99ddae36f0a275135e3338a484"}],"cinder/scheduler/filter_scheduler.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":true,"context_lines":[{"line_number":615,"context_line":"        LOG.debug(\"Choosing %s\", backend_state.backend_id)"},{"line_number":616,"context_line":"        return top_backend"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    def get_backup_host(self, volume: \u0027objects.Volume\u0027, driver\u003dNone):"},{"line_number":619,"context_line":"        return self.host_manager.get_backup_host(volume, driver)"}],"source_content_type":"text/x-python","patch_set":10,"id":"cbf72836_d23fce20","line":618,"range":{"start_line":618,"start_character":38,"end_line":618,"end_character":54},"updated":"2021-11-03 23:26:39.000000000","message":"nit: don\u0027t need the quotes here","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"18ffb32fe548d6d023503a77bb373f4cbd8bcf22","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        LOG.debug(\"Choosing %s\", backend_state.backend_id)"},{"line_number":616,"context_line":"        return top_backend"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    def get_backup_host(self, volume: \u0027objects.Volume\u0027, driver\u003dNone):"},{"line_number":619,"context_line":"        return self.host_manager.get_backup_host(volume, driver)"}],"source_content_type":"text/x-python","patch_set":10,"id":"f4dbec2b_7f8eb1d6","line":618,"range":{"start_line":618,"start_character":38,"end_line":618,"end_character":54},"in_reply_to":"cbf72836_d23fce20","updated":"2021-11-08 14:43:54.000000000","message":"Done","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"}],"cinder/scheduler/host_manager.py":[{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"5e833c29b13c5eff5e9c57e532b110b5005f007f","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        self.updated \u003d capability[\u0027timestamp\u0027]"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def consume_from_volume(self,"},{"line_number":317,"context_line":"                            volume: \u0027objects.Volume\u0027,"},{"line_number":318,"context_line":"                            update_time: bool \u003d True) -\u003e None:"},{"line_number":319,"context_line":"        \"\"\"Incrementally update host state from a volume.\"\"\""},{"line_number":320,"context_line":"        volume_gb \u003d volume[\u0027size\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a625944_34d189a0","line":317,"range":{"start_line":317,"start_character":36,"end_line":317,"end_character":53},"updated":"2021-08-09 23:09:41.000000000","message":"waiting for reply on https://review.opendev.org/c/openstack/cinder/+/788363/10/cinder/image/cache.py#66 before +2","commit_id":"5075b0ed0bc851d711dcbc83c9821419030cdf8d"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"472972598624ecad77b0ca082bd6eb29141e9628","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        self.updated \u003d capability[\u0027timestamp\u0027]"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def consume_from_volume(self,"},{"line_number":317,"context_line":"                            volume: \u0027objects.Volume\u0027,"},{"line_number":318,"context_line":"                            update_time: bool \u003d True) -\u003e None:"},{"line_number":319,"context_line":"        \"\"\"Incrementally update host state from a volume.\"\"\""},{"line_number":320,"context_line":"        volume_gb \u003d volume[\u0027size\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"a15e5bf2_2654b908","line":317,"range":{"start_line":317,"start_character":36,"end_line":317,"end_character":53},"in_reply_to":"7a625944_34d189a0","updated":"2021-08-10 22:38:52.000000000","message":"Hi, based on the reply https://review.opendev.org/c/openstack/cinder/+/788363/10/cinder/image/cache.py#66 I think we should update this as well, right?","commit_id":"5075b0ed0bc851d711dcbc83c9821419030cdf8d"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"3ece93785f63e4b386befb50e96bc000ae275513","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        self.updated \u003d capability[\u0027timestamp\u0027]"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def consume_from_volume(self,"},{"line_number":317,"context_line":"                            volume: \u0027objects.Volume\u0027,"},{"line_number":318,"context_line":"                            update_time: bool \u003d True) -\u003e None:"},{"line_number":319,"context_line":"        \"\"\"Incrementally update host state from a volume.\"\"\""},{"line_number":320,"context_line":"        volume_gb \u003d volume[\u0027size\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"7e337f4e_0fd8e134","line":317,"range":{"start_line":317,"start_character":36,"end_line":317,"end_character":53},"in_reply_to":"a15e5bf2_2654b908","updated":"2021-08-11 19:43:54.000000000","message":"Done","commit_id":"5075b0ed0bc851d711dcbc83c9821419030cdf8d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":true,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.capabilities: Optional[ReadOnlyDict] \u003d None"},{"line_number":111,"context_line":"        self.service: Optional[ReadOnlyDict] \u003d None"},{"line_number":112,"context_line":"        assert host is not None"},{"line_number":113,"context_line":"        self.host: str \u003d host"},{"line_number":114,"context_line":"        self.cluster_name: Optional[str] \u003d cluster_name"},{"line_number":115,"context_line":"        self.update_capabilities(capabilities, service)"}],"source_content_type":"text/x-python","patch_set":10,"id":"8222e085_3e864420","line":112,"range":{"start_line":112,"start_character":8,"end_line":112,"end_character":31},"updated":"2021-11-03 23:26:39.000000000","message":"This one really puzzled me (with host:Optional[str] on line 99, this looks like a runtime error waiting to happen).\n\nFrom what I can tell, host has to be Optional[str] because volume_utils.append_host() returns Optional[str], and append_host() is called to get the value that PoolState\u0027s init method passes to super(PoolState).__init__(), which is this __init__ right here.  Since PoolState\u0027s __init__ has host:str at line 379, we know that PoolState will always call append_host() with a non-None host value.  So what do you think about removing line 112 and instead doing the assert in PoolState before the call to this __init__ method is made?  Then we can have\n\n  host: str,\n\nat line 99, and we don\u0027t need the puzzling line 112 any more.  (I tried it locally, and mypy seems OK with it.)","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"18ffb32fe548d6d023503a77bb373f4cbd8bcf22","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.capabilities: Optional[ReadOnlyDict] \u003d None"},{"line_number":111,"context_line":"        self.service: Optional[ReadOnlyDict] \u003d None"},{"line_number":112,"context_line":"        assert host is not None"},{"line_number":113,"context_line":"        self.host: str \u003d host"},{"line_number":114,"context_line":"        self.cluster_name: Optional[str] \u003d cluster_name"},{"line_number":115,"context_line":"        self.update_capabilities(capabilities, service)"}],"source_content_type":"text/x-python","patch_set":10,"id":"a1fa0bc6_b0bc97be","line":112,"range":{"start_line":112,"start_character":8,"end_line":112,"end_character":31},"in_reply_to":"8222e085_3e864420","updated":"2021-11-08 14:43:54.000000000","message":"Done","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":true,"context_lines":[{"line_number":232,"context_line":"        if not capability:"},{"line_number":233,"context_line":"            return"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        self.pools \u003d typing.cast(dict, self.pools)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        pools \u003d capability.get(\u0027pools\u0027, None)"},{"line_number":238,"context_line":"        active_pools \u003d set()"}],"source_content_type":"text/x-python","patch_set":10,"id":"eb9abe43_dde1c30b","line":235,"range":{"start_line":235,"start_character":8,"end_line":235,"end_character":50},"updated":"2021-11-03 23:26:39.000000000","message":"--warn-redundant-casts is showing that this isn\u0027t necessary any more","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"18ffb32fe548d6d023503a77bb373f4cbd8bcf22","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        if not capability:"},{"line_number":233,"context_line":"            return"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        self.pools \u003d typing.cast(dict, self.pools)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        pools \u003d capability.get(\u0027pools\u0027, None)"},{"line_number":238,"context_line":"        active_pools \u003d set()"}],"source_content_type":"text/x-python","patch_set":10,"id":"92f6c044_d4599572","line":235,"range":{"start_line":235,"start_character":8,"end_line":235,"end_character":50},"in_reply_to":"eb9abe43_dde1c30b","updated":"2021-11-08 14:43:54.000000000","message":"Done","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":true,"context_lines":[{"line_number":380,"context_line":"                 cluster_name: Optional[str],"},{"line_number":381,"context_line":"                 capabilities: Union[Optional[ReadOnlyDict], Optional[dict]],"},{"line_number":382,"context_line":"                 pool_name: str):"},{"line_number":383,"context_line":"        new_host \u003d volume_utils.append_host(host, pool_name)"},{"line_number":384,"context_line":"        new_cluster \u003d volume_utils.append_host(cluster_name, pool_name)"},{"line_number":385,"context_line":"        super(PoolState, self).__init__(new_host, new_cluster, capabilities)"},{"line_number":386,"context_line":"        self.pool_name \u003d pool_name"}],"source_content_type":"text/x-python","patch_set":10,"id":"93dd07f4_7ead4c8d","line":383,"updated":"2021-11-03 23:26:39.000000000","message":"see comment in BackendState: maybe add\n\n  assert new_host is not None\n\nsince we know host is typed as not None at line 379, we should not get None back from append_host(), so I like making the assertion here instead of in the parent class.","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"18ffb32fe548d6d023503a77bb373f4cbd8bcf22","unresolved":false,"context_lines":[{"line_number":380,"context_line":"                 cluster_name: Optional[str],"},{"line_number":381,"context_line":"                 capabilities: Union[Optional[ReadOnlyDict], Optional[dict]],"},{"line_number":382,"context_line":"                 pool_name: str):"},{"line_number":383,"context_line":"        new_host \u003d volume_utils.append_host(host, pool_name)"},{"line_number":384,"context_line":"        new_cluster \u003d volume_utils.append_host(cluster_name, pool_name)"},{"line_number":385,"context_line":"        super(PoolState, self).__init__(new_host, new_cluster, capabilities)"},{"line_number":386,"context_line":"        self.pool_name \u003d pool_name"}],"source_content_type":"text/x-python","patch_set":10,"id":"03e4577f_c923e7e1","line":383,"in_reply_to":"93dd07f4_7ead4c8d","updated":"2021-11-08 14:43:54.000000000","message":"Done","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"}],"cinder/scheduler/weights/capacity.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        tmp_weights \u003d super(CapacityWeigher, self).weigh_objects("},{"line_number":76,"context_line":"            weighed_obj_list, weight_properties)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        assert self.maxval is not None"},{"line_number":79,"context_line":"        if math.isinf(self.maxval):"},{"line_number":80,"context_line":"            # NOTE(jecarey): if all weights were infinite then parent"},{"line_number":81,"context_line":"            # method returns 0 for all of the weights.  Thus self.minval"}],"source_content_type":"text/x-python","patch_set":10,"id":"697cedde_66637a91","line":78,"updated":"2021-11-03 23:26:39.000000000","message":"I guess this is safe to assert because the parent\u0027s weigh_objects() will set it and self.minval?","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"18ffb32fe548d6d023503a77bb373f4cbd8bcf22","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        tmp_weights \u003d super(CapacityWeigher, self).weigh_objects("},{"line_number":76,"context_line":"            weighed_obj_list, weight_properties)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        assert self.maxval is not None"},{"line_number":79,"context_line":"        if math.isinf(self.maxval):"},{"line_number":80,"context_line":"            # NOTE(jecarey): if all weights were infinite then parent"},{"line_number":81,"context_line":"            # method returns 0 for all of the weights.  Thus self.minval"}],"source_content_type":"text/x-python","patch_set":10,"id":"de5b67dd_55ea45b3","line":78,"in_reply_to":"697cedde_66637a91","updated":"2021-11-08 14:43:54.000000000","message":"It\u0027s needed because self.maxval is Optional but math.isinf() below requires it to be set.","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9557cf7f24c4e03b5b5d7ce0b727f5e5fdc5ed9f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        tmp_weights \u003d super(CapacityWeigher, self).weigh_objects("},{"line_number":76,"context_line":"            weighed_obj_list, weight_properties)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        assert self.maxval is not None"},{"line_number":79,"context_line":"        if math.isinf(self.maxval):"},{"line_number":80,"context_line":"            # NOTE(jecarey): if all weights were infinite then parent"},{"line_number":81,"context_line":"            # method returns 0 for all of the weights.  Thus self.minval"}],"source_content_type":"text/x-python","patch_set":10,"id":"4559ab3f_93874019","line":78,"in_reply_to":"6a6eb0af_5b3a9a83","updated":"2021-11-08 17:35:43.000000000","message":"I think your approach makes sense.","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"a8ba760546296a5e7a9b46c1f74b467de9221c6a","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        tmp_weights \u003d super(CapacityWeigher, self).weigh_objects("},{"line_number":76,"context_line":"            weighed_obj_list, weight_properties)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        assert self.maxval is not None"},{"line_number":79,"context_line":"        if math.isinf(self.maxval):"},{"line_number":80,"context_line":"            # NOTE(jecarey): if all weights were infinite then parent"},{"line_number":81,"context_line":"            # method returns 0 for all of the weights.  Thus self.minval"}],"source_content_type":"text/x-python","patch_set":10,"id":"6a6eb0af_5b3a9a83","line":78,"in_reply_to":"80b9f035_229d1804","updated":"2021-11-08 17:26:04.000000000","message":"\u003e I guess my question was more about how do we know that we\u0027re not introducing\n\u003e an incorrect statement into the code with this assert?\n\nBasically, we know because math.isinf() at line 79 throws a TypeError already if self.maxval is None.  (Which is why mypy complains.)\n\nOne alternative is to do a typing cast, but I think the assert is cleaner.\n\n\u003e The code we\u0027re calling at line 75, I think, does make sure that self.minval,\n\u003e self.maxval will have values after that call:\n\nYeah, the problem is, self.maxval is initially set to None and nothing makes the type system aware that this is no longer the case after weigh_objects() is called.  I can see a few potential ways to fix this but they involve actual code changes...","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"664ef5e8f0c0f4625a46ff6348c3bcee1905e894","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        tmp_weights \u003d super(CapacityWeigher, self).weigh_objects("},{"line_number":76,"context_line":"            weighed_obj_list, weight_properties)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        assert self.maxval is not None"},{"line_number":79,"context_line":"        if math.isinf(self.maxval):"},{"line_number":80,"context_line":"            # NOTE(jecarey): if all weights were infinite then parent"},{"line_number":81,"context_line":"            # method returns 0 for all of the weights.  Thus self.minval"}],"source_content_type":"text/x-python","patch_set":10,"id":"80b9f035_229d1804","line":78,"in_reply_to":"de5b67dd_55ea45b3","updated":"2021-11-08 17:09:24.000000000","message":"I guess my question was more about how do we know that we\u0027re not introducing\nan incorrect statement into the code with this assert?\n\nOn one hand, I guess it doesn\u0027t matter, because if the assert fails, then\nthe code was going to barf at line 79 anyway.\n\nI think my discomfort here comes from the difference with asserts in python and\njava.  In java, you have to specifically enable them at runtime, whereas in\npython they are on by default, so you could cause a runtime error with an incorrect assert.\n\nThe code we\u0027re calling at line 75, I think, does make sure that self.minval,\nself.maxval will have values after that call:\nhttps://github.com/openstack/cinder/blob/336ac06bcf69e4b2a7c782b2544a2079bf23bd6f/cinder/scheduler/base_weight.py#L108-L111\n\nSo I\u0027m ultimately OK with this.  (Though not so OK that I just hit the Resolved checkbox!)  Maybe you could remind us about this usage of assert at the cinder meeting in case it\u0027s causing people to refrain from approving patches.","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":true,"context_lines":[{"line_number":82,"context_line":"            # cannot be infinite at this point"},{"line_number":83,"context_line":"            copy_weights \u003d [w for w in tmp_weights if not math.isinf(w)]"},{"line_number":84,"context_line":"            self.maxval \u003d max(copy_weights)"},{"line_number":85,"context_line":"            assert self.maxval is not None"},{"line_number":86,"context_line":"            assert self.minval is not None"},{"line_number":87,"context_line":"            offset \u003d (self.maxval - self.minval) * OFFSET_MULT"},{"line_number":88,"context_line":"            self.maxval +\u003d OFFSET_MIN if offset \u003d\u003d 0.0 else offset"}],"source_content_type":"text/x-python","patch_set":10,"id":"17ca9023_62e61377","line":85,"range":{"start_line":85,"start_character":12,"end_line":85,"end_character":42},"updated":"2021-11-03 23:26:39.000000000","message":"This one is redundant (with line 78), but having it here makes it clear that we\u0027re good to go at line 87, so maybe that\u0027s OK.","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"18ffb32fe548d6d023503a77bb373f4cbd8bcf22","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            # cannot be infinite at this point"},{"line_number":83,"context_line":"            copy_weights \u003d [w for w in tmp_weights if not math.isinf(w)]"},{"line_number":84,"context_line":"            self.maxval \u003d max(copy_weights)"},{"line_number":85,"context_line":"            assert self.maxval is not None"},{"line_number":86,"context_line":"            assert self.minval is not None"},{"line_number":87,"context_line":"            offset \u003d (self.maxval - self.minval) * OFFSET_MULT"},{"line_number":88,"context_line":"            self.maxval +\u003d OFFSET_MIN if offset \u003d\u003d 0.0 else offset"}],"source_content_type":"text/x-python","patch_set":10,"id":"af7c6b12_f3ff3843","line":85,"range":{"start_line":85,"start_character":12,"end_line":85,"end_character":42},"in_reply_to":"17ca9023_62e61377","updated":"2021-11-08 14:43:54.000000000","message":"Done","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"}],"mypy-files.txt":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9f38c56d96472c23e199db947c0cab6c52bef924","unresolved":true,"context_lines":[{"line_number":8,"context_line":"cinder/image/image_utils.py"},{"line_number":9,"context_line":"cinder/exception.py"},{"line_number":10,"context_line":"cinder/manager.py"},{"line_number":11,"context_line":"cinder/objects/backup.py"},{"line_number":12,"context_line":"cinder/scheduler/base_handler.py"},{"line_number":13,"context_line":"cinder/scheduler/base_weight.py"},{"line_number":14,"context_line":"cinder/scheduler/evaluator/evaluator.py"}],"source_content_type":"text/plain","patch_set":10,"id":"f4be2cb2_971dafb0","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":24},"updated":"2021-11-03 23:26:39.000000000","message":"This line doesn\u0027t seem related to this commit?  (It\u0027s not breaking anything, though.)","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"18ffb32fe548d6d023503a77bb373f4cbd8bcf22","unresolved":false,"context_lines":[{"line_number":8,"context_line":"cinder/image/image_utils.py"},{"line_number":9,"context_line":"cinder/exception.py"},{"line_number":10,"context_line":"cinder/manager.py"},{"line_number":11,"context_line":"cinder/objects/backup.py"},{"line_number":12,"context_line":"cinder/scheduler/base_handler.py"},{"line_number":13,"context_line":"cinder/scheduler/base_weight.py"},{"line_number":14,"context_line":"cinder/scheduler/evaluator/evaluator.py"}],"source_content_type":"text/plain","patch_set":10,"id":"722f0c71_407940f6","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":24},"in_reply_to":"f4be2cb2_971dafb0","updated":"2021-11-08 14:43:54.000000000","message":"Done","commit_id":"eb1baab18c2302bbb640ef550a7e2c561b10ec52"}]}
