)]}'
{"neutron/services/trunk/rpc/server.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2339d83fcf9586de2b1afe7281965b43da9c6c94","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        trunk_port \u003d self.core_plugin.get_port(context, trunk_port_id)"},{"line_number":117,"context_line":"        trunk_host \u003d trunk_port.get(portbindings.HOST_ID)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        for try_cnt in range(3):"},{"line_number":120,"context_line":"            try:"},{"line_number":121,"context_line":"                # NOTE(status_police) Set the trunk in BUILD state before"},{"line_number":122,"context_line":"                # processing subport bindings. The trunk will stay in BUILD"},{"line_number":123,"context_line":"                # state until an attempt has been made to bind all subports"},{"line_number":124,"context_line":"                # passed here and the agent acknowledges the operation was"},{"line_number":125,"context_line":"                # successful."},{"line_number":126,"context_line":"                trunk.update(status\u003dtrunk_consts.TRUNK_BUILD_STATUS)"},{"line_number":127,"context_line":"                break"},{"line_number":128,"context_line":"            except exc.StaleDataError as e:"},{"line_number":129,"context_line":"                LOG.debug(\"Got StaleDataError exception: %s\", e)"},{"line_number":130,"context_line":"                continue"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        for port_id in port_ids:"},{"line_number":133,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfb3d3c7_fec04ce3","line":130,"range":{"start_line":119,"start_character":8,"end_line":130,"end_character":24},"updated":"2019-05-30 16:16:05.000000000","message":"Would using a retry decorator like @db_api.retry_db_errors be a better approach? I wonder if bumping the retry logic up the call stack would be a better approach as well.","commit_id":"80f396fd0468f3830400eed3e360a05d38765170"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"760bd03d1aa1b20601af2ce4e269a66129721bee","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        trunk_port \u003d self.core_plugin.get_port(context, trunk_port_id)"},{"line_number":117,"context_line":"        trunk_host \u003d trunk_port.get(portbindings.HOST_ID)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        for try_cnt in range(3):"},{"line_number":120,"context_line":"            try:"},{"line_number":121,"context_line":"                # NOTE(status_police) Set the trunk in BUILD state before"},{"line_number":122,"context_line":"                # processing subport bindings. The trunk will stay in BUILD"},{"line_number":123,"context_line":"                # state until an attempt has been made to bind all subports"},{"line_number":124,"context_line":"                # passed here and the agent acknowledges the operation was"},{"line_number":125,"context_line":"                # successful."},{"line_number":126,"context_line":"                trunk.update(status\u003dtrunk_consts.TRUNK_BUILD_STATUS)"},{"line_number":127,"context_line":"                break"},{"line_number":128,"context_line":"            except exc.StaleDataError as e:"},{"line_number":129,"context_line":"                LOG.debug(\"Got StaleDataError exception: %s\", e)"},{"line_number":130,"context_line":"                continue"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        for port_id in port_ids:"},{"line_number":133,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_ff181576","line":130,"range":{"start_line":119,"start_character":8,"end_line":130,"end_character":24},"in_reply_to":"9fb8cfa7_b01dfebe","updated":"2019-06-03 08:50:14.000000000","message":"Good ideas. Will do both in the next patch set.","commit_id":"80f396fd0468f3830400eed3e360a05d38765170"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a60e1cd75a4956dc067390678bfe410a08398635","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        trunk_port \u003d self.core_plugin.get_port(context, trunk_port_id)"},{"line_number":117,"context_line":"        trunk_host \u003d trunk_port.get(portbindings.HOST_ID)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        for try_cnt in range(3):"},{"line_number":120,"context_line":"            try:"},{"line_number":121,"context_line":"                # NOTE(status_police) Set the trunk in BUILD state before"},{"line_number":122,"context_line":"                # processing subport bindings. The trunk will stay in BUILD"},{"line_number":123,"context_line":"                # state until an attempt has been made to bind all subports"},{"line_number":124,"context_line":"                # passed here and the agent acknowledges the operation was"},{"line_number":125,"context_line":"                # successful."},{"line_number":126,"context_line":"                trunk.update(status\u003dtrunk_consts.TRUNK_BUILD_STATUS)"},{"line_number":127,"context_line":"                break"},{"line_number":128,"context_line":"            except exc.StaleDataError as e:"},{"line_number":129,"context_line":"                LOG.debug(\"Got StaleDataError exception: %s\", e)"},{"line_number":130,"context_line":"                continue"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        for port_id in port_ids:"},{"line_number":133,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_b01dfebe","line":130,"range":{"start_line":119,"start_character":8,"end_line":130,"end_character":24},"in_reply_to":"bfb3d3c7_ad64de4a","updated":"2019-05-31 19:05:59.000000000","message":"Maybe You can add some simple UT which will ensure that this is executed only those 3 times?\n\nAnd also, maybe if this happens those 3 times and still is the same error, then You should reraise this exception finally to make it visible for operator. What do You think?","commit_id":"80f396fd0468f3830400eed3e360a05d38765170"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"69605f66e6290072a58cc2e9bcdf2a72e21ff9ee","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        trunk_port \u003d self.core_plugin.get_port(context, trunk_port_id)"},{"line_number":117,"context_line":"        trunk_host \u003d trunk_port.get(portbindings.HOST_ID)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        for try_cnt in range(3):"},{"line_number":120,"context_line":"            try:"},{"line_number":121,"context_line":"                # NOTE(status_police) Set the trunk in BUILD state before"},{"line_number":122,"context_line":"                # processing subport bindings. The trunk will stay in BUILD"},{"line_number":123,"context_line":"                # state until an attempt has been made to bind all subports"},{"line_number":124,"context_line":"                # passed here and the agent acknowledges the operation was"},{"line_number":125,"context_line":"                # successful."},{"line_number":126,"context_line":"                trunk.update(status\u003dtrunk_consts.TRUNK_BUILD_STATUS)"},{"line_number":127,"context_line":"                break"},{"line_number":128,"context_line":"            except exc.StaleDataError as e:"},{"line_number":129,"context_line":"                LOG.debug(\"Got StaleDataError exception: %s\", e)"},{"line_number":130,"context_line":"                continue"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        for port_id in port_ids:"},{"line_number":133,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfb3d3c7_ad64de4a","line":130,"range":{"start_line":119,"start_character":8,"end_line":130,"end_character":24},"in_reply_to":"bfb3d3c7_fec04ce3","updated":"2019-05-31 08:22:54.000000000","message":"I did look into that a bit and this is what I found. Please see a stack trace below.\n\n1) The docstring of the retry_db_errors decorator says it\u0027s for \"functions which do not accept a context\". I don\u0027t understand the reason for that, so it bothers me that I\u0027m missing something here. Pretty much everything in this call chain takes a context argument. Please tell me if you know the reason for this limitation in the docstring.\n\n2) If we pushed the retry logic higher in the stack then it could be more generic so that would be good. Maybe we could close the other StaleDataError bugs at once. But we would also catch more of the case when the versioning logic actually catches conflicting updates. Higher in the stack we can differentiate between the causes of StaleDataErrors even less than here.\n\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server [None req-53439bd7-16b5-4aa6-9c46-0973548c5bf1 None None] Exception during message handling: StaleDataError: UPDATE statement on table \u0027standardattributes\u0027 e\nxpected to update 1 row(s); 0 were matched.\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server Traceback (most recent call last):\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/server.py\", line 166, in _process_incoming\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     res \u003d self.dispatcher.dispatch(message)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py\", line 265, in dispatch\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     return self._do_dispatch(endpoint, method, ctxt, args)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py\", line 194, in _do_dispatch\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     result \u003d func(ctxt, **new_args)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/oslo_log/helpers.py\", line 67, in wrapper\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     return method(*args, **kwargs)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/neutron/neutron/services/trunk/rpc/server.py\", line 99, in update_subport_bindings\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     subport_ids)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/neutron/neutron/services/trunk/rpc/server.py\", line 122, in _process_trunk_subport_bindings\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     trunk.update(status\u003dtrunk_consts.TRUNK_BUILD_STATUS)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/neutron/neutron/objects/base.py\", line 337, in decorator\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     return func(self, *args, **kwargs)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/neutron/neutron/objects/trunk.py\", line 125, in update\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     super(Trunk, self).update()\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/neutron/neutron/objects/base.py\", line 906, in update\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     self._get_composite_keys()))\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/neutron/neutron/objects/db/api.py\", line 93, in update_object\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     db_obj.save(session\u003dcontext.session)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/models.py\", line 50, in save\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     session.flush()\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py\", line 2446, in flush\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     self._flush(objects)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py\", line 2584, in _flush\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     transaction.rollback(_capture_exception\u003dTrue)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py\", line 67, in __exit__\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     compat.reraise(exc_type, exc_value, exc_tb)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py\", line 2544, in _flush\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     flush_context.execute()\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py\", line 416, in execute\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     rec.execute(self)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py\", line 583, in execute\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     uow,\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py\", line 236, in save_obj\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     update,\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py\", line 1008, in _emit_update_statements\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server     % (table.description, len(records), rows)\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server StaleDataError: UPDATE statement on table \u0027standardattributes\u0027 expected to update 1 row(s); 0 were matched.\nmáj 22 14:13:59 devstack0 neutron-server[22305]: ERROR oslo_messaging.rpc.server","commit_id":"80f396fd0468f3830400eed3e360a05d38765170"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3404e97c6579e03cdf128cc96053b8a674422647","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":108,"context_line":"            trunk \u003d trunk_objects.Trunk.get_object(context, id\u003dtrunk_id)"},{"line_number":109,"context_line":"            if trunk:"},{"line_number":110,"context_line":"                trunk.update(status\u003dstatus)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _process_trunk_subport_bindings(self, context, trunk, port_ids):"},{"line_number":113,"context_line":"        \"\"\"Process port bindings for subports on the given trunk.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_b0f51059","line":110,"updated":"2019-06-14 16:46:21.000000000","message":"Maybe I\u0027m wrong, but the method returning this exception is \"update_trunk_status\", not \"_process_trunk_subport_bindings\":\n\nFile \"/usr/lib/python2.7/site-packages/neutron/services/trunk/rpc/server.py\", line 110, in update_trunk_status\n  trunk.update(status\u003dstatus)\n\n\nAnyway, as commented in the bug, this is a common problem with all OVOs with standard attributes. This patch mitigates this problem only for trunks.","commit_id":"618e24e241241c7323702a815542f11e91fd32a1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"978e5bf4f3a2f8f71e3bb0bfa8189a7b0276cf39","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":108,"context_line":"            trunk \u003d trunk_objects.Trunk.get_object(context, id\u003dtrunk_id)"},{"line_number":109,"context_line":"            if trunk:"},{"line_number":110,"context_line":"                trunk.update(status\u003dstatus)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _process_trunk_subport_bindings(self, context, trunk, port_ids):"},{"line_number":113,"context_line":"        \"\"\"Process port bindings for subports on the given trunk.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_b61656f1","line":110,"in_reply_to":"9fb8cfa7_b0f51059","updated":"2019-06-17 08:01:47.000000000","message":"In the error cases I managed to reproduce it was raised in _process_trunk_subport_bindings. Please see the stack trace in my comment at https://review.opendev.org/#/c/662236/1/neutron/services/trunk/rpc/server.py@130.","commit_id":"618e24e241241c7323702a815542f11e91fd32a1"}],"neutron/tests/unit/services/trunk/rpc/test_server.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"45a05926b4da85c5139bd6b815456181b3e98d65","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                test_obj.update_subport_bindings,"},{"line_number":185,"context_line":"                self.context,"},{"line_number":186,"context_line":"                subports\u003dsubports)"},{"line_number":187,"context_line":"            self.assertEqual(3, mock_trunk_obj.update.call_count)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_update_subport_bindings_exception(self):"},{"line_number":190,"context_line":"        with self.port() as _parent_port:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_dfcd44b7","line":187,"updated":"2019-06-13 20:09:30.000000000","message":"please add one more case, when \"mock_trunk_obj.update.side_effect\" will be some other type of exception and You will check that this exception is raised and it\u0027s called only once.","commit_id":"7bd1a6c0aae18ca8a5381c513d0620705a835925"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"46098cbf77e65fb86cf68f13f58457c43b286108","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                test_obj.update_subport_bindings,"},{"line_number":185,"context_line":"                self.context,"},{"line_number":186,"context_line":"                subports\u003dsubports)"},{"line_number":187,"context_line":"            self.assertEqual(3, mock_trunk_obj.update.call_count)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_update_subport_bindings_exception(self):"},{"line_number":190,"context_line":"        with self.port() as _parent_port:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_3a3904d6","line":187,"in_reply_to":"9fb8cfa7_dfcd44b7","updated":"2019-06-14 10:58:25.000000000","message":"Done","commit_id":"7bd1a6c0aae18ca8a5381c513d0620705a835925"}]}
