)]}'
{"networking_ovn/ml2/mech_driver.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"84dfa82a7892b8094237aca2d60b1628908cde28","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self._plugin_property \u003d None"},{"line_number":106,"context_line":"        self._ovn_client_inst \u003d None"},{"line_number":107,"context_line":"        self._maintenance_thread \u003d None"},{"line_number":108,"context_line":"        self.node_uuid \u003d None"},{"line_number":109,"context_line":"        self.sg_enabled \u003d ovn_acl.is_sg_enabled()"},{"line_number":110,"context_line":"        self._post_fork_event \u003d threading.Event()"},{"line_number":111,"context_line":"        if cfg.CONF.SECURITYGROUP.firewall_driver:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_782aaa90","line":108,"range":{"start_line":108,"start_character":13,"end_line":108,"end_character":22},"updated":"2019-05-09 13:22:23.000000000","message":"hash_ring_node_uuid","commit_id":"b315f8347482ecf64648c67942348efe8bbc194a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"99590a0638b6d493c9fc3a8fb37d9f5cc983d5ba","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        \"\"\"Pre-initialize the ML2/OVN driver.\"\"\""},{"line_number":191,"context_line":"        self._clean_hash_ring()"},{"line_number":192,"context_line":"        atexit.register(self._clean_hash_ring)"},{"line_number":193,"context_line":"        signal.signal(signal.SIGTERM, self._clean_hash_ring)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def post_fork_initialize(self, resource, event, trigger, payload\u003dNone):"},{"line_number":196,"context_line":"        # NOTE(rtheis): This will initialize all workers (API, RPC,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_3fabc689","line":193,"range":{"start_line":193,"start_character":0,"end_line":193,"end_character":60},"updated":"2019-05-23 09:01:52.000000000","message":"So do we need this when we have atexit.register or do we even need the atexit? I mean, it probably doesn\u0027t hurt to call it twice, just trying to understand the reason behind atexit, is it for cases of unhandled exception in neutron-server?","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"75815b50b3edc902214cfb427b83bcff7b4583a0","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        \"\"\"Pre-initialize the ML2/OVN driver.\"\"\""},{"line_number":191,"context_line":"        self._clean_hash_ring()"},{"line_number":192,"context_line":"        atexit.register(self._clean_hash_ring)"},{"line_number":193,"context_line":"        signal.signal(signal.SIGTERM, self._clean_hash_ring)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def post_fork_initialize(self, resource, event, trigger, payload\u003dNone):"},{"line_number":196,"context_line":"        # NOTE(rtheis): This will initialize all workers (API, RPC,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_e7b275e6","line":193,"range":{"start_line":193,"start_character":0,"end_line":193,"end_character":60},"in_reply_to":"bfb3d3c7_07d0e94f","updated":"2019-05-23 09:19:52.000000000","message":"You don\u0027t need to change it, it was a question :) I don\u0027t think it can harm to call the cleanup twice when sigterm is received.","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c316a80d73e35c1bcab6e6a6c8db12970c3d0989","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        \"\"\"Pre-initialize the ML2/OVN driver.\"\"\""},{"line_number":191,"context_line":"        self._clean_hash_ring()"},{"line_number":192,"context_line":"        atexit.register(self._clean_hash_ring)"},{"line_number":193,"context_line":"        signal.signal(signal.SIGTERM, self._clean_hash_ring)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def post_fork_initialize(self, resource, event, trigger, payload\u003dNone):"},{"line_number":196,"context_line":"        # NOTE(rtheis): This will initialize all workers (API, RPC,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_07d0e94f","line":193,"range":{"start_line":193,"start_character":0,"end_line":193,"end_character":60},"in_reply_to":"bfb3d3c7_3fabc689","updated":"2019-05-23 09:17:54.000000000","message":"I was trying to be on the safe-side that\u0027s why I added both. But from my experience we could get rid of one of them.\n\nI will do it.","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f2b5ce58b88c40bac3521e7589ce581fb2999df0","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        \"\"\"Pre-initialize the ML2/OVN driver.\"\"\""},{"line_number":191,"context_line":"        self._clean_hash_ring()"},{"line_number":192,"context_line":"        atexit.register(self._clean_hash_ring)"},{"line_number":193,"context_line":"        signal.signal(signal.SIGTERM, self._clean_hash_ring)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def post_fork_initialize(self, resource, event, trigger, payload\u003dNone):"},{"line_number":196,"context_line":"        # NOTE(rtheis): This will initialize all workers (API, RPC,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_de5a9728","line":193,"range":{"start_line":193,"start_character":0,"end_line":193,"end_character":60},"in_reply_to":"bfb3d3c7_e7b275e6","updated":"2019-05-23 12:24:25.000000000","message":"Fair enough then!","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"}],"networking_ovn/ovsdb/ovsdb_monitor.py":[{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"9031be89d82441e661545fd98bb57e09b337af01","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        target_node \u003d self._hash_ring.get_node(str(row.uuid))"},{"line_number":355,"context_line":"        if target_node !\u003d self._node_uuid:"},{"line_number":356,"context_line":"            return"},{"line_number":357,"context_line":"        LOG.info(\u0027Hash Ring: Node %(node)s (host: %(hostname)s) \u0027"},{"line_number":358,"context_line":"                 \u0027handling event \"%(event)s\" for row %(row)s\u0027,"},{"line_number":359,"context_line":"                 {\u0027node\u0027: self._node_uuid, \u0027hostname\u0027: CONF.host,"},{"line_number":360,"context_line":"                  \u0027event\u0027: event, \u0027row\u0027: row.uuid})"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_19d634f3","line":357,"range":{"start_line":357,"start_character":8,"end_line":357,"end_character":27},"updated":"2019-04-24 11:46:09.000000000","message":"You want to have this as INFO rather than DEBUG, right? I see the point as this will allow better troubleshooting but it contains a lot of implementation details and will make the logs bigger. Do you still want to keep it like this?","commit_id":"07f235e9aa887fc3ce7e08dc98b987e757e19a27"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"863b12ba13794e07559ccd46710e3bc225ccd672","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        target_node \u003d self._hash_ring.get_node(str(row.uuid))"},{"line_number":355,"context_line":"        if target_node !\u003d self._node_uuid:"},{"line_number":356,"context_line":"            return"},{"line_number":357,"context_line":"        LOG.info(\u0027Hash Ring: Node %(node)s (host: %(hostname)s) \u0027"},{"line_number":358,"context_line":"                 \u0027handling event \"%(event)s\" for row %(row)s\u0027,"},{"line_number":359,"context_line":"                 {\u0027node\u0027: self._node_uuid, \u0027hostname\u0027: CONF.host,"},{"line_number":360,"context_line":"                  \u0027event\u0027: event, \u0027row\u0027: row.uuid})"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_bc6036a7","line":357,"range":{"start_line":357,"start_character":8,"end_line":357,"end_character":27},"in_reply_to":"ffb9cba7_19d634f3","updated":"2019-04-24 12:25:04.000000000","message":"I haven\u0027t put much thought into it. This will be logged once per event (just the worker actually handling it) so I thought INFO would be fine but, maybe we will flood things a bit. I will check the logs after I run some tempest and stuff to see how it looks like.\n\nIf we want to be on the safer side, I guess DEBUG won\u0027t do any harm either.","commit_id":"07f235e9aa887fc3ce7e08dc98b987e757e19a27"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"99590a0638b6d493c9fc3a8fb37d9f5cc983d5ba","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        \"\"\"Should be called after the idl has been initialized\"\"\""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"class OvnIdlDistributedLock(BaseOvnIdl):"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __init__(self, driver, remote, schema):"},{"line_number":348,"context_line":"        super(OvnIdlDistributedLock, self).__init__(remote, schema)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_7f061e89","line":345,"range":{"start_line":345,"start_character":28,"end_line":345,"end_character":38},"updated":"2019-05-23 09:01:52.000000000","message":"So you don\u0027t inherit from OvnIdl just to decouple it and make it easier to remove it in the future?","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c316a80d73e35c1bcab6e6a6c8db12970c3d0989","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        \"\"\"Should be called after the idl has been initialized\"\"\""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"class OvnIdlDistributedLock(BaseOvnIdl):"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __init__(self, driver, remote, schema):"},{"line_number":348,"context_line":"        super(OvnIdlDistributedLock, self).__init__(remote, schema)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_8717f9ed","line":345,"range":{"start_line":345,"start_character":28,"end_line":345,"end_character":38},"in_reply_to":"bfb3d3c7_7f061e89","updated":"2019-05-23 09:17:54.000000000","message":"Yes, the OvnIdl (bad naming) uses the OVSDB lock mechanism and the new class (OvnIdlDistributedLock) uses the hash ring.\n\nI kept the OvnIdl in place because I think it\u0027s still useful, for example, the metadata agent uses it:\n\nhttps://github.com/openstack/networking-ovn/blob/f92b5aa08708fcb75ebdc864a5a387a27958c17e/networking_ovn/agent/metadata/ovsdb.py#L26\n\nAnd reedip\u0027s event handler patch also uses it. The OVSDB lock is still ideal for some use cases.\n\nAnd as you said, if turns out we do not want to use it anymore we can update the code later and remove that class.","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"99590a0638b6d493c9fc3a8fb37d9f5cc983d5ba","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        try:"},{"line_number":356,"context_line":"            target_node \u003d self._hash_ring.get_node(str(row.uuid))"},{"line_number":357,"context_line":"        except exceptions.HashRingIsEmpty as e:"},{"line_number":358,"context_line":"            LOG.error(\u0027An error occured while getting a node from \u0027"},{"line_number":359,"context_line":"                      \u0027the HashRing: %s\u0027, e)"},{"line_number":360,"context_line":"            return"},{"line_number":361,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_982be880","line":358,"range":{"start_line":358,"start_character":23,"end_line":358,"end_character":65},"updated":"2019-05-23 09:01:52.000000000","message":"nit: We caught HashRingIsEmpty so we are sure the error was an empty hash ring","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c316a80d73e35c1bcab6e6a6c8db12970c3d0989","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        try:"},{"line_number":356,"context_line":"            target_node \u003d self._hash_ring.get_node(str(row.uuid))"},{"line_number":357,"context_line":"        except exceptions.HashRingIsEmpty as e:"},{"line_number":358,"context_line":"            LOG.error(\u0027An error occured while getting a node from \u0027"},{"line_number":359,"context_line":"                      \u0027the HashRing: %s\u0027, e)"},{"line_number":360,"context_line":"            return"},{"line_number":361,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_87ecd9f3","line":358,"range":{"start_line":358,"start_character":23,"end_line":358,"end_character":65},"in_reply_to":"bfb3d3c7_982be880","updated":"2019-05-23 09:17:54.000000000","message":"True.\n\nI am appending the error string from the exception in the log. That will basically say that the HashRing was empty.\n\nI can try to reword it later too.","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"}],"networking_ovn/ovsdb/worker.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d968ae3d28997605cc1b632d361da63e6c25a85","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class MaintenanceWorker(worker.BaseWorker):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def start(self):"},{"line_number":22,"context_line":"        super(MaintenanceWorker, self).start()"},{"line_number":23,"context_line":"        # NOTE(twilson) The super class will trigger the post_fork_initialize"},{"line_number":24,"context_line":"        # in the driver, which starts the connection/IDL notify loop which"},{"line_number":25,"context_line":"        # keeps the process from exiting"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfb3d3c7_13f4a05a","line":22,"updated":"2019-05-23 18:34:25.000000000","message":"nit: I wonder why we need either of these three methods since they just call super(), isn\u0027t that what class inheritance is for :)","commit_id":"6ef5489cf70cbc140a8768727350a8556fc8e870"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"7d51750a8082327301a2b16acf8fa01c5c455f0a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class MaintenanceWorker(worker.BaseWorker):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def start(self):"},{"line_number":22,"context_line":"        super(MaintenanceWorker, self).start()"},{"line_number":23,"context_line":"        # NOTE(twilson) The super class will trigger the post_fork_initialize"},{"line_number":24,"context_line":"        # in the driver, which starts the connection/IDL notify loop which"},{"line_number":25,"context_line":"        # keeps the process from exiting"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfb3d3c7_3b43b3b1","line":22,"in_reply_to":"bfb3d3c7_13f4a05a","updated":"2019-05-24 07:57:59.000000000","message":"They are abstractmethods in the superclass. If you inherit from an Abstract class and not implement an abstract method, Python is gonna raise an exception. But yeah, why are they abstract methods when you don\u0027t need to implement them :)","commit_id":"6ef5489cf70cbc140a8768727350a8556fc8e870"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"122777d23e29cb202f06b78f894e177b67c5dcdd","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class MaintenanceWorker(worker.BaseWorker):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def start(self):"},{"line_number":22,"context_line":"        super(MaintenanceWorker, self).start()"},{"line_number":23,"context_line":"        # NOTE(twilson) The super class will trigger the post_fork_initialize"},{"line_number":24,"context_line":"        # in the driver, which starts the connection/IDL notify loop which"},{"line_number":25,"context_line":"        # keeps the process from exiting"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfb3d3c7_be2471b0","line":22,"in_reply_to":"bfb3d3c7_3b43b3b1","updated":"2019-05-24 08:17:26.000000000","message":"+1, let\u0027s un-abstract in a separate patchy :)","commit_id":"6ef5489cf70cbc140a8768727350a8556fc8e870"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3dfb481501f95d97333c1bbf045e6c2412d5973a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class MaintenanceWorker(worker.BaseWorker):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def start(self):"},{"line_number":22,"context_line":"        super(MaintenanceWorker, self).start()"},{"line_number":23,"context_line":"        # NOTE(twilson) The super class will trigger the post_fork_initialize"},{"line_number":24,"context_line":"        # in the driver, which starts the connection/IDL notify loop which"},{"line_number":25,"context_line":"        # keeps the process from exiting"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfb3d3c7_9b117f60","line":22,"in_reply_to":"bfb3d3c7_3b43b3b1","updated":"2019-05-24 08:15:38.000000000","message":"Hah yeah indeed, it does look strange when u see it like it. Thanks Kuba for clarifying","commit_id":"6ef5489cf70cbc140a8768727350a8556fc8e870"}],"networking_ovn/tests/functional/test_ovsdb_monitor.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"99590a0638b6d493c9fc3a8fb37d9f5cc983d5ba","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.assertTrue(row_event.wait())"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # Assert that only one worker handled the event"},{"line_number":228,"context_line":"        self.assertEqual(1, row_event.COUNTER)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"class TestNBDbMonitorOverTcp(TestNBDbMonitor):"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_e7a59505","line":228,"updated":"2019-05-23 09:01:52.000000000","message":"What if there is a bug in the code and the event is picked by both workers, the worker 1 calls event.set() and we assert here while the second worker still handles the event and hasn\u0027t bumped the counter yet.\n\nWould it be better to use more workers, like 10? To higher the chance of hitting some race condition, if any.","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"2efd213b5f8159054e9bcac8ecb877547be41033","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.assertTrue(row_event.wait())"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # Assert that only one worker handled the event"},{"line_number":228,"context_line":"        self.assertEqual(1, row_event.COUNTER)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"class TestNBDbMonitorOverTcp(TestNBDbMonitor):"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_27908d43","line":228,"in_reply_to":"bfb3d3c7_e7a59505","updated":"2019-05-23 09:19:11.000000000","message":"+1 to this! not sure how likely is the yielding but it\u0027d be great also to mess a little bit and generate a bunch of other events to create more chaos","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c316a80d73e35c1bcab6e6a6c8db12970c3d0989","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.assertTrue(row_event.wait())"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # Assert that only one worker handled the event"},{"line_number":228,"context_line":"        self.assertEqual(1, row_event.COUNTER)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"class TestNBDbMonitorOverTcp(TestNBDbMonitor):"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_679f655f","line":228,"in_reply_to":"bfb3d3c7_e7a59505","updated":"2019-05-23 09:17:54.000000000","message":"That\u0027s a good point, I absolutely can wrap those workers creation into a function and create multiple (like u said 10 or more) while keeping the code clean.\n\nI will do it!","commit_id":"9b7a35549d2c4dc04b1fb957a5d0304aa7639c5e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c58e1bdc12c88f4aa1d6d3ea4b705d92aa2db11c","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.event_name \u003d \u0027DistributedLockTestEvent\u0027"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def run(self, event, row, old):"},{"line_number":65,"context_line":"        self.COUNTER +\u003d 1"},{"line_number":66,"context_line":"        self.event.set()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bfb3d3c7_42b6488c","line":65,"updated":"2019-05-31 13:31:20.000000000","message":"Suggestion: We can add a log message here. In case something goes wrong it can help debugging the test with the logs in the functional directory.","commit_id":"6ef5489cf70cbc140a8768727350a8556fc8e870"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"652cdc3318aea1de2c787ad007ed682fb11b7544","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.event_name \u003d \u0027DistributedLockTestEvent\u0027"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def run(self, event, row, old):"},{"line_number":65,"context_line":"        self.COUNTER +\u003d 1"},{"line_number":66,"context_line":"        self.event.set()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bfb3d3c7_fddefd6a","line":65,"in_reply_to":"bfb3d3c7_42b6488c","updated":"2019-05-31 13:39:52.000000000","message":"++\n\nWe\u0027ve spoken on IRC about adding a release note for this change as well. I add the log and the release note in a follow up patch since this one is already +A\u0027d.","commit_id":"6ef5489cf70cbc140a8768727350a8556fc8e870"}]}
