)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"41bd317f39d7030186624aa18cbdfd2d9a15dad2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8983545b_e6ce3af1","updated":"2026-05-29 12:50:33.000000000","message":"Thanks for your review!","commit_id":"4073c4ba9ecca70ffab9634c2be83189884bfc81"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"404399af035cc753365d06b83651e01cf989c797","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"2fbf5ced_dac56223","updated":"2026-06-01 16:55:14.000000000","message":"recheck failed while pulling from quay","commit_id":"4073c4ba9ecca70ffab9634c2be83189884bfc81"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"e34b0676b809d79a3e355f0a8274bb621c52aa2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e37178e1_99b1763f","updated":"2026-06-01 14:08:41.000000000","message":"thanks for the fix Doug, lgtm. As noted in the bug report we might want to implement some notification buffer if the blocking causes problems with incoming notification, but this is great improvement from the current state","commit_id":"4073c4ba9ecca70ffab9634c2be83189884bfc81"}],"watcher/decision_engine/model/collector/base.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"956bfbffcd5cf27697fe047b05532ac993fd563c","unresolved":true,"context_lines":[{"line_number":128,"context_line":"        super().__init__(config)"},{"line_number":129,"context_line":"        self.osc \u003d osc if osc else clients.OpenStackClients()"},{"line_number":130,"context_line":"        self.lock \u003d threading.RLock()"},{"line_number":131,"context_line":"        self.sync_lock \u003d threading.RLock()"},{"line_number":132,"context_line":"        self._audit_scope_handler \u003d None"},{"line_number":133,"context_line":"        self._cluster_data_model \u003d None"},{"line_number":134,"context_line":"        self._data_model_scope \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"315bb06e_8e782628","line":131,"range":{"start_line":131,"start_character":8,"end_line":131,"end_character":42},"updated":"2026-05-27 09:20:59.000000000","message":"May make sense to reuse the existing self.lock?. IIUC the only current usage of lock is to lock the initial creation of the model and the replacement of the \"main model\" in the collector in the setter cluster_data_model. That is used in the synchronize but given that rlock is re-entrant would work fine.\n\nI\u0027d say that would fix the corner case of race between the initial model creation (which is done when calling execute cluster_data_model() for first time out of periodic synchronize), and the update via notification in addition to the synchronize one.\n\nWDYT?","commit_id":"a908712d731a066efc6e8dfd0a5819caaec3b5c0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"90abd27e94edf1daf2f3a948698af2639a42d1fe","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        super().__init__(config)"},{"line_number":129,"context_line":"        self.osc \u003d osc if osc else clients.OpenStackClients()"},{"line_number":130,"context_line":"        self.lock \u003d threading.RLock()"},{"line_number":131,"context_line":"        self.sync_lock \u003d threading.RLock()"},{"line_number":132,"context_line":"        self._audit_scope_handler \u003d None"},{"line_number":133,"context_line":"        self._cluster_data_model \u003d None"},{"line_number":134,"context_line":"        self._data_model_scope \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"b2ac5d66_a01a6c84","line":131,"range":{"start_line":131,"start_character":8,"end_line":131,"end_character":42},"in_reply_to":"28b20094_5e201857","updated":"2026-05-27 14:23:45.000000000","message":"Actually, I think the corner case i mentioned is already covered because the notification handlers also use the cluster_data_model getter","commit_id":"a908712d731a066efc6e8dfd0a5819caaec3b5c0"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"aa76724f1ccf3c54e53f53556494927918957e90","unresolved":true,"context_lines":[{"line_number":128,"context_line":"        super().__init__(config)"},{"line_number":129,"context_line":"        self.osc \u003d osc if osc else clients.OpenStackClients()"},{"line_number":130,"context_line":"        self.lock \u003d threading.RLock()"},{"line_number":131,"context_line":"        self.sync_lock \u003d threading.RLock()"},{"line_number":132,"context_line":"        self._audit_scope_handler \u003d None"},{"line_number":133,"context_line":"        self._cluster_data_model \u003d None"},{"line_number":134,"context_line":"        self._data_model_scope \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"40e67771_3231a3ae","line":131,"range":{"start_line":131,"start_character":8,"end_line":131,"end_character":42},"in_reply_to":"315bb06e_8e782628","updated":"2026-05-27 12:38:28.000000000","message":"If we reuse the existing self.lock that would block any additional thread to read the current model. So if the collector takes 10m to synchronize, any other Audit thread would also be blocked during this period. That would be the reason for a different lock.","commit_id":"a908712d731a066efc6e8dfd0a5819caaec3b5c0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ef7516f5b621813925fd8e53d8cbd173ef3a4dea","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        super().__init__(config)"},{"line_number":129,"context_line":"        self.osc \u003d osc if osc else clients.OpenStackClients()"},{"line_number":130,"context_line":"        self.lock \u003d threading.RLock()"},{"line_number":131,"context_line":"        self.sync_lock \u003d threading.RLock()"},{"line_number":132,"context_line":"        self._audit_scope_handler \u003d None"},{"line_number":133,"context_line":"        self._cluster_data_model \u003d None"},{"line_number":134,"context_line":"        self._data_model_scope \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"28b20094_5e201857","line":131,"range":{"start_line":131,"start_character":8,"end_line":131,"end_character":42},"in_reply_to":"40e67771_3231a3ae","updated":"2026-05-27 12:48:26.000000000","message":"Right, that\u0027s much worse.","commit_id":"a908712d731a066efc6e8dfd0a5819caaec3b5c0"}],"watcher/tests/unit/decision_engine/cluster/test_cluster_data_model_collector.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"956bfbffcd5cf27697fe047b05532ac993fd563c","unresolved":true,"context_lines":[{"line_number":132,"context_line":"            notif_thread.join(timeout\u003d3)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # The node must have been added to new_model"},{"line_number":135,"context_line":"        collector.cluster_data_model.add_node.assert_called_once_with("},{"line_number":136,"context_line":"            dummy_node"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"class TestComputeDataModelCollector(test_base.TestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"f1ce4f9e_1925f73f","line":137,"range":{"start_line":135,"start_character":0,"end_line":137,"end_character":9},"updated":"2026-05-27 09:20:59.000000000","message":"IMO it\u0027d be more clear:\n\n\n\n```suggestion\n        new_model.add_node.assert_called_once_with(\n            dummy_node\n        )\n        old_model.add_node.assert_not_called()\n```","commit_id":"a908712d731a066efc6e8dfd0a5819caaec3b5c0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7d633b932434fc7712003b70d5344b204fe83276","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            notif_thread.join(timeout\u003d3)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # The node must have been added to new_model"},{"line_number":135,"context_line":"        collector.cluster_data_model.add_node.assert_called_once_with("},{"line_number":136,"context_line":"            dummy_node"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"class TestComputeDataModelCollector(test_base.TestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"88c3de0d_ce67dbc8","line":137,"range":{"start_line":135,"start_character":0,"end_line":137,"end_character":9},"in_reply_to":"c70b16e2_0bb88fbf","updated":"2026-05-29 15:34:03.000000000","message":"Thanks!","commit_id":"a908712d731a066efc6e8dfd0a5819caaec3b5c0"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"41bd317f39d7030186624aa18cbdfd2d9a15dad2","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            notif_thread.join(timeout\u003d3)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # The node must have been added to new_model"},{"line_number":135,"context_line":"        collector.cluster_data_model.add_node.assert_called_once_with("},{"line_number":136,"context_line":"            dummy_node"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"class TestComputeDataModelCollector(test_base.TestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c70b16e2_0bb88fbf","line":137,"range":{"start_line":135,"start_character":0,"end_line":137,"end_character":9},"in_reply_to":"f1ce4f9e_1925f73f","updated":"2026-05-29 12:50:33.000000000","message":"Done","commit_id":"a908712d731a066efc6e8dfd0a5819caaec3b5c0"}]}
