)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38092,"name":"Paweł Maćkowiak","display_name":"Paweł Maćkowiak","email":"pawel.mackowiak@canonical.com","username":"pawmack"},"change_message_id":"ae7e617e11cfd31a34d3fa488731ff78a94995f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b643f9c8_74f1fa06","updated":"2026-09-15 10:37:04.000000000","message":"I have tested the proposed patch in the environment where the bug was discovered. Sync is triggered. After sync reaches 100% the remote data state is set to 1.","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"d74682c6545edfeb395008d99ab4378cf13ef7c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6e2b4c3e_88e0840f","updated":"2026-09-15 08:24:54.000000000","message":"LGTM","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"},{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"4be4caf257e5157b4c340a76c942d1cf567fbe72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"342cb8c9_a73e2879","updated":"2026-09-14 19:10:08.000000000","message":"Thanks for quick review, updated change notes.","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"}],"cinder/tests/unit/volume/drivers/huawei/test_huawei_drivers.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"53ae12ebb74b01c817afd51ffa5525c4619f01c5","unresolved":true,"context_lines":[{"line_number":5652,"context_line":"        self.cleanup.attach_mock(self.remote.delete_lun, \u0027remote\u0027)"},{"line_number":5653,"context_line":"        self.cleanup.attach_mock(self.driver._delete_lun_with_check, \u0027local\u0027)"},{"line_number":5654,"context_line":""},{"line_number":5655,"context_line":"    @ddt.data(\u0027start\u0027, \u0027unhealthy\u0027, \u0027timeout\u0027, \u0027query\u0027)"},{"line_number":5656,"context_line":"    def test_clone_sync_failure_cleans_up(self, failure):"},{"line_number":5657,"context_line":"        self._prepare_clone()"},{"line_number":5658,"context_line":"        api_error \u003d exception.VolumeBackendAPIException(data\u003d\u0027API failure\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bec11162_eee20c41","line":5655,"updated":"2026-09-17 03:13:52.000000000","message":"None of these cleanup cases put the pair in RUNNING_TO_BE_SYNC (\u0027100\u0027).\n\n\u0027timeout\u0027 mocks RUNNINGSTATUS \u002723\u0027 (stop is expected). \u0027start\u0027 leaves get_hypermetro_by_id at the setUp default RUNNINGSTATUS \u00271\u0027 (line 5583), so stop is expected even though a real failed synchronize after ISFIRSTSYNC\u003dTrue is more likely to be \u0027100\u0027. \u0027unhealthy\u0027 is the only case that asserts stop is skipped.\n\nPlease add a case with HEALTHSTATUS\u003d\u00271\u0027, RUNNINGSTATUS\u003d\u0027100\u0027 after sync failure, and assert stop is called once the production helper treats \u0027100\u0027 as stoppable.","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"}],"cinder/volume/drivers/huawei/common.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"53ae12ebb74b01c817afd51ffa5525c4619f01c5","unresolved":true,"context_lines":[{"line_number":754,"context_line":""},{"line_number":755,"context_line":"        model_update \u003d self._add_extend_type_to_volume(opts, lun_params,"},{"line_number":756,"context_line":"                                                       lun_info, model_update,"},{"line_number":757,"context_line":"                                                       is_sync\u003dTrue)"},{"line_number":758,"context_line":"        model_update[\u0027provider_location\u0027] \u003d huawei_utils.to_string("},{"line_number":759,"context_line":"            **model_update.pop(\u0027metadata\u0027))"},{"line_number":760,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c40b4f41_3621c5e6","line":757,"updated":"2026-09-17 03:13:52.000000000","message":"is_sync\u003dTrue is only passed here. That covers:\n- create_volume_from_snapshot (this method)\n- create_cloned_volume, which calls this at line 780, then deletes the temp snapshot in finally at 784\n- create_group_from_src, which calls this per volume at 1652 and only then deletes group snapshots at 1658\n\nEmpty create_volume (359-360) still uses the default is_sync\u003dFalse. Good.\n\nBecause the metro wait now sits inside create_volume_from_snapshot, the clone temp snapshot and CG temp snapshots stay on the array for the whole HyperMetro first sync, not just LUNcopy/clone_pair. The snapshot is not required after _create_volume_from_snapshot returns. If you keep wait in this method, please split “local copy” from “metro sync” so create_cloned_volume can delete the snapshot before the wait.","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"}],"cinder/volume/drivers/huawei/hypermetro.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"53ae12ebb74b01c817afd51ffa5525c4619f01c5","unresolved":true,"context_lines":[{"line_number":122,"context_line":"                            \u0027id\u0027: metro_id, \u0027health\u0027: health,"},{"line_number":123,"context_line":"                            \u0027running\u0027: running}"},{"line_number":124,"context_line":"                raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":125,"context_line":"            return running \u003d\u003d constants.RUNNING_NORMAL"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        self.client.sync_hypermetro(metro_id)"},{"line_number":128,"context_line":"        huawei_utils.wait_for_condition("}],"source_content_type":"text/x-python","patch_set":3,"id":"0834857b_572c39a4","line":125,"updated":"2026-09-17 03:13:52.000000000","message":"Done is only `running \u003d\u003d RUNNING_NORMAL` (\u00271\u0027). HEALTHSTATUS/RUNNINGSTATUS are the only fields read.\n\nBug 2167242\u0027s failure mode is an inconsistent remote LUN (REMOTEDATASTATE 2 in the bug;checked that this patch sets remote data state to 1). This driver never reads REMOTEDATASTATE (no hits in the Huawei tree). FAKE_HYPERMETRO_RESPONSE also has no such field.\n\nIf  RUNNINGSTATUS\u003d1 while remote data is still inconsistent, this wait will return too early and Cinder will set the volume available. Please either wait until remote data is consistent as well, or state in the commit/reno that on the tested firmware running\u003d1 implies that.","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"53ae12ebb74b01c817afd51ffa5525c4619f01c5","unresolved":true,"context_lines":[{"line_number":124,"context_line":"                raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":125,"context_line":"            return running \u003d\u003d constants.RUNNING_NORMAL"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        self.client.sync_hypermetro(metro_id)"},{"line_number":128,"context_line":"        huawei_utils.wait_for_condition("},{"line_number":129,"context_line":"            _sync_complete, self.configuration.lun_copy_wait_interval,"},{"line_number":130,"context_line":"            self.configuration.lun_timeout)"}],"source_content_type":"text/x-python","patch_set":3,"id":"e6ae18de_115ec9b7","line":127,"updated":"2026-09-17 03:13:52.000000000","message":"This always PUTs /HyperMetroPair/synchronize_hcpair before polling.\n\n_sync_complete() already treats RUNNING_TO_BE_SYNC (\u0027100\u0027) as in-progress, which is the Huawei \"To be synchronized\" state where synchronize is the documented next step. If create with ISFIRSTSYNC\u003dTrue has already moved the pair to RUNNING_SYNC (\u002723\u0027), this extra PUT is not needed and Huawei documents synchronize as valid only from To be synchronized / Paused / Force Start.\n\nPlease GET the pair first:\n- \u0027100\u0027 (and \u002741\u0027 if you hit it) → PUT, then wait\n- \u002723\u0027 → wait only\n- \u00271\u0027 → return\n\nafter pair create and before this PUT, was RUNNINGSTATUS 100 or already 23?","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"53ae12ebb74b01c817afd51ffa5525c4619f01c5","unresolved":true,"context_lines":[{"line_number":357,"context_line":"        self._stop_hypermetro_if_needed(metro_id)"},{"line_number":358,"context_line":"        return metro_id"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"    def _stop_hypermetro_if_needed(self, metro_id):"},{"line_number":361,"context_line":"        metro_existed \u003d self.client.check_hypermetro_exist(metro_id)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        if metro_existed:"}],"source_content_type":"text/x-python","patch_set":3,"id":"0546d838_d2f73a8b","line":360,"updated":"2026-09-17 03:13:52.000000000","message":"This helper still stops only HEALTH_NORMAL + (RUNNING_NORMAL or RUNNING_SYNC) — see the condition at 368-370.\n\nThis patch adds RUNNING_TO_BE_SYNC (\u0027100\u0027) and treats it as valid in-progress in sync_hypermetro (line 119). delete_hypermetro_pair (line 87) uses this helper for clone cleanup. If sync fails while the pair is in \u0027100\u0027, stop is skipped and DELETE is issued anyway.\n\nI am not claiming the array will reject that DELETE; I am claiming stop is inconsistent with the new state this patch introduced. Please stop \u0027100\u0027 here too (or attempt stop whenever delete follows).","commit_id":"26cf9016f52799691b0e19834f38e72cd08e5ece"}],"releasenotes/notes/huawei-hypermetro-initial-sync-645e46856251499f.yaml":[{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"b4d00c130cea82dd092cba83248f5770eb1ccd5b","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Huawei driver: Fixed `bug #2167242"},{"line_number":5,"context_line":"    \u003chttps://bugs.launchpad.net/cinder/+bug/2167242\u003e`_ by enabling and"},{"line_number":6,"context_line":"    completing initial HyperMetro synchronization when cloning a volume"},{"line_number":7,"context_line":"    or creating one from a snapshot. These volumes could return incorrect"},{"line_number":8,"context_line":"    data through the remote array because the newly created remote LUN"},{"line_number":9,"context_line":"    had not been synchronized with the populated local LUN. Creation now"},{"line_number":10,"context_line":"    waits for synchronization to complete, using the configured LUN"},{"line_number":11,"context_line":"    timeout. Empty-volume creation is unchanged. This change does not"},{"line_number":12,"context_line":"    repair existing inconsistent pairs."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"b7be572b_1a7c18e9","line":9,"range":{"start_line":7,"start_character":37,"end_line":9,"end_character":58},"updated":"2026-09-14 18:00:44.000000000","message":"It\u0027s important to note here that this is a problem that happens only when multipath is used.","commit_id":"9ecd899f4e1943fdb1ea9ae8ad694fdd0dac9ab7"},{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"4be4caf257e5157b4c340a76c942d1cf567fbe72","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Huawei driver: Fixed `bug #2167242"},{"line_number":5,"context_line":"    \u003chttps://bugs.launchpad.net/cinder/+bug/2167242\u003e`_ by enabling and"},{"line_number":6,"context_line":"    completing initial HyperMetro synchronization when cloning a volume"},{"line_number":7,"context_line":"    or creating one from a snapshot. These volumes could return incorrect"},{"line_number":8,"context_line":"    data through the remote array because the newly created remote LUN"},{"line_number":9,"context_line":"    had not been synchronized with the populated local LUN. Creation now"},{"line_number":10,"context_line":"    waits for synchronization to complete, using the configured LUN"},{"line_number":11,"context_line":"    timeout. Empty-volume creation is unchanged. This change does not"},{"line_number":12,"context_line":"    repair existing inconsistent pairs."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"a40aa2f2_26d5f979","line":9,"range":{"start_line":7,"start_character":37,"end_line":9,"end_character":58},"in_reply_to":"b7be572b_1a7c18e9","updated":"2026-09-14 19:10:08.000000000","message":"Done","commit_id":"9ecd899f4e1943fdb1ea9ae8ad694fdd0dac9ab7"}]}
