)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"8d42a7196db2aa4c80fa0346d6574ddc4a13fa30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"764b9ef2_282bdfe5","updated":"2026-08-18 09:37:51.000000000","message":"recheck","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"f625ff8b44f0665d42ec0a47e2a5525335996afd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"76a9e26e_00ee257f","updated":"2026-09-10 07:08:53.000000000","message":"@jayaanand.borra@netapp.com Can you please re-review the latest patch, we have addressed the comments. Request other core reviewers as well to review. Both Zuul and CI has passed.","commit_id":"175b7de511f98f24f62b4e1a9b365e4064b8290c"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"ed9aea7e62bf006dc1b876f9913a3ecd0a8e2c0b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"f225403d_7222f830","updated":"2026-10-05 11:34:15.000000000","message":"@jayaanand.borra@netapp.com can you please re-review the patch? I also request core reviewers to take a look. If we get early feedback we can address it quickly and plan for merge as soon as Indri opens for merges.","commit_id":"175b7de511f98f24f62b4e1a9b365e4064b8290c"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"cd60c5c26772e241eb46ace5fb5fd7d2b04d7773","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"13726a29_1b9aa709","updated":"2026-09-02 12:42:35.000000000","message":"@jayaanand.borra@netapp.com thanks for your valuable feedback, we have addressed the requested changes and updated patch. Can you please have a look again?","commit_id":"175b7de511f98f24f62b4e1a9b365e4064b8290c"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"3f5726570a85e9a903d5462368c8c7a52999cf97","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"670bffdf_276bfeab","updated":"2026-09-23 04:05:49.000000000","message":"Can core reviewers please review and provide feedback on this patch?","commit_id":"175b7de511f98f24f62b4e1a9b365e4064b8290c"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"470f3e4b0f5eee720621eeb46df5bf7b4fd86c88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0a70cd8d_86a7691a","updated":"2026-10-27 05:57:53.000000000","message":"Request core reviewers to provide feedback and help us move the patch towards merge.","commit_id":"175b7de511f98f24f62b4e1a9b365e4064b8290c"}],"cinder/volume/drivers/hpe/alletramp_service.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"e3a8bf2228559edfc949da2adef9e5f14353bbf7","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def _is_array_unreachable_error(ex):"},{"line_number":103,"context_line":"    \"\"\"Return True only when an exception means the array is unreachable."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    A genuine \"array down\" surfaces as a low-level socket connection failure:"},{"line_number":106,"context_line":"    ``EHOSTUNREACH`` -\u003e ``requests.exceptions.ConnectionError`` and"}],"source_content_type":"text/x-python","patch_set":1,"id":"30bb90fd_ecabb6a2","line":103,"updated":"2026-09-01 15:40:33.000000000","message":"unwrap __cause__ / __context__. Flowkit and _create_replication_client wrap requests.ConnectionError in HPEStorageException / InvalidInput. As written the new disaster branches only work if the raw requests exception leaks out. ConnectTimeout already subclasses ConnectionError","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"cd60c5c26772e241eb46ace5fb5fd7d2b04d7773","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def _is_array_unreachable_error(ex):"},{"line_number":103,"context_line":"    \"\"\"Return True only when an exception means the array is unreachable."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    A genuine \"array down\" surfaces as a low-level socket connection failure:"},{"line_number":106,"context_line":"    ``EHOSTUNREACH`` -\u003e ``requests.exceptions.ConnectionError`` and"}],"source_content_type":"text/x-python","patch_set":1,"id":"e8e1c43a_71528973","line":103,"in_reply_to":"30bb90fd_ecabb6a2","updated":"2026-09-02 12:42:35.000000000","message":"Unwrapped __cause__ and __context__ in _is_array_unreachable_error() so Flowkit/Cinder-wrapped requests.ConnectionError is still treated as primary-array-unreachable.\n\nKept SSLError explicitly excluded from unreachable detection, since TLS/cert/config failures should not trigger disaster failover.","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"e3a8bf2228559edfc949da2adef9e5f14353bbf7","unresolved":true,"context_lines":[{"line_number":2402,"context_line":"                    \"active-active. targets\u003d%(targets)s\","},{"line_number":2403,"context_line":"                    {\u0027rcg\u0027: rcg_name, \u0027targets\u0027: rcg_details[\u0027targets\u0027]})"},{"line_number":2404,"context_line":"                try:"},{"line_number":2405,"context_line":"                    self._stop_remote_copy_group_safely(rcg_name)"},{"line_number":2406,"context_line":"                except Exception as ex:"},{"line_number":2407,"context_line":"                    return _failover_error_update(ex)"},{"line_number":2408,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"22b6cd22_8e67c24b","line":2405,"updated":"2026-09-01 15:40:33.000000000","message":"Dead except: _stop_remote_copy_group_safely already swallows Exception (and now logs). This try/except can never call _failover_error_update","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"cd60c5c26772e241eb46ace5fb5fd7d2b04d7773","unresolved":false,"context_lines":[{"line_number":2402,"context_line":"                    \"active-active. targets\u003d%(targets)s\","},{"line_number":2403,"context_line":"                    {\u0027rcg\u0027: rcg_name, \u0027targets\u0027: rcg_details[\u0027targets\u0027]})"},{"line_number":2404,"context_line":"                try:"},{"line_number":2405,"context_line":"                    self._stop_remote_copy_group_safely(rcg_name)"},{"line_number":2406,"context_line":"                except Exception as ex:"},{"line_number":2407,"context_line":"                    return _failover_error_update(ex)"},{"line_number":2408,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"55abfd6c_0f2de41c","line":2405,"in_reply_to":"22b6cd22_8e67c24b","updated":"2026-09-02 12:42:35.000000000","message":"Removed dead outer try/except blocks around _stop_remote_copy_group_safely() because that helper already catches and logs exceptions.","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"e3a8bf2228559edfc949da2adef9e5f14353bbf7","unresolved":true,"context_lines":[{"line_number":2475,"context_line":"                else:"},{"line_number":2476,"context_line":"                    should_recover \u003d True"},{"line_number":2477,"context_line":""},{"line_number":2478,"context_line":"            if should_recover:"},{"line_number":2479,"context_line":"                if remote_active_active:"},{"line_number":2480,"context_line":"                    # Active-active policy: recover on primary array"},{"line_number":2481,"context_line":"                    recover_action \u003d getattr("}],"source_content_type":"text/x-python","patch_set":1,"id":"72fd4f4e_f8c78af2","line":2478,"updated":"2026-09-01 15:40:33.000000000","message":"AA recover uses self.session_mgr (primary) + CHANGE_TO_SECONDARY. Disaster failover already treated the primary as unreachable above. so every Active PP volume lands in error while the host is still FAILED_OVER?","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"cd60c5c26772e241eb46ace5fb5fd7d2b04d7773","unresolved":false,"context_lines":[{"line_number":2475,"context_line":"                else:"},{"line_number":2476,"context_line":"                    should_recover \u003d True"},{"line_number":2477,"context_line":""},{"line_number":2478,"context_line":"            if should_recover:"},{"line_number":2479,"context_line":"                if remote_active_active:"},{"line_number":2480,"context_line":"                    # Active-active policy: recover on primary array"},{"line_number":2481,"context_line":"                    recover_action \u003d getattr("}],"source_content_type":"text/x-python","patch_set":1,"id":"2b0ea748_91e954a5","line":2478,"in_reply_to":"72fd4f4e_f8c78af2","updated":"2026-09-02 12:42:35.000000000","message":"Fixed active-active disaster failover to recover on the secondary/remote array with RC_ACTION_CHANGE_TO_PRIMARY when the primary is unreachable.\n\nPreserved planned active-active failover behavior by continuing to use the primary array with RC_ACTION_CHANGE_TO_SECONDARY when the primary is reachable.","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"e3a8bf2228559edfc949da2adef9e5f14353bbf7","unresolved":true,"context_lines":[{"line_number":2478,"context_line":"            if should_recover:"},{"line_number":2479,"context_line":"                if remote_active_active:"},{"line_number":2480,"context_line":"                    # Active-active policy: recover on primary array"},{"line_number":2481,"context_line":"                    recover_action \u003d getattr("},{"line_number":2482,"context_line":"                        constants,"},{"line_number":2483,"context_line":"                        \u0027RC_ACTION_CHANGE_TO_SECONDARY\u0027,"},{"line_number":2484,"context_line":"                        constants.RC_ACTION_CHANGE_TO_SECONDARY)"}],"source_content_type":"text/x-python","patch_set":1,"id":"8582b988_fcad4687","line":2481,"updated":"2026-09-01 15:40:33.000000000","message":"getattr(constants, \u0027RC_ACTION_CHANGE_TO_SECONDARY\u0027, constants.RC_ACTION_CHANGE_TO_SECONDARY) is a no-op and will AttributeError in the default if the name is missing. You already added the constant. Use it directly like the group path does at #7372","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"cd60c5c26772e241eb46ace5fb5fd7d2b04d7773","unresolved":false,"context_lines":[{"line_number":2478,"context_line":"            if should_recover:"},{"line_number":2479,"context_line":"                if remote_active_active:"},{"line_number":2480,"context_line":"                    # Active-active policy: recover on primary array"},{"line_number":2481,"context_line":"                    recover_action \u003d getattr("},{"line_number":2482,"context_line":"                        constants,"},{"line_number":2483,"context_line":"                        \u0027RC_ACTION_CHANGE_TO_SECONDARY\u0027,"},{"line_number":2484,"context_line":"                        constants.RC_ACTION_CHANGE_TO_SECONDARY)"}],"source_content_type":"text/x-python","patch_set":1,"id":"03b60880_501ca1d9","line":2481,"in_reply_to":"8582b988_fcad4687","updated":"2026-09-02 12:42:35.000000000","message":"Addressed.","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"e3a8bf2228559edfc949da2adef9e5f14353bbf7","unresolved":true,"context_lines":[{"line_number":2925,"context_line":"                    # planned-failover case (primary still reachable) keeps"},{"line_number":2926,"context_line":"                    # ensuring the RCG, while a down primary is tolerated."},{"line_number":2927,"context_line":"                    try:"},{"line_number":2928,"context_line":"                        self._do_volume_replication_setup(volume)"},{"line_number":2929,"context_line":"                    except Exception as ex:"},{"line_number":2930,"context_line":"                        if not _is_array_unreachable_error(ex):"},{"line_number":2931,"context_line":"                            # A genuine (non-connectivity) error should be"}],"source_content_type":"text/x-python","patch_set":1,"id":"954858bd_68671b5f","line":2928,"updated":"2026-09-01 15:40:33.000000000","message":"else is for failover and calling _do_volume_replication_setup during failover. That helper creates an RCG and on failure runs _do_volume_replication_destroy (including delete_volume). This only for stop+recover. If local RCG is already gone (HTTPNotFound) this will try to recreate replication on a dying primary, wrap ConnectionError in VolumeBackendAPIException, miss _is_array_unreachable_error, and abort the whole host failover.","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"cd60c5c26772e241eb46ace5fb5fd7d2b04d7773","unresolved":false,"context_lines":[{"line_number":2925,"context_line":"                    # planned-failover case (primary still reachable) keeps"},{"line_number":2926,"context_line":"                    # ensuring the RCG, while a down primary is tolerated."},{"line_number":2927,"context_line":"                    try:"},{"line_number":2928,"context_line":"                        self._do_volume_replication_setup(volume)"},{"line_number":2929,"context_line":"                    except Exception as ex:"},{"line_number":2930,"context_line":"                        if not _is_array_unreachable_error(ex):"},{"line_number":2931,"context_line":"                            # A genuine (non-connectivity) error should be"}],"source_content_type":"text/x-python","patch_set":1,"id":"d04ada55_fa9a184d","line":2928,"in_reply_to":"954858bd_68671b5f","updated":"2026-09-02 12:42:35.000000000","message":"Removed _do_volume_replication_setup() from host failover so failover does not recreate RCGs or run cleanup that can delete volumes.\n\nAdded an explicit primary_unreachable guard from failover_host() into _failover_replicated_host_volume() so the primary-down check is preserved without mutating replication setup.","commit_id":"1a046849d2099072aa608d09ad9a7bd2d1462ff2"}]}
