)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"48f629fc92b065e11af50bc2e19febdeee542373","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7adc7da4_3dd22be4","updated":"2025-12-19 15:52:20.000000000","message":"I think this makes sense; question inline.","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":35429,"name":"Biser Milanov","email":"biser.milanov@storpool.com","username":"sp-bmilanov"},"change_message_id":"cd8814ac44abe4272ce66ffec553efc1c929c171","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5195b8bd_ad178de1","updated":"2025-12-19 14:42:55.000000000","message":"LGTM with one nitpick","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"05066b6cf33d78eb0eff32460e12f3588a093687","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8f3e6d66_1d46044a","updated":"2025-12-23 14:20:36.000000000","message":"Approving with one +2 for the following reasons:\n- this fix was suggested by an upstream multipathd maintainer\n- it\u0027s proposed by a cinder core\n- has a +1 from another cinder core\n- has been tested in a customer environment\n- LGTM","commit_id":"d3f4f3b45e201587de21d4431fc4f12f4a5df95a"},{"author":{"_account_id":37328,"name":"Nimesh Desai","display_name":"Nimesh Desai","email":"nimesh.desai@ibm.com","username":"nimeshdesai"},"change_message_id":"c25e5b8de626700cbaee30fb1dbaa7789be415cc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9bb39b29_1482346f","updated":"2025-12-21 11:27:50.000000000","message":"LGTM","commit_id":"d3f4f3b45e201587de21d4431fc4f12f4a5df95a"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"a9975e1fcd3ab43a30391a6b1b59806d1e27272b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7e768e2a_8e69eb0d","updated":"2026-01-16 14:23:35.000000000","message":"Looks good to me - thank you!","commit_id":"d3f4f3b45e201587de21d4431fc4f12f4a5df95a"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2527b56b38461e872e79cc1a0a0ff82779ee3cc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4c3e8240_e9799660","updated":"2025-12-20 01:20:13.000000000","message":"Revisions LGTM.","commit_id":"d3f4f3b45e201587de21d4431fc4f12f4a5df95a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"390d6881df64248321ea405a79af63e3ccbcf353","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9be63cdd_583ed531","updated":"2025-12-19 16:41:42.000000000","message":"Thanks everyone for the review. I\u0027ve addressed the comments, please take another look.","commit_id":"d3f4f3b45e201587de21d4431fc4f12f4a5df95a"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"6fe2b94d01f8fe98e55b322b944e6c6ceeb9b149","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0b9192a0_6de4bc92","updated":"2026-01-16 14:41:23.000000000","message":"looks good.","commit_id":"d3f4f3b45e201587de21d4431fc4f12f4a5df95a"}],"os_brick/initiator/linuxscsi.py":[{"author":{"_account_id":37328,"name":"Nimesh Desai","display_name":"Nimesh Desai","email":"nimesh.desai@ibm.com","username":"nimeshdesai"},"change_message_id":"ccc41af6dabe6496ab9fa0342fe87ac37a82353c","unresolved":true,"context_lines":[{"line_number":359,"context_line":"        return not was_multipath and \u0027/dev\u0027 !\u003d os.path.split(path_used)[0]"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    @utils.retry(exception.MultipathdPathsNotRemoved)"},{"line_number":362,"context_line":"    def wait_multipathd_remove_paths(self, existing_devices: set[str]):"},{"line_number":363,"context_line":"        LOG.debug(\"Checking to see if device paths %s are still under \""},{"line_number":364,"context_line":"                  \"multipathd monitoring\", existing_devices)"},{"line_number":365,"context_line":"        all_devices \u003d set(self.multipath_show_paths(\"%d\").split())"}],"source_content_type":"text/x-python","patch_set":1,"id":"a624617f_008d761c","line":362,"updated":"2025-12-19 14:26:52.000000000","message":"please add docstring for this new function","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"390d6881df64248321ea405a79af63e3ccbcf353","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        return not was_multipath and \u0027/dev\u0027 !\u003d os.path.split(path_used)[0]"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    @utils.retry(exception.MultipathdPathsNotRemoved)"},{"line_number":362,"context_line":"    def wait_multipathd_remove_paths(self, existing_devices: set[str]):"},{"line_number":363,"context_line":"        LOG.debug(\"Checking to see if device paths %s are still under \""},{"line_number":364,"context_line":"                  \"multipathd monitoring\", existing_devices)"},{"line_number":365,"context_line":"        all_devices \u003d set(self.multipath_show_paths(\"%d\").split())"}],"source_content_type":"text/x-python","patch_set":1,"id":"85c219d1_096f0c3f","line":362,"in_reply_to":"a624617f_008d761c","updated":"2025-12-19 16:41:42.000000000","message":"Done","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":35429,"name":"Biser Milanov","email":"biser.milanov@storpool.com","username":"sp-bmilanov"},"change_message_id":"cd8814ac44abe4272ce66ffec553efc1c929c171","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        LOG.debug(\"Checking to see if device paths %s are still under \""},{"line_number":364,"context_line":"                  \"multipathd monitoring\", existing_devices)"},{"line_number":365,"context_line":"        all_devices \u003d set(self.multipath_show_paths(\"%d\").split())"},{"line_number":366,"context_line":"        if bool(existing_devices.intersection(all_devices)):"},{"line_number":367,"context_line":"            raise exception.MultipathdPathsNotRemoved(devices\u003dexisting_devices)"},{"line_number":368,"context_line":"        LOG.debug(\"Device paths %s have been removed from multipathd \""},{"line_number":369,"context_line":"                  \"monitoring.\", existing_devices)"}],"source_content_type":"text/x-python","patch_set":1,"id":"c3012f7b_8efbe109","line":366,"range":{"start_line":366,"start_character":8,"end_line":366,"end_character":60},"updated":"2025-12-19 14:42:55.000000000","message":"Nit: Not sure if we need the explicit cast to `bool` here","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"390d6881df64248321ea405a79af63e3ccbcf353","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        LOG.debug(\"Checking to see if device paths %s are still under \""},{"line_number":364,"context_line":"                  \"multipathd monitoring\", existing_devices)"},{"line_number":365,"context_line":"        all_devices \u003d set(self.multipath_show_paths(\"%d\").split())"},{"line_number":366,"context_line":"        if bool(existing_devices.intersection(all_devices)):"},{"line_number":367,"context_line":"            raise exception.MultipathdPathsNotRemoved(devices\u003dexisting_devices)"},{"line_number":368,"context_line":"        LOG.debug(\"Device paths %s have been removed from multipathd \""},{"line_number":369,"context_line":"                  \"monitoring.\", existing_devices)"}],"source_content_type":"text/x-python","patch_set":1,"id":"202ce603_1e41dbdd","line":366,"range":{"start_line":366,"start_character":8,"end_line":366,"end_character":60},"in_reply_to":"c3012f7b_8efbe109","updated":"2025-12-19 16:41:42.000000000","message":"Done","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"48f629fc92b065e11af50bc2e19febdeee542373","unresolved":true,"context_lines":[{"line_number":428,"context_line":"                # cleanup as expected"},{"line_number":429,"context_line":"                for device_name in devices_names:"},{"line_number":430,"context_line":"                    dev_path \u003d \u0027/dev/\u0027 + device_name"},{"line_number":431,"context_line":"                    self.multipath_del_path(dev_path)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        return multipath_name"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3c62ba69_d5dbff11","line":431,"updated":"2025-12-19 15:52:20.000000000","message":"I\u0027m worried that this may re-introduce the issue by tossing another udev event into the mix.  Maybe just log that we requested path removal, have waited a while, and can\u0027t wait around all day?\n\nIf you decide to keep this, we could probably use a log message here saying we\u0027re making one final try, because i think the last thing in the logs will be from the retry decorator saying that devices still have not been removed.","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"390d6881df64248321ea405a79af63e3ccbcf353","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                # cleanup as expected"},{"line_number":429,"context_line":"                for device_name in devices_names:"},{"line_number":430,"context_line":"                    dev_path \u003d \u0027/dev/\u0027 + device_name"},{"line_number":431,"context_line":"                    self.multipath_del_path(dev_path)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        return multipath_name"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1c2f1728_d6f09142","line":431,"in_reply_to":"3c62ba69_d5dbff11","updated":"2025-12-19 16:41:42.000000000","message":"Done\nAdded the log and now we have the final trace here.\nNote that this is emulated by explicitly raising exception hence multipathd del path returns fail (since we\u0027re trying to remove already removed device like the example below)\n\n    $ sudo multipathd del path /dev/sdf\n    ok\n    $ sudo multipathd del path /dev/sdf\n    fail\n\n\n\nDec 19 16:21:55 rdhasman-glance-cinder nova-compute[2731902]: DEBUG os_brick.initiator.linuxscsi [None req-45bfaacc-8bd8-4528-b3be-a246405a0dee admin admin] Device paths {\u0027sdf\u0027, \u0027sde\u0027} were not removed automatic\nally from multipathd monitoring. Making final attempt to remove them explicitly. {{(pid\u003d2731902) remove_connection /opt/stack/data/venv/lib/python3.10/site-packages/os_brick/initiator/linuxscsi.py:431}}         \nDec 19 16:21:55 rdhasman-glance-cinder nova-compute[2731902]: DEBUG oslo_concurrency.processutils [-] Running cmd (subprocess): multipathd del path /dev/sdf {{(pid\u003d2732157) execute /opt/stack/data/venv/lib/pytho\nn3.10/site-packages/oslo_concurrency/processutils.py:349}}                                                                                                                                                         \nDec 19 16:21:55 rdhasman-glance-cinder nova-compute[2731902]: DEBUG oslo_concurrency.processutils [-] CMD \"multipathd del path /dev/sdf\" returned: 1 in 0.006s {{(pid\u003d2732157) execute /opt/stack/data/venv/lib/pyt\nhon3.10/site-packages/oslo_concurrency/processutils.py:372}}                                                                                                                                                       \nDec 19 16:21:55 rdhasman-glance-cinder nova-compute[2731902]: DEBUG oslo.privsep.daemon [-] privsep: reply[e8f7c07a-2168-4a18-8bd9-a4ef89b69e64]: (4, (\u0027fail\\n\u0027, \u0027\u0027)) {{(pid\u003d2732157) _call_back /opt/stack/data/ve\nnv/lib/python3.10/site-packages/oslo_privsep/daemon.py:512}}                                                                                                                                                       \nDec 19 16:21:55 rdhasman-glance-cinder nova-compute[2731902]: DEBUG oslo_concurrency.processutils [-] Running cmd (subprocess): multipathd del path /dev/sde {{(pid\u003d2732157) execute /opt/stack/data/venv/lib/pytho\nn3.10/site-packages/oslo_concurrency/processutils.py:349}}                                                                                                                                                         \nDec 19 16:21:55 rdhasman-glance-cinder nova-compute[2731902]: DEBUG oslo_concurrency.processutils [-] CMD \"multipathd del path /dev/sde\" returned: 1 in 0.005s {{(pid\u003d2732157) execute /opt/stack/data/venv/lib/pyt\nhon3.10/site-packages/oslo_concurrency/processutils.py:372}}                                                                                                                                                       \nDec 19 16:21:55 rdhasman-glance-cinder nova-compute[2731902]: DEBUG oslo.privsep.daemon [-] privsep: reply[2ddd1a30-da21-477b-b31d-41912854c0d2]: (4, (\u0027fail\\n\u0027, \u0027\u0027)) {{(pid\u003d2732157) _call_back /opt/stack/data/ve\nnv/lib/python3.10/site-packages/oslo_privsep/daemon.py:512}}","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"6fe2b94d01f8fe98e55b322b944e6c6ceeb9b149","unresolved":true,"context_lines":[{"line_number":430,"context_line":"                LOG.debug(\"Device paths %s were not removed automatically \""},{"line_number":431,"context_line":"                          \"from multipathd monitoring. Making final attempt \""},{"line_number":432,"context_line":"                          \"to remove them explicitly.\", devices_names)"},{"line_number":433,"context_line":"                for device_name in devices_names:"},{"line_number":434,"context_line":"                    dev_path \u003d \u0027/dev/\u0027 + device_name"},{"line_number":435,"context_line":"                    self.multipath_del_path(dev_path)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        return multipath_name"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def _remove_scsi_symlinks(self, devices_names: Iterable[str]) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"b4720998_9c388b64","line":436,"range":{"start_line":433,"start_character":1,"end_line":436,"end_character":0},"updated":"2026-01-16 14:41:23.000000000","message":"Thought: might be helpful to have a final check \u0026 debug output following this for loop that logs if the last resort removal failed, respectively logging success of the last resort removal.\nThis will give a hint when debugging about what the final outcome was.","commit_id":"d3f4f3b45e201587de21d4431fc4f12f4a5df95a"}],"os_brick/tests/initiator/test_linuxscsi.py":[{"author":{"_account_id":37328,"name":"Nimesh Desai","display_name":"Nimesh Desai","email":"nimesh.desai@ibm.com","username":"nimeshdesai"},"change_message_id":"ccc41af6dabe6496ab9fa0342fe87ac37a82353c","unresolved":true,"context_lines":[{"line_number":225,"context_line":"                               self.linuxscsi.wait_for_path,"},{"line_number":226,"context_line":"                               path)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @mock.patch.object(linuxscsi.LinuxSCSI, \u0027multipath_show_paths\u0027)"},{"line_number":229,"context_line":"    def test_wait_multipathd_remove_paths_success(self, mp_show_paths_mock):"},{"line_number":230,"context_line":"        devices_names \u003d {\u0027sda\u0027, \u0027sdb\u0027}"},{"line_number":231,"context_line":"        all_devices \u003d \u0027sdc\\nsdf\\nsde\\nsdd\\nsdg\\n\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"081459cd_2fe23f52","line":228,"updated":"2025-12-19 14:26:52.000000000","message":"Don\u0027t we need to include mock.patch(os_brick.utils._time_sleep)","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"48f629fc92b065e11af50bc2e19febdeee542373","unresolved":true,"context_lines":[{"line_number":225,"context_line":"                               self.linuxscsi.wait_for_path,"},{"line_number":226,"context_line":"                               path)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @mock.patch.object(linuxscsi.LinuxSCSI, \u0027multipath_show_paths\u0027)"},{"line_number":229,"context_line":"    def test_wait_multipathd_remove_paths_success(self, mp_show_paths_mock):"},{"line_number":230,"context_line":"        devices_names \u003d {\u0027sda\u0027, \u0027sdb\u0027}"},{"line_number":231,"context_line":"        all_devices \u003d \u0027sdc\\nsdf\\nsde\\nsdd\\nsdg\\n\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"e0999e29_409f6099","line":228,"in_reply_to":"081459cd_2fe23f52","updated":"2025-12-19 15:52:20.000000000","message":"Good question, but this is handled by the base.TestCase class that\u0027s a parent.\n\nhttps://opendev.org/openstack/os-brick/src/commit/da7bbcf387039bd4bca3078759bbe1ec4da4fe84/os_brick/tests/base.py#L66-L70","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"390d6881df64248321ea405a79af63e3ccbcf353","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                               self.linuxscsi.wait_for_path,"},{"line_number":226,"context_line":"                               path)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @mock.patch.object(linuxscsi.LinuxSCSI, \u0027multipath_show_paths\u0027)"},{"line_number":229,"context_line":"    def test_wait_multipathd_remove_paths_success(self, mp_show_paths_mock):"},{"line_number":230,"context_line":"        devices_names \u003d {\u0027sda\u0027, \u0027sdb\u0027}"},{"line_number":231,"context_line":"        all_devices \u003d \u0027sdc\\nsdf\\nsde\\nsdd\\nsdg\\n\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ea12609_440c32bb","line":228,"in_reply_to":"e0999e29_409f6099","updated":"2025-12-19 16:41:42.000000000","message":"@Nimesh: We won\u0027t be retrying here (no failures) so sleep won\u0027t be called.\n@Brian: Thanks for the reference! I wonder if it was added later since other methods in this class also mock _time_sleep explicitly.","commit_id":"c82308c9107f7b331721c836ab3f5e7218e118d8"}]}
