)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b1605923733359381fa5da10c3972299a82f5edc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"ba411fcf_96012625","updated":"2025-11-12 14:20:29.000000000","message":"restating my +2","commit_id":"fac1a4d9de977cbc5579c51ff8c21f587ced8e22"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"75ffe6fa7e4bae73147e27e177e99bc438bdab7b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e4372ee6_6a07030e","updated":"2025-11-14 21:43:53.000000000","message":"this lgtm, some comment but those are trivial and can be addressed in the change that is fixing the bug.","commit_id":"fac1a4d9de977cbc5579c51ff8c21f587ced8e22"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"b9130c38c3c94de2ab7787f081f17ede1e3f6ff7","unresolved":true,"context_lines":[{"line_number":700,"context_line":"        for vol_id in vol_ids:"},{"line_number":701,"context_line":"            # wait for each vol to get attached"},{"line_number":702,"context_line":"            self._wait_for_volume_attach(server[\u0027id\u0027], vol_id)"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        # this is just to refresh server object"},{"line_number":705,"context_line":"        # so attached volumes can be shown in server"},{"line_number":706,"context_line":"        return self._show_server(server)"}],"source_content_type":"text/x-python","patch_set":4,"id":"39f35185_fe9b7420","line":703,"updated":"2024-08-08 12:35:53.000000000","message":"here also we can pass a single volume to attach.\nand we are waiting until the last one gets added, but wait for notification is missing\n```self.notifier.wait_for_versioned_notifications(\u0027instance.volume_attach.end\u0027)```","commit_id":"2cdf0e4fb544a65aefa8435c22441c01e9bde549"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7ce40167646ebad9b6d0835c1ee5456e5ba32977","unresolved":true,"context_lines":[{"line_number":700,"context_line":"        for vol_id in vol_ids:"},{"line_number":701,"context_line":"            # wait for each vol to get attached"},{"line_number":702,"context_line":"            self._wait_for_volume_attach(server[\u0027id\u0027], vol_id)"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        # this is just to refresh server object"},{"line_number":705,"context_line":"        # so attached volumes can be shown in server"},{"line_number":706,"context_line":"        return self._show_server(server)"}],"source_content_type":"text/x-python","patch_set":4,"id":"b24c0d13_ac27c1e1","line":703,"in_reply_to":"0ba203fb_59043d90","updated":"2025-11-12 10:09:52.000000000","message":"yes I\u0027m not trying to fix all existing usage as that is not part of fixing the bug\n\nim just adding the helper method for the  new usages\n\nwe could clean up the older usage but thats not in scope of this patch","commit_id":"2cdf0e4fb544a65aefa8435c22441c01e9bde549"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"e8673f13c15d4c4023e8a8548467707129837ced","unresolved":true,"context_lines":[{"line_number":700,"context_line":"        for vol_id in vol_ids:"},{"line_number":701,"context_line":"            # wait for each vol to get attached"},{"line_number":702,"context_line":"            self._wait_for_volume_attach(server[\u0027id\u0027], vol_id)"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        # this is just to refresh server object"},{"line_number":705,"context_line":"        # so attached volumes can be shown in server"},{"line_number":706,"context_line":"        return self._show_server(server)"}],"source_content_type":"text/x-python","patch_set":4,"id":"0ba203fb_59043d90","line":703,"in_reply_to":"39f35185_fe9b7420","updated":"2024-08-08 12:38:52.000000000","message":"okay, this\nhttps://review.opendev.org/c/openstack/nova/+/889947/comment/0e25d9c9_6c01040f/","commit_id":"2cdf0e4fb544a65aefa8435c22441c01e9bde549"}],"nova/tests/functional/regressions/test_bug_2048837.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0e6cd6947da17391276f021a8bb875b63bd23ba3","unresolved":true,"context_lines":[{"line_number":89,"context_line":"        # cleaning up"},{"line_number":90,"context_line":"        self.should_disconnect_mock.assert_not_called()"},{"line_number":91,"context_line":"        self.disconnect_volume_mock.assert_not_called()"},{"line_number":92,"context_line":"        self.lock.acquire()"},{"line_number":93,"context_line":"        self.api.delete_server(self.server_a[\u0027id\u0027])"},{"line_number":94,"context_line":"        self.disconnect_volume_mock.assert_not_called()"},{"line_number":95,"context_line":"        self.api.delete_server(self.server_b[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7fd63a92_d17eb6b0","line":92,"updated":"2024-05-21 12:04:55.000000000","message":"locally this seam to work but i guess its still timing depent since its failing in ci.\n\nim wondering if i should just squash the two patches unless other scan suggest an alternitive.","commit_id":"8fd76501b57449af88ecd32e785f191fd69c9915"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d6748f6722d0c08743a36d12781e577b0c9f2d55","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        # cleaning up"},{"line_number":90,"context_line":"        self.should_disconnect_mock.assert_not_called()"},{"line_number":91,"context_line":"        self.disconnect_volume_mock.assert_not_called()"},{"line_number":92,"context_line":"        self.lock.acquire()"},{"line_number":93,"context_line":"        self.api.delete_server(self.server_a[\u0027id\u0027])"},{"line_number":94,"context_line":"        self.disconnect_volume_mock.assert_not_called()"},{"line_number":95,"context_line":"        self.api.delete_server(self.server_b[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"89bad53d_ebe767be","line":92,"in_reply_to":"5bc094cd_660faab3","updated":"2024-06-10 12:03:55.000000000","message":"Done","commit_id":"8fd76501b57449af88ecd32e785f191fd69c9915"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"626d021208ac296384c570a94fef61a56c0ff973","unresolved":true,"context_lines":[{"line_number":89,"context_line":"        # cleaning up"},{"line_number":90,"context_line":"        self.should_disconnect_mock.assert_not_called()"},{"line_number":91,"context_line":"        self.disconnect_volume_mock.assert_not_called()"},{"line_number":92,"context_line":"        self.lock.acquire()"},{"line_number":93,"context_line":"        self.api.delete_server(self.server_a[\u0027id\u0027])"},{"line_number":94,"context_line":"        self.disconnect_volume_mock.assert_not_called()"},{"line_number":95,"context_line":"        self.api.delete_server(self.server_b[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"5bc094cd_660faab3","line":92,"in_reply_to":"7fd63a92_d17eb6b0","updated":"2024-05-21 12:06:10.000000000","message":"actully i might know one way to force this.","commit_id":"8fd76501b57449af88ecd32e785f191fd69c9915"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"b9130c38c3c94de2ab7787f081f17ede1e3f6ff7","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        self.volume_id \u003d self.cinder.MULTIATTACH_VOL"},{"line_number":60,"context_line":"        # Launch a server and attach a volume"},{"line_number":61,"context_line":"        self.server_a \u003d self._create_server(networks\u003d\u0027none\u0027)"},{"line_number":62,"context_line":"        self.notifier.wait_for_versioned_notifications(\u0027instance.create.end\u0027)"},{"line_number":63,"context_line":"        self._attach_volume(self.server_a, self.volume_id)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # Launch a second server and attempt to attach the same volume again"}],"source_content_type":"text/x-python","patch_set":4,"id":"4ba9b000_0a8300ad","line":62,"updated":"2024-08-08 12:35:53.000000000","message":"how waiting for notification helps? how it will be different from  wait for expected_state\u003d\u0027ACTIVE\u0027 on server_create.","commit_id":"2cdf0e4fb544a65aefa8435c22441c01e9bde549"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"b9130c38c3c94de2ab7787f081f17ede1e3f6ff7","unresolved":true,"context_lines":[{"line_number":68,"context_line":"        self._attach_volume(self.server_b, self.volume_id)"},{"line_number":69,"context_line":"        self.lock \u003d threading.Lock()"},{"line_number":70,"context_line":"        # run periodics to allow async tasks to complete"},{"line_number":71,"context_line":"        self._run_periodics()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _should_disconnect(self, *args, **kwargs):"},{"line_number":74,"context_line":"        with self.lock:"}],"source_content_type":"text/x-python","patch_set":4,"id":"cd460c62_855bed98","line":71,"range":{"start_line":71,"start_character":13,"end_line":71,"end_character":27},"updated":"2024-08-08 12:35:53.000000000","message":"this points here https://github.com/openstack/nova/blob/master/nova/test.py#L496\n\nbut I couldn\u0027t get it full (how it allow async tasks, by update_available_resource.)","commit_id":"2cdf0e4fb544a65aefa8435c22441c01e9bde549"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7ce40167646ebad9b6d0835c1ee5456e5ba32977","unresolved":true,"context_lines":[{"line_number":68,"context_line":"        self._attach_volume(self.server_b, self.volume_id)"},{"line_number":69,"context_line":"        self.lock \u003d threading.Lock()"},{"line_number":70,"context_line":"        # run periodics to allow async tasks to complete"},{"line_number":71,"context_line":"        self._run_periodics()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _should_disconnect(self, *args, **kwargs):"},{"line_number":74,"context_line":"        with self.lock:"}],"source_content_type":"text/x-python","patch_set":4,"id":"4e60b222_05af37b8","line":71,"range":{"start_line":71,"start_character":13,"end_line":71,"end_character":27},"in_reply_to":"cd460c62_855bed98","updated":"2025-11-12 10:09:52.000000000","message":"this is forcing a context switch and eventlet yeild as well as allowign the background task\n\nthis should not be required but it was to stabilize the test.","commit_id":"2cdf0e4fb544a65aefa8435c22441c01e9bde549"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"75ffe6fa7e4bae73147e27e177e99bc438bdab7b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self._delete_server(self.server_a)"},{"line_number":86,"context_line":"        self.should_disconnect_mock.assert_called()"},{"line_number":87,"context_line":"        self.disconnect_volume_mock.assert_not_called()"},{"line_number":88,"context_line":"        self._delete_server(self.server_b)"},{"line_number":89,"context_line":"        self.disconnect_volume_mock.assert_called()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def test_concurrent_server_delete(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"f7115030_0c209f5a","line":88,"range":{"start_line":88,"start_character":41,"end_line":88,"end_character":42},"updated":"2025-11-14 21:43:53.000000000","message":"we can check  self.should_disconnect_mock.assert_called() just to make sure 2nd delete also go through the self.should_disconnect method. But I am going to add this and below comment in fix where you are updating the test with fix.","commit_id":"fac1a4d9de977cbc5579c51ff8c21f587ced8e22"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"75ffe6fa7e4bae73147e27e177e99bc438bdab7b","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            self.lock.release()"},{"line_number":114,"context_line":"        self._wait_until_deleted(self.server_a)"},{"line_number":115,"context_line":"        self._wait_until_deleted(self.server_b)"},{"line_number":116,"context_line":"        self.should_disconnect_mock.assert_called()"},{"line_number":117,"context_line":"        # Fixme(sean-k-mooney): this is bug 2048837"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            self.disconnect_volume_mock.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":5,"id":"21616c85_9c52aadd","line":116,"range":{"start_line":116,"start_character":35,"end_line":116,"end_character":51},"updated":"2025-11-14 21:43:53.000000000","message":"we can assert here that it is called twice so that we know both instance delete tried to check should_disconnect but endup in race.","commit_id":"fac1a4d9de977cbc5579c51ff8c21f587ced8e22"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"75ffe6fa7e4bae73147e27e177e99bc438bdab7b","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            self.disconnect_volume_mock.assert_not_called()"},{"line_number":120,"context_line":"        except AssertionError:"},{"line_number":121,"context_line":"            # NOTE(sean-k-mooney): this reproducer is not 100%"},{"line_number":122,"context_line":"            # reliable so we convert a failure to a skip to avoid"},{"line_number":123,"context_line":"            # gating issues. the bug is addressed in the follow up patch"},{"line_number":124,"context_line":"            # and that test is stable so it is not worth fixing this test"},{"line_number":125,"context_line":"            # beyond the time.sleep(1) above."},{"line_number":126,"context_line":"            self.skipTest(\"Bug 2048837: volume disconnect not called\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"bb652786_4b6ea833","line":126,"range":{"start_line":121,"start_character":0,"end_line":126,"end_character":70},"updated":"2025-11-14 21:43:53.000000000","message":"++, agree. this is best try we can do but from code it is visible that race can happen.","commit_id":"fac1a4d9de977cbc5579c51ff8c21f587ced8e22"}]}
