)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":39116,"name":"Yathavan Parameshwaran","display_name":"Yathavan Parameshwaran","email":"yathavan.parameshwaran@windriver.com","username":"yparames"},"change_message_id":"cc396f2b58a9f809b87227ba991bbf210a1d0586","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"68904d6a_1dd73cf8","updated":"2026-07-27 15:00:58.000000000","message":"lgtm, fix is correct and well-targeted, just a couple minor nits","commit_id":"e300880324f3cc9e8e088cf865f7758d673944a8"}],"cinder/backup/manager.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"214ae7844fbec20070921ad37f3ab000b1b6cec7","unresolved":true,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        updates \u003d {}"},{"line_number":499,"context_line":"        try:"},{"line_number":500,"context_line":"            properties \u003d volume_utils.brick_get_connector_properties("},{"line_number":501,"context_line":"                CONF.use_multipath_for_image_xfer, enforce_multipath\u003dFalse)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f9983688_ff4b6f2e","line":500,"updated":"2026-07-24 19:12:26.000000000","message":"Good catch moving this inside the try block. The same pattern exists in restore_backup (line 774) where brick_get_connector_properties() is also outside the error handler. Since it\u0027s the same root cause, please fix both in this patch.","commit_id":"36f2ecf20f7de91136cd3d4af7475b2e20b03cb6"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"214ae7844fbec20070921ad37f3ab000b1b6cec7","unresolved":true,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        updates \u003d {}"},{"line_number":499,"context_line":"        try:"},{"line_number":500,"context_line":"            properties \u003d volume_utils.brick_get_connector_properties("},{"line_number":501,"context_line":"                CONF.use_multipath_for_image_xfer, enforce_multipath\u003dFalse)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"a7c8ed19_f022c9fa","line":500,"updated":"2026-07-24 19:12:26.000000000","message":"Please add a unit test for this fix — mock brick_get_connector_properties to raise an exception, call continue_backup, and assert that the backup transitions to error state and the volume is released from backing-up. Same for restore_backup if you fix that here too.","commit_id":"36f2ecf20f7de91136cd3d4af7475b2e20b03cb6"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"214ae7844fbec20070921ad37f3ab000b1b6cec7","unresolved":true,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        updates \u003d {}"},{"line_number":499,"context_line":"        try:"},{"line_number":500,"context_line":"            properties \u003d volume_utils.brick_get_connector_properties("},{"line_number":501,"context_line":"                CONF.use_multipath_for_image_xfer, enforce_multipath\u003dFalse)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"0b58e557_b2629e15","line":500,"updated":"2026-07-24 19:12:26.000000000","message":"This bug fix needs a release note (reno). A fix that prevents indefinite backup/volume state hangs is important for operators to know about.","commit_id":"36f2ecf20f7de91136cd3d4af7475b2e20b03cb6"},{"author":{"_account_id":38864,"name":"Sridhar Kumar Ettkepalli","display_name":"Sridhar","email":"sridharkumar.ettkepalli@windriver.com","username":"settkepa"},"change_message_id":"1326e27b1dfee294e61ed81333d15bb86c3c5650","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        updates \u003d {}"},{"line_number":499,"context_line":"        try:"},{"line_number":500,"context_line":"            properties \u003d volume_utils.brick_get_connector_properties("},{"line_number":501,"context_line":"                CONF.use_multipath_for_image_xfer, enforce_multipath\u003dFalse)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f92118d9_f27cf039","line":500,"in_reply_to":"0b58e557_b2629e15","updated":"2026-07-27 13:35:33.000000000","message":"Done","commit_id":"36f2ecf20f7de91136cd3d4af7475b2e20b03cb6"},{"author":{"_account_id":38864,"name":"Sridhar Kumar Ettkepalli","display_name":"Sridhar","email":"sridharkumar.ettkepalli@windriver.com","username":"settkepa"},"change_message_id":"1326e27b1dfee294e61ed81333d15bb86c3c5650","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        updates \u003d {}"},{"line_number":499,"context_line":"        try:"},{"line_number":500,"context_line":"            properties \u003d volume_utils.brick_get_connector_properties("},{"line_number":501,"context_line":"                CONF.use_multipath_for_image_xfer, enforce_multipath\u003dFalse)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9bfd19da_b00ce1d0","line":500,"in_reply_to":"a7c8ed19_f022c9fa","updated":"2026-07-27 13:35:33.000000000","message":"Done","commit_id":"36f2ecf20f7de91136cd3d4af7475b2e20b03cb6"},{"author":{"_account_id":38864,"name":"Sridhar Kumar Ettkepalli","display_name":"Sridhar","email":"sridharkumar.ettkepalli@windriver.com","username":"settkepa"},"change_message_id":"1326e27b1dfee294e61ed81333d15bb86c3c5650","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        updates \u003d {}"},{"line_number":499,"context_line":"        try:"},{"line_number":500,"context_line":"            properties \u003d volume_utils.brick_get_connector_properties("},{"line_number":501,"context_line":"                CONF.use_multipath_for_image_xfer, enforce_multipath\u003dFalse)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"680eef2c_f52f1be0","line":500,"in_reply_to":"f9983688_ff4b6f2e","updated":"2026-07-27 13:35:33.000000000","message":"Done","commit_id":"36f2ecf20f7de91136cd3d4af7475b2e20b03cb6"}],"cinder/tests/unit/backup/test_backup.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5dcbed95c11c59f0526899aee3f2d304b649a8ad","unresolved":false,"context_lines":[{"line_number":982,"context_line":"    @mock.patch(\u0027cinder.volume.rpcapi.VolumeAPI.get_backup_device\u0027)"},{"line_number":983,"context_line":"    def test_continue_backup_fail_brick_connector(self, mock_backup_device,"},{"line_number":984,"context_line":"                                                  mock_brick):"},{"line_number":985,"context_line":"        \"\"\"Test backup error handling when brick_get_connector_properties fails."},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        When brick_get_connector_properties() raises (e.g., privsep cannot"},{"line_number":988,"context_line":"        start due to missing capabilities in a container), the backup must"}],"source_content_type":"text/x-python","patch_set":2,"id":"77d058f1_c07dd24f","line":985,"updated":"2026-07-27 17:10:13.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"e300880324f3cc9e8e088cf865f7758d673944a8"},{"author":{"_account_id":39116,"name":"Yathavan Parameshwaran","display_name":"Yathavan Parameshwaran","email":"yathavan.parameshwaran@windriver.com","username":"yparames"},"change_message_id":"cc396f2b58a9f809b87227ba991bbf210a1d0586","unresolved":true,"context_lines":[{"line_number":1003,"context_line":"                          self.ctxt, backup, mock_backup_device)"},{"line_number":1004,"context_line":""},{"line_number":1005,"context_line":"        vol \u003d db.volume_get(self.ctxt, vol_id)"},{"line_number":1006,"context_line":"        self.assertEqual(\u0027available\u0027, vol.status)"},{"line_number":1007,"context_line":"        self.assertEqual(\u0027error_backing-up\u0027, vol.previous_status)"},{"line_number":1008,"context_line":"        backup \u003d db.backup_get(self.ctxt, backup.id)"},{"line_number":1009,"context_line":"        self.assertEqual(fields.BackupStatus.ERROR, backup.status)"}],"source_content_type":"text/x-python","patch_set":2,"id":"b10ecb11_6bf91858","line":1006,"range":{"start_line":1006,"start_character":0,"end_line":1006,"end_character":49},"updated":"2026-07-27 15:00:58.000000000","message":"minor nit: make sure that volume transition happens in the same except block (earlier in the continue_backup) you moved the call into (not in a later stage), pretty sure since the test asserts it and presumably passes, this is likely fine\n\nother than that, just check that the except around _attach_device is the one that does update_backup_error() and volume release, and that brick_get_connector_properties now sits under that same handler","commit_id":"e300880324f3cc9e8e088cf865f7758d673944a8"},{"author":{"_account_id":38864,"name":"Sridhar Kumar Ettkepalli","display_name":"Sridhar","email":"sridharkumar.ettkepalli@windriver.com","username":"settkepa"},"change_message_id":"de16f16f2af7b285866b9cb1a4cc2af61aadd807","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"                          self.ctxt, backup, mock_backup_device)"},{"line_number":1004,"context_line":""},{"line_number":1005,"context_line":"        vol \u003d db.volume_get(self.ctxt, vol_id)"},{"line_number":1006,"context_line":"        self.assertEqual(\u0027available\u0027, vol.status)"},{"line_number":1007,"context_line":"        self.assertEqual(\u0027error_backing-up\u0027, vol.previous_status)"},{"line_number":1008,"context_line":"        backup \u003d db.backup_get(self.ctxt, backup.id)"},{"line_number":1009,"context_line":"        self.assertEqual(fields.BackupStatus.ERROR, backup.status)"}],"source_content_type":"text/x-python","patch_set":2,"id":"eb08dbf1_a465ae8e","line":1006,"in_reply_to":"b10ecb11_6bf91858","updated":"2026-07-27 15:08:58.000000000","message":"Confirmed — brick_get_connector_properties() now sits inside the outer try: block (line ~499). If it raises, the exception is caught by the outer except Exception as err: handler (line ~554) which calls volume_utils.update_backup_error(backup, str(err)) to transition the backup to ERROR and restores the volume from \u0027backing-up\u0027 via self.db.volume_update(). The test assertion validates this path.","commit_id":"e300880324f3cc9e8e088cf865f7758d673944a8"},{"author":{"_account_id":39116,"name":"Yathavan Parameshwaran","display_name":"Yathavan Parameshwaran","email":"yathavan.parameshwaran@windriver.com","username":"yparames"},"change_message_id":"cc396f2b58a9f809b87227ba991bbf210a1d0586","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"        self.assertEqual(fields.BackupStatus.ERROR, backup.status)"},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"    @mock.patch(\u0027cinder.volume.volume_utils.brick_get_connector_properties\u0027)"},{"line_number":1012,"context_line":"    def test_restore_backup_fail_brick_connector(self, mock_brick):"},{"line_number":1013,"context_line":"        \"\"\"Test restore error handling when brick_get_connector_properties fails."},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"        When brick_get_connector_properties() raises in _run_restore, the"}],"source_content_type":"text/x-python","patch_set":2,"id":"8006c3df_a1e96610","line":1012,"range":{"start_line":1012,"start_character":4,"end_line":1012,"end_character":67},"updated":"2026-07-27 15:00:58.000000000","message":"restore test asserts the volume ends error_restoring and backup back to available, but that transition happens in restore_backup(), not _run_restore(). can you please confirm _run_restore\u0027s except re-raises instead of swallowing it? asking b/c otherwise the outer handler wouldn\u0027t run and the state assertions would rely on something else...","commit_id":"e300880324f3cc9e8e088cf865f7758d673944a8"},{"author":{"_account_id":38864,"name":"Sridhar Kumar Ettkepalli","display_name":"Sridhar","email":"sridharkumar.ettkepalli@windriver.com","username":"settkepa"},"change_message_id":"de16f16f2af7b285866b9cb1a4cc2af61aadd807","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"        self.assertEqual(fields.BackupStatus.ERROR, backup.status)"},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"    @mock.patch(\u0027cinder.volume.volume_utils.brick_get_connector_properties\u0027)"},{"line_number":1012,"context_line":"    def test_restore_backup_fail_brick_connector(self, mock_brick):"},{"line_number":1013,"context_line":"        \"\"\"Test restore error handling when brick_get_connector_properties fails."},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"        When brick_get_connector_properties() raises in _run_restore, the"}],"source_content_type":"text/x-python","patch_set":2,"id":"66f249c6_e0788bb9","line":1012,"in_reply_to":"8006c3df_a1e96610","updated":"2026-07-27 15:08:58.000000000","message":"Confirmed — _run_restore()\u0027s except block explicitly re-raises after creating the user-facing message:\n\n    except Exception:\n        self.message_api.create_from_request_context(\n            context, detail\u003dmessage_field.Detail.ATTACH_ERROR)\n        raise  # propagates to restore_backup\u0027s outer handler\n\nThe outer handler in restore_backup() then catches it with excutils.save_and_reraise_exception(), sets volume to error_restoring and backup back to available. The test assertions validate this end-to-end.","commit_id":"e300880324f3cc9e8e088cf865f7758d673944a8"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5dcbed95c11c59f0526899aee3f2d304b649a8ad","unresolved":false,"context_lines":[{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"    @mock.patch(\u0027cinder.volume.volume_utils.brick_get_connector_properties\u0027)"},{"line_number":1012,"context_line":"    def test_restore_backup_fail_brick_connector(self, mock_brick):"},{"line_number":1013,"context_line":"        \"\"\"Test restore error handling when brick_get_connector_properties fails."},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"        When brick_get_connector_properties() raises in _run_restore, the"},{"line_number":1016,"context_line":"        exception must propagate to restore_backup\u0027s handler which transitions"}],"source_content_type":"text/x-python","patch_set":2,"id":"b8f8cd6b_14005a9b","line":1013,"updated":"2026-07-27 17:10:13.000000000","message":"pep8: E501 line too long (81 \u003e 79 characters)","commit_id":"e300880324f3cc9e8e088cf865f7758d673944a8"}]}
