)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2016-04-14 16:29:54 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add revision numbers to standard attribute objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds a new \u0027revision\u0027 field to all standard attribute"},{"line_number":10,"context_line":"objects. This number can be used to distinguish between"},{"line_number":11,"context_line":"snapshots of an object to determine which one is more recent"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5a18252c_16e21a2f","line":8,"updated":"2016-04-15 11:36:21.000000000","message":"Does it make sense to include in the commit message the motivation for making the change?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add revision numbers to standard attribute objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds a new \u0027revision\u0027 field to all standard attribute"},{"line_number":10,"context_line":"objects. This number can be used to distinguish between"},{"line_number":11,"context_line":"snapshots of an object to determine which one is more recent"},{"line_number":12,"context_line":"without having to trust system clocks. This can be leveraged"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5a18252c_90111207","line":9,"range":{"start_line":9,"start_character":17,"end_line":9,"end_character":25},"updated":"2016-04-15 11:36:21.000000000","message":"s/revision/revision_number (?)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":11,"context_line":"snapshots of an object to determine which one is more recent"},{"line_number":12,"context_line":"without having to trust system clocks. This can be leveraged"},{"line_number":13,"context_line":"by agents, ML2 backends, core plugin backends, and/or other"},{"line_number":14,"context_line":"external systems that need up-to-date data from the Neutron"},{"line_number":15,"context_line":"server to ignore stale updates."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is done by leveraging the version counting feature built"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5a18252c_b36c1809","line":14,"range":{"start_line":14,"start_character":52,"end_line":14,"end_character":59},"updated":"2016-04-15 11:36:21.000000000","message":"s/Neutron/neutron :(","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":15,"context_line":"server to ignore stale updates."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is done by leveraging the version counting feature built"},{"line_number":18,"context_line":"into SQLAlchemy.[1] This converts any record updates into a"},{"line_number":19,"context_line":"compare-and-swap updated based on the current version number."},{"line_number":20,"context_line":"If the CAS update fails, a StaleDataError is raised which will"},{"line_number":21,"context_line":"abort the transaction and the API layer will catch this and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5a18252c_e53887a2","line":18,"range":{"start_line":18,"start_character":45,"end_line":18,"end_character":52},"updated":"2016-04-15 11:36:21.000000000","message":"s/updates/update (?)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is done by leveraging the version counting feature built"},{"line_number":18,"context_line":"into SQLAlchemy.[1] This converts any record updates into a"},{"line_number":19,"context_line":"compare-and-swap updated based on the current version number."},{"line_number":20,"context_line":"If the CAS update fails, a StaleDataError is raised which will"},{"line_number":21,"context_line":"abort the transaction and the API layer will catch this and"},{"line_number":22,"context_line":"retry."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5a18252c_762717ca","line":19,"range":{"start_line":19,"start_character":17,"end_line":19,"end_character":24},"updated":"2016-04-15 11:36:21.000000000","message":"s/updated/update (?)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"806ceb4e3469d75d867087e385112f64fb8d1eb0","unresolved":false,"context_lines":[{"line_number":21,"context_line":"on the child models that the service plugin will use to"},{"line_number":22,"context_line":"find the parent and bump its revision."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Partially-Implements: bp/push-notifications"},{"line_number":25,"context_line":"Change-Id: I476d3e03c8ee763cc4be6d679fe9f501eb3a19b5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"7aa08908_171349b9","line":24,"range":{"start_line":24,"start_character":22,"end_line":24,"end_character":43},"updated":"2016-06-14 02:08:53.000000000","message":"nit: should be \"blueprint push-notifications\" to get a working link","commit_id":"6747a87f68ebe86a81f1c37fc5e71eb2ec7dd0a1"}],"neutron/db/api.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7df3152996b653a451130fb96a7a97b20b75304f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"_FACADE \u003d None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"MAX_RETRIES \u003d 10"},{"line_number":34,"context_line":"is_deadlock_or_stale \u003d lambda e: isinstance(e, (db_exc.DBDeadlock,"},{"line_number":35,"context_line":"                                                exc.StaleDataError))"},{"line_number":36,"context_line":"retry_db_errors \u003d oslo_db_api.wrap_db_retry("},{"line_number":37,"context_line":"    max_retries\u003dMAX_RETRIES,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a18252c_ebe6ba13","line":34,"range":{"start_line":34,"start_character":23,"end_line":34,"end_character":29},"updated":"2016-04-14 12:32:58.000000000","message":"Nit: Can you please just make this a regular method? I don\u0027t think a lambda buys us any speed.","commit_id":"9d66e7aced014ef705cabcf6e2c335b8a9c4eb08"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"10c4ad1652ffd4976492a6068f470c3c712e6316","unresolved":false,"context_lines":[{"line_number":31,"context_line":"_FACADE \u003d None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"MAX_RETRIES \u003d 10"},{"line_number":34,"context_line":"is_deadlock_or_stale \u003d lambda e: isinstance(e, (db_exc.DBDeadlock,"},{"line_number":35,"context_line":"                                                exc.StaleDataError))"},{"line_number":36,"context_line":"retry_db_errors \u003d oslo_db_api.wrap_db_retry("},{"line_number":37,"context_line":"    max_retries\u003dMAX_RETRIES,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a18252c_69b91115","line":34,"range":{"start_line":34,"start_character":23,"end_line":34,"end_character":29},"in_reply_to":"5a18252c_ebe6ba13","updated":"2016-04-14 13:07:42.000000000","message":"Sure, it wasn\u0027t for speed. Just to save space for easier readability, but the line break probably killed that.","commit_id":"9d66e7aced014ef705cabcf6e2c335b8a9c4eb08"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ba8b4a16f7c97aa36a36017522895645fd56474e","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":342,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":343,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":344,"context_line":"            network.bump_revision()"},{"line_number":345,"context_line":"            # validate \u0027shared\u0027 parameter"},{"line_number":346,"context_line":"            if \u0027shared\u0027 in n:"},{"line_number":347,"context_line":"                entry \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a18252c_6dbe4766","line":344,"updated":"2016-04-14 11:01:04.000000000","message":"if i understand correct a dual update on the same network will fail? that is if they both have revision X. Where is the revision checked when the write takes place?","commit_id":"9d66e7aced014ef705cabcf6e2c335b8a9c4eb08"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0a5de99c809d13b4e1ea6ffed0de99218b6c0c8a","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":342,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":343,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":344,"context_line":"            network.bump_revision()"},{"line_number":345,"context_line":"            # validate \u0027shared\u0027 parameter"},{"line_number":346,"context_line":"            if \u0027shared\u0027 in n:"},{"line_number":347,"context_line":"                entry \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a18252c_c85dc948","line":344,"in_reply_to":"5a18252c_6dbe4766","updated":"2016-04-14 11:17:24.000000000","message":"Yes, it will throw a StaleDataError and the the API layer will retry just like with a DeadlockError.","commit_id":"9d66e7aced014ef705cabcf6e2c335b8a9c4eb08"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ba8b4a16f7c97aa36a36017522895645fd56474e","unresolved":false,"context_lines":[{"line_number":714,"context_line":"        s \u003d subnet[\u0027subnet\u0027]"},{"line_number":715,"context_line":"        new_cidr \u003d s.get(\u0027cidr\u0027)"},{"line_number":716,"context_line":"        db_subnet \u003d self._get_subnet(context, id)"},{"line_number":717,"context_line":"        db_subnet.bump_revision()"},{"line_number":718,"context_line":"        # Fill \u0027ip_version\u0027 and \u0027allocation_pools\u0027 fields with the current"},{"line_number":719,"context_line":"        # value since _validate_subnet() expects subnet spec has \u0027ip_version\u0027"},{"line_number":720,"context_line":"        # and \u0027allocation_pools\u0027 fields."}],"source_content_type":"text/x-python","patch_set":9,"id":"5a18252c_2de44faa","line":717,"updated":"2016-04-14 11:01:04.000000000","message":"sorry for digressing - why is the network done under a transaction and this is not? that may lead to problems","commit_id":"9d66e7aced014ef705cabcf6e2c335b8a9c4eb08"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0a5de99c809d13b4e1ea6ffed0de99218b6c0c8a","unresolved":false,"context_lines":[{"line_number":714,"context_line":"        s \u003d subnet[\u0027subnet\u0027]"},{"line_number":715,"context_line":"        new_cidr \u003d s.get(\u0027cidr\u0027)"},{"line_number":716,"context_line":"        db_subnet \u003d self._get_subnet(context, id)"},{"line_number":717,"context_line":"        db_subnet.bump_revision()"},{"line_number":718,"context_line":"        # Fill \u0027ip_version\u0027 and \u0027allocation_pools\u0027 fields with the current"},{"line_number":719,"context_line":"        # value since _validate_subnet() expects subnet spec has \u0027ip_version\u0027"},{"line_number":720,"context_line":"        # and \u0027allocation_pools\u0027 fields."}],"source_content_type":"text/x-python","patch_set":9,"id":"5a18252c_9c283688","line":717,"in_reply_to":"5a18252c_2de44faa","updated":"2016-04-14 11:17:24.000000000","message":"Ah, good catch. This certainly needs to be in the transaction down on L765.","commit_id":"9d66e7aced014ef705cabcf6e2c335b8a9c4eb08"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":342,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":343,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":344,"context_line":"            network.bump_revision()"},{"line_number":345,"context_line":"            # validate \u0027shared\u0027 parameter"},{"line_number":346,"context_line":"            if \u0027shared\u0027 in n:"},{"line_number":347,"context_line":"                entry \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_856713b6","line":344,"range":{"start_line":344,"start_character":12,"end_line":344,"end_character":35},"updated":"2016-04-15 11:36:21.000000000","message":"Why isn\u0027t this work taken care of, in line 367 below, by sa\u0027s revisioning mechanism, since network is a member of the standard-attributes group?  (With analogous questions about the other mods made below.)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2ef7a679f97d066837b10bad9a65522a15b34843","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":342,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":343,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":344,"context_line":"            network.bump_revision()"},{"line_number":345,"context_line":"            # validate \u0027shared\u0027 parameter"},{"line_number":346,"context_line":"            if \u0027shared\u0027 in n:"},{"line_number":347,"context_line":"                entry \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_3e9bd673","line":344,"range":{"start_line":344,"start_character":12,"end_line":344,"end_character":35},"in_reply_to":"1a122d0e_2c62a73e","updated":"2016-04-20 07:27:49.000000000","message":"Yeah, and this also good because I think it would be pretty easy down the road for people to forget or not know that they need to make a manual bump_revision call when appropriate.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b8c6d30bb53f3d9e267da2b37bb4bddcb5a9dcd2","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":342,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":343,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":344,"context_line":"            network.bump_revision()"},{"line_number":345,"context_line":"            # validate \u0027shared\u0027 parameter"},{"line_number":346,"context_line":"            if \u0027shared\u0027 in n:"},{"line_number":347,"context_line":"                entry \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_2c62a73e","line":344,"range":{"start_line":344,"start_character":12,"end_line":344,"end_character":35},"in_reply_to":"1a122d0e_9db5f0ef","updated":"2016-04-19 12:22:58.000000000","message":"That\u0027s based on DB event subscriptions. https://github.com/openstack/neutron/blob/16346b906e3d57c4fa5c187ff09452de6df35936/neutron/services/timestamp/timestamp_db.py#L78\n\nInterestingly, that timestamp update should trigger a revision bump, but I don\u0027t want to depend on the timestamp service plugin to make this work.\n\nI will probably refactor this to use the event listeners as well so it\u0027s not invading the normal db model code.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"74126dfd3e10501cbf97c37bd998e5b9f17ad30b","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":342,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":343,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":344,"context_line":"            network.bump_revision()"},{"line_number":345,"context_line":"            # validate \u0027shared\u0027 parameter"},{"line_number":346,"context_line":"            if \u0027shared\u0027 in n:"},{"line_number":347,"context_line":"                entry \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_9db5f0ef","line":344,"range":{"start_line":344,"start_character":12,"end_line":344,"end_character":35},"in_reply_to":"1a122d0e_d8b4dbf3","updated":"2016-04-19 10:24:38.000000000","message":"Doesn\u0027t standardattributes.updated_at get advanced when a standard attributes object gets changed in any way--e.g., when networks.admin_state_up gets changed?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":342,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":343,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":344,"context_line":"            network.bump_revision()"},{"line_number":345,"context_line":"            # validate \u0027shared\u0027 parameter"},{"line_number":346,"context_line":"            if \u0027shared\u0027 in n:"},{"line_number":347,"context_line":"                entry \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_d8b4dbf3","line":344,"range":{"start_line":344,"start_character":12,"end_line":344,"end_character":35},"in_reply_to":"5a18252c_856713b6","updated":"2016-04-17 21:28:15.000000000","message":"sa\u0027s revision mechanism only takes care of updates to the table it is present on. Since it\u0027s only present on the standard attribute table, it will only automatically update when columns on that table are changed (e.g. description).","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":760,"context_line":"            registry.notify(resources.SUBNET_GATEWAY, events.BEFORE_UPDATE,"},{"line_number":761,"context_line":"                            self, **kwargs)"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":764,"context_line":"            subnet, changes \u003d self.ipam.update_db_subnet(context, id, s,"},{"line_number":765,"context_line":"                                                         db_pools)"},{"line_number":766,"context_line":"        result \u003d self._make_subnet_dict(subnet, context\u003dcontext)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_8628c6e3","line":763,"range":{"start_line":763,"start_character":8,"end_line":763,"end_character":57},"updated":"2016-04-15 11:36:21.000000000","message":"(Although I think it may not be needed, :) ) I believe you wanted a db_subnet.bump_revision() here?\n\nShould there be a network.bump_revision() as a result of the subnet update?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":760,"context_line":"            registry.notify(resources.SUBNET_GATEWAY, events.BEFORE_UPDATE,"},{"line_number":761,"context_line":"                            self, **kwargs)"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":764,"context_line":"            subnet, changes \u003d self.ipam.update_db_subnet(context, id, s,"},{"line_number":765,"context_line":"                                                         db_pools)"},{"line_number":766,"context_line":"        result \u003d self._make_subnet_dict(subnet, context\u003dcontext)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_78bf87d0","line":763,"range":{"start_line":763,"start_character":8,"end_line":763,"end_character":57},"in_reply_to":"5a18252c_8628c6e3","updated":"2016-04-17 21:28:15.000000000","message":"The revision bump is in update_db_subnet.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"}],"neutron/db/ipam_backend_mixin.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                self._update_subnet_allocation_pools(context, subnet_id, s))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        subnet \u003d self._get_subnet(context, subnet_id)"},{"line_number":195,"context_line":"        subnet.bump_revision()"},{"line_number":196,"context_line":"        subnet.update(s)"},{"line_number":197,"context_line":"        return subnet, changes"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _validate_subnet_cidr(self, context, network, new_subnet_cidr):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_06c95626","line":196,"range":{"start_line":195,"start_character":8,"end_line":196,"end_character":24},"updated":"2016-04-15 11:36:21.000000000","message":"Should these be in a transaction?  (But is line 195 needed since subnet is part of the standard-attributes-group?)\n\nAnd should there be a network.bump_revision() as a result of the subnet update?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b8c6d30bb53f3d9e267da2b37bb4bddcb5a9dcd2","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                self._update_subnet_allocation_pools(context, subnet_id, s))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        subnet \u003d self._get_subnet(context, subnet_id)"},{"line_number":195,"context_line":"        subnet.bump_revision()"},{"line_number":196,"context_line":"        subnet.update(s)"},{"line_number":197,"context_line":"        return subnet, changes"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _validate_subnet_cidr(self, context, network, new_subnet_cidr):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_6c393ff2","line":196,"range":{"start_line":195,"start_character":8,"end_line":196,"end_character":24},"in_reply_to":"1a122d0e_895bf286","updated":"2016-04-19 12:22:58.000000000","message":"Yeah, that\u0027s a good idea.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"74126dfd3e10501cbf97c37bd998e5b9f17ad30b","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                self._update_subnet_allocation_pools(context, subnet_id, s))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        subnet \u003d self._get_subnet(context, subnet_id)"},{"line_number":195,"context_line":"        subnet.bump_revision()"},{"line_number":196,"context_line":"        subnet.update(s)"},{"line_number":197,"context_line":"        return subnet, changes"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _validate_subnet_cidr(self, context, network, new_subnet_cidr):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_895bf286","line":196,"range":{"start_line":195,"start_character":8,"end_line":196,"end_character":24},"in_reply_to":"1a122d0e_98ba63e0","updated":"2016-04-19 10:24:38.000000000","message":"Should the information in your second para be included as brief comments (not here, but in places where a bump_revision call is made for the parent of a non-first-class child)?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                self._update_subnet_allocation_pools(context, subnet_id, s))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        subnet \u003d self._get_subnet(context, subnet_id)"},{"line_number":195,"context_line":"        subnet.bump_revision()"},{"line_number":196,"context_line":"        subnet.update(s)"},{"line_number":197,"context_line":"        return subnet, changes"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _validate_subnet_cidr(self, context, network, new_subnet_cidr):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_98ba63e0","line":196,"range":{"start_line":195,"start_character":8,"end_line":196,"end_character":24},"in_reply_to":"5a18252c_06c95626","updated":"2016-04-17 21:28:15.000000000","message":"The callers of update_db_subnet start a transaction.\n\nAs for updating the network, no since network is a separate Neutron construct. The only time we need to update because a child changed is when that child is not a first-class thing (e.g. IPAllocations are not visible anywhere in the API or agents as separate objects so changes to them must be represented as changes to the port they are a part of).","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"}],"neutron/db/l3_db.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\"Update the DB object.\"\"\""},{"line_number":235,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":236,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":237,"context_line":"            router_db.bump_revision()"},{"line_number":238,"context_line":"            if data:"},{"line_number":239,"context_line":"                router_db.update(data)"},{"line_number":240,"context_line":"            return router_db"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_4baeb781","line":237,"range":{"start_line":237,"start_character":12,"end_line":237,"end_character":37},"updated":"2016-04-15 11:36:21.000000000","message":"Should this work be done only if there\u0027s data?  (Which is to say, isn\u0027t this handled by line 239?)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"74126dfd3e10501cbf97c37bd998e5b9f17ad30b","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\"Update the DB object.\"\"\""},{"line_number":235,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":236,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":237,"context_line":"            router_db.bump_revision()"},{"line_number":238,"context_line":"            if data:"},{"line_number":239,"context_line":"                router_db.update(data)"},{"line_number":240,"context_line":"            return router_db"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_dd6e482e","line":237,"range":{"start_line":237,"start_character":12,"end_line":237,"end_character":37},"in_reply_to":"1a122d0e_38c6af67","updated":"2016-04-19 10:24:38.000000000","message":"Does it make sense to include this information in a comment?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b8c6d30bb53f3d9e267da2b37bb4bddcb5a9dcd2","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\"Update the DB object.\"\"\""},{"line_number":235,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":236,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":237,"context_line":"            router_db.bump_revision()"},{"line_number":238,"context_line":"            if data:"},{"line_number":239,"context_line":"                router_db.update(data)"},{"line_number":240,"context_line":"            return router_db"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_ac7997ca","line":237,"range":{"start_line":237,"start_character":12,"end_line":237,"end_character":37},"in_reply_to":"1a122d0e_dd6e482e","updated":"2016-04-19 12:22:58.000000000","message":"yeah","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\"Update the DB object.\"\"\""},{"line_number":235,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":236,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":237,"context_line":"            router_db.bump_revision()"},{"line_number":238,"context_line":"            if data:"},{"line_number":239,"context_line":"                router_db.update(data)"},{"line_number":240,"context_line":"            return router_db"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_38c6af67","line":237,"range":{"start_line":237,"start_character":12,"end_line":237,"end_character":37},"in_reply_to":"5a18252c_4baeb781","updated":"2016-04-17 21:28:15.000000000","message":"No, there are cases where something happens to the router (e.g. a port is added to it) where nothing happens to the data model for the router itself, but it\u0027s important to bump the revision so when agents get the full  snapshot of the router with interfaces, it can distinguish between the snapshot before the interface add and after.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f57af1bb1174cdc6f9387342e92be99d6304a962","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"            if self._is_dns_integration_supported:"},{"line_number":1237,"context_line":"                dns_data \u003d self._process_dns_floatingip_update_precommit("},{"line_number":1238,"context_line":"                    context, floatingip_db)"},{"line_number":1239,"context_line":"        floatingip_dict \u003d self._make_floatingip_dict(floatingip_db)"},{"line_number":1240,"context_line":"        if self._is_dns_integration_supported:"},{"line_number":1241,"context_line":"            self._process_dns_floatingip_update_postcommit(context,"},{"line_number":1242,"context_line":"                                                           floatingip_dict,"}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_c05b9b84","line":1239,"updated":"2016-07-27 09:29:01.000000000","message":"I am puzzled: why the change? I dug deeper into the _process_dns_floatingip_update_precommit function but failed to understand it.","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b7b48d850b10097ab72aac3126481a4d97febb0d","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"            if self._is_dns_integration_supported:"},{"line_number":1237,"context_line":"                dns_data \u003d self._process_dns_floatingip_update_precommit("},{"line_number":1238,"context_line":"                    context, floatingip_db)"},{"line_number":1239,"context_line":"        floatingip_dict \u003d self._make_floatingip_dict(floatingip_db)"},{"line_number":1240,"context_line":"        if self._is_dns_integration_supported:"},{"line_number":1241,"context_line":"            self._process_dns_floatingip_update_postcommit(context,"},{"line_number":1242,"context_line":"                                                           floatingip_dict,"}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_9281f4c5","line":1239,"in_reply_to":"dada55a8_124a2455","updated":"2016-07-27 11:18:43.000000000","message":"Oh nice. Thanks for explanation.","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f3fbf9b2dc687f8f3535057b39c438f469f9712f","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"            if self._is_dns_integration_supported:"},{"line_number":1237,"context_line":"                dns_data \u003d self._process_dns_floatingip_update_precommit("},{"line_number":1238,"context_line":"                    context, floatingip_db)"},{"line_number":1239,"context_line":"        floatingip_dict \u003d self._make_floatingip_dict(floatingip_db)"},{"line_number":1240,"context_line":"        if self._is_dns_integration_supported:"},{"line_number":1241,"context_line":"            self._process_dns_floatingip_update_postcommit(context,"},{"line_number":1242,"context_line":"                                                           floatingip_dict,"}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_124a2455","line":1239,"in_reply_to":"dada55a8_c05b9b84","updated":"2016-07-27 11:08:36.000000000","message":"making the dict before the commit means that it doesn\u0027t include the revision bump that happens on the commit. it was either this or call make dict again, but i examined and there was no reason for the dict to exist inside the transaction.","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"}],"neutron/db/l3_dvr_db.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                if cs_port:"},{"line_number":295,"context_line":"                    fixed_ips \u003d list(cs_port[\u0027port\u0027][\u0027fixed_ips\u0027])"},{"line_number":296,"context_line":"                    fixed_ips.append(fixed_ip)"},{"line_number":297,"context_line":"                    updated_port \u003d self._core_plugin.update_port("},{"line_number":298,"context_line":"                        context.elevated(),"},{"line_number":299,"context_line":"                        cs_port[\u0027port_id\u0027], {\u0027port\u0027: {\u0027fixed_ips\u0027: fixed_ips}})"},{"line_number":300,"context_line":"                    LOG.debug(\"CSNAT port updated for IPv6 subnet: \""}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_a62a228e","line":297,"range":{"start_line":297,"start_character":20,"end_line":297,"end_character":32},"updated":"2016-04-15 11:36:21.000000000","message":"Should there be a router.bump_revision() here?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                if cs_port:"},{"line_number":295,"context_line":"                    fixed_ips \u003d list(cs_port[\u0027port\u0027][\u0027fixed_ips\u0027])"},{"line_number":296,"context_line":"                    fixed_ips.append(fixed_ip)"},{"line_number":297,"context_line":"                    updated_port \u003d self._core_plugin.update_port("},{"line_number":298,"context_line":"                        context.elevated(),"},{"line_number":299,"context_line":"                        cs_port[\u0027port_id\u0027], {\u0027port\u0027: {\u0027fixed_ips\u0027: fixed_ips}})"},{"line_number":300,"context_line":"                    LOG.debug(\"CSNAT port updated for IPv6 subnet: \""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_58a0cb9f","line":297,"range":{"start_line":297,"start_character":20,"end_line":297,"end_character":32},"in_reply_to":"5a18252c_a62a228e","updated":"2016-04-17 21:28:15.000000000","message":"I\u0027m not sure we will need it. Technically nothing of the router itself is changing (e.g. it\u0027s interface associations are still the same) in contrast to L275 where the associated interfaces are gaining a new member. As long as the L3 agent is watching the updates for its routers\u0027 ports, it will detect this change that way.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"}],"neutron/db/migration/alembic_migrations/versions/newton/expand/c415aab1c048_add_revisions_column.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        \u0027standardattributes\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger(),"},{"line_number":35,"context_line":"                  nullable\u003dFalse, server_default\u003d\u00270\u0027))"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_03bca3da","line":35,"range":{"start_line":35,"start_character":34,"end_line":35,"end_character":52},"updated":"2016-04-15 11:36:21.000000000","message":"Any reason not to use just default?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        \u0027standardattributes\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger(),"},{"line_number":35,"context_line":"                  nullable\u003dFalse, server_default\u003d\u00270\u0027))"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_9888a324","line":35,"range":{"start_line":35,"start_character":34,"end_line":35,"end_character":52},"in_reply_to":"5a18252c_03bca3da","updated":"2016-04-17 21:28:15.000000000","message":"default controls behavior of sqlalchemy. we need to ensure a new record can be inserted into standardattributes without specifying a \u0027revision_number\u0027 value since this is an expansion script which means any schema changes it makes need to be compatible with the old version of the neutron server.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"}],"neutron/db/model_base.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    revision_number \u003d sa.Column("},{"line_number":114,"context_line":"        sa.BigInteger().with_variant(sa.Integer(), \u0027sqlite\u0027),"},{"line_number":115,"context_line":"        server_default\u003d\u00270\u0027, nullable\u003dFalse)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    __mapper_args__ \u003d {"},{"line_number":118,"context_line":"        # see http://docs.sqlalchemy.org/en/latest/orm/versioning.html for"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_31448e19","line":115,"range":{"start_line":115,"start_character":8,"end_line":115,"end_character":26},"updated":"2016-04-15 11:36:21.000000000","message":"The server_default --\u003e default question in the alembic migration module applies here also, of course.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        server_default\u003d\u00270\u0027, nullable\u003dFalse)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    __mapper_args__ \u003d {"},{"line_number":118,"context_line":"        # see http://docs.sqlalchemy.org/en/latest/orm/versioning.html for"},{"line_number":119,"context_line":"        # details about how this works"},{"line_number":120,"context_line":"        \"version_id_col\": revision_number"},{"line_number":121,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_2b60a400","line":118,"range":{"start_line":118,"start_character":14,"end_line":118,"end_character":70},"updated":"2016-04-15 11:36:21.000000000","message":"In the case of a multi-row update, the revisioning feature \"does not take effect\"--I\u0027m taking that to mean that in a multi-row update the revision number is still incremented, as though the column were a normal autoincrementing column, but that concurrent transaction contention is not taken into consideration.  Is whatever-is-the-correct-interpretation-of-this a problem for us?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2ef7a679f97d066837b10bad9a65522a15b34843","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        server_default\u003d\u00270\u0027, nullable\u003dFalse)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    __mapper_args__ \u003d {"},{"line_number":118,"context_line":"        # see http://docs.sqlalchemy.org/en/latest/orm/versioning.html for"},{"line_number":119,"context_line":"        # details about how this works"},{"line_number":120,"context_line":"        \"version_id_col\": revision_number"},{"line_number":121,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_3eff56ab","line":118,"range":{"start_line":118,"start_character":14,"end_line":118,"end_character":70},"in_reply_to":"1a122d0e_187db31c","updated":"2016-04-20 07:27:49.000000000","message":"Can we add this info to this comment?  I thought it might be the case that multi-row updates aren\u0027t performed in Neutron but am too new to the codebase to have known.  Others who read the versioning.html linked in this comment might have the same question.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        server_default\u003d\u00270\u0027, nullable\u003dFalse)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    __mapper_args__ \u003d {"},{"line_number":118,"context_line":"        # see http://docs.sqlalchemy.org/en/latest/orm/versioning.html for"},{"line_number":119,"context_line":"        # details about how this works"},{"line_number":120,"context_line":"        \"version_id_col\": revision_number"},{"line_number":121,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_187db31c","line":118,"range":{"start_line":118,"start_character":14,"end_line":118,"end_character":70},"in_reply_to":"5a18252c_2b60a400","updated":"2016-04-17 21:28:15.000000000","message":"This is referring to cases where we execute a statement updating multiple objects simultaneously (e.g. UPDATE ports set name\u003d\u0027hello\u0027 where name\u003d\u0027goodbye\u0027).\n\nWe already don\u0027t do these in Neutron because they don\u0027t trigger sqlalchemy events either so this won\u0027t be a concern.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2ef7a679f97d066837b10bad9a65522a15b34843","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def bump_revision(self):"},{"line_number":175,"context_line":"        # SQLAlchemy will bump the version for us automatically if the"},{"line_number":176,"context_line":"        # standard attr record is being modified, but we must call this"},{"line_number":177,"context_line":"        # for all other modifications or when relevant children are being"},{"line_number":178,"context_line":"        # modified (e.g. fixed_ips change should bump port revision)"},{"line_number":179,"context_line":"        self.standard_attr.revision_number +\u003d 1"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_b5bd2f6a","line":177,"range":{"start_line":177,"start_character":10,"end_line":177,"end_character":40},"updated":"2016-04-20 07:27:49.000000000","message":"Based on your response at https://review.openstack.org/#/c/303966/11/neutron/db/db_base_plugin_v2.py@344, I now see what you mean by \"all other modifications\" here.  So whether or not you create an event listener, this clause can be removed, right?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return association_proxy(\u0027standard_attr\u0027, \u0027revision_number\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def bump_revision(self):"},{"line_number":175,"context_line":"        # SQLAlchemy will bump the version for us automatically if the"},{"line_number":176,"context_line":"        # standard attr record is being modified, but we must call this"},{"line_number":177,"context_line":"        # for all other modifications or when relevant children are being"},{"line_number":178,"context_line":"        # modified (e.g. fixed_ips change should bump port revision)"},{"line_number":179,"context_line":"        self.standard_attr.revision_number +\u003d 1"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_c7bb8e74","line":177,"range":{"start_line":175,"start_character":10,"end_line":177,"end_character":63},"updated":"2016-04-15 11:36:21.000000000","message":"I apologize that my questions and implied questions below are mutually incoherent; answers to some will make others moot.\n\nI\u0027m seeing a bump_revision() call for some updates to standard-attribute-records even when the update is not part of a parent-child relationship (e.g., https://review.openstack.org/#/c/303966/11/neutron/db/ipam_backend_mixin.py@195).  I think, diffidently, that there shouldn\u0027t be any bump_revision() calls other than in the case of parent-child relationships (although maybe not even then, depending on the merit of my question in https://review.openstack.org/#/c/303966/11/neutron/db/securitygroups_db.py@409).\n\nI\u0027m not sure what is meant by \"all other modifications.\"  Are these modifications to standard-attribute-records of attributes other than the ones that are standard?  I can see a couple of incoherencies with this interpretation, so I think it must be wrong.  Are they modifications to resources that are not a members of the standard-attributes resources?  If so, why not just add a revision_number to those other resources?  I suspect this phrase means some third thing that I just don\u0027t see yet.\n\nAnd I do believe that some resources that are not part of the standard-attributes resources--such as QosPolicy--should in fact get a revision_number.  (Or maybe such resources should be changed to be standardattributes.)\n\nDoes a manual revision bump bypass the swap-and-compare activity that sql-alchemy performs?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"235bccd682bc1997e2140a860f26f67b215b7ab7","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return association_proxy(\u0027standard_attr\u0027, \u0027revision_number\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def bump_revision(self):"},{"line_number":175,"context_line":"        # SQLAlchemy will bump the version for us automatically if the"},{"line_number":176,"context_line":"        # standard attr record is being modified, but we must call this"},{"line_number":177,"context_line":"        # for all other modifications or when relevant children are being"},{"line_number":178,"context_line":"        # modified (e.g. fixed_ips change should bump port revision)"},{"line_number":179,"context_line":"        self.standard_attr.revision_number +\u003d 1"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_24c005e0","line":177,"range":{"start_line":175,"start_character":10,"end_line":177,"end_character":63},"in_reply_to":"1a122d0e_c7bb8e74","updated":"2016-04-19 10:41:33.000000000","message":"My questions here largely go away as a result of answers given elsewhere.  Thanks goodness, since my questions are mutually incoherent.  :)  How embarrassing--I\u0027m glad not everyone in the world can see this stuff.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        # SQLAlchemy will bump the version for us automatically if the"},{"line_number":176,"context_line":"        # standard attr record is being modified, but we must call this"},{"line_number":177,"context_line":"        # for all other modifications or when relevant children are being"},{"line_number":178,"context_line":"        # modified (e.g. fixed_ips change should bump port revision)"},{"line_number":179,"context_line":"        self.standard_attr.revision_number +\u003d 1"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_a67fcbde","line":178,"range":{"start_line":178,"start_character":25,"end_line":178,"end_character":67},"updated":"2016-04-15 11:36:21.000000000","message":"Maybe it\u0027s overkill, but should we mention that if StaleDataErrors are returned for a proper subset of a parent and its children the subtransaction mechanism will handle this?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2ef7a679f97d066837b10bad9a65522a15b34843","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        # SQLAlchemy will bump the version for us automatically if the"},{"line_number":176,"context_line":"        # standard attr record is being modified, but we must call this"},{"line_number":177,"context_line":"        # for all other modifications or when relevant children are being"},{"line_number":178,"context_line":"        # modified (e.g. fixed_ips change should bump port revision)"},{"line_number":179,"context_line":"        self.standard_attr.revision_number +\u003d 1"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_15f7c38b","line":178,"range":{"start_line":178,"start_character":25,"end_line":178,"end_character":67},"in_reply_to":"1a122d0e_d72f3c86","updated":"2016-04-20 07:27:49.000000000","message":"I\u0027ll let you know if I can remember or invent a smart idea to back my question, but in the meantime I\u0027ll just call it silly.\n\nBut also, can we add to this comment the point about non-first-class objects, so that people new to the project know what is meant by \"relevant\"?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b8c6d30bb53f3d9e267da2b37bb4bddcb5a9dcd2","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        # SQLAlchemy will bump the version for us automatically if the"},{"line_number":176,"context_line":"        # standard attr record is being modified, but we must call this"},{"line_number":177,"context_line":"        # for all other modifications or when relevant children are being"},{"line_number":178,"context_line":"        # modified (e.g. fixed_ips change should bump port revision)"},{"line_number":179,"context_line":"        self.standard_attr.revision_number +\u003d 1"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_d72f3c86","line":178,"range":{"start_line":178,"start_character":25,"end_line":178,"end_character":67},"in_reply_to":"5a18252c_a67fcbde","updated":"2016-04-19 12:22:58.000000000","message":"Can you elaborate a bit? If a StaleDataError is thrown, it will abort the entire transaction (parent and children).","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"}],"neutron/db/securitygroups_db.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            context.session.add(db)"},{"line_number":407,"context_line":"            sg \u003d self._get_security_group(context,"},{"line_number":408,"context_line":"                                          rule_dict[\u0027security_group_id\u0027])"},{"line_number":409,"context_line":"            sg.bump_revision()  # bump revision of group"},{"line_number":410,"context_line":"            self._registry_notify(resources.SECURITY_GROUP_RULE,"},{"line_number":411,"context_line":"                              events.PRECOMMIT_CREATE,"},{"line_number":412,"context_line":"                              exc_cls\u003dext_sg.SecurityGroupConflict, **kwargs)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_4af7c88a","line":409,"range":{"start_line":409,"start_character":12,"end_line":409,"end_character":30},"updated":"2016-04-15 11:36:21.000000000","message":"Can/should we just call self.update_security_group instead?  This will enable us to get, for instance, the registry activity involved in that method.  Apologies if this is a stupid idea.  But if it\u0027s not a stupid idea, then I think that bump_revision() might not be needed at all--that is, it might not be needed anywhere.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            context.session.add(db)"},{"line_number":407,"context_line":"            sg \u003d self._get_security_group(context,"},{"line_number":408,"context_line":"                                          rule_dict[\u0027security_group_id\u0027])"},{"line_number":409,"context_line":"            sg.bump_revision()  # bump revision of group"},{"line_number":410,"context_line":"            self._registry_notify(resources.SECURITY_GROUP_RULE,"},{"line_number":411,"context_line":"                              events.PRECOMMIT_CREATE,"},{"line_number":412,"context_line":"                              exc_cls\u003dext_sg.SecurityGroupConflict, **kwargs)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_98b6e3da","line":409,"range":{"start_line":409,"start_character":12,"end_line":409,"end_character":30},"in_reply_to":"1a122d0e_5cce2c84","updated":"2016-04-17 21:28:15.000000000","message":"Yeah, the only reason we can\u0027t do this is because of the transaction semantics. If we call update_security_group in a transaction it will be happening inside of a transaction when the events it emits imply a commit has happened.\n\nAfter thinking about it though, security group rules are first class citizens so I don\u0027t think we should probably bump the revision number of the group.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"af7732b362204981ac34b15492b522a58eaa5b1c","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            context.session.add(db)"},{"line_number":407,"context_line":"            sg \u003d self._get_security_group(context,"},{"line_number":408,"context_line":"                                          rule_dict[\u0027security_group_id\u0027])"},{"line_number":409,"context_line":"            sg.bump_revision()  # bump revision of group"},{"line_number":410,"context_line":"            self._registry_notify(resources.SECURITY_GROUP_RULE,"},{"line_number":411,"context_line":"                              events.PRECOMMIT_CREATE,"},{"line_number":412,"context_line":"                              exc_cls\u003dext_sg.SecurityGroupConflict, **kwargs)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_5cce2c84","line":409,"range":{"start_line":409,"start_character":12,"end_line":409,"end_character":30},"in_reply_to":"5a18252c_4af7c88a","updated":"2016-04-15 12:32:42.000000000","message":"Maybe my idea is a non-starter for what it would mean for the db transaction (not sure), and/or for other reasons.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                                              sgrule.security_group_id)"},{"line_number":685,"context_line":"                sg.bump_revision()"},{"line_number":686,"context_line":"                context.session.delete(sgrule)"},{"line_number":687,"context_line":"            except exc.NoResultFound:"},{"line_number":688,"context_line":"                raise ext_sg.SecurityGroupRuleNotFound(id\u003did)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        registry.notify("},{"line_number":691,"context_line":"            resources.SECURITY_GROUP_RULE, events.AFTER_DELETE, self,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_cad6384e","line":688,"range":{"start_line":687,"start_character":12,"end_line":688,"end_character":61},"updated":"2016-04-15 11:36:21.000000000","message":"Should this be moved to line 682?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                                              sgrule.security_group_id)"},{"line_number":685,"context_line":"                sg.bump_revision()"},{"line_number":686,"context_line":"                context.session.delete(sgrule)"},{"line_number":687,"context_line":"            except exc.NoResultFound:"},{"line_number":688,"context_line":"                raise ext_sg.SecurityGroupRuleNotFound(id\u003did)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        registry.notify("},{"line_number":691,"context_line":"            resources.SECURITY_GROUP_RULE, events.AFTER_DELETE, self,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_58c56b3a","line":688,"range":{"start_line":687,"start_character":12,"end_line":688,"end_character":61},"in_reply_to":"5a18252c_cad6384e","updated":"2016-04-17 21:28:15.000000000","message":"I left this here to catch if the security group isn\u0027t found, but I just realized that\u0027s converted to a different exception so I will need to catch that separately.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f57af1bb1174cdc6f9387342e92be99d6304a962","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    security_group_id \u003d sa.Column(sa.String(36),"},{"line_number":75,"context_line":"                                  sa.ForeignKey(\"securitygroups.id\"),"},{"line_number":76,"context_line":"                                  primary_key\u003dTrue)"},{"line_number":77,"context_line":"    revises_on_change \u003d (\u0027ports\u0027, )"},{"line_number":78,"context_line":"    # Add a relationship to the Port model in order to instruct SQLAlchemy to"},{"line_number":79,"context_line":"    # eagerly load security group bindings"},{"line_number":80,"context_line":"    ports \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_7e0250b5","line":77,"updated":"2016-07-27 09:29:01.000000000","message":"how does that work? Doesn\u0027t the code in the service plugin assume there is a single object to bump per relation? I don\u0027t see a API test that would attach sg to a port and check that port is bumped.","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f3fbf9b2dc687f8f3535057b39c438f469f9712f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    security_group_id \u003d sa.Column(sa.String(36),"},{"line_number":75,"context_line":"                                  sa.ForeignKey(\"securitygroups.id\"),"},{"line_number":76,"context_line":"                                  primary_key\u003dTrue)"},{"line_number":77,"context_line":"    revises_on_change \u003d (\u0027ports\u0027, )"},{"line_number":78,"context_line":"    # Add a relationship to the Port model in order to instruct SQLAlchemy to"},{"line_number":79,"context_line":"    # eagerly load security group bindings"},{"line_number":80,"context_line":"    ports \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_f2b2f047","line":77,"in_reply_to":"dada55a8_7e0250b5","updated":"2016-07-27 11:08:36.000000000","message":"the relationship is named poorly. \u0027ports\u0027 is actually just the port because the binding only has a single port_id.\n\nI\u0027ll add an API test for adding/removing sg from a port","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b7b48d850b10097ab72aac3126481a4d97febb0d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    security_group_id \u003d sa.Column(sa.String(36),"},{"line_number":75,"context_line":"                                  sa.ForeignKey(\"securitygroups.id\"),"},{"line_number":76,"context_line":"                                  primary_key\u003dTrue)"},{"line_number":77,"context_line":"    revises_on_change \u003d (\u0027ports\u0027, )"},{"line_number":78,"context_line":"    # Add a relationship to the Port model in order to instruct SQLAlchemy to"},{"line_number":79,"context_line":"    # eagerly load security group bindings"},{"line_number":80,"context_line":"    ports \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_d2040c4b","line":77,"in_reply_to":"dada55a8_f2b2f047","updated":"2016-07-27 11:18:43.000000000","message":"Ack.","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":19554,"name":"Nam","email":"namnh68@fsoft.com.vn","username":"namnh"},"change_message_id":"0303245bd3413581cc1e607f4b0f22b4fa1e80a9","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                                sa.ForeignKey(\"securitygroups.id\","},{"line_number":96,"context_line":"                                              ondelete\u003d\"CASCADE\"),"},{"line_number":97,"context_line":"                                nullable\u003dTrue)"},{"line_number":98,"context_line":"    revises_on_change \u003d (\u0027security_group\u0027, )"},{"line_number":99,"context_line":"    direction \u003d sa.Column(sa.Enum(\u0027ingress\u0027, \u0027egress\u0027,"},{"line_number":100,"context_line":"                                  name\u003d\u0027securitygrouprules_direction\u0027))"},{"line_number":101,"context_line":"    ethertype \u003d sa.Column(sa.String(40))"}],"source_content_type":"text/x-python","patch_set":41,"id":"1ac06dbe_d37b49f3","line":98,"range":{"start_line":98,"start_character":4,"end_line":98,"end_character":44},"updated":"2016-08-24 10:42:43.000000000","message":"@Kevin Benton\n\nHello Mr.Kevin. This line of code means that when creating a new security group rule then the revison value of the sg will be changed. So would you mind commenting a patch set to send a notification that the security group is updated.\n\nBecause after discussion with you last time [1] and I got some comment on my patch set [2], I would like to update to do this when creating a new subnet :). Thanks\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-neutron/%23openstack-neutron.2016-07-21.log.html#t2016-07-21T08:51:54 \n\n[2] https://review.openstack.org/#/c/350953/","commit_id":"4e8cc683496b1d8ebd727106390ba3ce660796f8"}],"neutron/extensions/revisions.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of Neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_3d290538","line":42,"range":{"start_line":42,"start_character":68,"end_line":42,"end_character":75},"updated":"2016-04-15 11:36:21.000000000","message":"neutron :)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"796623734dd347e7b3b9bc8c56fe5c84c1f6baa8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of Neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_c1e270d4","line":43,"updated":"2016-04-21 06:31:04.000000000","message":"No, that shouldn\u0027t be a part of this change. It\u0027s only partially related.\n\nIt\u0027s up to the core reviewers to decide if an object should have these standard attrs. Trying to automate that will just take too much time I think.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of Neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_026e14c9","line":43,"range":{"start_line":43,"start_character":17,"end_line":43,"end_character":24},"updated":"2016-04-15 11:36:21.000000000","message":"Some of them: on what basis should an object type be given a revision number?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of Neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_98dd4317","line":43,"range":{"start_line":43,"start_character":17,"end_line":43,"end_character":24},"in_reply_to":"1a122d0e_026e14c9","updated":"2016-04-17 21:28:15.000000000","message":"If it\u0027s part of the standard attributes objects.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"74126dfd3e10501cbf97c37bd998e5b9f17ad30b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of Neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_f0c08b2c","line":43,"range":{"start_line":43,"start_character":17,"end_line":43,"end_character":24},"in_reply_to":"1a122d0e_98dd4317","updated":"2016-04-19 10:24:38.000000000","message":"I realize that my question wasn\u0027t clear.  What I was getting at: on what basis should a resource get designated a standard attributes resource in order to benefit from the ordering guarantee that a revision_number provides? With the implied questions: should any resource not currently a standard attributes resource get moved into that category now?  Or, if not, should any of those resources get its own revision_number (a la qos_policies.revision_number)?\n\nI suspect the answers to my questions are: 1) A resource is/will get designated a standard attributes resource on the basis of considerations wholly other than revision_number.  2) No.  3) Yikes, no.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2ef7a679f97d066837b10bad9a65522a15b34843","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of Neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_01f95fc7","line":43,"range":{"start_line":43,"start_character":17,"end_line":43,"end_character":24},"in_reply_to":"1a122d0e_ecfa6f42","updated":"2016-04-20 07:27:49.000000000","message":"I guess that begs the question--whose answer, if there is one, is outside the scope of this change--of whether we can or should put a mechanism into place (some kind of interaction between the test suite and alembic migrations?) that forces someone to actively decide of a table being added to the schema either that it should NOT have standardattributes or that it should.  Maybe there\u0027s no remotely sensible way to do this other than in documentation, but it seems that the standardattributes mechanism currently may be easy to overlook when implementing schema changes.\n\nFor those resources that should move to standard attributes, should that happen as part of this change (i.e., review.openstack.org/#/c/303966/) or outside of it?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b8c6d30bb53f3d9e267da2b37bb4bddcb5a9dcd2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of Neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_ecfa6f42","line":43,"range":{"start_line":43,"start_character":17,"end_line":43,"end_character":24},"in_reply_to":"1a122d0e_f0c08b2c","updated":"2016-04-19 12:22:58.000000000","message":"I think things that live in the API like QoS policies should be moved to standard attributes. Otherwise they will get left behind on all sorts of things like this, timestamps, tags, etc.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e991c400d390562027625eb3ba85d91fc5092520","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_4ea8f177","line":43,"range":{"start_line":43,"start_character":17,"end_line":43,"end_character":24},"updated":"2016-07-25 11:10:51.000000000","message":"It\u0027s more common to refer to those entities as resources. Especially now that we have \u0027objects\u0027 as internal abstractions.","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c6ff32d1e860627d04fd0cba8717abce0f27dc5a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_description(cls):"},{"line_number":42,"context_line":"        return (\"This extension will display the revision number of neutron \""},{"line_number":43,"context_line":"                \"objects.\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_38e923b8","line":43,"range":{"start_line":43,"start_character":17,"end_line":43,"end_character":24},"in_reply_to":"dada55a8_4ea8f177","updated":"2016-07-27 00:53:43.000000000","message":"Done","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"}],"neutron/objects/subnetpool.py":[{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"6cc893c19e7a1f7451b3182af385ac6cacdc6f19","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027hash\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027address_scope_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027prefixes\u0027: common_types.ListOfIPNetworksField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027revision_number\u0027: obj_fields.IntegerField()"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    fields_no_update \u003d [\u0027id\u0027, \u0027tenant_id\u0027, \u0027revision_number\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"7aa08908_0f0ba525","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":52},"updated":"2016-06-16 09:45:56.000000000","message":"I believe that should be added to [1] instead (used by DeclarativeObject metaclass in [2]).\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/extensions/standardattributes.py\n[2] https://github.com/openstack/neutron/blob/master/neutron/objects/base.py","commit_id":"3aa41012ed1968eedc165fe7cfed21db857d0ba3"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7b95763b4753cae47545c93fbeb0edb2452bd4bb","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027hash\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027address_scope_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027prefixes\u0027: common_types.ListOfIPNetworksField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027revision_number\u0027: obj_fields.IntegerField()"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    fields_no_update \u003d [\u0027id\u0027, \u0027tenant_id\u0027, \u0027revision_number\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"7aa08908_b6ba57df","line":50,"updated":"2016-06-17 17:05:07.000000000","message":"Yep, I figured that out. That\u0027s why I pushed up the previous patchset. :)","commit_id":"3aa41012ed1968eedc165fe7cfed21db857d0ba3"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"b2e932a3a93ea006d43847648d19afa4f5db0bcd","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027hash\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027address_scope_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027prefixes\u0027: common_types.ListOfIPNetworksField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027revision_number\u0027: obj_fields.IntegerField()"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    fields_no_update \u003d [\u0027id\u0027, \u0027tenant_id\u0027, \u0027revision_number\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"7aa08908_55837ea9","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":52},"in_reply_to":"7aa08908_0f0ba525","updated":"2016-06-16 10:30:50.000000000","message":"I see that revision_number is already declared in standard attributes [1], so yes, Ilya is right, it can be added to object extensions. This would mean that every object what is using the standard attributes will have this value by default. It includes Subnet and Subnetpool objects, which are already merged. And Port and Network objects that are WIP.\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/db/model_base.py#L113","commit_id":"3aa41012ed1968eedc165fe7cfed21db857d0ba3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"716bff486f8215c73e081c8cad1146c766bee6dc","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027hash\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027address_scope_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027prefixes\u0027: common_types.ListOfIPNetworksField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027revision_number\u0027: obj_fields.IntegerField()"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    fields_no_update \u003d [\u0027id\u0027, \u0027tenant_id\u0027, \u0027revision_number\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"7aa08908_8dae7ae5","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":52},"in_reply_to":"7aa08908_406d7acb","updated":"2016-06-16 11:13:48.000000000","message":"Ahaa, I see it\u0027s there in previous PS. Then this is not needed, fields from standard attribute object are addad automatically when db_model inherits from standard attribute model.","commit_id":"3aa41012ed1968eedc165fe7cfed21db857d0ba3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"95488514fe0132885f825c1c1c65f47bc11b9844","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027hash\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027address_scope_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027prefixes\u0027: common_types.ListOfIPNetworksField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027revision_number\u0027: obj_fields.IntegerField()"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    fields_no_update \u003d [\u0027id\u0027, \u0027tenant_id\u0027, \u0027revision_number\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"7aa08908_406d7acb","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":52},"in_reply_to":"7aa08908_55837ea9","updated":"2016-06-16 10:34:52.000000000","message":"+1 for adding it to standard attributes object extensions.","commit_id":"3aa41012ed1968eedc165fe7cfed21db857d0ba3"}],"neutron/plugins/common/constants.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"4d7b8d562d586e522e947ba6808d194c8b73297e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_43a49c07","line":48,"updated":"2016-07-08 07:35:32.000000000","message":"Any core plugin that uses the database, and we\u0027ve already seemed to adopt that expectation with the other default service plugins. Even if they don\u0027t use the DB, the service plugin will basically turn into a NOOP since there won\u0027t be any sqlalchemy events to react to and nothing will call the extend_dict functions.","commit_id":"06e67d3a7a21728455615e0a63a143c157e45dff"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"187c7f55c250ace3776418746de9fce3dd8fc90c","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_11094c32","line":48,"updated":"2016-07-02 00:07:19.000000000","message":"are you sure this is expected to work with any other core plugin?","commit_id":"06e67d3a7a21728455615e0a63a143c157e45dff"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3616f15ac82edf85f006c86195595873b654d21e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":31,"id":"dada55a8_5602390a","line":48,"in_reply_to":"1aa78d24_43a49c07","updated":"2016-07-25 16:29:17.000000000","message":"Right, but then for those plugins we\u0027ll advertise the feature via /extensions API, but it won\u0027t really work.","commit_id":"06e67d3a7a21728455615e0a63a143c157e45dff"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"53ba43b1a5b649a1132f2306509856d21c4f33e8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":31,"id":"dada55a8_b4052dc3","line":48,"in_reply_to":"dada55a8_277c88b4","updated":"2016-07-26 16:36:52.000000000","message":"To be brutally honest, I am not sure why we\u0027re having this discussion. People are free to do whatever they want, inherit or override whatever they want. If they steer away from the conventional paths and decide to go nuts, that\u0027s self inflicted pain.\n\nTo your question about the non-db plugin class: my answer is...I wasn\u0027t looking when that got merged, because it\u0027s a refactoring I don\u0027t approve of, and I can only fight so many battles :)","commit_id":"06e67d3a7a21728455615e0a63a143c157e45dff"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b92db10a6c290eee8dff6c4a4a83a21b80f71791","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":31,"id":"dada55a8_da53da37","line":48,"in_reply_to":"dada55a8_5602390a","updated":"2016-07-25 22:51:25.000000000","message":"Then they can patch this out. This ship has already sailed because the same will applied to timestamps, flavors, ip availability, auto allocate, and tag. Every one of them queries the DB.","commit_id":"06e67d3a7a21728455615e0a63a143c157e45dff"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8a6be02ab214eea5f1d5d2550a66b862bd2d4b08","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":31,"id":"dada55a8_277c88b4","line":48,"in_reply_to":"dada55a8_98684a23","updated":"2016-07-26 09:54:47.000000000","message":"Armando, it will work IF we assume that all plugins inherit from base db plugin. If that\u0027s the case, why do we even have the base non-db plugin class?","commit_id":"06e67d3a7a21728455615e0a63a143c157e45dff"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"339753c51bdbbebc1e1c84ad0027b182d4e8cbf0","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":31,"id":"dada55a8_98684a23","line":48,"in_reply_to":"dada55a8_da53da37","updated":"2016-07-25 23:53:10.000000000","message":"This list should contain plugins support that\u0027s orthogonal to core plugins, ie. things that are supposed to work irrespective of the core plugin.  If we assume that adding a revision ID can work with any plugin, then I see no problem; this is simply saying to API users: your server is capable of handling resource revisions, and you\u0027ll see a revision ID in your responses. Nothing else is needed to work, is there?","commit_id":"06e67d3a7a21728455615e0a63a143c157e45dff"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e991c400d390562027625eb3ba85d91fc5092520","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_2e6dbd32","line":48,"updated":"2016-07-25 11:10:51.000000000","message":"Am I right that those plugins (and API extensions) will be automatically loaded for all core plugins, including eg. those that are not using neutron db models? Isn\u0027t it giving wrong impression to API users that the feature is supported while plugins may have not yet caught up?\n\nI understand it\u0027s not the first case we do that. Has it been discussed before? What was the rationale behind allowing that type of API extension advertisement for 3party plugins?","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d61a5daf5f61942cb539f3cb3d9589eb8c96f08d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_36722a4a","line":48,"in_reply_to":"dada55a8_2e6dbd32","updated":"2016-07-25 15:04:33.000000000","message":"https://review.openstack.org/#/c/303966/31/neutron/plugins/common/constants.py@48","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4929bb16a4b83716067123da9fe72634024ebdf5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027timestamp_core\u0027: \u0027timestamp_core\u0027,"},{"line_number":46,"context_line":"    \u0027network_ip_availability\u0027: \u0027network-ip-availability\u0027,"},{"line_number":47,"context_line":"    \u0027flavors\u0027: \u0027flavors\u0027,"},{"line_number":48,"context_line":"    \u0027revisions\u0027: \u0027revisions\u0027,"},{"line_number":49,"context_line":"}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_76265dbb","line":48,"in_reply_to":"dada55a8_36722a4a","updated":"2016-07-25 16:29:35.000000000","message":"Great. I replied there.","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"}],"neutron/services/revisions/revision_plugin.py":[{"author":{"_account_id":18289,"name":"Sreekumar S","email":"sreesiv@gmail.com","username":"sreesiv"},"change_message_id":"8f0063ec78331278f7b879a0de936325715865c0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        # bump revision number for any updated objects in the session"},{"line_number":41,"context_line":"        for obj in session.dirty:"},{"line_number":42,"context_line":"            if isinstance(obj, model_base.HasStandardAttributes):"},{"line_number":43,"context_line":"                obj.bump_revision()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        # see if any created/updated/deleted objects bump the revision"},{"line_number":46,"context_line":"        # of another object"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_74c83275","line":43,"range":{"start_line":43,"start_character":15,"end_line":43,"end_character":35},"updated":"2016-06-10 14:10:04.000000000","message":"Might be my lack of know how... But don\u0027t we need a lock or interlocked incr here?","commit_id":"e55d9da106fabb12c827bedcf26186cc3a8d5f4a"},{"author":{"_account_id":18289,"name":"Sreekumar S","email":"sreesiv@gmail.com","username":"sreesiv"},"change_message_id":"8f0063ec78331278f7b879a0de936325715865c0","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    continue"},{"line_number":63,"context_line":"                # no need to bump revisions on related objects being deleted"},{"line_number":64,"context_line":"                if related_obj not in session.deleted:"},{"line_number":65,"context_line":"                    related_obj.bump_revision()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_plugin_type(self):"},{"line_number":68,"context_line":"        return \"revision_plugin\""}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_f71f0459","line":65,"range":{"start_line":65,"start_character":20,"end_line":65,"end_character":47},"updated":"2016-06-10 14:10:04.000000000","message":"ditto as above.","commit_id":"e55d9da106fabb12c827bedcf26186cc3a8d5f4a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e991c400d390562027625eb3ba85d91fc5092520","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    continue"},{"line_number":63,"context_line":"                # no need to bump revisions on related objects being deleted"},{"line_number":64,"context_line":"                if related_obj not in session.deleted:"},{"line_number":65,"context_line":"                    related_obj.bump_revision()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_plugin_type(self):"},{"line_number":68,"context_line":"        return \"revision_plugin\""}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_b42bc032","line":65,"updated":"2016-07-25 11:10:51.000000000","message":"I guess the assumption here is that there are no 3rd order dependencies, hence we don\u0027t need to apply the bump attempt recursively to potential revision dependencies for related objects. That\u0027s fine with me, but maybe a note on that assumption could be of use for readers.","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"41330902ecc79b1c570098bed6afd1950de7c695","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    continue"},{"line_number":63,"context_line":"                # no need to bump revisions on related objects being deleted"},{"line_number":64,"context_line":"                if related_obj not in session.deleted:"},{"line_number":65,"context_line":"                    related_obj.bump_revision()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_plugin_type(self):"},{"line_number":68,"context_line":"        return \"revision_plugin\""}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_ba0c2643","line":65,"in_reply_to":"dada55a8_b42bc032","updated":"2016-07-25 22:56:53.000000000","message":"Ah yes, I could see how that might creep up some time in the future. I may just handle it now if it\u0027s easy. Otherwise I\u0027ll leave a note.","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c6ff32d1e860627d04fd0cba8717abce0f27dc5a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    continue"},{"line_number":63,"context_line":"                # no need to bump revisions on related objects being deleted"},{"line_number":64,"context_line":"                if related_obj not in session.deleted:"},{"line_number":65,"context_line":"                    related_obj.bump_revision()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_plugin_type(self):"},{"line_number":68,"context_line":"        return \"revision_plugin\""}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_1bea5474","line":65,"in_reply_to":"dada55a8_ba0c2643","updated":"2016-07-27 00:53:43.000000000","message":"Done","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e991c400d390562027625eb3ba85d91fc5092520","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def _table_to_model(self, table):"},{"line_number":77,"context_line":"        \"\"\"Return the SQLa declared model for a given table object.\"\"\""},{"line_number":78,"context_line":"        fullname \u003d table.fullname"},{"line_number":79,"context_line":"        for c in model_base.BASEV2._decl_class_registry.values():"},{"line_number":80,"context_line":"            if hasattr(c, \u0027__tablename__\u0027) and c.__tablename__ \u003d\u003d fullname:"},{"line_number":81,"context_line":"                return c"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_5446c44f","line":79,"range":{"start_line":79,"start_character":35,"end_line":79,"end_character":55},"updated":"2016-07-25 11:10:51.000000000","message":"This seems like an access to SQLa guts. Could we instead pass class_registry\u003d to declarative.declarative_base in neutron/db/model_base.py, and then use the passed in registry to extract models? That would avoid relying on internal bits from the library.","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"41330902ecc79b1c570098bed6afd1950de7c695","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def _table_to_model(self, table):"},{"line_number":77,"context_line":"        \"\"\"Return the SQLa declared model for a given table object.\"\"\""},{"line_number":78,"context_line":"        fullname \u003d table.fullname"},{"line_number":79,"context_line":"        for c in model_base.BASEV2._decl_class_registry.values():"},{"line_number":80,"context_line":"            if hasattr(c, \u0027__tablename__\u0027) and c.__tablename__ \u003d\u003d fullname:"},{"line_number":81,"context_line":"                return c"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_fd4b3857","line":79,"range":{"start_line":79,"start_character":35,"end_line":79,"end_character":55},"in_reply_to":"dada55a8_5446c44f","updated":"2016-07-25 22:56:53.000000000","message":"I\u0027ll look into it.","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c6ff32d1e860627d04fd0cba8717abce0f27dc5a","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def _table_to_model(self, table):"},{"line_number":77,"context_line":"        \"\"\"Return the SQLa declared model for a given table object.\"\"\""},{"line_number":78,"context_line":"        fullname \u003d table.fullname"},{"line_number":79,"context_line":"        for c in model_base.BASEV2._decl_class_registry.values():"},{"line_number":80,"context_line":"            if hasattr(c, \u0027__tablename__\u0027) and c.__tablename__ \u003d\u003d fullname:"},{"line_number":81,"context_line":"                return c"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"dada55a8_1b5c147c","line":79,"range":{"start_line":79,"start_character":35,"end_line":79,"end_character":55},"in_reply_to":"dada55a8_fd4b3857","updated":"2016-07-27 00:53:43.000000000","message":"Done","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f57af1bb1174cdc6f9387342e92be99d6304a962","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                            {\u0027obj\u0027: obj, \u0027col\u0027: revises_col})"},{"line_number":61,"context_line":"                continue"},{"line_number":62,"context_line":"            # if related object revises others, bump those as well"},{"line_number":63,"context_line":"            self._bump_related_revisions(session, related_obj)"},{"line_number":64,"context_line":"            # no need to bump revisions on related objects being deleted"},{"line_number":65,"context_line":"            if related_obj not in session.deleted:"},{"line_number":66,"context_line":"                related_obj.bump_revision()"}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_20c71797","line":63,"updated":"2016-07-27 09:29:01.000000000","message":"Now that we use recursion, should we introduce a guard against bumping same objects several times (that would trigger an infinite loop)? I would think, we would mark models with some hidden marker, or track those bumped in a session.","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ee8d0611a55d41fd00bd55da04843a70e7e3ffa9","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                            {\u0027obj\u0027: obj, \u0027col\u0027: revises_col})"},{"line_number":61,"context_line":"                continue"},{"line_number":62,"context_line":"            # if related object revises others, bump those as well"},{"line_number":63,"context_line":"            self._bump_related_revisions(session, related_obj)"},{"line_number":64,"context_line":"            # no need to bump revisions on related objects being deleted"},{"line_number":65,"context_line":"            if related_obj not in session.deleted:"},{"line_number":66,"context_line":"                related_obj.bump_revision()"}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_a3cb0871","line":63,"in_reply_to":"dada55a8_12a98424","updated":"2016-07-27 12:10:26.000000000","message":"Yeah, it only needs to be monotonic. Anything else is just for show. I think we can check it out in a follow-up patch","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f3fbf9b2dc687f8f3535057b39c438f469f9712f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                            {\u0027obj\u0027: obj, \u0027col\u0027: revises_col})"},{"line_number":61,"context_line":"                continue"},{"line_number":62,"context_line":"            # if related object revises others, bump those as well"},{"line_number":63,"context_line":"            self._bump_related_revisions(session, related_obj)"},{"line_number":64,"context_line":"            # no need to bump revisions on related objects being deleted"},{"line_number":65,"context_line":"            if related_obj not in session.deleted:"},{"line_number":66,"context_line":"                related_obj.bump_revision()"}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_9280d4f8","line":63,"in_reply_to":"dada55a8_20c71797","updated":"2016-07-27 11:08:36.000000000","message":"Well we shouldn\u0027t have anywhere where a parent bumps a child that also bumps the parent. I would rather have that fail with the max recursion depth error it would throw rather than have something silently ignore it...","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b7b48d850b10097ab72aac3126481a4d97febb0d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                            {\u0027obj\u0027: obj, \u0027col\u0027: revises_col})"},{"line_number":61,"context_line":"                continue"},{"line_number":62,"context_line":"            # if related object revises others, bump those as well"},{"line_number":63,"context_line":"            self._bump_related_revisions(session, related_obj)"},{"line_number":64,"context_line":"            # no need to bump revisions on related objects being deleted"},{"line_number":65,"context_line":"            if related_obj not in session.deleted:"},{"line_number":66,"context_line":"                related_obj.bump_revision()"}],"source_content_type":"text/x-python","patch_set":39,"id":"dada55a8_12a98424","line":63,"in_reply_to":"dada55a8_9280d4f8","updated":"2016-07-27 11:18:43.000000000","message":"One thing the guard would help to avoid is a bump that would skip a number. Let\u0027s say you have two new resources to flush that will both bump a revision for another resource. Then the latter revision will +2 instead of +1. Of course, we are technically ok as long as it\u0027s monothonic, so... I am probably ok as is.","commit_id":"ccace284fd508677fd6dca4be907890ff0be0641"}],"neutron/tests/tempest/api/test_revisions.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e574b9a680feff6f8f537d5defe26a81a852d1b5","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            port[\u0027id\u0027], security_groups\u003d[sg[\u0027security_group\u0027][\u0027id\u0027]])"},{"line_number":76,"context_line":"        updated \u003d self.client.show_port(port[\u0027id\u0027])"},{"line_number":77,"context_line":"        self.client.update_port(port[\u0027id\u0027], security_groups\u003d[])"},{"line_number":78,"context_line":"        # TODO(kevinbenton): these extra shows after after the update are"},{"line_number":79,"context_line":"        # to work around the fact that ML2 creates the result dict before"},{"line_number":80,"context_line":"        # commit happens if the port is unbound. The update response should"},{"line_number":81,"context_line":"        # be usable directly once that is fixed."}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_3063811c","line":78,"range":{"start_line":78,"start_character":47,"end_line":78,"end_character":58},"updated":"2016-07-28 09:55:38.000000000","message":"after after","commit_id":"e5b209a4e9eaec2590f6d5963350b769cc58a94a"}],"neutron/tests/unit/db/test_db_base_plugin_v2.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":5828,"context_line":"            # we want to make sure that the attr resource was removed"},{"line_number":5829,"context_line":"            self._get_neutron_attr(ctx, attr_id)"},{"line_number":5830,"context_line":""},{"line_number":5831,"context_line":"    def test_staledata_error_on_concurrent_object_update_network(self):"},{"line_number":5832,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":5833,"context_line":"        network \u003d self._make_network(ctx)"},{"line_number":5834,"context_line":"        self._test_staledata_error_on_concurrent_object_update("}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_8af72058","line":5831,"range":{"start_line":5831,"start_character":57,"end_line":5831,"end_character":64},"updated":"2016-04-15 11:36:21.000000000","message":"All of these resource types get their revision_number characteristics by virtue of their participation in the StandardAttribute class.  Is it sufficient to test just one of these resource types?","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":5828,"context_line":"            # we want to make sure that the attr resource was removed"},{"line_number":5829,"context_line":"            self._get_neutron_attr(ctx, attr_id)"},{"line_number":5830,"context_line":""},{"line_number":5831,"context_line":"    def test_staledata_error_on_concurrent_object_update_network(self):"},{"line_number":5832,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":5833,"context_line":"        network \u003d self._make_network(ctx)"},{"line_number":5834,"context_line":"        self._test_staledata_error_on_concurrent_object_update("}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_58f3ab9e","line":5831,"range":{"start_line":5831,"start_character":57,"end_line":5831,"end_character":64},"in_reply_to":"5a18252c_8af72058","updated":"2016-04-17 21:28:15.000000000","message":"It probably is since it\u0027s exercising the same code. I just did all of them in case there was some refactor that led to different behavior for one object.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":5834,"context_line":"        self._test_staledata_error_on_concurrent_object_update("},{"line_number":5835,"context_line":"            models_v2.Network, network[\u0027id\u0027])"},{"line_number":5836,"context_line":""},{"line_number":5837,"context_line":"    def test_staledata_error_on_concurrent_object_update_port(self):"},{"line_number":5838,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":5839,"context_line":"        network \u003d self._make_network(ctx)"},{"line_number":5840,"context_line":"        port \u003d self._make_port(ctx, network.id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_ca50f834","line":5837,"range":{"start_line":5837,"start_character":8,"end_line":5837,"end_character":22},"updated":"2016-04-15 11:36:21.000000000","message":"Should we include positive unit tests?  (Though maybe that would just be testing the revision numbering mechanism itself, which in turn is already taken care of with the api tests.)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":5834,"context_line":"        self._test_staledata_error_on_concurrent_object_update("},{"line_number":5835,"context_line":"            models_v2.Network, network[\u0027id\u0027])"},{"line_number":5836,"context_line":""},{"line_number":5837,"context_line":"    def test_staledata_error_on_concurrent_object_update_port(self):"},{"line_number":5838,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":5839,"context_line":"        network \u003d self._make_network(ctx)"},{"line_number":5840,"context_line":"        port \u003d self._make_port(ctx, network.id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_f8cef758","line":5837,"range":{"start_line":5837,"start_character":8,"end_line":5837,"end_character":22},"in_reply_to":"5a18252c_ca50f834","updated":"2016-04-17 21:28:15.000000000","message":"These tests also double as a positive test by the positive check on L5923","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f6ec2f790d16b6e66677e5ea076ed8c50a5ef9a7","unresolved":false,"context_lines":[{"line_number":5841,"context_line":"        self._test_staledata_error_on_concurrent_object_update("},{"line_number":5842,"context_line":"            models_v2.Port, port[\u0027id\u0027])"},{"line_number":5843,"context_line":""},{"line_number":5844,"context_line":"    def test_staledata_error_on_concurrent_object_update_subnet(self):"},{"line_number":5845,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":5846,"context_line":"        network \u003d self._make_network(ctx)"},{"line_number":5847,"context_line":"        subnet \u003d self._make_subnet(ctx, network.id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a18252c_ca3758fd","line":5844,"range":{"start_line":5844,"start_character":4,"end_line":5844,"end_character":7},"updated":"2016-04-15 11:36:21.000000000","message":"Does it make sense to include tests for those situations in which parent-child relationships require revision number bumps to multiple tables?  (Maybe those aren\u0027t unit tests though.)","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93810f0ae48ca9426d5fe4c6dd84849181432893","unresolved":false,"context_lines":[{"line_number":5841,"context_line":"        self._test_staledata_error_on_concurrent_object_update("},{"line_number":5842,"context_line":"            models_v2.Port, port[\u0027id\u0027])"},{"line_number":5843,"context_line":""},{"line_number":5844,"context_line":"    def test_staledata_error_on_concurrent_object_update_subnet(self):"},{"line_number":5845,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":5846,"context_line":"        network \u003d self._make_network(ctx)"},{"line_number":5847,"context_line":"        subnet \u003d self._make_subnet(ctx, network.id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_d8fe9b6a","line":5844,"range":{"start_line":5844,"start_character":4,"end_line":5844,"end_character":7},"in_reply_to":"5a18252c_ca3758fd","updated":"2016-04-17 21:28:15.000000000","message":"We could. I would prefer to leave them to the API tests for right now though.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2ef7a679f97d066837b10bad9a65522a15b34843","unresolved":false,"context_lines":[{"line_number":5876,"context_line":"        self._test_staledata_error_on_concurrent_object_update("},{"line_number":5877,"context_line":"            sgdb.SecurityGroupRule, rule[\u0027id\u0027])"},{"line_number":5878,"context_line":""},{"line_number":5879,"context_line":"    def _test_staledata_error_on_concurrent_object_update(self, model, dbid):"},{"line_number":5880,"context_line":"        \"\"\"Test revision compare and swap update breaking on concurrent update."},{"line_number":5881,"context_line":""},{"line_number":5882,"context_line":"        In this test we start an update of the name on a model in an eventlet"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_39e0f9f9","line":5879,"range":{"start_line":5879,"start_character":8,"end_line":5879,"end_character":57},"updated":"2016-04-20 07:27:49.000000000","message":"This shows that a manual revision bump does not bypass the compare-and-swap activity that sql-alchemy performs.  I\u0027m a little surprised, not that a manual revision bump can block, but that a manual revision bump can be blocked.  But this test demonstrates both.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"dcfbf0face4f468b3e4ff5baa0053fb77c56497b","unresolved":false,"context_lines":[{"line_number":5876,"context_line":"        self._test_staledata_error_on_concurrent_object_update("},{"line_number":5877,"context_line":"            sgdb.SecurityGroupRule, rule[\u0027id\u0027])"},{"line_number":5878,"context_line":""},{"line_number":5879,"context_line":"    def _test_staledata_error_on_concurrent_object_update(self, model, dbid):"},{"line_number":5880,"context_line":"        \"\"\"Test revision compare and swap update breaking on concurrent update."},{"line_number":5881,"context_line":""},{"line_number":5882,"context_line":"        In this test we start an update of the name on a model in an eventlet"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_e1bcccdd","line":5879,"updated":"2016-04-21 06:25:34.000000000","message":"Yes, if you examine the SQLAlchemy versioning document, you can have completely manual version bumps if you want. The component that forces it to compare and swap is specifying that column as the versioning column.","commit_id":"f8d47f568d5becb0552f301b2319d1bcd4dfdacd"}],"setup.cfg":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e991c400d390562027625eb3ba85d91fc5092520","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    auto_allocate \u003d neutron.services.auto_allocate.plugin:Plugin"},{"line_number":82,"context_line":"    segments \u003d neutron.services.segments.plugin:Plugin"},{"line_number":83,"context_line":"    network_ip_availability \u003d neutron.services.network_ip_availability.plugin:NetworkIPAvailabilityPlugin"},{"line_number":84,"context_line":"    revisions \u003d neutron.services.revisions.revision_plugin:RevisionPlugin"},{"line_number":85,"context_line":"    timestamp_core \u003d neutron.services.timestamp.timestamp_plugin:TimeStampPlugin"},{"line_number":86,"context_line":"    trunk \u003d neutron.services.trunk.plugin:TrunkPlugin"},{"line_number":87,"context_line":"neutron.qos.notification_drivers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":37,"id":"dada55a8_149e0c54","line":84,"updated":"2016-07-25 11:10:51.000000000","message":"Just curious, why do we add it here if there is no way to disable it?","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"41330902ecc79b1c570098bed6afd1950de7c695","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    auto_allocate \u003d neutron.services.auto_allocate.plugin:Plugin"},{"line_number":82,"context_line":"    segments \u003d neutron.services.segments.plugin:Plugin"},{"line_number":83,"context_line":"    network_ip_availability \u003d neutron.services.network_ip_availability.plugin:NetworkIPAvailabilityPlugin"},{"line_number":84,"context_line":"    revisions \u003d neutron.services.revisions.revision_plugin:RevisionPlugin"},{"line_number":85,"context_line":"    timestamp_core \u003d neutron.services.timestamp.timestamp_plugin:TimeStampPlugin"},{"line_number":86,"context_line":"    trunk \u003d neutron.services.trunk.plugin:TrunkPlugin"},{"line_number":87,"context_line":"neutron.qos.notification_drivers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":37,"id":"dada55a8_5d71a4a7","line":84,"in_reply_to":"dada55a8_149e0c54","updated":"2016-07-25 22:56:53.000000000","message":"auto plugins is based on an entry point name. if someone with a non-db based plugin wants to override this they technically could.","commit_id":"9a611f2a9c9e9ecfaccab667edb91e19287c9c66"}]}
