)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"581035995ba65c2614cbb281dfa65c08ef10ed03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c467af8b_72e7722a","updated":"2023-05-19 15:28:16.000000000","message":"Maybe you\u0027ve gone through all these things, but if not, some ideas of things that might not go as we expect when these are made async. I\u0027m curious about how you plan to validate that all the new ways these can interleave are okay (or maybe you can explain each in detail enough to be sure?)","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"28b5bdf652f32f5e4bc8c03ddbeb0c0e05141ff4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"09501b1c_0a33dd57","updated":"2023-06-13 01:11:12.000000000","message":"recheck","commit_id":"9cba6b3aa4924f8d2abbf30370de726cc2e7799e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d2c7b594d47ed76be538a4688de72de2b8563449","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"825324d1_237d4e21","updated":"2023-06-05 18:15:41.000000000","message":"recheck sqlite error","commit_id":"9cba6b3aa4924f8d2abbf30370de726cc2e7799e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"fc347007cdd48172369ec4458975fe352f128d37","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"aa2c04c0_2e8b4311","updated":"2023-05-26 17:50:49.000000000","message":"recheck timeout","commit_id":"9cba6b3aa4924f8d2abbf30370de726cc2e7799e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f9418de3557c4d7b8c90eddc20512f9ec43e8cc9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"573098bf_271fdb1f","updated":"2023-06-09 14:28:34.000000000","message":"recheck unrelated teardown/volume timeouts","commit_id":"9cba6b3aa4924f8d2abbf30370de726cc2e7799e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"c20e0b2c21393f8a4d599bbcbdbf111cbd338aea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"601c1849_fc857723","updated":"2023-07-13 07:36:22.000000000","message":"recheck","commit_id":"8ba311aa35a21410a41d7ff914c405acf95220f4"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"af95d5d7111cf6a6fcc29d783679082ed90da1e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"8b5aa05c_fe7ade74","updated":"2023-08-09 18:59:29.000000000","message":"recheck","commit_id":"8ba311aa35a21410a41d7ff914c405acf95220f4"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a65ef566d1a0f9763216a8c51aff7f7bdf0da316","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"436abaaf_e31a5089","updated":"2023-08-30 15:14:13.000000000","message":"recheck","commit_id":"4c25213688ac5d500d4489472b971ac206a90268"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"df95924377ee84b9b9200f31ee8e9494d7fedbf7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"12344f75_f228feed","updated":"2023-12-27 19:10:54.000000000","message":"Very neat! Only noticed a typo in the comments.","commit_id":"d0d55195a994636699fe52f6c40763320ea70b7a"}],"nova/compute/manager.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4bbede321d8888fd8c3fdfaa5de89ce1f3de4e5b","unresolved":true,"context_lines":[{"line_number":9148,"context_line":"                        self.volume_api.attachment_delete(context,"},{"line_number":9149,"context_line":"                                                          bdm.attachment_id)"},{"line_number":9150,"context_line":""},{"line_number":9151,"context_line":"                except Exception as e:"},{"line_number":9152,"context_line":"                    if bdm.attachment_id is None:"},{"line_number":9153,"context_line":"                        LOG.error(\u0027Connection for volume %s not terminated on \u0027"},{"line_number":9154,"context_line":"                                  \u0027source host %s during post_live_migration: \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"f8511982_c706f934","line":9151,"updated":"2023-05-19 16:05:49.000000000","message":"There\u0027s pokemon exception catching here, so calling this with spawn_n should be safe, exception-wise?","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"50cf35f08b3e4f34083deb9e3f251a235cc87105","unresolved":false,"context_lines":[{"line_number":9148,"context_line":"                        self.volume_api.attachment_delete(context,"},{"line_number":9149,"context_line":"                                                          bdm.attachment_id)"},{"line_number":9150,"context_line":""},{"line_number":9151,"context_line":"                except Exception as e:"},{"line_number":9152,"context_line":"                    if bdm.attachment_id is None:"},{"line_number":9153,"context_line":"                        LOG.error(\u0027Connection for volume %s not terminated on \u0027"},{"line_number":9154,"context_line":"                                  \u0027source host %s during post_live_migration: \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"c217f5c1_b0405495","line":9151,"in_reply_to":"2090b394_295f0ffb","updated":"2023-05-19 16:59:46.000000000","message":"Ack, I\u0027ll add a wait just before driver.cleanup() then, which also means we\u0027re extra safe in terms of not calling uplug_vifs() until we\u0027re finished with Neutron.","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4cc2dfa61b45d8f283959edbade9b21a8e9d1088","unresolved":false,"context_lines":[{"line_number":9148,"context_line":"                        self.volume_api.attachment_delete(context,"},{"line_number":9149,"context_line":"                                                          bdm.attachment_id)"},{"line_number":9150,"context_line":""},{"line_number":9151,"context_line":"                except Exception as e:"},{"line_number":9152,"context_line":"                    if bdm.attachment_id is None:"},{"line_number":9153,"context_line":"                        LOG.error(\u0027Connection for volume %s not terminated on \u0027"},{"line_number":9154,"context_line":"                                  \u0027source host %s during post_live_migration: \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"2090b394_295f0ffb","line":9151,"in_reply_to":"f8511982_c706f934","updated":"2023-05-19 16:31:50.000000000","message":"Ack, but it\u0027s logged now and won\u0027t be if we don\u0027t wait.","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"581035995ba65c2614cbb281dfa65c08ef10ed03","unresolved":true,"context_lines":[{"line_number":9254,"context_line":""},{"line_number":9255,"context_line":"        # Disconnect volumes from this (the source) host."},{"line_number":9256,"context_line":"        utils.spawn_n(self._post_live_migration_remove_source_vol_connections,"},{"line_number":9257,"context_line":"                      ctxt, instance, source_bdms)"},{"line_number":9258,"context_line":""},{"line_number":9259,"context_line":"        destroy_vifs \u003d False"},{"line_number":9260,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"60c5d8f0_9a4b6b00","line":9257,"updated":"2023-05-19 15:28:16.000000000","message":"One thing to think about is that this will avoid us stopping if an exception is raised. We might want to wait on these two things for that reason at least. It might not matter if they fail and/or it may be better to not let them stop us, but it *also* might be better if we at least check and log the fact.","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4bbede321d8888fd8c3fdfaa5de89ce1f3de4e5b","unresolved":true,"context_lines":[{"line_number":9254,"context_line":""},{"line_number":9255,"context_line":"        # Disconnect volumes from this (the source) host."},{"line_number":9256,"context_line":"        utils.spawn_n(self._post_live_migration_remove_source_vol_connections,"},{"line_number":9257,"context_line":"                      ctxt, instance, source_bdms)"},{"line_number":9258,"context_line":""},{"line_number":9259,"context_line":"        destroy_vifs \u003d False"},{"line_number":9260,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f8db1a18_c733c583","line":9257,"in_reply_to":"60c5d8f0_9a4b6b00","updated":"2023-05-19 16:05:49.000000000","message":"Good point, I\u0027m not sure how defensive we want to be here - the methods we\u0027re calling catch exeptions inline (see my other two comments), so it should be mostly safe, but we may indeed want to wait here to raise any stragglers, so to speak.","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4cc2dfa61b45d8f283959edbade9b21a8e9d1088","unresolved":false,"context_lines":[{"line_number":9254,"context_line":""},{"line_number":9255,"context_line":"        # Disconnect volumes from this (the source) host."},{"line_number":9256,"context_line":"        utils.spawn_n(self._post_live_migration_remove_source_vol_connections,"},{"line_number":9257,"context_line":"                      ctxt, instance, source_bdms)"},{"line_number":9258,"context_line":""},{"line_number":9259,"context_line":"        destroy_vifs \u003d False"},{"line_number":9260,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"35563cb7_b55f542b","line":9257,"in_reply_to":"f8db1a18_c733c583","updated":"2023-05-19 16:31:50.000000000","message":"Ack","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"581035995ba65c2614cbb281dfa65c08ef10ed03","unresolved":true,"context_lines":[{"line_number":9272,"context_line":"                          \u0027with original source VIFs from migrate_data: %s\u0027,"},{"line_number":9273,"context_line":"                          unplug_nw_info, instance\u003dinstance)"},{"line_number":9274,"context_line":"            self.driver.post_live_migration_at_source(ctxt, instance,"},{"line_number":9275,"context_line":"                                                      unplug_nw_info)"},{"line_number":9276,"context_line":"        except NotImplementedError as ex:"},{"line_number":9277,"context_line":"            LOG.debug(ex, instance\u003dinstance)"},{"line_number":9278,"context_line":"            # For all hypervisors other than libvirt, there is a possibility"}],"source_content_type":"text/x-python","patch_set":1,"id":"17954e63_cebedc80","line":9275,"updated":"2023-05-19 15:28:16.000000000","message":"Are we sure that racing to here before the migrate_instance_start() has completed is okay? I\u0027m not sure what that network api call actually does, but obviously making it async gives me concern (even though as you say, it seems not entirely clear that anything depends on it.\n\nLike, if we haven\u0027t activated the new bindings before we delete the old ones or something, does the port state reset or something like that? Without making sure we hit every orientation of this, it\u0027s a bit scary...","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4bbede321d8888fd8c3fdfaa5de89ce1f3de4e5b","unresolved":true,"context_lines":[{"line_number":9272,"context_line":"                          \u0027with original source VIFs from migrate_data: %s\u0027,"},{"line_number":9273,"context_line":"                          unplug_nw_info, instance\u003dinstance)"},{"line_number":9274,"context_line":"            self.driver.post_live_migration_at_source(ctxt, instance,"},{"line_number":9275,"context_line":"                                                      unplug_nw_info)"},{"line_number":9276,"context_line":"        except NotImplementedError as ex:"},{"line_number":9277,"context_line":"            LOG.debug(ex, instance\u003dinstance)"},{"line_number":9278,"context_line":"            # For all hypervisors other than libvirt, there is a possibility"}],"source_content_type":"text/x-python","patch_set":1,"id":"5e513d16_b3e636be","line":9275,"in_reply_to":"17954e63_cebedc80","updated":"2023-05-19 16:05:49.000000000","message":"This only does something in the libvirt driver, and the thing it does is unplug the vifs. This is independent of the Neutron port bindings (and we\u0027re calling it with the \"old\" network_info from L9230 anyways)","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4cc2dfa61b45d8f283959edbade9b21a8e9d1088","unresolved":false,"context_lines":[{"line_number":9272,"context_line":"                          \u0027with original source VIFs from migrate_data: %s\u0027,"},{"line_number":9273,"context_line":"                          unplug_nw_info, instance\u003dinstance)"},{"line_number":9274,"context_line":"            self.driver.post_live_migration_at_source(ctxt, instance,"},{"line_number":9275,"context_line":"                                                      unplug_nw_info)"},{"line_number":9276,"context_line":"        except NotImplementedError as ex:"},{"line_number":9277,"context_line":"            LOG.debug(ex, instance\u003dinstance)"},{"line_number":9278,"context_line":"            # For all hypervisors other than libvirt, there is a possibility"}],"source_content_type":"text/x-python","patch_set":1,"id":"4674c97f_0363f95f","line":9275,"in_reply_to":"5e513d16_b3e636be","updated":"2023-05-19 16:31:50.000000000","message":"Ack","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"581035995ba65c2614cbb281dfa65c08ef10ed03","unresolved":true,"context_lines":[{"line_number":9293,"context_line":"        if do_cleanup:"},{"line_number":9294,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":9295,"context_line":"                      instance\u003dinstance)"},{"line_number":9296,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":9297,"context_line":"                                destroy_disks\u003ddestroy_disks,"},{"line_number":9298,"context_line":"                                migrate_data\u003dmigrate_data,"},{"line_number":9299,"context_line":"                                destroy_vifs\u003ddestroy_vifs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3d929749_516820d6","line":9296,"updated":"2023-05-19 15:28:16.000000000","message":"Here too, it seems like if we haven\u0027t finished the act of removing the volume connections, this might not be able to do what it needs?","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4bbede321d8888fd8c3fdfaa5de89ce1f3de4e5b","unresolved":true,"context_lines":[{"line_number":9293,"context_line":"        if do_cleanup:"},{"line_number":9294,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":9295,"context_line":"                      instance\u003dinstance)"},{"line_number":9296,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":9297,"context_line":"                                destroy_disks\u003ddestroy_disks,"},{"line_number":9298,"context_line":"                                migrate_data\u003dmigrate_data,"},{"line_number":9299,"context_line":"                                destroy_vifs\u003ddestroy_vifs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"4fde8275_a4776756","line":9296,"in_reply_to":"3d929749_516820d6","updated":"2023-05-19 16:05:49.000000000","message":"OK, so this does eventually call down to _disconnect_volume(). I don\u0027t know enough about the storage side of things to determine whether it\u0027s OK to do this without necessarily waiting for the Cinder attachment cleanup. I can add a wait here.","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4cc2dfa61b45d8f283959edbade9b21a8e9d1088","unresolved":true,"context_lines":[{"line_number":9293,"context_line":"        if do_cleanup:"},{"line_number":9294,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":9295,"context_line":"                      instance\u003dinstance)"},{"line_number":9296,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":9297,"context_line":"                                destroy_disks\u003ddestroy_disks,"},{"line_number":9298,"context_line":"                                migrate_data\u003dmigrate_data,"},{"line_number":9299,"context_line":"                                destroy_vifs\u003ddestroy_vifs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"902e4e12_73a8e48b","line":9296,"in_reply_to":"4fde8275_a4776756","updated":"2023-05-19 16:31:50.000000000","message":"Ack, I think the wait is a good call just to be sure.","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4df9a6420a81c19ae2603dea32f96adacb4e3869","unresolved":false,"context_lines":[{"line_number":9293,"context_line":"        if do_cleanup:"},{"line_number":9294,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":9295,"context_line":"                      instance\u003dinstance)"},{"line_number":9296,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":9297,"context_line":"                                destroy_disks\u003ddestroy_disks,"},{"line_number":9298,"context_line":"                                migrate_data\u003dmigrate_data,"},{"line_number":9299,"context_line":"                                destroy_vifs\u003ddestroy_vifs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"74c44c91_52ad1090","line":9296,"in_reply_to":"902e4e12_73a8e48b","updated":"2023-05-19 17:26:51.000000000","message":"Done","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":20733,"name":"Rajesh Tailor","email":"ratailor@redhat.com","username":"rajesht"},"change_message_id":"31bc413ab27d97ebacc189b70d3c77a5cac7d630","unresolved":true,"context_lines":[{"line_number":9371,"context_line":"            # For neutron, migrate_instance_start will activate the destination"},{"line_number":9372,"context_line":"            # host port bindings, if there are any created by conductor before"},{"line_number":9373,"context_line":"            # live migration started."},{"line_number":9374,"context_line":"            self.network_api.migrate_instance_start(ctxt, instance, migration)"},{"line_number":9375,"context_line":"            nw_migrate \u003d utils.spawn(self.network_api.migrate_instance_start,"},{"line_number":9376,"context_line":"                                     ctxt, instance, migration)"},{"line_number":9377,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":11,"id":"b58a6f66_9218fad2","line":9374,"range":{"start_line":9374,"start_character":0,"end_line":9374,"end_character":78},"updated":"2023-11-01 11:28:42.000000000","message":"you need to remove this line, looks like you forgot. 😊","commit_id":"37f41046df3a80db45b484e6fb938232b6c30bfe"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"df95924377ee84b9b9200f31ee8e9494d7fedbf7","unresolved":true,"context_lines":[{"line_number":9403,"context_line":"                          \u0027with original source VIFs from migrate_data: %s\u0027,"},{"line_number":9404,"context_line":"                          unplug_nw_info, instance\u003dinstance)"},{"line_number":9405,"context_line":"            # NOTE(artom) post_live_migration_at_source() in the libvirt driver"},{"line_number":9406,"context_line":"            # calls down to uplug_vifs(). It should be safe to do that without"},{"line_number":9407,"context_line":"            # waiting for the Neutron port bindings to be updated, but just to"},{"line_number":9408,"context_line":"            # be safe, and to log any exceptions handled in"},{"line_number":9409,"context_line":"            # migrate_instance_start(), we wait for its greenthread here."}],"source_content_type":"text/x-python","patch_set":14,"id":"a30afce5_92704523","line":9406,"updated":"2023-12-27 19:10:54.000000000","message":"s/uplug/unplug/","commit_id":"d0d55195a994636699fe52f6c40763320ea70b7a"}],"nova/network/neutron.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4bbede321d8888fd8c3fdfaa5de89ce1f3de4e5b","unresolved":true,"context_lines":[{"line_number":3139,"context_line":"                binding \u003d client.show_port_binding("},{"line_number":3140,"context_line":"                    vif[\u0027id\u0027], dest_host"},{"line_number":3141,"context_line":"                )[\u0027binding\u0027]"},{"line_number":3142,"context_line":"            except neutron_client_exc.NeutronClientException as exc:"},{"line_number":3143,"context_line":"                if exc.status_code !\u003d 404:"},{"line_number":3144,"context_line":"                    # We don\u0027t raise an exception here because we assume that"},{"line_number":3145,"context_line":"                    # port bindings will be updated correctly when"}],"source_content_type":"text/x-python","patch_set":1,"id":"6cdaa6bf_4b8f1cd2","line":3142,"updated":"2023-05-19 16:05:49.000000000","message":"And this isn\u0027t quite Pokemon catching, but it\u0027s pretty thorough...","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4bbede321d8888fd8c3fdfaa5de89ce1f3de4e5b","unresolved":true,"context_lines":[{"line_number":3173,"context_line":"                LOG.debug("},{"line_number":3174,"context_line":"                    \u0027Activated binding for port %s and host %s\u0027,"},{"line_number":3175,"context_line":"                    vif[\u0027id\u0027], dest_host)"},{"line_number":3176,"context_line":"            except neutron_client_exc.NeutronClientException as exc:"},{"line_number":3177,"context_line":"                # A 409 means the port binding is already active, which"},{"line_number":3178,"context_line":"                # shouldn\u0027t happen if the caller is doing things in the correct"},{"line_number":3179,"context_line":"                # order."}],"source_content_type":"text/x-python","patch_set":1,"id":"bab3bd63_d2d2c04a","line":3176,"updated":"2023-05-19 16:05:49.000000000","message":"Ditto","commit_id":"6a7d95f9db8b3a560b30bf920fb30f989175d351"}]}
