)]}'
{"neutron/agent/common/ovs_lib.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2011 VMware, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_37678254","line":1,"updated":"2019-07-25 10:42:33.000000000","message":"You should implement a couple of functional tests for those new methods added.","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":362,"context_line":"    def _get_port_val(self, port_name, port_val):"},{"line_number":363,"context_line":"        return self.db_get_val(\"Interface\", port_name, port_val)"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    def _get_bridge_val(self, br_val):"},{"line_number":366,"context_line":"        return self.db_get_val(\"Bridge\", self.br_name, br_val)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def get_port_ofport(self, port_name):"},{"line_number":369,"context_line":"        \"\"\"Get the port\u0027s assigned ofport, retrying if not yet assigned.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_37d78252","line":366,"range":{"start_line":365,"start_character":4,"end_line":366,"end_character":62},"updated":"2019-07-25 10:42:33.000000000","message":"I don\u0027t see the value of adding this method.","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        return port_external_ids"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def get_bridge_external_ids(self):"},{"line_number":389,"context_line":"        return self._get_bridge_val(\"external_ids\") or {}"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def delete_bridge_external_ids_key(self, key):"},{"line_number":392,"context_line":"        return self.ovsdb.db_remove("}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_77f5faec","line":389,"range":{"start_line":389,"start_character":51,"end_line":389,"end_character":57},"updated":"2019-07-25 10:42:33.000000000","message":"Not needed. \"external_ids\" and \"other_config\" are, by default, a \"map of string-string pair\". If the register is empty, {} will be returned by default.\n\nBTW, you can call directly:\n  return self.db_get_val(\"Bridge\", self.br_name, br_val)\n\n[1] http://www.openvswitch.org//ovs-vswitchd.conf.db.5.pdf","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":389,"context_line":"        return self._get_bridge_val(\"external_ids\") or {}"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def delete_bridge_external_ids_key(self, key):"},{"line_number":392,"context_line":"        return self.ovsdb.db_remove("},{"line_number":393,"context_line":"            \"Bridge\","},{"line_number":394,"context_line":"            self.br_name,"},{"line_number":395,"context_line":"            \"external_ids\","}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_b7be12d2","line":392,"updated":"2019-07-25 10:42:33.000000000","message":"small nit: do we need 6 lines for a command that can be written in 2?","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"}],"neutron/agent/rpc.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"183f3795984d9c9e48b3c0c30abe5b7d432d68c2","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                            device, repr(trace_info))"},{"line_number":172,"context_line":"                    else:"},{"line_number":173,"context_line":"                        lost \u003d traces.pop(device)"},{"line_number":174,"context_line":"                        LOG.warning("},{"line_number":175,"context_line":"                            \u0027Cannot put multiple trace_infos into a \u0027"},{"line_number":176,"context_line":"                            \u0027single update_device_list rpc message, \u0027"},{"line_number":177,"context_line":"                            \u0027trace_info lost for port\u003d%s: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_805ba352","line":174,"range":{"start_line":174,"start_character":28,"end_line":174,"end_character":35},"updated":"2019-07-24 09:43:17.000000000","message":"IMO debug will be enough here","commit_id":"391cdbc4ee5beb5e5d6cb324355232abe9480c33"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"74a7e5f5520fdecddee8cf352399ad40eb6135ce","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                            device, repr(trace_info))"},{"line_number":172,"context_line":"                    else:"},{"line_number":173,"context_line":"                        lost \u003d traces.pop(device)"},{"line_number":174,"context_line":"                        LOG.warning("},{"line_number":175,"context_line":"                            \u0027Cannot put multiple trace_infos into a \u0027"},{"line_number":176,"context_line":"                            \u0027single update_device_list rpc message, \u0027"},{"line_number":177,"context_line":"                            \u0027trace_info lost for port\u003d%s: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_c1751ace","line":174,"range":{"start_line":174,"start_character":28,"end_line":174,"end_character":35},"in_reply_to":"7faddb67_805ba352","updated":"2019-07-24 13:52:57.000000000","message":"Done","commit_id":"391cdbc4ee5beb5e5d6cb324355232abe9480c33"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"183f3795984d9c9e48b3c0c30abe5b7d432d68c2","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        for i in range(0, max(len(devices_up), len(devices_down)), step):"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"            trace_info \u003d self._get_trace_info_for_devices("},{"line_number":227,"context_line":"                traces, devices_up[i:i + step] + devices_down[i:i + step])"},{"line_number":228,"context_line":"            if trace_info:"},{"line_number":229,"context_line":"                profiler.init(**trace_info)"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_db4bd05c","line":227,"updated":"2019-07-24 09:43:17.000000000","message":"I wonder if this would be somehow possible to do this only if osprofiler is enabled. To not iterate over all devices if it\u0027s not necessary. Or will it just be just \"traces\" will be None in such case always?","commit_id":"391cdbc4ee5beb5e5d6cb324355232abe9480c33"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fc826f23a60d1ac3331b11eaefe8af2efff75a71","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        for i in range(0, max(len(devices_up), len(devices_down)), step):"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"            trace_info \u003d self._get_trace_info_for_devices("},{"line_number":227,"context_line":"                traces, devices_up[i:i + step] + devices_down[i:i + step])"},{"line_number":228,"context_line":"            if trace_info:"},{"line_number":229,"context_line":"                profiler.init(**trace_info)"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_b48cd035","line":227,"in_reply_to":"7faddb67_213f4ed7","updated":"2019-07-25 09:01:32.000000000","message":"thx","commit_id":"391cdbc4ee5beb5e5d6cb324355232abe9480c33"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"74a7e5f5520fdecddee8cf352399ad40eb6135ce","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        for i in range(0, max(len(devices_up), len(devices_down)), step):"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"            trace_info \u003d self._get_trace_info_for_devices("},{"line_number":227,"context_line":"                traces, devices_up[i:i + step] + devices_down[i:i + step])"},{"line_number":228,"context_line":"            if trace_info:"},{"line_number":229,"context_line":"                profiler.init(**trace_info)"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_213f4ed7","line":227,"in_reply_to":"7faddb67_db4bd05c","updated":"2019-07-24 13:52:57.000000000","message":"I changed the condition in line 163 so now we additionally skip the whole thing if:\n\n* traces\u003d\u003d{} or\n* profiler.enabled is False in the config","commit_id":"391cdbc4ee5beb5e5d6cb324355232abe9480c33"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        one trace_info into one message."},{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":"        trace_info \u003d {}"},{"line_number":164,"context_line":"        if traces and cfg.CONF.profiler.enabled:"},{"line_number":165,"context_line":"            for device in devices:"},{"line_number":166,"context_line":"                if device in traces:"},{"line_number":167,"context_line":"                    if not trace_info:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_b7dff20a","line":164,"updated":"2019-07-25 10:42:33.000000000","message":"nit: in shake of clarity and avoid indentation, this can be\n\nif not (traces and cfg.CONF.profiler.enabled):\n return trace_info\n\nfor device in (dev for dev in devices if dev in traces):\n  if not trace_info:\n    trace_info \u003d traces.pop(device)\n    LOG.debug(...)\n    return trace_info # according to the next comment","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                            \u0027Add trace_info to update_device_* rpc \u0027"},{"line_number":171,"context_line":"                            \u0027for port\u003d%s: %s\u0027,"},{"line_number":172,"context_line":"                            device, repr(trace_info))"},{"line_number":173,"context_line":"                    else:"},{"line_number":174,"context_line":"                        lost \u003d traces.pop(device)"},{"line_number":175,"context_line":"                        LOG.debug("},{"line_number":176,"context_line":"                            \u0027Cannot put multiple trace_infos into a \u0027"},{"line_number":177,"context_line":"                            \u0027single update_device_list rpc message, \u0027"},{"line_number":178,"context_line":"                            \u0027trace_info lost for port\u003d%s: %s\u0027,"},{"line_number":179,"context_line":"                            device, repr(lost))"},{"line_number":180,"context_line":"        return trace_info"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def update_device_down(self, context, device, agent_id, host\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_57e6beea","line":179,"range":{"start_line":173,"start_character":20,"end_line":179,"end_character":47},"updated":"2019-07-25 10:42:33.000000000","message":"In systems with hundreds of ports, this will throw the same number of lines and I don\u0027t see if this is really needed.","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                            device, repr(lost))"},{"line_number":180,"context_line":"        return trace_info"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def update_device_down(self, context, device, agent_id, host\u003dNone,"},{"line_number":183,"context_line":"                           traces\u003dNone):"},{"line_number":184,"context_line":"        cctxt \u003d self.client.prepare()"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_37cb024b","line":182,"updated":"2019-07-25 10:42:33.000000000","message":"Please, add a TODO here to create a decorator for those methods. We have too much redundant code here.","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"c9577510b8999558fb5469ed9dcdba41eed75968","unresolved":false,"context_lines":[{"line_number":1563,"context_line":"            if trace_info_key in br_external_ids:"},{"line_number":1564,"context_line":"                trace_info_json \u003d br_external_ids[trace_info_key]"},{"line_number":1565,"context_line":"                trace_info \u003d jsonutils.loads(trace_info_json)"},{"line_number":1566,"context_line":"                profiler.reinit(**trace_info)"},{"line_number":1567,"context_line":"                self.int_br.delete_bridge_external_ids_key(trace_info_key)"},{"line_number":1568,"context_line":""},{"line_number":1569,"context_line":"            # check \u0027iface-id\u0027 is set otherwise is not a port"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_d2ce04b3","line":1566,"updated":"2019-06-24 08:01:59.000000000","message":"what is the event that triggers _process_port() function? is it polling of ovsdb or RPC message? if the latter then there should be profiler context that comes via messaging","commit_id":"003ee19742b5dd42723041d47c498eebc777c49f"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"916e1d694a3e3840df8dbafb137be52db9d9f268","unresolved":false,"context_lines":[{"line_number":1563,"context_line":"            if trace_info_key in br_external_ids:"},{"line_number":1564,"context_line":"                trace_info_json \u003d br_external_ids[trace_info_key]"},{"line_number":1565,"context_line":"                trace_info \u003d jsonutils.loads(trace_info_json)"},{"line_number":1566,"context_line":"                profiler.reinit(**trace_info)"},{"line_number":1567,"context_line":"                self.int_br.delete_bridge_external_ids_key(trace_info_key)"},{"line_number":1568,"context_line":""},{"line_number":1569,"context_line":"            # check \u0027iface-id\u0027 is set otherwise is not a port"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_6b1f1e70","line":1566,"in_reply_to":"9fb8cfa7_26596559","updated":"2019-06-24 16:01:10.000000000","message":"Bence, thank you for the detailed explanation.\n\nI agree with your findings and would start with removing the decorator from OVSNeutronAgent and applying it only to methods triggered by RPC. This will avoid call to profiler.stop() which now happens on return from process_port_info()\n\nThen the question is the span lifetime - the span starts once trace context is read from OVS port, but when can it be considered as finished? Does it live within one iteration of rpc_loop() or longer?","commit_id":"003ee19742b5dd42723041d47c498eebc777c49f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"a44592b09b7823c3f679b4f35dd6f74d421c6c15","unresolved":false,"context_lines":[{"line_number":1563,"context_line":"            if trace_info_key in br_external_ids:"},{"line_number":1564,"context_line":"                trace_info_json \u003d br_external_ids[trace_info_key]"},{"line_number":1565,"context_line":"                trace_info \u003d jsonutils.loads(trace_info_json)"},{"line_number":1566,"context_line":"                profiler.reinit(**trace_info)"},{"line_number":1567,"context_line":"                self.int_br.delete_bridge_external_ids_key(trace_info_key)"},{"line_number":1568,"context_line":""},{"line_number":1569,"context_line":"            # check \u0027iface-id\u0027 is set otherwise is not a port"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_dc6ca837","line":1566,"in_reply_to":"9fb8cfa7_6b1f1e70","updated":"2019-06-26 14:59:26.000000000","message":"\u003e I agree with your findings and would start with removing the\n \u003e decorator from OVSNeutronAgent and applying it only to methods\n \u003e triggered by RPC. This will avoid call to profiler.stop() which now\n \u003e happens on return from process_port_info()\n\nI started doing this so we\u0027ll never have unmatched profiler.stop()s. I had to realize that in neutron-ovs-agent the trace_info is lost from the context before we call profiler.init() in deserialize_context(). I\u0027m now debugging why that happens.\n\n \u003e Then the question is the span lifetime - the span starts once trace\n \u003e context is read from OVS port, but when can it be considered as\n \u003e finished? Does it live within one iteration of rpc_loop() or\n \u003e longer?\n\nI\u0027d like to consider the end of the span when neutron-ovs-agent sends the update_device_list rpc to neutron-server setting the port status to some final status like ACTIVE. I think the reinit() method in my current osprofiler change is seriously ugly - I\u0027d like to get rid of it somehow. One idea I have (at least as a first step) is to only pass the trace_info through neutron-ovs-agent and do not call profiler.init() from ovs-agent. Still we would have trace points from nova/os-vif (before ovs-agent) and neutron-server (after ovs-agent). So we could tell the total time spent in ovs-agent. But this way we could avoid the need for reinit() or deinit() in osprofiler. But I\u0027ll have to experiment with this.","commit_id":"003ee19742b5dd42723041d47c498eebc777c49f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"db8399f27d9ff8b7bda2623dec0ffe0eaa3867f2","unresolved":false,"context_lines":[{"line_number":1563,"context_line":"            if trace_info_key in br_external_ids:"},{"line_number":1564,"context_line":"                trace_info_json \u003d br_external_ids[trace_info_key]"},{"line_number":1565,"context_line":"                trace_info \u003d jsonutils.loads(trace_info_json)"},{"line_number":1566,"context_line":"                profiler.reinit(**trace_info)"},{"line_number":1567,"context_line":"                self.int_br.delete_bridge_external_ids_key(trace_info_key)"},{"line_number":1568,"context_line":""},{"line_number":1569,"context_line":"            # check \u0027iface-id\u0027 is set otherwise is not a port"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_26596559","line":1566,"in_reply_to":"9fb8cfa7_d2ce04b3","updated":"2019-06-24 10:11:53.000000000","message":"In short: _process_port is triggered by polling of ovsdb.\n\nThe background of this WIP change may not come through properly from these patches so let me explain:\n\nWhen we looked into osprofiler reports of a full VM boot (with vNICs) we realized there are no trace points after the vif plug. However many things happen after the vif plug: most importantly neutron-agent wires the port, then it sends an rpc back to neutron-server to update the port status, then neutron-server calls back to nova to resume the VM boot. And we\u0027d like to profile all this.\n\nAs I\u0027m sure you know the original integration work of osprofiler added the trace info to all the usual communication channels like HTTP calls and RPC messages to trigger tracing in other components. But vif plugging is non-standard unfortunately. Usually what happens is the following: nova (through os-vif) plugs an interface into the softswitch and a neutron agent polls on the softswitch configuration and realizes there\u0027s a new interface. This is a communication channel where the trace info is not passed at the moment, therefore the trace ends in nova/os-vif.\n\nIn addition to this the ovs-agent architecture is a spaghetti, so we\u0027re trying to find the least hacky way to enable tracing after the vif plug.\n\nAs you can see in line 100 the OVSNeutronAgent class is currenty decorated to be traced. The \"rpc\" string there is quite misleading. Many of the methods of this class are not remote methods. But even the methods called remotely are not doing any real work - they only update global state variables in ovs-agent, so the next loop can pick up the work to do. The single most important operation of ovs-agent (i.e. the vif plug) is not triggered by rpc.\n\nI\u0027m not sure if we should keep the decorator on OVSNeutronAgent. But when it\u0027s there combined with the profiler.init() in process_ports_events() we are going to see profiler.stop()s without the corresponding profiler.start()s. Because we can only init() the profiler in the middle of the decorated process_ports_events() method. Maybe we should delete the decorator and hand pick code locations for profiler.start/stops so we never have unmatched stop()s.\n\nThe ovs-agent loop itself interleaves work that could belong to many trace requests. Even the rpc message back to neutron is a batched message so it could be part of many traces at once while the rpc message format currently allows only a single trace info.\n\nI\u0027m not sure how much useful profiling information we can get out of ovs-agent - because even the best profiling here will ultimately just measure the length of the rpc_loop in ovs-agent. But I would definitely want to pass the trace info back to neutron-server so we can see the overall time spent in ovs-agent and follow the trace from there.\n\nWe uploaded these changes hoping that people have ideas how to make all this less hacky while still providing useful tracing data.","commit_id":"003ee19742b5dd42723041d47c498eebc777c49f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":1552,"context_line":"        br_external_ids \u003d self.int_br.get_bridge_external_ids()"},{"line_number":1553,"context_line":"        trace_info_key \u003d \u0027osprofiler_%s\u0027 % vif_name"},{"line_number":1554,"context_line":"        if trace_info_key in br_external_ids:"},{"line_number":1555,"context_line":"            trace_info_json \u003d br_external_ids[trace_info_key]"},{"line_number":1556,"context_line":"            trace_info \u003d jsonutils.loads(trace_info_json)"},{"line_number":1557,"context_line":"            self.traces[port_id] \u003d trace_info"},{"line_number":1558,"context_line":"            self.int_br.delete_bridge_external_ids_key(trace_info_key)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_1727e614","line":1555,"range":{"start_line":1555,"start_character":12,"end_line":1555,"end_character":27},"updated":"2019-07-25 10:42:33.000000000","message":"How much info are we going to store in \"external_ids\"?\n\nHow big is this value \"trace_info_json\"?\n\nRemember we can\u0027t abuse the bridge \"external_ids\" register.","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c3e88552e2679909c75f1ae859c873c9ba223a73","unresolved":false,"context_lines":[{"line_number":1556,"context_line":"            trace_info \u003d jsonutils.loads(trace_info_json)"},{"line_number":1557,"context_line":"            self.traces[port_id] \u003d trace_info"},{"line_number":1558,"context_line":"            self.int_br.delete_bridge_external_ids_key(trace_info_key)"},{"line_number":1559,"context_line":"            LOG.debug("},{"line_number":1560,"context_line":"                \u0027trace info for vif plug moved from bridge external_id\u0027"},{"line_number":1561,"context_line":"                \u0027to memory for vif\u003d%s port\u003d%s: %s\u0027,"},{"line_number":1562,"context_line":"                vif_name, port_id, trace_info_json)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_173e0629","line":1559,"updated":"2019-07-25 10:42:33.000000000","message":"I always want to have debug messages, but is this really needed?","commit_id":"2a685c7793aa59d644094a40a15739e63597758f"}]}
