)]}'
{"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"178ffa7c551722a30de54251a32be39b9cdeb540","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def _model_query(self, context, model):"},{"line_number":93,"context_line":"        if context.lockmode:"},{"line_number":94,"context_line":"            query \u003d context.session.query("},{"line_number":95,"context_line":"                model).with_lockmode(context.lockmode)"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            query \u003d context.session.query(model)"},{"line_number":98,"context_line":"        # define basic filter condition for model query"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FbnA%3D","line":95,"updated":"2013-09-26 18:59:25.000000000","message":"How about adding query function on context?\n# or let session handle it\nThis lock mode checking should be done automatically","commit_id":"2b2f69429c76545df9cd3db0ad0142d8556fb518"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"34fbd4c9e6eb6081f912cb5c201b07e962ed3ed0","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def _model_query(self, context, model):"},{"line_number":93,"context_line":"        if context.lockmode:"},{"line_number":94,"context_line":"            query \u003d context.session.query("},{"line_number":95,"context_line":"                model).with_lockmode(context.lockmode)"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            query \u003d context.session.query(model)"},{"line_number":98,"context_line":"        # define basic filter condition for model query"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FbMA%3D","line":95,"in_reply_to":"AAAAS3%2F%2FbVk%3D","updated":"2013-09-26 22:20:13.000000000","message":"I see, I guess I\u0027d need to go back to the drawing board.","commit_id":"2b2f69429c76545df9cd3db0ad0142d8556fb518"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"509288fd3b317df5704398be3342cda7f9bcd863","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def _model_query(self, context, model):"},{"line_number":93,"context_line":"        if context.lockmode:"},{"line_number":94,"context_line":"            query \u003d context.session.query("},{"line_number":95,"context_line":"                model).with_lockmode(context.lockmode)"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            query \u003d context.session.query(model)"},{"line_number":98,"context_line":"        # define basic filter condition for model query"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FbVk%3D","line":95,"in_reply_to":"AAAAS3%2F%2Fbgs%3D","updated":"2013-09-26 21:02:52.000000000","message":"IMO, L94-97 stuff will be written in several places in future.\nso we should have some function to do this.","commit_id":"2b2f69429c76545df9cd3db0ad0142d8556fb518"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bce74b7e74d96c9528feac340e8e0f0ba4049c7c","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def _model_query(self, context, model):"},{"line_number":93,"context_line":"        if context.lockmode:"},{"line_number":94,"context_line":"            query \u003d context.session.query("},{"line_number":95,"context_line":"                model).with_lockmode(context.lockmode)"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            query \u003d context.session.query(model)"},{"line_number":98,"context_line":"        # define basic filter condition for model query"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2Fbgs%3D","line":95,"in_reply_to":"AAAAS3%2F%2FbnA%3D","updated":"2013-09-26 19:33:49.000000000","message":"Care to elaborate a bit further? What do we gain if we do as you say?","commit_id":"2b2f69429c76545df9cd3db0ad0142d8556fb518"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"806c13d822f336fa8da1b778bda22262574f237a","unresolved":false,"context_lines":[{"line_number":997,"context_line":"                self._delete_port(context, port[\u0027id\u0027])"},{"line_number":998,"context_line":""},{"line_number":999,"context_line":"            # clean up subnets"},{"line_number":1000,"context_line":"            subnets_qry \u003d context.session.query(models_v2.Subnet)"},{"line_number":1001,"context_line":"            subnets_qry.filter_by(network_id\u003did).delete()"},{"line_number":1002,"context_line":"            context.session.delete(network)"},{"line_number":1003,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2F2%2Bw%3D","line":1000,"updated":"2013-10-08 21:30:30.000000000","message":"Is with_lockmode(\u0027update\u0027) needed here to prevent new subnets from being created before the transaction commits?","commit_id":"4446242f8df65a0fca74ee94364e27f03e13e171"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ddf822295464d54cb48b853f912d861a13f9156f","unresolved":false,"context_lines":[{"line_number":997,"context_line":"                self._delete_port(context, port[\u0027id\u0027])"},{"line_number":998,"context_line":""},{"line_number":999,"context_line":"            # clean up subnets"},{"line_number":1000,"context_line":"            subnets_qry \u003d context.session.query(models_v2.Subnet)"},{"line_number":1001,"context_line":"            subnets_qry.filter_by(network_id\u003did).delete()"},{"line_number":1002,"context_line":"            context.session.delete(network)"},{"line_number":1003,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2F29w%3D","line":1000,"in_reply_to":"AAAATH%2F%2F2%2Bw%3D","updated":"2013-10-08 21:35:20.000000000","message":"I guess you\u0027re right...even though strictly speaking this would not be addressing the failure mode described in the bug report. I\u0027d rather have it fixed in subsequent patch.","commit_id":"4446242f8df65a0fca74ee94364e27f03e13e171"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"da177198d088bff1f34e576182ccd05dc34d4ef6","unresolved":false,"context_lines":[{"line_number":997,"context_line":"                self._delete_port(context, port[\u0027id\u0027])"},{"line_number":998,"context_line":""},{"line_number":999,"context_line":"            # clean up subnets"},{"line_number":1000,"context_line":"            subnets_qry \u003d context.session.query(models_v2.Subnet)"},{"line_number":1001,"context_line":"            subnets_qry.filter_by(network_id\u003did).delete()"},{"line_number":1002,"context_line":"            context.session.delete(network)"},{"line_number":1003,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2F2EQ%3D","line":1000,"in_reply_to":"AAAATH%2F%2F29w%3D","updated":"2013-10-09 03:20:18.000000000","message":"I\u0027ve been looking into this locking, and am starting to get convinced that the SQL standard requires that it locks the rows that are returned by the query from further updates or deletion, but does not necessarily prevent new rows from being inserted that a subsequent issue of the same query would return. If that is the case, using with_lockmode(\u0027update\u0027) on this query would not prevent new subnets referencing the network from being created. If so, the same probably applies to the port queries. Maybe we need to explicitly lock the tables instead.","commit_id":"4446242f8df65a0fca74ee94364e27f03e13e171"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"eb5f513c9375bc59b8cc491ac803a614ace7a427","unresolved":false,"context_lines":[{"line_number":997,"context_line":"                self._delete_port(context, port[\u0027id\u0027])"},{"line_number":998,"context_line":""},{"line_number":999,"context_line":"            # clean up subnets"},{"line_number":1000,"context_line":"            subnets_qry \u003d context.session.query(models_v2.Subnet)"},{"line_number":1001,"context_line":"            subnets_qry.filter_by(network_id\u003did).delete()"},{"line_number":1002,"context_line":"            context.session.delete(network)"},{"line_number":1003,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FuuE%3D","line":1000,"in_reply_to":"AAAATH%2F%2F2EQ%3D","updated":"2013-10-10 15:32:56.000000000","message":"I think I misread your comment the first time. The lockmode is not required in this case because no actual SQL statement is issued at this time. The statement is issued at the time of delete.","commit_id":"4446242f8df65a0fca74ee94364e27f03e13e171"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2e35e8a09c0602b90f57396b33f9a056fcea9024","unresolved":false,"context_lines":[{"line_number":442,"context_line":"                  {\u0027ip_address\u0027: ip_address,"},{"line_number":443,"context_line":"                   \u0027network_id\u0027: network_id,"},{"line_number":444,"context_line":"                   \u0027subnet_id\u0027: subnet_id})"},{"line_number":445,"context_line":"        context.session.query(models_v2.IPAllocation).filter_by("},{"line_number":446,"context_line":"            network_id\u003dnetwork_id,"},{"line_number":447,"context_line":"            ip_address\u003dip_address,"},{"line_number":448,"context_line":"            subnet_id\u003dsubnet_id).delete()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FqQw%3D","line":445,"updated":"2013-10-30 18:18:04.000000000","message":"the original code here was added due to the fact that there would be races with postgres. not sure if that i the case here.","commit_id":"c70252849122a007714da1a9ea2efa64900c60e9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"20015385bd66412dbc13bb106cb0a854c9d4b53a","unresolved":false,"context_lines":[{"line_number":442,"context_line":"                  {\u0027ip_address\u0027: ip_address,"},{"line_number":443,"context_line":"                   \u0027network_id\u0027: network_id,"},{"line_number":444,"context_line":"                   \u0027subnet_id\u0027: subnet_id})"},{"line_number":445,"context_line":"        context.session.query(models_v2.IPAllocation).filter_by("},{"line_number":446,"context_line":"            network_id\u003dnetwork_id,"},{"line_number":447,"context_line":"            ip_address\u003dip_address,"},{"line_number":448,"context_line":"            subnet_id\u003dsubnet_id).delete()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FqMc%3D","line":445,"in_reply_to":"AAAATn%2F%2FqQw%3D","updated":"2013-10-30 18:29:56.000000000","message":"If I understand this correctly sqlalchemy won\u0027t issue the sql statement until it gets to the delete command, in which case preparing the query object like you were going to do a select seems unnecessary. Also, how can there be races if the only sql command generated is:\n\ndelete from ip_allocations where network_id \u003d \u0027%id%\u0027 and ip_address \u003d \u0027%ip%\u0027\n\nThe DBMS should take care of concurrent deletes.","commit_id":"c70252849122a007714da1a9ea2efa64900c60e9"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"0901d81d571dde306ab5226840dee0f067862cc9","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"            for a in allocated:"},{"line_number":1276,"context_line":"                if a.ports.device_owner in AUTO_DELETE_PORT_OWNERS:"},{"line_number":1277,"context_line":"                    NeutronDbPluginV2._delete_ip_allocation("},{"line_number":1278,"context_line":"                        context, subnet.network_id, id, a.ip_address)"},{"line_number":1279,"context_line":"                else:"},{"line_number":1280,"context_line":"                    raise q_exc.SubnetInUse(subnet_id\u003did)"},{"line_number":1281,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FIvo%3D","line":1278,"updated":"2013-11-13 23:37:32.000000000","message":"is it possible to keep the older version of the code which deleted all allocation in a single query?\n\nI believe this piece of code will trigger a statement for each allocation.","commit_id":"d399ebac841dafd17f44fcf0a9dd4f6f2e274968"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"aa953b8711482985b42abd3fc72a1d820815792b","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"            for a in allocated:"},{"line_number":1276,"context_line":"                if a.ports.device_owner in AUTO_DELETE_PORT_OWNERS:"},{"line_number":1277,"context_line":"                    NeutronDbPluginV2._delete_ip_allocation("},{"line_number":1278,"context_line":"                        context, subnet.network_id, id, a.ip_address)"},{"line_number":1279,"context_line":"                else:"},{"line_number":1280,"context_line":"                    raise q_exc.SubnetInUse(subnet_id\u003did)"},{"line_number":1281,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2Bqm4%3D","line":1278,"in_reply_to":"AAAATn%2F%2FIvo%3D","updated":"2013-11-21 20:17:43.000000000","message":"I looked into this one and I believe an optimization would work so that we can collect the ports first and then delete a list of ip allocations. However, for a specific subnet how many AUTO_DELETE_PORT_OWNERS do you expect to have? Typically just one; in theory there can be more than one, but I couldn\u0027t see that in my experiments unless something screws up between the dhcp agent and the server or (at a later date) multi-host is introduced. Thoughts?","commit_id":"d399ebac841dafd17f44fcf0a9dd4f6f2e274968"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"30a484996e736443566c9ea9fb6b1ecafb07b4c1","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                    \"(%(network_id)s/%(subnet_id)s)\"),"},{"line_number":442,"context_line":"                  {\u0027ip_address\u0027: ip_address,"},{"line_number":443,"context_line":"                   \u0027network_id\u0027: network_id,"},{"line_number":444,"context_line":"                   \u0027subnet_id\u0027: subnet_id})"},{"line_number":445,"context_line":"        context.session.query(models_v2.IPAllocation).filter_by("},{"line_number":446,"context_line":"            network_id\u003dnetwork_id,"},{"line_number":447,"context_line":"            ip_address\u003dip_address,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BS08%3D","line":444,"updated":"2013-11-27 19:07:24.000000000","message":"Could you add a comment here why we don\u0027t need with_lockmode(\u0027update\u0027) ?","commit_id":"6a5b3f4dd65e6b94c9909b5351d100a8e7b4ae35"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3890aaff3a8932c5a515bfacbbadadec6a9b9d49","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                    \"(%(network_id)s/%(subnet_id)s)\"),"},{"line_number":442,"context_line":"                  {\u0027ip_address\u0027: ip_address,"},{"line_number":443,"context_line":"                   \u0027network_id\u0027: network_id,"},{"line_number":444,"context_line":"                   \u0027subnet_id\u0027: subnet_id})"},{"line_number":445,"context_line":"        context.session.query(models_v2.IPAllocation).filter_by("},{"line_number":446,"context_line":"            network_id\u003dnetwork_id,"},{"line_number":447,"context_line":"            ip_address\u003dip_address,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BStI%3D","line":444,"in_reply_to":"AAAATn%2F%2BS08%3D","updated":"2013-11-27 19:33:01.000000000","message":"There\u0027s no need for a comment. Only a single SQL DELETE statement is issued. lockmode applied if a SELECT was issued, but it isn\u0027t.","commit_id":"6a5b3f4dd65e6b94c9909b5351d100a8e7b4ae35"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"634b918badc3e9b543d8d8d2a174dda36d93101b","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                    \"(%(network_id)s/%(subnet_id)s)\"),"},{"line_number":442,"context_line":"                  {\u0027ip_address\u0027: ip_address,"},{"line_number":443,"context_line":"                   \u0027network_id\u0027: network_id,"},{"line_number":444,"context_line":"                   \u0027subnet_id\u0027: subnet_id})"},{"line_number":445,"context_line":"        context.session.query(models_v2.IPAllocation).filter_by("},{"line_number":446,"context_line":"            network_id\u003dnetwork_id,"},{"line_number":447,"context_line":"            ip_address\u003dip_address,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BSCM%3D","line":444,"in_reply_to":"AAAATn%2F%2BStI%3D","updated":"2013-11-27 22:07:59.000000000","message":"AH sorry I got it","commit_id":"6a5b3f4dd65e6b94c9909b5351d100a8e7b4ae35"}]}
