)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9af6e99cef80f3d28966b44d928d8fe8edaea1c8","unresolved":true,"context_lines":[{"line_number":11,"context_line":"agent when a Chassis is created\" and to be able to create a"},{"line_number":12,"context_line":"WaitEvent that would fire on the same condition, *after* the other"},{"line_number":13,"context_line":"event is finished. E.g. \"after the neutron agent is created, call"},{"line_number":14,"context_line":"get_agent() to verify that it is there.\""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Since RowEventHandler._watched_events is a set, events are not"},{"line_number":17,"context_line":"ordered, so sometimes the WaitEvent matches before the other"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"2f3d7e60_8d0d2e70","line":14,"updated":"2021-11-24 14:49:21.000000000","message":"Hi Terry. Correct me if I\u0027m wrong: in your example, you have two event types: one event generated by OVS and the second one generated by Neutron. How OVS can handle the second type of events?\n\nOr maybe what I\u0027m saying has no sense at all and I misunderstood the patch.","commit_id":"062fe6603c44ca59357585bc0010dba6da3e784f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ab8f9554e65e144f5961a38fc9b88b1894663570","unresolved":true,"context_lines":[{"line_number":11,"context_line":"agent when a Chassis is created\" and to be able to create a"},{"line_number":12,"context_line":"WaitEvent that would fire on the same condition, *after* the other"},{"line_number":13,"context_line":"event is finished. E.g. \"after the neutron agent is created, call"},{"line_number":14,"context_line":"get_agent() to verify that it is there.\""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Since RowEventHandler._watched_events is a set, events are not"},{"line_number":17,"context_line":"ordered, so sometimes the WaitEvent matches before the other"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"91a283df_fdd14097","line":14,"in_reply_to":"2f3d7e60_8d0d2e70","updated":"2021-11-24 15:09:59.000000000","message":"Sorry, it\u0027s a little confusing.\n\nThis patch only deals with RowEvents, which WaitEvents are a subclass. In the example, there is a RowEvent like ChassisAgentWriteEvent that looks for a Chassis_Private to be created, and it\u0027ll add a Neutron agent to the db. In a test, I\u0027d like to be able to have a WaitEvent that also waits on that Chassis_Private to be created, but that definitely fires after ChassisAgentWriteEvent.run() is called and creates the agent in the neutron db, so I can test that get_agent() works. Right now, the WaitEvent might happen before the ChassisAgentWriteEvent, so get_agent() might be called before the agent is actually created.","commit_id":"062fe6603c44ca59357585bc0010dba6da3e784f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"b099623be48bfa188c09c6951f137eca07fec4f3","unresolved":false,"context_lines":[{"line_number":11,"context_line":"agent when a Chassis is created\" and to be able to create a"},{"line_number":12,"context_line":"WaitEvent that would fire on the same condition, *after* the other"},{"line_number":13,"context_line":"event is finished. E.g. \"after the neutron agent is created, call"},{"line_number":14,"context_line":"get_agent() to verify that it is there.\""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Since RowEventHandler._watched_events is a set, events are not"},{"line_number":17,"context_line":"ordered, so sometimes the WaitEvent matches before the other"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"aa302239_a93e372b","line":14,"in_reply_to":"91a283df_fdd14097","updated":"2021-11-30 23:16:36.000000000","message":"Done","commit_id":"062fe6603c44ca59357585bc0010dba6da3e784f"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9af6e99cef80f3d28966b44d928d8fe8edaea1c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cba43465_3a6e677c","updated":"2021-11-24 14:49:21.000000000","message":"Hi Terr","commit_id":"062fe6603c44ca59357585bc0010dba6da3e784f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b74078f4d2814bd420c0b4aaf3d4f0a004d43557","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e35cc638_17f5f134","updated":"2021-11-24 19:36:44.000000000","message":"I think it is a beautiful piece of code","commit_id":"389b366364e2c40341ee3b5a3e3388d33e199f05"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"bd53c4768a55d3ca45214e123f4a37eb3bbd775e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"72f595d3_940c87aa","updated":"2021-11-24 23:12:58.000000000","message":"I\u0027m a little confused by the failing lsp functional tests (which use WaitEvents) as they pass fine locally, even after 100s of runs.","commit_id":"5d2650ba32cc108bbf1b592f37bb3b2838272b97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8196ba855518e1e1224195a5686fe2abc6a6173f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f869b2b4_e8c6bb01","updated":"2021-11-29 00:21:26.000000000","message":"the functional failure seems to be related to the wait event:\n\n  File \"/home/zuul/src/opendev.org/openstack/ovsdbapp/ovsdbapp/tests/functional/schema/ovn_southbound/test_impl_idl.py\", line 98, in _add_chassis_switch_port\n    self.assertTrue(row_event.wait())\n  File \"/usr/lib/python3.8/unittest/case.py\", line 765, in assertTrue\n    raise self.failureException(msg)\nAssertionError: False is not true","commit_id":"fa42e85c915e6e2d0d47009fc9de9d15456a596e"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"7a99802a776e185d67338243e004f75b0673f772","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"75000673_5adebc51","updated":"2021-11-30 14:37:32.000000000","message":"recheck\n\none more time trying for lsp_bind error","commit_id":"1c351a9f606d32a3427ae88d3cef66df2aedf768"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ff49bbd2836563356cc9f328a8fed2ea8e858700","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"ca5a2847_c9ca6771","updated":"2021-11-29 20:32:56.000000000","message":"recheck\n\nsee if we can hit the lsp_bind test failures","commit_id":"1c351a9f606d32a3427ae88d3cef66df2aedf768"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"a614e391fe701f969d4d0e32ba5ccad9aa0f6bc2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"622a710c_c82e2dac","updated":"2021-11-29 22:09:07.000000000","message":"recheck\n\ntry to hit lsp_bind failure again","commit_id":"1c351a9f606d32a3427ae88d3cef66df2aedf768"}],"ovsdbapp/event.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f5e253ff5963157bc1a7da2630649a3cd6a54daa","unresolved":true,"context_lines":[{"line_number":109,"context_line":"    def _get_queue(self, event):"},{"line_number":110,"context_line":"        if isinstance(event, WaitEvent):"},{"line_number":111,"context_line":"            return self._wait_events"},{"line_number":112,"context_line":"        return self._watched_events"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @property"},{"line_number":115,"context_line":"    def _watched_events(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"e514f130_5aab6107","line":112,"range":{"start_line":112,"start_character":20,"end_line":112,"end_character":35},"updated":"2021-11-24 15:38:32.000000000","message":"Should this be self._events ?","commit_id":"062fe6603c44ca59357585bc0010dba6da3e784f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"bd53c4768a55d3ca45214e123f4a37eb3bbd775e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def _get_queue(self, event):"},{"line_number":110,"context_line":"        if isinstance(event, WaitEvent):"},{"line_number":111,"context_line":"            return self._wait_events"},{"line_number":112,"context_line":"        return self._watched_events"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @property"},{"line_number":115,"context_line":"    def _watched_events(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1b37aaf2_df968a7d","line":112,"range":{"start_line":112,"start_character":20,"end_line":112,"end_character":35},"in_reply_to":"e514f130_5aab6107","updated":"2021-11-24 23:12:58.000000000","message":"Done","commit_id":"062fe6603c44ca59357585bc0010dba6da3e784f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"56b50ef5407d74e4dcc382105c24f57bdcc6d5c9","unresolved":true,"context_lines":[{"line_number":18,"context_line":"import threading"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"try:"},{"line_number":21,"context_line":"    import sortedcontainers"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    from ovs.compat import sortedcontainers"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba9255ef_196cee9b","line":21,"range":{"start_line":21,"start_character":11,"end_line":21,"end_character":27},"updated":"2021-12-01 12:06:28.000000000","message":"We\u0027ll need to add this to requirements.","commit_id":"1c351a9f606d32a3427ae88d3cef66df2aedf768"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"a6f66cd2f0b0fc7a71852bf77d426e9c19b6e333","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import threading"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"try:"},{"line_number":21,"context_line":"    import sortedcontainers"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    from ovs.compat import sortedcontainers"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9276c99e_1631f9cc","line":21,"range":{"start_line":21,"start_character":11,"end_line":21,"end_character":27},"in_reply_to":"ba9255ef_196cee9b","updated":"2021-12-01 14:57:01.000000000","message":"python-ovs already contains an in-tree version of sortedcontainers and it is already a requirement. We will opportunistically use the system-installed one if it exists. sortedcontainers isn\u0027t available in several distros (RHEL \u003c 9 for example). So we didn\u0027t want to make this a hard requirement.","commit_id":"1c351a9f606d32a3427ae88d3cef66df2aedf768"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"56b50ef5407d74e4dcc382105c24f57bdcc6d5c9","unresolved":true,"context_lines":[{"line_number":20,"context_line":"try:"},{"line_number":21,"context_line":"    import sortedcontainers"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    from ovs.compat import sortedcontainers"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":"STOP_EVENT \u003d (\"STOP\", None, None, None)"}],"source_content_type":"text/x-python","patch_set":9,"id":"958e7310_e14f793d","line":23,"range":{"start_line":23,"start_character":4,"end_line":23,"end_character":43},"updated":"2021-12-01 12:06:28.000000000","message":"Why do we need this?","commit_id":"1c351a9f606d32a3427ae88d3cef66df2aedf768"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"a6f66cd2f0b0fc7a71852bf77d426e9c19b6e333","unresolved":false,"context_lines":[{"line_number":20,"context_line":"try:"},{"line_number":21,"context_line":"    import sortedcontainers"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    from ovs.compat import sortedcontainers"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":"STOP_EVENT \u003d (\"STOP\", None, None, None)"}],"source_content_type":"text/x-python","patch_set":9,"id":"c132d389_cd4b28cf","line":23,"range":{"start_line":23,"start_character":4,"end_line":23,"end_character":43},"in_reply_to":"958e7310_e14f793d","updated":"2021-12-01 14:57:01.000000000","message":"See above. :)","commit_id":"1c351a9f606d32a3427ae88d3cef66df2aedf768"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5780793cf448ca5c8c793c78f33760d45c312d4c","unresolved":true,"context_lines":[{"line_number":17,"context_line":"import queue"},{"line_number":18,"context_line":"import threading"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Several supported distros don\u0027t package sortedcontainers. For this reason"},{"line_number":21,"context_line":"# python-ovs, which requires it for indexing support, has an in-tree copy of"},{"line_number":22,"context_line":"# it. We already require sortedcontainers through python-ovs\u0027 dependency, so"},{"line_number":23,"context_line":"# to avoid issues with distro packaging, we don\u0027t add sortedcontainers as a"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ec8bf7b_8b60494a","line":20,"updated":"2021-12-02 15:04:33.000000000","message":"Thanks for the detailed explanation.","commit_id":"5d269bf9103449bc0a4d01fcd0bb3d0ab2556fdf"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"b9f3409f9dd326f3b33eb2995645a211a4ef2197","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import queue"},{"line_number":18,"context_line":"import threading"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Several supported distros don\u0027t package sortedcontainers. For this reason"},{"line_number":21,"context_line":"# python-ovs, which requires it for indexing support, has an in-tree copy of"},{"line_number":22,"context_line":"# it. We already require sortedcontainers through python-ovs\u0027 dependency, so"},{"line_number":23,"context_line":"# to avoid issues with distro packaging, we don\u0027t add sortedcontainers as a"}],"source_content_type":"text/x-python","patch_set":10,"id":"32a60722_d3c38f68","line":20,"in_reply_to":"3ec8bf7b_8b60494a","updated":"2021-12-02 16:06:01.000000000","message":"Done","commit_id":"5d269bf9103449bc0a4d01fcd0bb3d0ab2556fdf"}],"ovsdbapp/tests/unit/test_event.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5c6be56a39e331f357d40e9b6a0b1d8f082e7c6b","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    def setUp(self):"},{"line_number":43,"context_line":"        super().setUp()"},{"line_number":44,"context_line":"        self.handler \u003d event.RowEventHandler()"},{"line_number":45,"context_line":"        self.assertEqual(0, len(tuple(self.handler._watched_events)))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_watch_event(self):"},{"line_number":48,"context_line":"        event \u003d TestEvent()"}],"source_content_type":"text/x-python","patch_set":6,"id":"fe05a029_726444dc","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":69},"updated":"2021-11-24 21:54:51.000000000","message":"Would\n  self.assertFalse(self.handler._watched_events)\n\nwork?","commit_id":"fd4e0f1d3008947ad11bf9a82ba4e24c593d8f41"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c8a08a1da69af3c80d6fdaa688f394935b3effe1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def setUp(self):"},{"line_number":43,"context_line":"        super().setUp()"},{"line_number":44,"context_line":"        self.handler \u003d event.RowEventHandler()"},{"line_number":45,"context_line":"        self.assertEqual(0, len(tuple(self.handler._watched_events)))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_watch_event(self):"},{"line_number":48,"context_line":"        event \u003d TestEvent()"}],"source_content_type":"text/x-python","patch_set":6,"id":"4651bd87_06341154","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":69},"in_reply_to":"fe05a029_726444dc","updated":"2021-11-30 23:25:54.000000000","message":"_watched_events is an iterator, so it won\u0027t ever be False. We could get rid of the len() call and use assertFalse, but I really wanted to test specifically that there were no items. If the value were somehow None, for example, it would be wrong. I admint it is probably a silly distinction.","commit_id":"fd4e0f1d3008947ad11bf9a82ba4e24c593d8f41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f4e43d337094658751b579112e12686a70fbdcb9","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        event \u003d TestEvent()"},{"line_number":60,"context_line":"        expected \u003d (event,)"},{"line_number":61,"context_line":"        self.handler.watch_event(event)"},{"line_number":62,"context_line":"        self.assertCountEqual(self.handler._watched_events, expected)"},{"line_number":63,"context_line":"        return expected"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_watch_events(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"faa5ce3b_8eeb21c3","line":62,"range":{"start_line":62,"start_character":30,"end_line":62,"end_character":68},"updated":"2021-11-27 23:06:53.000000000","message":"nit: The order is usually \"expected, observed\", no?","commit_id":"5d2650ba32cc108bbf1b592f37bb3b2838272b97"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8268c0e40c7fa43064f6b30cff8acf14347ffd90","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        event \u003d TestEvent()"},{"line_number":60,"context_line":"        expected \u003d (event,)"},{"line_number":61,"context_line":"        self.handler.watch_event(event)"},{"line_number":62,"context_line":"        self.assertCountEqual(self.handler._watched_events, expected)"},{"line_number":63,"context_line":"        return expected"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_watch_events(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"a53b68e7_5531a581","line":62,"range":{"start_line":62,"start_character":30,"end_line":62,"end_character":68},"in_reply_to":"faa5ce3b_8eeb21c3","updated":"2021-11-28 21:28:54.000000000","message":"Done","commit_id":"5d2650ba32cc108bbf1b592f37bb3b2838272b97"}]}
