)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2516ac3ecaf517039a1867da0392c720f8ea7956","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"853e1fab_b8238e6b","updated":"2026-05-20 16:01:15.000000000","message":"A few things to clear up.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"31766cd6_69b088ec","updated":"2026-06-05 13:28:45.000000000","message":"API surface and skeleton are right. Blockers: line 175 (restore failure-state tracking), line 123 + line 126 (lineage flattening + capacity), and the DB-update atomicity comment for implementability.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"abd5e1bfbd40d351dd440105e115e6495d1c1767","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"2f35dbe2_ee324c0b","updated":"2026-06-08 14:50:12.000000000","message":"Provided some comments.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e8db03869e3e3c03bc1d06dcb7886013e5debf06","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d18b4fa1_f73ae8b2","updated":"2026-06-11 12:13:06.000000000","message":"Some additional comments.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0eacc5ac1d0235a7d1d03370e583e2c37b494e30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"54ac45b8_5d4df8b1","updated":"2026-06-05 14:50:37.000000000","message":"few concerns inline","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"ee82b777bf93a4c410a13d8c3b1293250395fb38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"7dc18b04_39f11dcb","updated":"2026-08-12 21:41:34.000000000","message":"Before this can be approved I think two things need to happen.\n\nFirst, Eric\u0027s question on PS6 about the API shape is still open and unanswered.\nAdding a value to `migration_policy` overloads a field whose current meaning is\n\"may I migrate?\" with a second, orthogonal meaning of \"what should I bring with\nme?\". Your table on PS6 shows the behaviour is well defined, and I don\u0027t doubt\nthat — my concern is the same as Eric\u0027s, that the field ends up encoding two\nindependent decisions. This is worth settling in the next mid-cycle meeting\nwe iterate further on the text, because if it changes, the REST API impact\nsection changes with it. I\u0027d rather that discussion happen now than after\nanother revision.\n\nSecond, there are four points I raised on PS1/PS3 that have been answered with\n\"I will update it in the next version\" but have not appeared in PS4 through\nPS7.","commit_id":"c2e62e6502565c944c7dd9ea47e0946b303ebbc1"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"315f58cb89e892c3a1fa19d8b44db814292a602b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ca4cbc4f_a42a557f","updated":"2026-08-12 13:55:55.000000000","message":"LGTM","commit_id":"c2e62e6502565c944c7dd9ea47e0946b303ebbc1"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"ed12b197f09a16f8200cc49a58feac617111d3eb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"b7a29dfe_4af11022","in_reply_to":"7dc18b04_39f11dcb","updated":"2026-08-18 19:13:50.000000000","message":"@simon@everpuredata.com\nThank you for raising this, and sorry that we did not address @eharney@redhat.com\u0027s question directly in the previous reply.\n \nI agree with Eric\u0027s and your concern. The existing `migration_policy` parameter answers whether migration is allowed during retype, while including snapshots is a separate decision about what resources participate in that migration. Adding `on-demand-include-snapshots` combines those two decisions in one value.\n \nWe are currently considering two alternatives:\n1. Add an independent `include_snapshots` boolean to the `os-retype` request in a new microversion, while keeping the existing meaning and values of `migration_policy`.\nFor example:\n       {\n           \"os-retype\": {\n               \"new_type\": \"new-storage-backend\",\n               \"migration_policy\": \"on-demand\",\n               \"include_snapshots\": true\n           }\n       }\n \n   In this model, `migration_policy` continues to control whether migration may occur, and `include_snapshots` controls whether snapshots are included if migration is required. The default for `include_snapshots` would be`false`, preserving the existing API behavior.\n   In particular, `migration_policy\u003dnever` with `include_snapshots\u003dtrue` would not permit migration. A retype that can be completed without migration may still succeed, while one that requires migration would fail as it does today.\n   \n \n2. Keep the REST API unchanged and use a cinder.conf option to control whether migration of volumes with snapshots is enabled. In that case, `migration_policy\u003don-demand` would retain its current API shape, while the deployer configuration would determine whether snapshots are included.\n \nMy current preference is option 1. It keeps the two decisions orthogonal, makes the potentially expensive snapshot-inclusive operation explicit for each request, and avoids changing request behavior solely through a deployment configuration. However, I would like to get feedback from the community before settling on this API shape.","commit_id":"c2e62e6502565c944c7dd9ea47e0946b303ebbc1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"c7692fb8_b4d0517d","in_reply_to":"a8f7d72b_e71e4fe6","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"c2e62e6502565c944c7dd9ea47e0946b303ebbc1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"83acfffb62b4c210410e5f4c3f3c32042135f220","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"a8f7d72b_e71e4fe6","in_reply_to":"b7a29dfe_4af11022","updated":"2026-08-21 20:44:22.000000000","message":"Thanks for coming back on this, and for engaging with the objection rather than\ndefending the original shape. Option 1 is the right answer and I support it.\n\nTo say why explicitly, so it\u0027s on the record for anyone joining the thread\nlater: `include_snapshots` keeps the two decisions orthogonal. `migration_policy`\ncontinues to answer \"may this retype migrate?\" and the new flag answers \"if it\nmigrates, does the snapshot set come too?\". That also resolves Eric\u0027s specific\npoint on PS6 by construction — retyping a volume that has snapshots but needs no\nmigration keeps succeeding under `migration_policy\u003dnever`, because the new flag\nnever makes migration permissible on its own. Your description of\n`never` + `include_snapshots\u003dtrue` is the behaviour I\u0027d expect: the combination\nis accepted, not rejected as contradictory, and migration is still refused.\nPlease state that case explicitly in the spec — it\u0027s the one a reader will\nwonder about.\n\nI\u0027d rule option 2 out, and I think it should be ruled out in the spec rather\nthan left as an alternative. Gating this on a cinder.conf option means the same\nAPI request behaves differently depending on the deployment, with nothing in the\nresponse telling the caller which behaviour they got. It also gives the API user\nno way to opt into an operation that may copy N x volume size — the caller who\npays the cost is the one who should ask for it. The legitimate deployer control\nis a bound, not a switch, and you already have that in the\n`max_snapshots_per_migration` option: it composes with option 1 exactly as it\nstands. Please move option 2 into the Alternatives section with that reasoning\nrather than leaving it open.\n\nOne thing worth stating plainly so this doesn\u0027t stall the implementation:\nadopting option 1 does not invalidate the work already done. It rewrites the\nschema and microversion patch, changes the trigger condition in the policy and\npreflight patches, and changes what gets threaded through the routing and\nscheduler patches — but the orchestration core is untouched, because nothing\npast the API layer keys off the policy string once execution starts. The\nexpensive part of the series survives the change.\n\n\n@eharney@redhat.com — could you confirm option 1 addresses your PS6 concern? I\u0027d rather this\nwere settled you as well rather than agreement between Fuli and me.","commit_id":"c2e62e6502565c944c7dd9ea47e0946b303ebbc1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7eae9f3a_2be2adaf","updated":"2026-09-23 15:25:36.000000000","message":"Not a -1, but not a +2 yet","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0979e21bf952b80ee534ec11e373f5e9cda700f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"faa64bb7_aad5102b","updated":"2026-09-23 18:00:56.000000000","message":"please move to 2027.1","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"06e59619c90a44b77b67718c64f1cab63214a7f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"6dea9963_5187cd49","updated":"2026-10-14 08:50:09.000000000","message":"LGTM. Thank you for the spec.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1a77694f_b48e73a6","updated":"2026-10-05 19:55:56.000000000","message":"Thank you for PS9. Every point from the PS8 review is addressed, and a couple\nare better than what I asked for: splitting the in-use assumption at line 93,\nreplacing the destination-quota bullet with a source-side headroom requirement\nthat accounts for sequential processing and space-efficient clones, and adding\nthe explicit \"delete the temporary source volume before processing the next\nsnapshot\" step that makes that reasoning hold. I also checked the quota claim\nat lines 122-124 against the implementation: 994909 creates the staging\nsnapshot record with `use_quota\u003dFalse` and the temporary volumes go through\n`_create_temp_volume_from_snapshot`, so the statement is accurate rather than\naspirational. The Security impact rewrite now matches what 994903 actually\ndoes, and the move to `specs/2027.1/` is right.\n\nThis is the last set of items I have. Most of it is documenting decisions you\nhave already made in code — your implementation is ahead of the spec text in\nseveral places, and since the spec is what the rest of us review the code\nagainst, the text needs to catch up.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"929c95dd_a8ac1a15","updated":"2026-10-21 23:35:16.000000000","message":"Thank you for the detailed review and for checking the spec against the implementation. I rechecked the current patch series while preparing the next revision and updated the spec.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1856a5ff_62d1b33d","updated":"2026-10-22 11:53:00.000000000","message":"Three inline comments below. The first is the only one I would want in\nbefore approval, because the spec currently describes a weaker behaviour\nthan the code has. The other two are a design-gap note I owed you from the\nlast round and a nit.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"780289a8_6bb713cd","updated":"2026-10-22 14:21:50.000000000","message":"Looks good","commit_id":"a11abc5ceb9aa097282e85efcfbcda11be4c2b98"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"5a11f751111589de4167dd885bdeb7bcea3b5110","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"078e7468_d748a909","updated":"2026-10-22 13:43:13.000000000","message":"Thank you for the review and for comparing the spec with the current implementation. I addressed the two documentation gaps and noted the expected version renumbering.","commit_id":"a11abc5ceb9aa097282e85efcfbcda11be4c2b98"}],"specs/2026.2/retype-volume-including-snapshots.rst":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"abd5e1bfbd40d351dd440105e115e6495d1c1767","unresolved":true,"context_lines":[{"line_number":21,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"* Datacenter Maintenance or Backend Upgrade: An operator needs to vacate all"},{"line_number":24,"context_line":"  volumes from a storage backend that is being decommissioned or upgraded. Some"},{"line_number":25,"context_line":"  volumes on that backend have snapshots (e.g., user-created restore points)."},{"line_number":26,"context_line":"  Today, those volumes cannot be moved or retyped without deleting the"},{"line_number":27,"context_line":"  snapshots, which is not acceptable to the users. With this feature, the"},{"line_number":28,"context_line":"  operator could migrate such volumes (and their snapshots) seamlessly to a new"}],"source_content_type":"text/x-rst","patch_set":3,"id":"f6b7542a_0150410d","line":25,"range":{"start_line":24,"start_character":75,"end_line":25,"end_character":76},"updated":"2026-06-08 14:50:12.000000000","message":"A general trend we have seen in case of CSPs is, users do not want to keep snapshots on local storage for longer retention periods. This risks their golden copies to get deleted/lost in case of a disaster. Users use backup solutions to move the golden copies of their Volumes and VMs and remove the local snapshots. So a lot of users would be using backup solutions to migrate volumes with snapshots.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"06e59619c90a44b77b67718c64f1cab63214a7f2","unresolved":false,"context_lines":[{"line_number":21,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"* Datacenter Maintenance or Backend Upgrade: An operator needs to vacate all"},{"line_number":24,"context_line":"  volumes from a storage backend that is being decommissioned or upgraded. Some"},{"line_number":25,"context_line":"  volumes on that backend have snapshots (e.g., user-created restore points)."},{"line_number":26,"context_line":"  Today, those volumes cannot be moved or retyped without deleting the"},{"line_number":27,"context_line":"  snapshots, which is not acceptable to the users. With this feature, the"},{"line_number":28,"context_line":"  operator could migrate such volumes (and their snapshots) seamlessly to a new"}],"source_content_type":"text/x-rst","patch_set":3,"id":"e672506c_39f8c61e","line":25,"range":{"start_line":24,"start_character":75,"end_line":25,"end_character":76},"in_reply_to":"1cc5411b_ef72bf07","updated":"2026-10-14 08:50:09.000000000","message":"Acknowledged","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"4736281341cf71bee828c73a3c3b19257eddaf89","unresolved":true,"context_lines":[{"line_number":21,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"* Datacenter Maintenance or Backend Upgrade: An operator needs to vacate all"},{"line_number":24,"context_line":"  volumes from a storage backend that is being decommissioned or upgraded. Some"},{"line_number":25,"context_line":"  volumes on that backend have snapshots (e.g., user-created restore points)."},{"line_number":26,"context_line":"  Today, those volumes cannot be moved or retyped without deleting the"},{"line_number":27,"context_line":"  snapshots, which is not acceptable to the users. With this feature, the"},{"line_number":28,"context_line":"  operator could migrate such volumes (and their snapshots) seamlessly to a new"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1cc5411b_ef72bf07","line":25,"range":{"start_line":24,"start_character":75,"end_line":25,"end_character":76},"in_reply_to":"f6b7542a_0150410d","updated":"2026-06-09 12:36:16.000000000","message":"Thank you for your comments. I agree with that. However, there are still many systems that require taking volume snapshots and saving them for a certain period. For example, a system might need to take daily snapshots and keep them for 30 days. For such systems, a local snapshot is simpler and more feasible than a remote backup solution. We need to consider the needs of these systems.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0eacc5ac1d0235a7d1d03370e583e2c37b494e30","unresolved":true,"context_lines":[{"line_number":89,"context_line":"   requested, Cinder determines whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"},{"line_number":92,"context_line":"   migration. This includes creating a volume from a snapshot, migrating or"},{"line_number":93,"context_line":"   copying the temporary volume to the destination backend, and creating a"},{"line_number":94,"context_line":"   snapshot on the destination backend."},{"line_number":95,"context_line":"3. Cinder migrates snapshots first (Cinder copies each snapshot in dependency"},{"line_number":96,"context_line":"   order as a volume to destination backend, and then creates a new snapshot on"},{"line_number":97,"context_line":"   the destination backend)."}],"source_content_type":"text/x-rst","patch_set":3,"id":"376cd1da_4aaec7e7","line":94,"range":{"start_line":92,"start_character":63,"end_line":94,"end_character":39},"updated":"2026-06-05 14:50:37.000000000","message":"what happens to the temporary volume? is that deleted after the snapshot is created on destination backend? Some vendors have dependency between the volume and snapshot and sometimes deleting the source volume requires flattening the snapshot since the snapshot is a COW or ROW clone of the source so all volume blocks needs to be copied before it\u0027s deleted.\nIf that scenario happens, won\u0027t the snapshot end up having more storage space on the destination than on the source (where they were a COW or ROW clone) ?","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":89,"context_line":"   requested, Cinder determines whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"},{"line_number":92,"context_line":"   migration. This includes creating a volume from a snapshot, migrating or"},{"line_number":93,"context_line":"   copying the temporary volume to the destination backend, and creating a"},{"line_number":94,"context_line":"   snapshot on the destination backend."},{"line_number":95,"context_line":"3. Cinder migrates snapshots first (Cinder copies each snapshot in dependency"},{"line_number":96,"context_line":"   order as a volume to destination backend, and then creates a new snapshot on"},{"line_number":97,"context_line":"   the destination backend)."}],"source_content_type":"text/x-rst","patch_set":3,"id":"56625e24_565a7874","line":94,"range":{"start_line":92,"start_character":63,"end_line":94,"end_character":39},"in_reply_to":"2eadb5a0_1ea3754a","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"abd5e1bfbd40d351dd440105e115e6495d1c1767","unresolved":true,"context_lines":[{"line_number":89,"context_line":"   requested, Cinder determines whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"},{"line_number":92,"context_line":"   migration. This includes creating a volume from a snapshot, migrating or"},{"line_number":93,"context_line":"   copying the temporary volume to the destination backend, and creating a"},{"line_number":94,"context_line":"   snapshot on the destination backend."},{"line_number":95,"context_line":"3. Cinder migrates snapshots first (Cinder copies each snapshot in dependency"},{"line_number":96,"context_line":"   order as a volume to destination backend, and then creates a new snapshot on"},{"line_number":97,"context_line":"   the destination backend)."}],"source_content_type":"text/x-rst","patch_set":3,"id":"48146adb_11593324","line":94,"range":{"start_line":92,"start_character":63,"end_line":94,"end_character":39},"in_reply_to":"376cd1da_4aaec7e7","updated":"2026-06-08 14:50:12.000000000","message":"Agreed. NetApp uses COW or clones to create snapshots. These are not full copy of the blocks but point in time pointers to the original block. Volume creation from clone itself is a clone as well. So this will require the source side to first split and then copy the entire volume on secondary site. Once done snapshots needs to be taken and the Volume from snapshot cannot exist since that will be an additional space overhead on destination site.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"4736281341cf71bee828c73a3c3b19257eddaf89","unresolved":true,"context_lines":[{"line_number":89,"context_line":"   requested, Cinder determines whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"},{"line_number":92,"context_line":"   migration. This includes creating a volume from a snapshot, migrating or"},{"line_number":93,"context_line":"   copying the temporary volume to the destination backend, and creating a"},{"line_number":94,"context_line":"   snapshot on the destination backend."},{"line_number":95,"context_line":"3. Cinder migrates snapshots first (Cinder copies each snapshot in dependency"},{"line_number":96,"context_line":"   order as a volume to destination backend, and then creates a new snapshot on"},{"line_number":97,"context_line":"   the destination backend)."}],"source_content_type":"text/x-rst","patch_set":3,"id":"2eadb5a0_1ea3754a","line":94,"range":{"start_line":92,"start_character":63,"end_line":94,"end_character":39},"in_reply_to":"48146adb_11593324","updated":"2026-06-09 12:36:16.000000000","message":"My idea is to create only one corresponding volume on the target backend. Then, data will be transferred from each source snapshot to this volume, and new snapshots will be created from it for each one. Finally, the current volume\u0027s data will be copied to this new volume, which will then become the canonical volume.\nSince there is only one temporary volume and the snapshot data will be transferred in order, COW or ROW clone will be supported on the destination if the backend supports it.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0eacc5ac1d0235a7d1d03370e583e2c37b494e30","unresolved":true,"context_lines":[{"line_number":110,"context_line":"   original source volume and snapshots unchanged."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"This design ensures that the retyped volume on the destination has an"},{"line_number":113,"context_line":"identical set of snapshots (with the same names and IDs) as it had on the"},{"line_number":114,"context_line":"source."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"Workflow details"}],"source_content_type":"text/x-rst","patch_set":3,"id":"0629fc9b_10bdc72f","line":113,"range":{"start_line":113,"start_character":27,"end_line":113,"end_character":56},"updated":"2026-06-05 14:50:37.000000000","message":"how do we ensure this? IIUC, if the source and destination are part of the same openstack cluster, and we migrate temporary volumes and create snapshots out of it, it will have a new UUID for the snapshot right? Will we update all the destination UUIDs of snapshots to the source ones? how can we do that unless we delete all the source snapshots?\nI guess once we migrate the base volume, we can delete the volume along with it\u0027s snapshots and then change the snapshot UUIDs to be the same as source but that\u0027s my understanding, please document how we are going to achieve it.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":110,"context_line":"   original source volume and snapshots unchanged."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"This design ensures that the retyped volume on the destination has an"},{"line_number":113,"context_line":"identical set of snapshots (with the same names and IDs) as it had on the"},{"line_number":114,"context_line":"source."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"Workflow details"}],"source_content_type":"text/x-rst","patch_set":3,"id":"030160ae_9951205f","line":113,"range":{"start_line":113,"start_character":27,"end_line":113,"end_character":56},"in_reply_to":"0629fc9b_10bdc72f","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"abd5e1bfbd40d351dd440105e115e6495d1c1767","unresolved":true,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":133,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":134,"context_line":"    dirver)."},{"line_number":135,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"}],"source_content_type":"text/x-rst","patch_set":3,"id":"20578b19_4d03ec5d","line":134,"range":{"start_line":134,"start_character":4,"end_line":134,"end_character":10},"updated":"2026-06-08 14:50:12.000000000","message":"nit: driver - typo","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"4736281341cf71bee828c73a3c3b19257eddaf89","unresolved":true,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":133,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":134,"context_line":"    dirver)."},{"line_number":135,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"}],"source_content_type":"text/x-rst","patch_set":3,"id":"aea6f074_05fec52b","line":134,"range":{"start_line":134,"start_character":4,"end_line":134,"end_character":10},"in_reply_to":"20578b19_4d03ec5d","updated":"2026-06-09 12:36:16.000000000","message":"Thank you, I will correct it.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"9b3f77b27f25f3c721884f0cec66e3f6b042dd08","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":133,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":134,"context_line":"    dirver)."},{"line_number":135,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"}],"source_content_type":"text/x-rst","patch_set":3,"id":"0510877a_3b904102","line":134,"range":{"start_line":134,"start_character":4,"end_line":134,"end_character":10},"in_reply_to":"aea6f074_05fec52b","updated":"2026-06-25 14:48:42.000000000","message":"Done","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":true,"context_lines":[{"line_number":135,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"},{"line_number":138,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":139,"context_line":"    snapshot content, preserving snapshot metadata."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"* Maintain and/or reconstruct snapshot lineage:"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"09130369_e73307f6","line":139,"range":{"start_line":138,"start_character":4,"end_line":139,"end_character":51},"updated":"2026-06-05 13:28:45.000000000","message":"Each destination snapshot is a fresh snapshot taken of a copy, not a faithful reproduction of the source snapshot\u0027s exact image. For an available volume the source is static, so fidelity is fine. But per lines 100-102 the in-use path copies via the live Nova-assisted flow, so the destination snapshots are only crash-consistent at copy time — they are not identical point-in-time images of the originals. Please state whether that semantic difference is accepted for in-use retype, or how it\u0027s avoided (e.g. quiesce, or restricting which VM states qualify).","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"abd5e1bfbd40d351dd440105e115e6495d1c1767","unresolved":true,"context_lines":[{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"},{"line_number":138,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":139,"context_line":"    snapshot content, preserving snapshot metadata."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"* Maintain and/or reconstruct snapshot lineage:"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7cb5b8be_fa10b036","line":139,"range":{"start_line":139,"start_character":22,"end_line":139,"end_character":51},"updated":"2026-06-08 14:50:12.000000000","message":"Snapshot metadata will change once the transfer is complete. The ID/path and container of snapshots will changes. For vendors who use luns using COW snapshoting, this would mean change in the lun paths/file paths for eg.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":135,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"},{"line_number":138,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":139,"context_line":"    snapshot content, preserving snapshot metadata."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"* Maintain and/or reconstruct snapshot lineage:"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1d966875_5e2f6927","line":139,"range":{"start_line":138,"start_character":4,"end_line":139,"end_character":51},"in_reply_to":"09130369_e73307f6","updated":"2026-06-15 01:21:19.000000000","message":"I will update it in the next version.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":135,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"},{"line_number":138,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":139,"context_line":"    snapshot content, preserving snapshot metadata."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"* Maintain and/or reconstruct snapshot lineage:"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"94a8a545_bc05ca7f","line":139,"range":{"start_line":138,"start_character":4,"end_line":139,"end_character":51},"in_reply_to":"1d966875_5e2f6927","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"edfd62f2774ea74bc458608b5320a51c0f812762","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":137,"context_line":"    generic host-assisted copy path is used"},{"line_number":138,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":139,"context_line":"    snapshot content, preserving snapshot metadata."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"* Maintain and/or reconstruct snapshot lineage:"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"a420ad01_2f7a0b4d","line":139,"range":{"start_line":139,"start_character":22,"end_line":139,"end_character":51},"in_reply_to":"7cb5b8be_fa10b036","updated":"2026-10-14 08:50:46.000000000","message":"Done","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0eacc5ac1d0235a7d1d03370e583e2c37b494e30","unresolved":true,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* When the volume status is ``in-use``:"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"  * Attach the destination volume to the same instance/host where the source"},{"line_number":157,"context_line":"    volume is attached (without changing the guest-visible device until the"},{"line_number":158,"context_line":"    final swap/commit step)."},{"line_number":159,"context_line":"  * Invoke the existing in-use migration data copy flow where Cinder calls Nova"},{"line_number":160,"context_line":"    to copy the data between the source and destination volumes."},{"line_number":161,"context_line":"  * Complete the migration by updating Cinder state to treat the destination"}],"source_content_type":"text/x-rst","patch_set":3,"id":"c450242d_55cc6a78","line":158,"range":{"start_line":156,"start_character":0,"end_line":158,"end_character":28},"updated":"2026-06-05 14:50:37.000000000","message":"doesn\u0027t this already happen in the migration workflow where we ask nova to copy the data between source and destination and swap the volumes in the end?","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"260f262fed2d85e22117797fd0efb7601e677f17","unresolved":true,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* When the volume status is ``in-use``:"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"  * Attach the destination volume to the same instance/host where the source"},{"line_number":157,"context_line":"    volume is attached (without changing the guest-visible device until the"},{"line_number":158,"context_line":"    final swap/commit step)."},{"line_number":159,"context_line":"  * Invoke the existing in-use migration data copy flow where Cinder calls Nova"},{"line_number":160,"context_line":"    to copy the data between the source and destination volumes."},{"line_number":161,"context_line":"  * Complete the migration by updating Cinder state to treat the destination"}],"source_content_type":"text/x-rst","patch_set":3,"id":"e23342cf_4a22fdc9","line":158,"range":{"start_line":156,"start_character":0,"end_line":158,"end_character":28},"in_reply_to":"c450242d_55cc6a78","updated":"2026-10-23 02:14:15.000000000","message":"The spec now describes the \u0027in-use\u0027 volume migration as follows:\n\n* If the volume status is ``in-use``, the base volume data transfer uses a\n  host-assisted strategy with the same Nova-assisted copy mechanism used by the\n  existing attached-volume migration flow where applicable.\n\n  * Attach the destination volume to the same instance/host where the source\n    volume is attached (without changing the guest-visible device until the\n    final swap/commit step).\n  * Invoke the existing in-use migration data copy flow where Cinder calls Nova\n    to copy the data between the source and destination volumes.\n\n  * Complete the migration by updating Cinder state to treat the destination\n    volume as the canonical volume on the new backend.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":true,"context_lines":[{"line_number":164,"context_line":"Cinder DB update"},{"line_number":165,"context_line":"~~~~~~~~~~~~~~~~"},{"line_number":166,"context_line":"* Update the ``host`` / backend fields for the volume."},{"line_number":167,"context_line":"* Update snapshot provider metadata such as ``provider_location``,"},{"line_number":168,"context_line":"  ``provider_id``, and ``provider_auth`` so that existing Cinder snapshot"},{"line_number":169,"context_line":"  records refer to the destination backend snapshot artifacts."},{"line_number":170,"context_line":"* Update the snapshots\u0027 ``volume_type_id`` when the volume type changes."},{"line_number":171,"context_line":"* Ensure snapshot records continue to reference the migrated volume."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3ae5f489_e1f65b23","line":168,"range":{"start_line":167,"start_character":2,"end_line":168,"end_character":40},"updated":"2026-06-05 13:28:45.000000000","message":"The destination snapshots are created via the normal create_snapshot driver call, which yields a model-update for a new snapshot record — but this design keeps the original Cinder snapshot ID and grafts new backend provider fields onto it. Please spell out:\n\n * the exact mapping (original snapshot record ← new backend artifact\u0027s provider fields), and\n * atomicity: the volume plus all N snapshot records must be repointed as a unit; a crash between per-snapshot updates leaves a mix of source/destination pointers. \"update … in a driver-consistent manner\" is too vague for the field that determines whether the snapshot is openable after retype.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":164,"context_line":"Cinder DB update"},{"line_number":165,"context_line":"~~~~~~~~~~~~~~~~"},{"line_number":166,"context_line":"* Update the ``host`` / backend fields for the volume."},{"line_number":167,"context_line":"* Update snapshot provider metadata such as ``provider_location``,"},{"line_number":168,"context_line":"  ``provider_id``, and ``provider_auth`` so that existing Cinder snapshot"},{"line_number":169,"context_line":"  records refer to the destination backend snapshot artifacts."},{"line_number":170,"context_line":"* Update the snapshots\u0027 ``volume_type_id`` when the volume type changes."},{"line_number":171,"context_line":"* Ensure snapshot records continue to reference the migrated volume."}],"source_content_type":"text/x-rst","patch_set":3,"id":"6b33bf96_03620015","line":168,"range":{"start_line":167,"start_character":2,"end_line":168,"end_character":40},"in_reply_to":"3ae5f489_e1f65b23","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"abd5e1bfbd40d351dd440105e115e6495d1c1767","unresolved":true,"context_lines":[{"line_number":179,"context_line":"----------------"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":182,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":183,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":184,"context_line":"  leaving the source volume untouched."},{"line_number":185,"context_line":"* If cleaning up migrated snapshot artifacts fails, Cinder stops the rollback"},{"line_number":186,"context_line":"  process."}],"source_content_type":"text/x-rst","patch_set":3,"id":"e4ee4260_262ed163","line":183,"range":{"start_line":182,"start_character":59,"end_line":183,"end_character":43},"updated":"2026-06-08 14:50:12.000000000","message":"How does cinder orchestrate the rollback in between of the migration failure? Unless the design considers updating each snapshot detail per migration with a success or failure flag.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e8db03869e3e3c03bc1d06dcb7886013e5debf06","unresolved":true,"context_lines":[{"line_number":179,"context_line":"----------------"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":182,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":183,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":184,"context_line":"  leaving the source volume untouched."},{"line_number":185,"context_line":"* If cleaning up migrated snapshot artifacts fails, Cinder stops the rollback"},{"line_number":186,"context_line":"  process."}],"source_content_type":"text/x-rst","patch_set":3,"id":"fb5f67ff_8af65722","line":183,"range":{"start_line":182,"start_character":59,"end_line":183,"end_character":43},"in_reply_to":"2daac4d3_35ef76a6","updated":"2026-06-11 12:13:06.000000000","message":"My question was also directed to understanding who will be responsible to orchestrate the cleanup? Cinder core will not know which migrations have failed so I believe the driver will be responsible to take that onus as it will have the list of all snapshots being migrated? If this has to be orchestrated frm Cinder core, how does the driver know which snapshots to clean as well?","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"9b3f77b27f25f3c721884f0cec66e3f6b042dd08","unresolved":false,"context_lines":[{"line_number":179,"context_line":"----------------"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":182,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":183,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":184,"context_line":"  leaving the source volume untouched."},{"line_number":185,"context_line":"* If cleaning up migrated snapshot artifacts fails, Cinder stops the rollback"},{"line_number":186,"context_line":"  process."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7b8e1f19_b8716112","line":183,"range":{"start_line":182,"start_character":59,"end_line":183,"end_character":43},"in_reply_to":"a8c10b08_8fc56918","updated":"2026-06-25 14:48:42.000000000","message":"Acknowledged","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"4736281341cf71bee828c73a3c3b19257eddaf89","unresolved":true,"context_lines":[{"line_number":179,"context_line":"----------------"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":182,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":183,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":184,"context_line":"  leaving the source volume untouched."},{"line_number":185,"context_line":"* If cleaning up migrated snapshot artifacts fails, Cinder stops the rollback"},{"line_number":186,"context_line":"  process."}],"source_content_type":"text/x-rst","patch_set":3,"id":"2daac4d3_35ef76a6","line":183,"range":{"start_line":182,"start_character":59,"end_line":183,"end_character":43},"in_reply_to":"e4ee4260_262ed163","updated":"2026-06-09 12:36:16.000000000","message":"In the current specification design, a volume migration cannot be interrupted once initiated. If a migration is interrupted for any reason, the volume migration status will change from \"migrating\" to \"error,\" and all migrated snapshot artifacts on the destination will be cleaned up. A system administrator will then be required to resolve the resulting error by resetting the volume\u0027s status.\nIf cleaning up migrated snapshot artifacts fails, the failure will be logged, and the system administrator will need to delete them manually.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":179,"context_line":"----------------"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":182,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":183,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":184,"context_line":"  leaving the source volume untouched."},{"line_number":185,"context_line":"* If cleaning up migrated snapshot artifacts fails, Cinder stops the rollback"},{"line_number":186,"context_line":"  process."}],"source_content_type":"text/x-rst","patch_set":3,"id":"a8c10b08_8fc56918","line":183,"range":{"start_line":182,"start_character":59,"end_line":183,"end_character":43},"in_reply_to":"fb5f67ff_8af65722","updated":"2026-06-15 01:21:19.000000000","message":"Cinder will be responsible for orchestrating the cleanup. When a migration fails, all snapshots that were migrated to the destination will be cleaned up. There\u0027s no need to identify individual failed snapshots.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"abd5e1bfbd40d351dd440105e115e6495d1c1767","unresolved":true,"context_lines":[{"line_number":272,"context_line":"Retyping volume duration increases with:"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"* number of snapshots,"},{"line_number":275,"context_line":"* snapshot sizes / copy mechanisms,"},{"line_number":276,"context_line":"* and volume size."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"overall time becomes:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"a094b07d_af099cce","line":275,"range":{"start_line":275,"start_character":19,"end_line":275,"end_character":34},"updated":"2026-06-08 14:50:12.000000000","message":"the concurrent operations will need to be designed in such a way that the parallel cloning limits of each driver can be taken care of. Depending on storage vendors, there will be limitations on how many parallel COW operations can be done, and if Cinder allows all operations to happen at the same time, it may reduce the probability of success in scaled out setups.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"3c7a5092a5815268ecda936b360e6a8aec26c05c","unresolved":false,"context_lines":[{"line_number":272,"context_line":"Retyping volume duration increases with:"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"* number of snapshots,"},{"line_number":275,"context_line":"* snapshot sizes / copy mechanisms,"},{"line_number":276,"context_line":"* and volume size."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"overall time becomes:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"db7ed34a_5d346d4a","line":275,"range":{"start_line":275,"start_character":19,"end_line":275,"end_character":34},"in_reply_to":"3d702bbc_c9188c21","updated":"2026-06-15 05:17:40.000000000","message":"Acknowledged","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"4736281341cf71bee828c73a3c3b19257eddaf89","unresolved":true,"context_lines":[{"line_number":272,"context_line":"Retyping volume duration increases with:"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"* number of snapshots,"},{"line_number":275,"context_line":"* snapshot sizes / copy mechanisms,"},{"line_number":276,"context_line":"* and volume size."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"overall time becomes:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"e373717c_a53f1612","line":275,"range":{"start_line":275,"start_character":19,"end_line":275,"end_character":34},"in_reply_to":"a094b07d_af099cce","updated":"2026-06-09 12:36:16.000000000","message":"Given that only one corresponding volume can be created on the destination to maintain volume-snapshot relationships and support COW or ROW cloning, snapshots should be migrated in a specific sequence. Therefore, I do not believe that parallel cloning is a feasible reality.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":272,"context_line":"Retyping volume duration increases with:"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"* number of snapshots,"},{"line_number":275,"context_line":"* snapshot sizes / copy mechanisms,"},{"line_number":276,"context_line":"* and volume size."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"overall time becomes:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3d702bbc_c9188c21","line":275,"range":{"start_line":275,"start_character":19,"end_line":275,"end_character":34},"in_reply_to":"e1b14910_ce124437","updated":"2026-06-15 01:21:19.000000000","message":"Before migration, a pre-check will verify if the destination\u0027s quota and other migration conditions are met. Only migrations that satisfy these conditions will be permitted.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e8db03869e3e3c03bc1d06dcb7886013e5debf06","unresolved":true,"context_lines":[{"line_number":272,"context_line":"Retyping volume duration increases with:"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"* number of snapshots,"},{"line_number":275,"context_line":"* snapshot sizes / copy mechanisms,"},{"line_number":276,"context_line":"* and volume size."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"overall time becomes:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"e1b14910_ce124437","line":275,"range":{"start_line":275,"start_character":19,"end_line":275,"end_character":34},"in_reply_to":"e373717c_a53f1612","updated":"2026-06-11 12:13:06.000000000","message":"Okay. A follow up question would be - how does this work with volume and snapshot quotas in place. If the destination backend has quotas assigned and is allowed to migrate volumes without limiting based on quotas, it may overprovision the destination and can be misused?","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0eacc5ac1d0235a7d1d03370e583e2c37b494e30","unresolved":true,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":"overall time becomes:"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* (vendor volume migration time) + (snapshot migration time), where snapshot"},{"line_number":281,"context_line":"  migration cost is roughly proportional to volume size multiplied by the"},{"line_number":282,"context_line":"  number of snapshot generations."},{"line_number":283,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bd8315e8_8c36c595","line":280,"range":{"start_line":280,"start_character":35,"end_line":280,"end_character":60},"updated":"2026-06-05 14:50:37.000000000","message":"we really need to consider this in performance as well as storage impact, if a volume of 2TB has 10 snapshots, it means we might end up migrating 22TB of data, which, when libvirt does it, is a really slow process and might take up days to complete. not to mention the storage space occupied during the length of the operation.\nthough the available snapshots will create available volumes which might use a dd operation and might be able to preserve sparseness, please try running some numbers so we have a clear idea what the performance impact of such an operation would be in a real world deployment.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"260f262fed2d85e22117797fd0efb7601e677f17","unresolved":true,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":"overall time becomes:"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* (vendor volume migration time) + (snapshot migration time), where snapshot"},{"line_number":281,"context_line":"  migration cost is roughly proportional to volume size multiplied by the"},{"line_number":282,"context_line":"  number of snapshot generations."},{"line_number":283,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ff70c5d6_9831aae1","line":280,"range":{"start_line":280,"start_character":35,"end_line":280,"end_character":60},"in_reply_to":"bd8315e8_8c36c595","updated":"2026-10-23 02:14:15.000000000","message":"I added a worked worst-case example to PS11.\n\nFor a 2 TiB volume with 10 snapshots, the generic path may copy approximately\n22 TiB: 20 TiB for the ten snapshot generations plus 2 TiB for the current\nvolume. At a sustained effective throughput of 100 MiB/s, the transfer alone\ntakes approximately 64 hours before protocol and backend overhead.\n\nWithout space-efficient snapshots, the destination may also require\napproximately 22 TiB of transient backend capacity. Sequential processing\nlimits source-side materialization to about one temporary volume at a time.\nSparse copies and COW/ROW snapshots can reduce both estimates.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0eacc5ac1d0235a7d1d03370e583e2c37b494e30","unresolved":true,"context_lines":[{"line_number":349,"context_line":"* Update Cinder admin documentation to describe behavior and caveats."},{"line_number":350,"context_line":"* Document driver and hypervisor constraints (e.g., libvirt requirement for"},{"line_number":351,"context_line":"  generic attached-volume migration)."},{"line_number":352,"context_line":"* Document that snapshot-heavy volumes will take longer to retype."},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"References"},{"line_number":355,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"d628cff5_435b2ae0","line":352,"range":{"start_line":352,"start_character":0,"end_line":352,"end_character":66},"updated":"2026-06-05 14:50:37.000000000","message":"please try to include some real world scenario calculation of a large volume with multiple snapshots migration so end users have some idea of what the performance/storage space cost would be to opt into such an operation.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":349,"context_line":"* Update Cinder admin documentation to describe behavior and caveats."},{"line_number":350,"context_line":"* Document driver and hypervisor constraints (e.g., libvirt requirement for"},{"line_number":351,"context_line":"  generic attached-volume migration)."},{"line_number":352,"context_line":"* Document that snapshot-heavy volumes will take longer to retype."},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"References"},{"line_number":355,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"96d0deea_a3f58b62","line":352,"range":{"start_line":352,"start_character":0,"end_line":352,"end_character":66},"in_reply_to":"52d8ac61_997c1780","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":349,"context_line":"* Update Cinder admin documentation to describe behavior and caveats."},{"line_number":350,"context_line":"* Document driver and hypervisor constraints (e.g., libvirt requirement for"},{"line_number":351,"context_line":"  generic attached-volume migration)."},{"line_number":352,"context_line":"* Document that snapshot-heavy volumes will take longer to retype."},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"References"},{"line_number":355,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"52d8ac61_997c1780","line":352,"range":{"start_line":352,"start_character":0,"end_line":352,"end_character":66},"in_reply_to":"d628cff5_435b2ae0","updated":"2026-06-15 01:21:19.000000000","message":"I will update it in the next version.","commit_id":"6a25305a858607d447ff1747757ad84fce51eec2"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"776c5333bebab69e327649093c5af963394489ef","unresolved":true,"context_lines":[{"line_number":132,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":133,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":134,"context_line":"    generic host-assisted copy path is used."},{"line_number":135,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":136,"context_line":"    snapshot content."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"* Maintain and/or reconstruct snapshot lineage:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"8e3bb1aa_7307aa7c","line":135,"updated":"2026-06-24 15:23:52.000000000","message":"I think this part needs more details -- this sounds like it relies on a backend being able to synthesize a snapshot on volume A out of temporary volume B. Is that a function that backends actually support?","commit_id":"66c49be9b45587a93f816a5a40e8930257d27055"},{"author":{"_account_id":34260,"name":"Masayoshi Mizuma","display_name":"Masayoshi Mizuma","email":"m.mizuma@fujitsu.com","username":"mmizuma"},"change_message_id":"dd628c9ef99bbfe7ca0f1af4858a36d8468a0857","unresolved":true,"context_lines":[{"line_number":132,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":133,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":134,"context_line":"    generic host-assisted copy path is used."},{"line_number":135,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":136,"context_line":"    snapshot content."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"* Maintain and/or reconstruct snapshot lineage:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"e4968f69_b6d46765","line":135,"in_reply_to":"8e3bb1aa_7307aa7c","updated":"2026-06-30 06:22:04.000000000","message":"Thank you for your comments. The spec is updated to clarify that the generic flow does not assume any backend-specific ability to synthesize a snapshot on destination volume A directly from temporary volume B. \nThe baseline path is to materialize the source snapshot via the existing create_volume_from_snapshot capability, copy that point-in-time data into the already-created staging destination volume, and then invoke the destination backend\u0027s normal create_snapshot operation on that staging volume. \nAny backend-specific copy optimization or snapshot adopt/rename step is optional driver-side logic, not a required generic primitive.","commit_id":"66c49be9b45587a93f816a5a40e8930257d27055"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":132,"context_line":"  * Transfer data from the source temporary volume to the destination volume."},{"line_number":133,"context_line":"    A driver may optimize this copy through existing copy hooks; otherwise the"},{"line_number":134,"context_line":"    generic host-assisted copy path is used."},{"line_number":135,"context_line":"  * Create a snapshot from the destination volume representing the transferred"},{"line_number":136,"context_line":"    snapshot content."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"* Maintain and/or reconstruct snapshot lineage:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"763e20d5_000baaa0","line":135,"in_reply_to":"e4968f69_b6d46765","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"66c49be9b45587a93f816a5a40e8930257d27055"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"cc185d76e361d6f144105d126d4b2e867e072f5a","unresolved":true,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Retype volume including snapshots"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"URL of launchpad blueprint:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"a13f95bb_eb3d7029","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":13},"updated":"2026-06-30 14:15:17.000000000","message":"We should probably have a more specific title - this is really about retype w/ migration and not just plain retype.","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":34260,"name":"Masayoshi Mizuma","display_name":"Masayoshi Mizuma","email":"m.mizuma@fujitsu.com","username":"mmizuma"},"change_message_id":"5e6cc288c5aefdf6965e20641914e464942477f2","unresolved":true,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Retype volume including snapshots"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"URL of launchpad blueprint:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"b7fe4d9d_7746d0f7","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":13},"in_reply_to":"424c17e2_326b4216","updated":"2026-07-01 02:56:48.000000000","message":"spec is updated","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":34260,"name":"Masayoshi Mizuma","display_name":"Masayoshi Mizuma","email":"m.mizuma@fujitsu.com","username":"mmizuma"},"change_message_id":"486aea99deea7e8b91a87512900b956e24030d4e","unresolved":true,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Retype volume including snapshots"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"URL of launchpad blueprint:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"424c17e2_326b4216","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":13},"in_reply_to":"a13f95bb_eb3d7029","updated":"2026-07-01 00:38:21.000000000","message":"Thank you for pointing this out. I agree that the current title is not specific enough, since the proposed change is focused on retype operations that require migration, rather than plain retype.\nI will update the title to \"Retype volume with migration including snapshots\" to make this clearer.","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Retype volume including snapshots"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"URL of launchpad blueprint:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"0041a435_7951d86e","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":13},"in_reply_to":"b7fe4d9d_7746d0f7","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"cc185d76e361d6f144105d126d4b2e867e072f5a","unresolved":true,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":"* Users benefit from retained snapshots after migration."},{"line_number":291,"context_line":"* No changes required to user commands for snapshot management."},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"Performance Impact"},{"line_number":294,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":295,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7f441591_0a5c1a7d","line":292,"updated":"2026-06-30 14:15:17.000000000","message":"Worth noting that this is only for retype+migration and the non-retype Cinder migrate API will not support this.","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":34260,"name":"Masayoshi Mizuma","display_name":"Masayoshi Mizuma","email":"m.mizuma@fujitsu.com","username":"mmizuma"},"change_message_id":"5e6cc288c5aefdf6965e20641914e464942477f2","unresolved":true,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":"* Users benefit from retained snapshots after migration."},{"line_number":291,"context_line":"* No changes required to user commands for snapshot management."},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"Performance Impact"},{"line_number":294,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":295,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"c8f0c987_588b5935","line":292,"in_reply_to":"2c7ce09f_ddd59a85","updated":"2026-07-01 02:56:48.000000000","message":"spec is updated","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":34260,"name":"Masayoshi Mizuma","display_name":"Masayoshi Mizuma","email":"m.mizuma@fujitsu.com","username":"mmizuma"},"change_message_id":"486aea99deea7e8b91a87512900b956e24030d4e","unresolved":true,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":"* Users benefit from retained snapshots after migration."},{"line_number":291,"context_line":"* No changes required to user commands for snapshot management."},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"Performance Impact"},{"line_number":294,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":295,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"2c7ce09f_ddd59a85","line":292,"in_reply_to":"7f441591_0a5c1a7d","updated":"2026-07-01 00:38:21.000000000","message":"Thank you for your comments. I agree that the current wording could be read as applying to the generic Cinder migrate API.\n\nI will revise this section to make it clear that this behavior is only for retype operations that require migration. The non-retype Cinder migrate API remains out of scope and will not support migrating volumes with snapshots as part of this spec.","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":false,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":"* Users benefit from retained snapshots after migration."},{"line_number":291,"context_line":"* No changes required to user commands for snapshot management."},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"Performance Impact"},{"line_number":294,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":295,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"aa48e82e_1a180563","line":292,"in_reply_to":"c8f0c987_588b5935","updated":"2026-09-23 15:25:36.000000000","message":"Done","commit_id":"6bd9dec9e82f7f3a92a78dba41e1cb74e58ab662"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"097b5e346f9b4ca30e7621c90ab96d3b0b0d2011","unresolved":true,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Add a new microversion to ``POST /v3/{project_id}/volumes/{volume_id}/action``"},{"line_number":230,"context_line":"Retype a Volume API to add a value ``on-demand-include-snapshots`` to the field"},{"line_number":231,"context_line":"``migration_policy``, and it is for an admin."},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Requests that use this value with an older microversion fail with a"},{"line_number":234,"context_line":"``400 Bad Request`` error."}],"source_content_type":"text/x-rst","patch_set":6,"id":"4d563428_9f6763de","line":231,"updated":"2026-07-09 13:43:50.000000000","message":"I\u0027m not sure that adding this as a new migration_policy value is the correct place to add this -- overloading this field creates some confusion. Retyping a volume with snapshots without migration should still succeed with migration-policy\u003dnever.\n\nWe should discuss and get input from a few reviewers about this API design.","commit_id":"23291dce6a95a84d65ce0a72711488eee1d3bed4"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9aafe287061d386d55317992ca51567190871068","unresolved":true,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Add a new microversion to ``POST /v3/{project_id}/volumes/{volume_id}/action``"},{"line_number":230,"context_line":"Retype a Volume API to add a value ``on-demand-include-snapshots`` to the field"},{"line_number":231,"context_line":"``migration_policy``, and it is for an admin."},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Requests that use this value with an older microversion fail with a"},{"line_number":234,"context_line":"``400 Bad Request`` error."}],"source_content_type":"text/x-rst","patch_set":6,"id":"eba77dd5_eca49c8e","line":231,"in_reply_to":"4d563428_9f6763de","updated":"2026-07-14 22:29:02.000000000","message":"This feature is only enabled when the migration_policy\u003d\"on-demand-include-snapshots\" option is specified.\nThe results of \"retyping a volume\", considering the existence of snapshots and the occurrence of migration under both migration_policy\u003d\"never\" and migration_policy\u003d\"on-demand-include-snapshots\" options, are detailed below:\n\n| migration_policy            | snapshot | migraton | result  |\n|:----------------------------|:---------|:---------|:--------|\n| never                       | w/       | w/       | fail    |\n| never                       | w/       | w/o      | succeed |\n| never                       | w/o      | w/       | fail    |\n| never                       | w/o      | w/o      | succeed |\n| on-demand-include-snapshots | w/       | w/       | succeed |\n| on-demand-include-snapshots | w/       | w/o      | succeed |\n| on-demand-include-snapshots | w/o      | w/       | succeed |\n| on-demand-include-snapshots | w/o      | w/o      | succeed |\n\nCould you please tell me more about your concerns?","commit_id":"23291dce6a95a84d65ce0a72711488eee1d3bed4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Add a new microversion to ``POST /v3/{project_id}/volumes/{volume_id}/action``"},{"line_number":230,"context_line":"Retype a Volume API to add a value ``on-demand-include-snapshots`` to the field"},{"line_number":231,"context_line":"``migration_policy``, and it is for an admin."},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Requests that use this value with an older microversion fail with a"},{"line_number":234,"context_line":"``400 Bad Request`` error."}],"source_content_type":"text/x-rst","patch_set":6,"id":"7d2faeb3_def149b6","line":231,"in_reply_to":"eba77dd5_eca49c8e","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"23291dce6a95a84d65ce0a72711488eee1d3bed4"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"097b5e346f9b4ca30e7621c90ab96d3b0b0d2011","unresolved":true,"context_lines":[{"line_number":374,"context_line":""},{"line_number":375,"context_line":"  * retype a volume that includes N snapshots across two backends with different"},{"line_number":376,"context_line":"    volume types."},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"Documentation Impact"},{"line_number":379,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"f67bbdd0_252190cb","line":377,"updated":"2026-07-09 13:43:50.000000000","message":"Need to test more complex scenarios such as retype with snapshots from an unencrypted type on backend A to an encrypted type on backend B.","commit_id":"23291dce6a95a84d65ce0a72711488eee1d3bed4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":374,"context_line":""},{"line_number":375,"context_line":"  * retype a volume that includes N snapshots across two backends with different"},{"line_number":376,"context_line":"    volume types."},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"Documentation Impact"},{"line_number":379,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"ef1b55f0_dcdcc4b6","line":377,"in_reply_to":"0da7cb7e_5d2fd036","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"23291dce6a95a84d65ce0a72711488eee1d3bed4"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9aafe287061d386d55317992ca51567190871068","unresolved":true,"context_lines":[{"line_number":374,"context_line":""},{"line_number":375,"context_line":"  * retype a volume that includes N snapshots across two backends with different"},{"line_number":376,"context_line":"    volume types."},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"Documentation Impact"},{"line_number":379,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"0da7cb7e_5d2fd036","line":377,"in_reply_to":"8cbe77dc_694a4c8b","updated":"2026-07-14 22:29:02.000000000","message":"Thinking more about this point, encrypted volumes (regardless of source or destination) will be excluded from this feature in the Hibiscus release. Support for encrypted volumes will be implemented in the future.","commit_id":"23291dce6a95a84d65ce0a72711488eee1d3bed4"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"7cbad3830e52e4d8fa3563bdaa7d4db6bf725b0a","unresolved":true,"context_lines":[{"line_number":374,"context_line":""},{"line_number":375,"context_line":"  * retype a volume that includes N snapshots across two backends with different"},{"line_number":376,"context_line":"    volume types."},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"Documentation Impact"},{"line_number":379,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"8cbe77dc_694a4c8b","line":377,"in_reply_to":"f67bbdd0_252190cb","updated":"2026-07-13 22:39:16.000000000","message":"Thank you for your commnets. I will update it in the next version.","commit_id":"23291dce6a95a84d65ce0a72711488eee1d3bed4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":90,"context_line":"* The source driver supports creating a volume from a snapshot."},{"line_number":91,"context_line":"* The destination backend supports the required volume migration or copy"},{"line_number":92,"context_line":"  operation for the temporary volumes used during snapshot migration."},{"line_number":93,"context_line":"* The source volume and its snapshots are not modified until the volume retyping"},{"line_number":94,"context_line":"  has completed successfully."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Workflow details"},{"line_number":97,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"03f1e864_0885fde9","line":94,"range":{"start_line":93,"start_character":2,"end_line":94,"end_character":29},"updated":"2026-09-23 15:25:36.000000000","message":"Please split this — snapshots immutable for the duration, source volume writable in the in-use case.","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":90,"context_line":"* The source driver supports creating a volume from a snapshot."},{"line_number":91,"context_line":"* The destination backend supports the required volume migration or copy"},{"line_number":92,"context_line":"  operation for the temporary volumes used during snapshot migration."},{"line_number":93,"context_line":"* The source volume and its snapshots are not modified until the volume retyping"},{"line_number":94,"context_line":"  has completed successfully."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Workflow details"},{"line_number":97,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"83313a79_8ba85fc4","line":94,"range":{"start_line":93,"start_character":2,"end_line":94,"end_character":29},"in_reply_to":"03f1e864_0885fde9","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":109,"context_line":"backends satisfy the requirements for host-assisted snapshot migration. This"},{"line_number":110,"context_line":"includes the following items."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* The number of snapshots for the volume when retyping with snapshot-aware"},{"line_number":113,"context_line":"  migration does not exceed the destination backend quota."},{"line_number":114,"context_line":"* The destination backend capacity must exceed (the number of snapshots + 1)"},{"line_number":115,"context_line":"  multiplied by the size of source volume."},{"line_number":116,"context_line":"* The volume status is in-use or available."}],"source_content_type":"text/x-rst","patch_set":8,"id":"d73974b7_df3f5789","line":113,"range":{"start_line":112,"start_character":2,"end_line":113,"end_character":58},"updated":"2026-09-23 15:25:36.000000000","message":"since each snapshot will need to be converted on the source to a full volume, you should check the headroom there as well. Of course this depends on how a snapshot is converted to a full volume on different backends...","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":109,"context_line":"backends satisfy the requirements for host-assisted snapshot migration. This"},{"line_number":110,"context_line":"includes the following items."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* The number of snapshots for the volume when retyping with snapshot-aware"},{"line_number":113,"context_line":"  migration does not exceed the destination backend quota."},{"line_number":114,"context_line":"* The destination backend capacity must exceed (the number of snapshots + 1)"},{"line_number":115,"context_line":"  multiplied by the size of source volume."},{"line_number":116,"context_line":"* The volume status is in-use or available."}],"source_content_type":"text/x-rst","patch_set":8,"id":"067218ce_cffad3fa","line":113,"range":{"start_line":112,"start_character":2,"end_line":113,"end_character":58},"in_reply_to":"d73974b7_df3f5789","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":119,"context_line":"  encrypted."},{"line_number":120,"context_line":"* The source and destination backend must advertise a capability to migrate"},{"line_number":121,"context_line":"  including snapshot."},{"line_number":122,"context_line":"* The number of snapshots for the volume must not exceed the configured limit"},{"line_number":123,"context_line":"  for snapshot-aware retype operations. A value of -1 indicates no limit, while"},{"line_number":124,"context_line":"  0 disables snapshot-aware retype requests."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"694d077d_0835a0c0","line":122,"range":{"start_line":122,"start_character":0,"end_line":122,"end_character":77},"updated":"2026-09-23 15:25:36.000000000","message":"are the temproray volumes from the snapshots included in a service tenant quota or are we doing a bypass of the quota?","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":119,"context_line":"  encrypted."},{"line_number":120,"context_line":"* The source and destination backend must advertise a capability to migrate"},{"line_number":121,"context_line":"  including snapshot."},{"line_number":122,"context_line":"* The number of snapshots for the volume must not exceed the configured limit"},{"line_number":123,"context_line":"  for snapshot-aware retype operations. A value of -1 indicates no limit, while"},{"line_number":124,"context_line":"  0 disables snapshot-aware retype requests."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"dd8ea141_3c0076f8","line":122,"range":{"start_line":122,"start_character":0,"end_line":122,"end_character":77},"in_reply_to":"694d077d_0835a0c0","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":179,"context_line":"  * Invoke the existing in-use migration data copy flow where Cinder calls Nova"},{"line_number":180,"context_line":"    to copy the data between the source and destination volumes."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    * Suspend the VM to stop I/O operations. Perform the final data transfer."},{"line_number":183,"context_line":"    * Update the VM\u0027s volume reference."},{"line_number":184,"context_line":"    * Resume VM and finalize volume swap."},{"line_number":185,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"6cfddff3_1719ea61","line":182,"updated":"2026-09-23 15:25:36.000000000","message":"Nova\u0027s volume swap uses libvirt `blockCopy` with a pivot and does not suspend the VM. Cinder also doesn\u0027t control the VM power state. This is contradicting line 173. I don\u0027t think you need these 3 bullets as they are confusing the issue, as the xisting workflow is correct","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":179,"context_line":"  * Invoke the existing in-use migration data copy flow where Cinder calls Nova"},{"line_number":180,"context_line":"    to copy the data between the source and destination volumes."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    * Suspend the VM to stop I/O operations. Perform the final data transfer."},{"line_number":183,"context_line":"    * Update the VM\u0027s volume reference."},{"line_number":184,"context_line":"    * Resume VM and finalize volume swap."},{"line_number":185,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"83f8a612_84d30978","line":182,"in_reply_to":"6cfddff3_1719ea61","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":212,"context_line":"* If the source and destination backends do not satisfy the requirements or any"},{"line_number":213,"context_line":"  checks fail at pre-verification stage, a ``409 Conflict`` error will be"},{"line_number":214,"context_line":"  returned to the user, and the retype request will not be executed."},{"line_number":215,"context_line":"* If and operation fails during the snapshot migration, the base volume data"},{"line_number":216,"context_line":"  migration, or Cinder DB update stages, Cinder terminates the retype execution"},{"line_number":217,"context_line":"  and attempts to rollback; staging destination snapshots are deleted, temporary"},{"line_number":218,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"}],"source_content_type":"text/x-rst","patch_set":8,"id":"4fb575ac_c9cc7cda","line":215,"range":{"start_line":215,"start_character":5,"end_line":215,"end_character":9},"updated":"2026-09-23 15:25:36.000000000","message":"nit: any","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":212,"context_line":"* If the source and destination backends do not satisfy the requirements or any"},{"line_number":213,"context_line":"  checks fail at pre-verification stage, a ``409 Conflict`` error will be"},{"line_number":214,"context_line":"  returned to the user, and the retype request will not be executed."},{"line_number":215,"context_line":"* If and operation fails during the snapshot migration, the base volume data"},{"line_number":216,"context_line":"  migration, or Cinder DB update stages, Cinder terminates the retype execution"},{"line_number":217,"context_line":"  and attempts to rollback; staging destination snapshots are deleted, temporary"},{"line_number":218,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bd0a45b2_8a9cbd01","line":215,"range":{"start_line":215,"start_character":5,"end_line":215,"end_character":9},"in_reply_to":"4fb575ac_c9cc7cda","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":216,"context_line":"  migration, or Cinder DB update stages, Cinder terminates the retype execution"},{"line_number":217,"context_line":"  and attempts to rollback; staging destination snapshots are deleted, temporary"},{"line_number":218,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"},{"line_number":219,"context_line":"  succeeds.. Additionally, Cinder will set the volume migration status to error"},{"line_number":220,"context_line":"  and notify the user of the migration failure."},{"line_number":221,"context_line":"* If cleaning up snapshot or volume artifacts fails, Cinder stops the roll back"},{"line_number":222,"context_line":"  process and records the error details in the cinder-volume log."}],"source_content_type":"text/x-rst","patch_set":8,"id":"318b8f44_79eb2c53","line":219,"range":{"start_line":219,"start_character":10,"end_line":219,"end_character":12},"updated":"2026-09-23 15:25:36.000000000","message":"nit: single fullstop","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":216,"context_line":"  migration, or Cinder DB update stages, Cinder terminates the retype execution"},{"line_number":217,"context_line":"  and attempts to rollback; staging destination snapshots are deleted, temporary"},{"line_number":218,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"},{"line_number":219,"context_line":"  succeeds.. Additionally, Cinder will set the volume migration status to error"},{"line_number":220,"context_line":"  and notify the user of the migration failure."},{"line_number":221,"context_line":"* If cleaning up snapshot or volume artifacts fails, Cinder stops the roll back"},{"line_number":222,"context_line":"  process and records the error details in the cinder-volume log."}],"source_content_type":"text/x-rst","patch_set":8,"id":"49b2a39e_a146576d","line":219,"range":{"start_line":219,"start_character":10,"end_line":219,"end_character":12},"in_reply_to":"318b8f44_79eb2c53","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":218,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"},{"line_number":219,"context_line":"  succeeds.. Additionally, Cinder will set the volume migration status to error"},{"line_number":220,"context_line":"  and notify the user of the migration failure."},{"line_number":221,"context_line":"* If cleaning up snapshot or volume artifacts fails, Cinder stops the roll back"},{"line_number":222,"context_line":"  process and records the error details in the cinder-volume log."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":8,"id":"6c37f71b_b21e9a1f","line":221,"range":{"start_line":221,"start_character":70,"end_line":221,"end_character":79},"updated":"2026-09-23 15:25:36.000000000","message":"nit: rollback","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":218,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"},{"line_number":219,"context_line":"  succeeds.. Additionally, Cinder will set the volume migration status to error"},{"line_number":220,"context_line":"  and notify the user of the migration failure."},{"line_number":221,"context_line":"* If cleaning up snapshot or volume artifacts fails, Cinder stops the roll back"},{"line_number":222,"context_line":"  process and records the error details in the cinder-volume log."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7dee840e_c9c6b1f0","line":221,"range":{"start_line":221,"start_character":70,"end_line":221,"end_character":79},"in_reply_to":"6c37f71b_b21e9a1f","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":247,"context_line":"REST API impact"},{"line_number":248,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"Add an ``include_snapshots`` boolean option to the ``os-retype`` requset in a"},{"line_number":251,"context_line":"new microversion of the ``POST /v3/{project_id}/volumes/{volume_id}/action``"},{"line_number":252,"context_line":"(Retype a Volume) API. This option is restricted to administrators."},{"line_number":253,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"5e9c63fb_668b6a04","line":250,"range":{"start_line":250,"start_character":65,"end_line":250,"end_character":73},"updated":"2026-09-23 15:25:36.000000000","message":"nit: request","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":247,"context_line":"REST API impact"},{"line_number":248,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"Add an ``include_snapshots`` boolean option to the ``os-retype`` requset in a"},{"line_number":251,"context_line":"new microversion of the ``POST /v3/{project_id}/volumes/{volume_id}/action``"},{"line_number":252,"context_line":"(Retype a Volume) API. This option is restricted to administrators."},{"line_number":253,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"01c9c055_41178456","line":250,"range":{"start_line":250,"start_character":65,"end_line":250,"end_character":73},"in_reply_to":"5e9c63fb_668b6a04","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"78c9ecdfe79394f929ce5538d02177f8d9a2d40f","unresolved":true,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"Add an ``include_snapshots`` boolean option to the ``os-retype`` requset in a"},{"line_number":251,"context_line":"new microversion of the ``POST /v3/{project_id}/volumes/{volume_id}/action``"},{"line_number":252,"context_line":"(Retype a Volume) API. This option is restricted to administrators."},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"Requests that use this value with an older microversion fail with a"},{"line_number":255,"context_line":"``400 Bad Request`` error."}],"source_content_type":"text/x-rst","patch_set":8,"id":"8066d9e0_81bc16a4","line":252,"range":{"start_line":252,"start_character":0,"end_line":252,"end_character":67},"updated":"2026-09-23 15:25:36.000000000","message":"this is not mentioned in Security Impact, as that still says `None` and `does not introduce new authorization serfaces\".","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"Add an ``include_snapshots`` boolean option to the ``os-retype`` requset in a"},{"line_number":251,"context_line":"new microversion of the ``POST /v3/{project_id}/volumes/{volume_id}/action``"},{"line_number":252,"context_line":"(Retype a Volume) API. This option is restricted to administrators."},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"Requests that use this value with an older microversion fail with a"},{"line_number":255,"context_line":"``400 Bad Request`` error."}],"source_content_type":"text/x-rst","patch_set":8,"id":"83db7ac4_14210d18","line":252,"range":{"start_line":252,"start_character":0,"end_line":252,"end_character":67},"in_reply_to":"8066d9e0_81bc16a4","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"41371d77ccc0932439468b3ebb02491621df45d1"}],"specs/2026.2/volume-migration-with-snapshot.rst":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"4b3f33806e3fa3d3dd883f1e4fa07625e7f74188","unresolved":true,"context_lines":[{"line_number":40,"context_line":"  only supported by the storage driver, the cloud vendor will face storage"},{"line_number":41,"context_line":"  vendor lock-in. Implementing this feature in software would allow them to"},{"line_number":42,"context_line":"  introduce the best available storage whenever expansion is required, thereby"},{"line_number":43,"context_line":"  preventing vendor lock-in."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7169b8c8_31340b7d","line":43,"updated":"2026-05-20 20:31:03.000000000","message":"Migration from one backend to another is done via a call to retype, so that should be mentioned here.  Backends typically can\u0027t talk directly to each other so cinder has to assist with this.  \n\nwhen a user wants to migrate a volume, this is typically moving to the same type of backend, re: 1 netapp to another.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":40,"context_line":"  only supported by the storage driver, the cloud vendor will face storage"},{"line_number":41,"context_line":"  vendor lock-in. Implementing this feature in software would allow them to"},{"line_number":42,"context_line":"  introduce the best available storage whenever expansion is required, thereby"},{"line_number":43,"context_line":"  preventing vendor lock-in."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5467e19e_a14be204","line":43,"in_reply_to":"14c98d2f_60f60efd","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"e28e63b7e6c66e6b2af356861cd5ce0520050eae","unresolved":true,"context_lines":[{"line_number":40,"context_line":"  only supported by the storage driver, the cloud vendor will face storage"},{"line_number":41,"context_line":"  vendor lock-in. Implementing this feature in software would allow them to"},{"line_number":42,"context_line":"  introduce the best available storage whenever expansion is required, thereby"},{"line_number":43,"context_line":"  preventing vendor lock-in."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"f2bf6159_34f2ffe2","line":43,"in_reply_to":"7169b8c8_31340b7d","updated":"2026-05-27 03:29:19.000000000","message":"Thank you for the suggestion, I will include this in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":true,"context_lines":[{"line_number":40,"context_line":"  only supported by the storage driver, the cloud vendor will face storage"},{"line_number":41,"context_line":"  vendor lock-in. Implementing this feature in software would allow them to"},{"line_number":42,"context_line":"  introduce the best available storage whenever expansion is required, thereby"},{"line_number":43,"context_line":"  preventing vendor lock-in."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"14c98d2f_60f60efd","line":43,"in_reply_to":"f2bf6159_34f2ffe2","updated":"2026-06-05 13:28:45.000000000","message":"Mostly covered by the host-assisted framing already. Just add the one volume-level sentence — cross-backend volume movement is mediated by Cinder for the same reason — so the motivation reads end-to-end.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2516ac3ecaf517039a1867da0392c720f8ea7956","unresolved":true,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"When a volume migration is requested:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"1. When a volume migration with retype API is requested, Cinder determines"},{"line_number":89,"context_line":"   whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"}],"source_content_type":"text/x-rst","patch_set":1,"id":"e6f98025_1a2c0424","line":88,"updated":"2026-05-20 16:01:15.000000000","message":"the title of this spec references migration, and there is a migrate API, so you need to clarify why you are referencing the retype API.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":true,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"When a volume migration is requested:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"1. When a volume migration with retype API is requested, Cinder determines"},{"line_number":89,"context_line":"   whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"}],"source_content_type":"text/x-rst","patch_set":1,"id":"30db32a1_2dd27603","line":88,"in_reply_to":"28c04d41_addf20bf","updated":"2026-06-05 13:28:45.000000000","message":"Your retype-first rationale is reasonable and the retitle covers most of this. Please just make it explicit in the spec that the os-migrate_volume API is out of scope for now and that retype is the chosen vehicle, so reviewers don\u0027t assume parity between the two APIs.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"When a volume migration is requested:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"1. When a volume migration with retype API is requested, Cinder determines"},{"line_number":89,"context_line":"   whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"}],"source_content_type":"text/x-rst","patch_set":1,"id":"db78a1c7_65005fdf","line":88,"in_reply_to":"30db32a1_2dd27603","updated":"2026-06-15 01:21:19.000000000","message":"I will update it in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"When a volume migration is requested:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"1. When a volume migration with retype API is requested, Cinder determines"},{"line_number":89,"context_line":"   whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"}],"source_content_type":"text/x-rst","patch_set":1,"id":"2dbceac0_58fecb66","line":88,"in_reply_to":"db78a1c7_65005fdf","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"2434bbe4e111d00e32a51c98071dd40d839530a2","unresolved":true,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"When a volume migration is requested:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"1. When a volume migration with retype API is requested, Cinder determines"},{"line_number":89,"context_line":"   whether the source volume has snapshots."},{"line_number":90,"context_line":"2. If the volume has snapshots, Cinder verifies that the source and destination"},{"line_number":91,"context_line":"   backends support the operations required for host-assisted snapshot"}],"source_content_type":"text/x-rst","patch_set":1,"id":"28c04d41_addf20bf","line":88,"in_reply_to":"e6f98025_1a2c0424","updated":"2026-05-27 03:27:26.000000000","message":"Thank you for the comments. Ideally, this feature should be implemented in both the migrate API and the retype API. Given that the retype API can also move a volume\u0027s data to a different storage backend and is more frequently utilized by system administrators, I would like to proceed with implementing the feature via the retype API first.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2516ac3ecaf517039a1867da0392c720f8ea7956","unresolved":true,"context_lines":[{"line_number":120,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* The system enumerates all snapshots for the volume, ordered oldest -\u003e newest"},{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"51aa6b03_04fade0d","line":123,"range":{"start_line":123,"start_character":2,"end_line":123,"end_character":46},"updated":"2026-05-20 16:01:15.000000000","message":"if the backend doesn\u0027t expose the relationship, is oldest -\u003e newest always true? Chains with deltas or dependent snapshots need to be considered.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":120,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* The system enumerates all snapshots for the volume, ordered oldest -\u003e newest"},{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"44fc7358_21eb6eb9","line":123,"range":{"start_line":123,"start_character":2,"end_line":123,"end_character":46},"in_reply_to":"1cb94c5c_1ff30411","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"2434bbe4e111d00e32a51c98071dd40d839530a2","unresolved":true,"context_lines":[{"line_number":120,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* The system enumerates all snapshots for the volume, ordered oldest -\u003e newest"},{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ab2b35f7_3afb741d","line":123,"range":{"start_line":123,"start_character":2,"end_line":123,"end_character":46},"in_reply_to":"51aa6b03_04fade0d","updated":"2026-05-27 03:27:26.000000000","message":"That\u0027s a really good point. We also need to consider migration in relation to snapshot dependencies. I\u0027ll make sure to include that in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":120,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* The system enumerates all snapshots for the volume, ordered oldest -\u003e newest"},{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1cb94c5c_1ff30411","line":123,"range":{"start_line":123,"start_character":2,"end_line":123,"end_character":46},"in_reply_to":"5934f742_366a84b0","updated":"2026-06-15 01:21:19.000000000","message":"I will update it in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":true,"context_lines":[{"line_number":120,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* The system enumerates all snapshots for the volume, ordered oldest -\u003e newest"},{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5934f742_366a84b0","line":123,"range":{"start_line":123,"start_character":2,"end_line":123,"end_character":46},"in_reply_to":"ab2b35f7_3afb741d","updated":"2026-06-05 13:28:45.000000000","message":"The new lineage bullet helps, but it\u0027s conditional (\"when the backend supports\") and aspirational. It still doesn\u0027t address the three concrete cases: the host-assisted path flattens chains into independent full copies; backends that don\u0027t expose the parent relationship (is created_at ordering safe?); and delta/dependent snapshots where ordering is load-bearing. Please make those explicit rather than deferring to backend capability.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2516ac3ecaf517039a1867da0392c720f8ea7956","unresolved":true,"context_lines":[{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."}],"source_content_type":"text/x-rst","patch_set":1,"id":"364987e4_e093c88a","line":126,"range":{"start_line":126,"start_character":36,"end_line":126,"end_character":52},"updated":"2026-05-20 16:01:15.000000000","message":"How will these temporary volumes affect quota? The migration could fail is the quota limit is hit before completion. What about using a temporary tenant, like in glance image-cache, for these temporary volumes.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."}],"source_content_type":"text/x-rst","patch_set":1,"id":"1bed354c_1dbe2557","line":126,"range":{"start_line":126,"start_character":36,"end_line":126,"end_character":52},"in_reply_to":"235affa2_8531a33a","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":true,"context_lines":[{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."}],"source_content_type":"text/x-rst","patch_set":1,"id":"49e61a2a_23b43e21","line":126,"range":{"start_line":126,"start_character":36,"end_line":126,"end_character":52},"in_reply_to":"2ab14449_f6094802","updated":"2026-06-05 13:28:45.000000000","message":"To close my own earlier question: I was conflating user quota with backend capacity. You\u0027re right that service-internal temp volumes needn\u0027t consume user quota. The concern I should have stated precisely is backend capacity / reserved_percentage headroom on source and destination during the copy — N flattened generations × full volume size of transient space. Please:\n\n * name capacity exhaustion mid-migration as a precondition check + failure mode feeding the rollback path; and\n * confirm the temp volumes are quota-exempt by mechanism (service tenant? manager-level bypass?), not just by assertion.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"2434bbe4e111d00e32a51c98071dd40d839530a2","unresolved":true,"context_lines":[{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."}],"source_content_type":"text/x-rst","patch_set":1,"id":"2ab14449_f6094802","line":126,"range":{"start_line":126,"start_character":36,"end_line":126,"end_character":52},"in_reply_to":"364987e4_e093c88a","updated":"2026-05-27 03:27:26.000000000","message":"Could you please clarify what you mean by `quota`? In the current specification design, internal resources will not consume user-defined `quota` during the migration process. However, we do have to consider other resource limits, such as available storage capacity.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":123,"context_line":"  (or by parent relationship where available)."},{"line_number":124,"context_line":"* For each snapshot:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."}],"source_content_type":"text/x-rst","patch_set":1,"id":"235affa2_8531a33a","line":126,"range":{"start_line":126,"start_character":36,"end_line":126,"end_character":52},"in_reply_to":"49e61a2a_23b43e21","updated":"2026-06-15 01:21:19.000000000","message":"I will update it in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e1978c91b2f267f13144e48574e0ea6c65a129ed","unresolved":true,"context_lines":[{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."},{"line_number":130,"context_line":"  * Transfer data from source temporary volume to destination temporary volume."},{"line_number":131,"context_line":"  * Create a snapshot on the destination backend representing the transferred"},{"line_number":132,"context_line":"    snapshot content, preserving snapshot metadata."}],"source_content_type":"text/x-rst","patch_set":1,"id":"0d1eace6_1bab1430","line":129,"updated":"2026-06-04 20:36:32.000000000","message":"Why would the backend need a temporary volume as well?  That would require tying a snapshot to a different volume than it was created from when all is said and done.\n\nWhy not migrate the temporary to the target, snapshot it, and then move on to the next one?\n\nOr do you envision this happening in parallel / to handle the in-use case?\n\nI ask because I\u0027m not sure how many storage devices support moving a snapshot from one parent to another (i.e. temporary to target).","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"e605df5f4738f324e479a09452725202a7ffb5f5","unresolved":true,"context_lines":[{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."},{"line_number":130,"context_line":"  * Transfer data from source temporary volume to destination temporary volume."},{"line_number":131,"context_line":"  * Create a snapshot on the destination backend representing the transferred"},{"line_number":132,"context_line":"    snapshot content, preserving snapshot metadata."}],"source_content_type":"text/x-rst","patch_set":1,"id":"dc5a5d9a_f86016e0","line":129,"in_reply_to":"0d1eace6_1bab1430","updated":"2026-06-05 04:27:44.000000000","message":"Thank you for your comment.\n\nThere was something wrong in the description of the workflow details.\n\nMy idea is to create only one corresponding volume on the target backend. Then, data will be transferred from each source snapshot to this volume, and new snapshots will be created from it for each one. Finally, the current volume\u0027s data will be copied to this new volume, which will then become the canonical volume.\n\nI will update the description in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."},{"line_number":130,"context_line":"  * Transfer data from source temporary volume to destination temporary volume."},{"line_number":131,"context_line":"  * Create a snapshot on the destination backend representing the transferred"},{"line_number":132,"context_line":"    snapshot content, preserving snapshot metadata."}],"source_content_type":"text/x-rst","patch_set":1,"id":"4bd3d082_83ff7d8b","line":129,"in_reply_to":"2433469e_41c7f1dd","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"2306b245c62dc5cdf77ff0ebee1b6ea0cd110e98","unresolved":true,"context_lines":[{"line_number":126,"context_line":"  * Materialize the snapshot into a temporary volume (or use a"},{"line_number":127,"context_line":"    backend-optimized snapshot export/copy mechanism when provided by the"},{"line_number":128,"context_line":"    dirver)."},{"line_number":129,"context_line":"  * Create a corresponding temporary destination volume on the target backend."},{"line_number":130,"context_line":"  * Transfer data from source temporary volume to destination temporary volume."},{"line_number":131,"context_line":"  * Create a snapshot on the destination backend representing the transferred"},{"line_number":132,"context_line":"    snapshot content, preserving snapshot metadata."}],"source_content_type":"text/x-rst","patch_set":1,"id":"2433469e_41c7f1dd","line":129,"in_reply_to":"dc5a5d9a_f86016e0","updated":"2026-06-05 04:46:14.000000000","message":"Gotcha, thank you. This is how I was envisioning it should go.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2516ac3ecaf517039a1867da0392c720f8ea7956","unresolved":true,"context_lines":[{"line_number":170,"context_line":"----------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":173,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":174,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":175,"context_line":"  leaving the source volume untouched. If rollback is not possible, Cinder"},{"line_number":176,"context_line":"  marks the migration as failed and leaves detailed status for operator"},{"line_number":177,"context_line":"  intervention."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b4bd17f5_fb37d87c","line":175,"range":{"start_line":173,"start_character":58,"end_line":175,"end_character":37},"updated":"2026-05-20 16:01:15.000000000","message":"what happens if the cleanup fails midway through. How is state tracked? Can the `migstat` field have additional values to reflect thus?","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"79ad9cb312c117c38a67c39e641e94e7965601ad","unresolved":true,"context_lines":[{"line_number":170,"context_line":"----------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":173,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":174,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":175,"context_line":"  leaving the source volume untouched. If rollback is not possible, Cinder"},{"line_number":176,"context_line":"  marks the migration as failed and leaves detailed status for operator"},{"line_number":177,"context_line":"  intervention."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"24192ce0_0c071a9c","line":175,"range":{"start_line":173,"start_character":58,"end_line":175,"end_character":37},"in_reply_to":"1e895b7c_51bf5f3e","updated":"2026-05-28 01:48:37.000000000","message":"Thinking more about this. When the cleanup fails, the system administrator may need to delete the uncleaned snapshots manually. I will add a `cleanup_error` value to track this state in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"0bd141b85751a7a8e6e16bac99a5b10f71eab358","unresolved":true,"context_lines":[{"line_number":170,"context_line":"----------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":173,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":174,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":175,"context_line":"  leaving the source volume untouched. If rollback is not possible, Cinder"},{"line_number":176,"context_line":"  marks the migration as failed and leaves detailed status for operator"},{"line_number":177,"context_line":"  intervention."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"9dcba7a5_d2ecd8d8","line":175,"range":{"start_line":173,"start_character":58,"end_line":175,"end_character":37},"in_reply_to":"24192ce0_0c071a9c","updated":"2026-06-05 13:28:45.000000000","message":"Understood that dropping `migstat` in PS3 was intentional, on the reasoning that migration is uninterruptible and failures auto-clean. But that relies on cleanup always succeeding, and PS3 says the opposite two lines earlier: \"If cleaning up migrated snapshot artifacts fails, Cinder stops the rollback process.\" That stopped-mid-rollback state is exactly the partially-committed case — orphaned destination snapshots + temp volumes, source intact — and \"auto-deleted, no state needed\" doesn\u0027t cover it. Please either:\n\n(a) reinstate the cleanup_error value you proposed in your first reply, or\n(b) document concretely where an operator reads which artifacts leaked.\n\nAlso: \"Data model impact: None\" + \"leaves detailed status for operator intervention\" are in tension — if status is recorded, say where; if not, the operator has nothing to act on.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"9eb4a2e1567a59174f95232343f56b6839422bed","unresolved":true,"context_lines":[{"line_number":170,"context_line":"----------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":173,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":174,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":175,"context_line":"  leaving the source volume untouched. If rollback is not possible, Cinder"},{"line_number":176,"context_line":"  marks the migration as failed and leaves detailed status for operator"},{"line_number":177,"context_line":"  intervention."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ace1d58c_a7ce30be","line":175,"range":{"start_line":173,"start_character":58,"end_line":175,"end_character":37},"in_reply_to":"9dcba7a5_d2ecd8d8","updated":"2026-06-15 01:21:19.000000000","message":"I will update it in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":170,"context_line":"----------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":173,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":174,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":175,"context_line":"  leaving the source volume untouched. If rollback is not possible, Cinder"},{"line_number":176,"context_line":"  marks the migration as failed and leaves detailed status for operator"},{"line_number":177,"context_line":"  intervention."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"96b9b32f_0f5d89ba","line":175,"range":{"start_line":173,"start_character":58,"end_line":175,"end_character":37},"in_reply_to":"ace1d58c_a7ce30be","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"2434bbe4e111d00e32a51c98071dd40d839530a2","unresolved":true,"context_lines":[{"line_number":170,"context_line":"----------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"* If snapshot migration fails, the volume migration is not attempted."},{"line_number":173,"context_line":"* If volume migration fails after snapshots have migrated, Cinder attempts to"},{"line_number":174,"context_line":"  rollback by cleaning up migrated snapshot artifacts on the destination and"},{"line_number":175,"context_line":"  leaving the source volume untouched. If rollback is not possible, Cinder"},{"line_number":176,"context_line":"  marks the migration as failed and leaves detailed status for operator"},{"line_number":177,"context_line":"  intervention."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"1e895b7c_51bf5f3e","line":175,"range":{"start_line":173,"start_character":58,"end_line":175,"end_character":37},"in_reply_to":"b4bd17f5_fb37d87c","updated":"2026-05-27 03:27:26.000000000","message":"In the current specification design, a volume migration cannot be interrupted once initiated. If a migration is interrupted for any reason, a system administrator\u0027s intervention is required to resolve the resulting error state. In such cases, any snapshots created during the process are automatically deleted, precluding the need to record their state in `migstat`.\n\nConsidering that the time required for volume migration can be significantly extended with numerous snapshot generations, I believe the ability to interrupt and resume volume migration should be supported in the future. At that point, new values should be added to `migstat` to track snapshot states.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2516ac3ecaf517039a1867da0392c720f8ea7956","unresolved":true,"context_lines":[{"line_number":189,"context_line":"Data model impact"},{"line_number":190,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"Unknown at this time, currently under investigation."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"REST API impact"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"604e9cc3_5fc1a8a7","line":192,"range":{"start_line":192,"start_character":0,"end_line":192,"end_character":52},"updated":"2026-05-20 16:01:15.000000000","message":"This needs to be clarified before we can approve this spec.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"2434bbe4e111d00e32a51c98071dd40d839530a2","unresolved":true,"context_lines":[{"line_number":189,"context_line":"Data model impact"},{"line_number":190,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"Unknown at this time, currently under investigation."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"REST API impact"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"af13a22b_a19fe53c","line":192,"range":{"start_line":192,"start_character":0,"end_line":192,"end_character":52},"in_reply_to":"604e9cc3_5fc1a8a7","updated":"2026-05-27 03:27:26.000000000","message":"Certainly, I will include this in the next version.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":189,"context_line":"Data model impact"},{"line_number":190,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"Unknown at this time, currently under investigation."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"REST API impact"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"2a634e83_d1d4a718","line":192,"range":{"start_line":192,"start_character":0,"end_line":192,"end_character":52},"in_reply_to":"af13a22b_a19fe53c","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2516ac3ecaf517039a1867da0392c720f8ea7956","unresolved":true,"context_lines":[{"line_number":205,"context_line":"   {"},{"line_number":206,"context_line":"        \"os-retype\": {"},{"line_number":207,"context_line":"                \"new_type\": \"new-storage-backend\","},{"line_number":208,"context_line":"                \"migration_policy\": \"on-demand-with-snapshot\""},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":"   }"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"f5e501b0_cde868ae","line":208,"range":{"start_line":208,"start_character":37,"end_line":208,"end_character":60},"updated":"2026-05-20 16:01:15.000000000","message":"This is a little confusing. It could be read as snapshots are created on-demand. Maybe rename to `on-demand-include-snapshots` or add a new flag to extend the existing `on-demand` policy","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":205,"context_line":"   {"},{"line_number":206,"context_line":"        \"os-retype\": {"},{"line_number":207,"context_line":"                \"new_type\": \"new-storage-backend\","},{"line_number":208,"context_line":"                \"migration_policy\": \"on-demand-with-snapshot\""},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":"   }"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"9f35a115_f2dc170f","line":208,"range":{"start_line":208,"start_character":37,"end_line":208,"end_character":60},"in_reply_to":"ebcce149_dbef1f2e","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"2434bbe4e111d00e32a51c98071dd40d839530a2","unresolved":true,"context_lines":[{"line_number":205,"context_line":"   {"},{"line_number":206,"context_line":"        \"os-retype\": {"},{"line_number":207,"context_line":"                \"new_type\": \"new-storage-backend\","},{"line_number":208,"context_line":"                \"migration_policy\": \"on-demand-with-snapshot\""},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":"   }"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ebcce149_dbef1f2e","line":208,"range":{"start_line":208,"start_character":37,"end_line":208,"end_character":60},"in_reply_to":"f5e501b0_cde868ae","updated":"2026-05-27 03:27:26.000000000","message":"Thank you for the suggestion, I will rename it to `on-demand-include-snapshots`.","commit_id":"1c8a542f0d9e8a3b6b8184de497b691f834c6abe"}],"specs/2027.1/retype-volume-including-snapshots.rst":[{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"a53f7aee521c58e14157f4c73a2f1e5b6fa741b5","unresolved":true,"context_lines":[{"line_number":29,"context_line":"  volumes from a storage backend that is being decommissioned or upgraded. Some"},{"line_number":30,"context_line":"  volumes on that backend have snapshots (e.g., user-created restore points)."},{"line_number":31,"context_line":"  Today, those volumes cannot be moved or retyped without deleting the"},{"line_number":32,"context_line":"  snapshots, which is not acceptable to the users. With this feature, the"},{"line_number":33,"context_line":"  operator could migrate such volumes (and their snapshots) seamlessly to a new"},{"line_number":34,"context_line":"  backend with different volume types, preserving all restore points."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Load Balancing and Tiering: Over time, an administrator might want to"},{"line_number":37,"context_line":"  redistribute volumes across backends (for example, moving older,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"4079bdf1_7f67e02d","line":34,"range":{"start_line":32,"start_character":51,"end_line":34,"end_character":69},"updated":"2026-10-14 15:48:45.000000000","message":"So this would be analogous toma migration right?","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"c2f99454ac285b5de526f2bc781c63825d0a3f09","unresolved":true,"context_lines":[{"line_number":29,"context_line":"  volumes from a storage backend that is being decommissioned or upgraded. Some"},{"line_number":30,"context_line":"  volumes on that backend have snapshots (e.g., user-created restore points)."},{"line_number":31,"context_line":"  Today, those volumes cannot be moved or retyped without deleting the"},{"line_number":32,"context_line":"  snapshots, which is not acceptable to the users. With this feature, the"},{"line_number":33,"context_line":"  operator could migrate such volumes (and their snapshots) seamlessly to a new"},{"line_number":34,"context_line":"  backend with different volume types, preserving all restore points."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Load Balancing and Tiering: Over time, an administrator might want to"},{"line_number":37,"context_line":"  redistribute volumes across backends (for example, moving older,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"457e08bd_35a777fa","line":34,"range":{"start_line":32,"start_character":51,"end_line":34,"end_character":69},"in_reply_to":"4079bdf1_7f67e02d","updated":"2026-10-22 03:28:31.000000000","message":"Yes, migration of volumes with snapshots is also achievable. Since most volume migrations between different backends require a retype, we have decided to implement this functionality within the retype API.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":29,"context_line":"  volumes from a storage backend that is being decommissioned or upgraded. Some"},{"line_number":30,"context_line":"  volumes on that backend have snapshots (e.g., user-created restore points)."},{"line_number":31,"context_line":"  Today, those volumes cannot be moved or retyped without deleting the"},{"line_number":32,"context_line":"  snapshots, which is not acceptable to the users. With this feature, the"},{"line_number":33,"context_line":"  operator could migrate such volumes (and their snapshots) seamlessly to a new"},{"line_number":34,"context_line":"  backend with different volume types, preserving all restore points."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Load Balancing and Tiering: Over time, an administrator might want to"},{"line_number":37,"context_line":"  redistribute volumes across backends (for example, moving older,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"b4e26d0f_3a6da33f","line":34,"range":{"start_line":32,"start_character":51,"end_line":34,"end_character":69},"in_reply_to":"457e08bd_35a777fa","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":true,"context_lines":[{"line_number":110,"context_line":"backends satisfy the requirements for host-assisted snapshot migration. This"},{"line_number":111,"context_line":"includes the following items."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* The normal Cinder destination volume-type quota reservation for the original"},{"line_number":114,"context_line":"  volume succeeds."},{"line_number":115,"context_line":"* The source backend has enough headroom to materialize one temporary source"},{"line_number":116,"context_line":"  volume from a snapshot. The capacity consumed by this operation is"},{"line_number":117,"context_line":"  driver-dependent; a backend can use a space-efficient clone when it supports"},{"line_number":118,"context_line":"  one. Cinder processes snapshots sequentially, so headroom for all temporary"},{"line_number":119,"context_line":"  source volumes at once is not required."},{"line_number":120,"context_line":"* The destination backend capacity must exceed (the number of snapshots + 1)"},{"line_number":121,"context_line":"  multiplied by the size of source volume."},{"line_number":122,"context_line":"* Temporary source volumes, the staging destination volume, and staging"},{"line_number":123,"context_line":"  destination snapshots are internal migration resources. They do not consume"},{"line_number":124,"context_line":"  Cinder quota from the requesting project or a service project."}],"source_content_type":"text/x-rst","patch_set":9,"id":"cc6f1120_a59f6a3a","line":121,"range":{"start_line":113,"start_character":2,"end_line":121,"end_character":42},"updated":"2026-10-05 19:55:56.000000000","message":"Pre-verification now carries three capacity and quota statements -- the quota\nreservation at 113-114, the source headroom at 115-119, and the destination\ncapacity at 120-121. Neither 994905 nor 994913 contains a single reference to\ncapacity; 994913 filters destinations solely on the `snapshot_migration_support`\ncapability, and the standard CapacityFilter sizes for the volume alone, not for\ntransient copies. So all three are currently promises the code does not keep.\nPlease either implement them or mark them explicitly as future work.\n\nSeparately, line 120-121 should carry the same qualifier you added to the\nsource-side bullet. The destination does genuinely accumulate N snapshots, so\n\"(number of snapshots + 1) multiplied by the size of source volume\" is the\nworst case for a backend without space-efficient snapshots, not a flat\nrequirement -- and line 170 already says COW/ROW cloning is leveraged where the\ndestination supports it.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[{"line_number":110,"context_line":"backends satisfy the requirements for host-assisted snapshot migration. This"},{"line_number":111,"context_line":"includes the following items."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* The normal Cinder destination volume-type quota reservation for the original"},{"line_number":114,"context_line":"  volume succeeds."},{"line_number":115,"context_line":"* The source backend has enough headroom to materialize one temporary source"},{"line_number":116,"context_line":"  volume from a snapshot. The capacity consumed by this operation is"},{"line_number":117,"context_line":"  driver-dependent; a backend can use a space-efficient clone when it supports"},{"line_number":118,"context_line":"  one. Cinder processes snapshots sequentially, so headroom for all temporary"},{"line_number":119,"context_line":"  source volumes at once is not required."},{"line_number":120,"context_line":"* The destination backend capacity must exceed (the number of snapshots + 1)"},{"line_number":121,"context_line":"  multiplied by the size of source volume."},{"line_number":122,"context_line":"* Temporary source volumes, the staging destination volume, and staging"},{"line_number":123,"context_line":"  destination snapshots are internal migration resources. They do not consume"},{"line_number":124,"context_line":"  Cinder quota from the requesting project or a service project."}],"source_content_type":"text/x-rst","patch_set":9,"id":"f9e15f34_b8fb2b33","line":121,"range":{"start_line":113,"start_character":2,"end_line":121,"end_character":42},"in_reply_to":"157d1bf4_e3c3343f","updated":"2026-10-22 11:53:00.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":true,"context_lines":[{"line_number":110,"context_line":"backends satisfy the requirements for host-assisted snapshot migration. This"},{"line_number":111,"context_line":"includes the following items."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* The normal Cinder destination volume-type quota reservation for the original"},{"line_number":114,"context_line":"  volume succeeds."},{"line_number":115,"context_line":"* The source backend has enough headroom to materialize one temporary source"},{"line_number":116,"context_line":"  volume from a snapshot. The capacity consumed by this operation is"},{"line_number":117,"context_line":"  driver-dependent; a backend can use a space-efficient clone when it supports"},{"line_number":118,"context_line":"  one. Cinder processes snapshots sequentially, so headroom for all temporary"},{"line_number":119,"context_line":"  source volumes at once is not required."},{"line_number":120,"context_line":"* The destination backend capacity must exceed (the number of snapshots + 1)"},{"line_number":121,"context_line":"  multiplied by the size of source volume."},{"line_number":122,"context_line":"* Temporary source volumes, the staging destination volume, and staging"},{"line_number":123,"context_line":"  destination snapshots are internal migration resources. They do not consume"},{"line_number":124,"context_line":"  Cinder quota from the requesting project or a service project."}],"source_content_type":"text/x-rst","patch_set":9,"id":"157d1bf4_e3c3343f","line":121,"range":{"start_line":113,"start_character":2,"end_line":121,"end_character":42},"in_reply_to":"cc6f1120_a59f6a3a","updated":"2026-10-21 23:35:16.000000000","message":"Thanks. I updated the quota statement to distinguish the existing retype quota reservation from backend-capacity preflight.\n\nThe existing ``get_volume_type_reservation`` path reserves destination volume-type quota for the preserved volume and its snapshots, including the snapshot count and aggregate size where snapshot-gigabyte quota is enabled.\nThe staging volume, staging snapshots, and temporary source volumes are internal migration resources and use ``use_quota\u003dFalse``.\n\nThere is, however, no generic scheduler or driver contract that preflights the transient backend capacity needed by those internal resources. I therefore removed any implication that source headroom or destination transient capacity is synchronously guaranteed. The spec now describes them as planning estimates, with capacity exhaustion handled as an asynchronous migration failure.\n\nFor a destination without space-efficient snapshots, the worst-case estimate is ``(number of snapshots + 1) * source volume size``. Sequential processing means that the source generally needs to materialize only one temporary snapshot volume at a time, and COW/ROW behavior can reduce the actual capacity used on either backend.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":true,"context_lines":[{"line_number":206,"context_line":"  records refer to the destination backend snapshot artifacts."},{"line_number":207,"context_line":"* Update the snapshots\u0027 ``volume_type_id``."},{"line_number":208,"context_line":"* Ensure snapshot records continue to reference the retyped volume."},{"line_number":209,"context_line":"* Ensure any driver-specific metadata is updated in a driver-consistent manner."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Essentially, after the volume retyping, from an end-user perspective the volume"},{"line_number":212,"context_line":"and its snapshots should function exactly as before, just now residing on a"}],"source_content_type":"text/x-rst","patch_set":9,"id":"741ce7d1_e617acfc","line":209,"range":{"start_line":209,"start_character":1,"end_line":209,"end_character":79},"updated":"2026-10-05 19:55:56.000000000","message":"Lines 203-208 name the fields, which is what I asked for originally. What is\nstill missing is what happens if the process dies partway through: the volume\nrecord plus N snapshot records have to move as a unit, and a crash between\nper-snapshot updates leaves a mix of source and destination pointers with no\nway to tell which is which. Line 209\u0027s \"Ensure any driver-specific metadata is\nupdated in a driver-consistent manner\" is too vague for the field that decides\nwhether a snapshot can be found after the retype.\n\n994912 already answers this well: `_finalize_migrated_snapshots` is an explicit\ntwo-phase commit, where phase 1 repoints every preserved snapshot record with\ncompensating rollback if any one fails, and phase 2 deletes the source\nartifacts only after every record is committed. Please describe that in the\nspec rather than leaving it in a docstring.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[{"line_number":206,"context_line":"  records refer to the destination backend snapshot artifacts."},{"line_number":207,"context_line":"* Update the snapshots\u0027 ``volume_type_id``."},{"line_number":208,"context_line":"* Ensure snapshot records continue to reference the retyped volume."},{"line_number":209,"context_line":"* Ensure any driver-specific metadata is updated in a driver-consistent manner."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Essentially, after the volume retyping, from an end-user perspective the volume"},{"line_number":212,"context_line":"and its snapshots should function exactly as before, just now residing on a"}],"source_content_type":"text/x-rst","patch_set":9,"id":"8c9b5e15_7031d7b9","line":209,"range":{"start_line":209,"start_character":1,"end_line":209,"end_character":79},"in_reply_to":"672e0aba_0f254889","updated":"2026-10-22 11:53:00.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":true,"context_lines":[{"line_number":206,"context_line":"  records refer to the destination backend snapshot artifacts."},{"line_number":207,"context_line":"* Update the snapshots\u0027 ``volume_type_id``."},{"line_number":208,"context_line":"* Ensure snapshot records continue to reference the retyped volume."},{"line_number":209,"context_line":"* Ensure any driver-specific metadata is updated in a driver-consistent manner."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Essentially, after the volume retyping, from an end-user perspective the volume"},{"line_number":212,"context_line":"and its snapshots should function exactly as before, just now residing on a"}],"source_content_type":"text/x-rst","patch_set":9,"id":"672e0aba_0f254889","line":209,"range":{"start_line":209,"start_character":1,"end_line":209,"end_character":79},"in_reply_to":"741ce7d1_e617acfc","updated":"2026-10-21 23:35:16.000000000","message":"Agreed. I replaced the vague driver-consistency statement with the application-level two-phase finalization protocol.\n\nIn phase 1, Cinder asks the destination driver to adopt each rebuilt snapshot, then repoints the preserved source snapshot record to the destination provider fields while retaining a source-artifact handle. If Cinder catches a phase-1 failure, it restores records already updated and removes adopted destination artifacts where possible.\n\nIn phase 2, Cinder deletes the retained source snapshot artifacts only after the volume cutover has succeeded. The original Cinder snapshot IDs are preserved throughout.\n\nThe per-snapshot phase is not a single database transaction. The subsequent swap of the two volume records is atomic, and a caught failure during that swap invokes snapshot compensation. A process failure during phase 1 can still leave the volume in ``migration_status\u003dcompleting`` with a mixture of adopted and pending snapshot records. The spec states that this window is not automatically unwound and requires operator inspection.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":true,"context_lines":[{"line_number":216,"context_line":"----------------"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"* If the source and destination backends do not satisfy the requirements or any"},{"line_number":219,"context_line":"  checks fail at pre-verification stage, a ``409 Conflict`` error will be"},{"line_number":220,"context_line":"  returned to the user, and the retype request will not be executed."},{"line_number":221,"context_line":"* If any operation fails during the snapshot migration, the base volume data"},{"line_number":222,"context_line":"  migration, or Cinder DB update stages, Cinder terminates the retype execution"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1574705f_fec1d60e","line":219,"range":{"start_line":219,"start_character":45,"end_line":219,"end_character":57},"updated":"2026-10-05 19:55:56.000000000","message":"In the implementation the snapshot-status check raises `ResourceConflict` (409), but the encryption check in 994905 and the snapshot-count check in 994904 both\nraise `InvalidInput` (400). Please document which preconditions give which --\nAPI consumers will code against this.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":true,"context_lines":[{"line_number":216,"context_line":"----------------"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"* If the source and destination backends do not satisfy the requirements or any"},{"line_number":219,"context_line":"  checks fail at pre-verification stage, a ``409 Conflict`` error will be"},{"line_number":220,"context_line":"  returned to the user, and the retype request will not be executed."},{"line_number":221,"context_line":"* If any operation fails during the snapshot migration, the base volume data"},{"line_number":222,"context_line":"  migration, or Cinder DB update stages, Cinder terminates the retype execution"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9f8260b3_91f6d522","line":219,"range":{"start_line":219,"start_character":45,"end_line":219,"end_character":57},"in_reply_to":"1574705f_fec1d60e","updated":"2026-10-21 23:35:16.000000000","message":"Agreed. I documented the mappings explicitly:\n\n* ``400 Bad Request`` for use of ``include_snapshots`` below microversion 3.72, ``max_snapshots_per_migration\u003d0``, exceeding a positive snapshot limit, or an encrypted source/destination combination that is unsupported by snapshot-aware retype.\n* ``409 Conflict`` when any snapshot is not in ``available`` status.\n* ``413 Request Entity Too Large`` when destination volume-type quota reservation fails.\n\nBackend capability and transient-capacity failures discovered after acceptance remain asynchronous failures and set the migration status to ``error``.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[{"line_number":216,"context_line":"----------------"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"* If the source and destination backends do not satisfy the requirements or any"},{"line_number":219,"context_line":"  checks fail at pre-verification stage, a ``409 Conflict`` error will be"},{"line_number":220,"context_line":"  returned to the user, and the retype request will not be executed."},{"line_number":221,"context_line":"* If any operation fails during the snapshot migration, the base volume data"},{"line_number":222,"context_line":"  migration, or Cinder DB update stages, Cinder terminates the retype execution"}],"source_content_type":"text/x-rst","patch_set":9,"id":"d75f3143_3071eb5b","line":219,"range":{"start_line":219,"start_character":45,"end_line":219,"end_character":57},"in_reply_to":"9f8260b3_91f6d522","updated":"2026-10-22 11:53:00.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":true,"context_lines":[{"line_number":224,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"},{"line_number":225,"context_line":"  succeeds. Additionally, Cinder will set the volume migration status to error"},{"line_number":226,"context_line":"  and notify the user of the migration failure."},{"line_number":227,"context_line":"* If cleaning up snapshot or volume artifacts fails, Cinder stops the rollback"},{"line_number":228,"context_line":"  process and records the error details in the cinder-volume log."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3287cb3a_f2442dd1","line":227,"updated":"2026-10-05 19:55:56.000000000","message":"This line still records a failed cleanup only in the cinder-volume log, Data\nmodel impact (line 251) is still \"None\", and Documentation Impact (line 424)\nhas no operator recovery procedure. So the state that most needs to be visible\n-- rollback stopped, orphaned destination snapshots and temporary volumes left\nbehind, source intact -- is the one an operator cannot see through the API.\n\nOn PS1 you proposed a `cleanup_error` value, which I thought was the right\ninstinct. Either reinstate that (or an equivalent `migration_status` value), or\ndocument the manual recovery procedure under Documentation Impact.\n\nThis matters more now than it did, because 994912 has grown real recovery\nbehaviour the spec says nothing about: `Volume.is_cleanable()` returning True\nfor `retyping` so an interrupted retype gets a workers-table entry,\n`_warn_interrupted_finalize` for the `completing` window, a sweep for orphaned\nper-snapshot temporary source volumes, and a deliberate decision *not* to\nauto-roll-back an interrupted in-use migration because Nova may already have\npivoted the guest onto the destination. That last one is a significant and, I\nthink, correct call, and it is exactly the operator-visible failure mode this\nitem is about. None of it is in the spec.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":true,"context_lines":[{"line_number":224,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"},{"line_number":225,"context_line":"  succeeds. Additionally, Cinder will set the volume migration status to error"},{"line_number":226,"context_line":"  and notify the user of the migration failure."},{"line_number":227,"context_line":"* If cleaning up snapshot or volume artifacts fails, Cinder stops the rollback"},{"line_number":228,"context_line":"  process and records the error details in the cinder-volume log."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":9,"id":"61a95c38_5ea92649","line":227,"in_reply_to":"3287cb3a_f2442dd1","updated":"2026-10-21 23:35:16.000000000","message":"I chose the documentation option rather than introduce a new ``cleanup_error`` or per-snapshot migration-status value in this change.\n\nThe spec now describes the existing recovery split:\n\n* An interrupted, unattached ``migrating`` snapshot-aware operation is handled\n  by the cleanup worker. Cinder attempts to remove staged destination\n  snapshots, the staging destination volume, and per-snapshot temporary source\n  volumes, then marks the migration as an error.\n* An attached operation left in ``migrating`` is not automatically rolled\n  back, because Nova may already have pivoted the guest to the destination.\n* An operation left in ``completing`` is also not automatically unwound,\n  because snapshot records and volume records may already be partly cut over.\n* A volume left in ``retyping`` without a persisted migration phase is left\n  unchanged because Cinder cannot tell whether a native driver retype already\n  changed the backend.\n\nFor the cases that are not automatically recovered, the operator must inspect cinder-volume and Nova logs, the attachment, both volume artifacts, and each snapshot\u0027s backend artifact before changing status or removing resources.\nCleanup failures are logged with Cinder resource IDs and provider information where available. Source snapshot artifacts are retained until cutover so that manual recovery remains possible.\n\nThe Data model section also states that no new schema is introduced and that recovery relies on the existing ``migration_status``, workers table, temporary resource records, and internal-resource markers.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[{"line_number":224,"context_line":"  volumes are cleaned, and source snapshots remain unchanged unless finalization"},{"line_number":225,"context_line":"  succeeds. Additionally, Cinder will set the volume migration status to error"},{"line_number":226,"context_line":"  and notify the user of the migration failure."},{"line_number":227,"context_line":"* If cleaning up snapshot or volume artifacts fails, Cinder stops the rollback"},{"line_number":228,"context_line":"  process and records the error details in the cinder-volume log."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":9,"id":"c9563aed_2089acf8","line":227,"in_reply_to":"61a95c38_5ea92649","updated":"2026-10-22 11:53:00.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":true,"context_lines":[{"line_number":330,"context_line":"  snapshots as part of this spec."},{"line_number":331,"context_line":"* No changes required to user commands for snapshot management."},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Performance Impact"},{"line_number":334,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Retyping volume duration increases with:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"d237df74_7d4a9b91","line":333,"updated":"2026-10-05 19:55:56.000000000","message":"I want to back Rajat\u0027s request explicitly rather than bury it in a list -- he\nhas now asked for this twice, on PS3 at lines 280 and 352, and the section is\nstill entirely qualitative. A 2TB volume with 10 snapshots implies roughly 22TB\nof copying, days of wall-clock through the libvirt path, and transient space on\nboth ends for the duration. An operator deciding whether to set\n`include_snapshots` needs a number, not a proportionality statement. Even one\nworked example with stated assumptions would do.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[{"line_number":330,"context_line":"  snapshots as part of this spec."},{"line_number":331,"context_line":"* No changes required to user commands for snapshot management."},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Performance Impact"},{"line_number":334,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Retyping volume duration increases with:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"90d26644_35df2b03","line":333,"in_reply_to":"3075f90f_7616a7e3","updated":"2026-10-22 11:53:00.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":true,"context_lines":[{"line_number":330,"context_line":"  snapshots as part of this spec."},{"line_number":331,"context_line":"* No changes required to user commands for snapshot management."},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Performance Impact"},{"line_number":334,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Retyping volume duration increases with:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3075f90f_7616a7e3","line":333,"in_reply_to":"d237df74_7d4a9b91","updated":"2026-10-21 23:35:16.000000000","message":"Agreed. I added a worked worst-case example.\n\nFor a 2 TiB volume with 10 snapshots, the generic path may copy approximately\n22 TiB: 20 TiB for the ten snapshot generations plus 2 TiB for the current\nvolume. At a sustained effective throughput of 100 MiB/s, the transfer alone\ntakes approximately 64 hours before protocol and backend overhead.\n\nWithout space-efficient snapshots, the destination may also require\napproximately 22 TiB of transient backend capacity. Sequential processing\nlimits source-side materialization to about one temporary volume at a time.\nSparse copies and COW/ROW snapshots can reduce both estimates.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":true,"context_lines":[{"line_number":345,"context_line":"  migration cost is roughly proportional to volume size multiplied by the"},{"line_number":346,"context_line":"  number of snapshot generations."},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Other deployer impact"},{"line_number":349,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"* Operators should be aware that retyping a volume may take longer when the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"40159837_76217983","line":348,"updated":"2026-10-05 19:55:56.000000000","message":"* The `max_snapshots_per_migration` configuration option, with its -1 / 0 /\n  positive semantics. It is described at lines 131-133 as a precondition but\n  never named as an option an operator sets.\n* The volume RPC version bump. 994908 moves `RPC_API_VERSION` to 3.21 and adds\n  two methods guarded by `assert_min_rpc_version`. The spec has no upgrade\n  discussion at all, and rolling upgrades with mixed-version cinder-volume\n  services are exactly where that bites.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":true,"context_lines":[{"line_number":345,"context_line":"  migration cost is roughly proportional to volume size multiplied by the"},{"line_number":346,"context_line":"  number of snapshot generations."},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Other deployer impact"},{"line_number":349,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"* Operators should be aware that retyping a volume may take longer when the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"df78ef7c_e8481657","line":348,"in_reply_to":"40159837_76217983","updated":"2026-10-21 23:35:16.000000000","message":"I identified ``max_snapshots_per_migration`` explicitly as a ``cinder.conf`` option:\n\n* ``-1``: no snapshot-count limit (the implemented default);\n* ``0``: disable snapshot-aware retype;\n* a positive value: reject a request whose snapshot count exceeds that value.\n\nI added an Upgrade impact section.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[{"line_number":345,"context_line":"  migration cost is roughly proportional to volume size multiplied by the"},{"line_number":346,"context_line":"  number of snapshot generations."},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Other deployer impact"},{"line_number":349,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"* Operators should be aware that retyping a volume may take longer when the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"4a62191e_82952e79","line":348,"in_reply_to":"df78ef7c_e8481657","updated":"2026-10-22 11:53:00.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"23d6e4ee9398b22dbeafbd74dc9d5eda13d65eca","unresolved":true,"context_lines":[{"line_number":352,"context_line":"  volume includes many snapshots."},{"line_number":353,"context_line":"* Backends should support necessary snapshot operations for best results."},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"Developer impact"},{"line_number":356,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"Drivers may optionally implement:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"a4650c57_709d92f6","line":355,"updated":"2026-10-05 19:55:56.000000000","message":"The two bullets describe the hooks in prose but name neither the capability\nflag nor the methods. A third-party driver maintainer reading this cannot tell\nwhat to implement. Please name them: the `snapshot_migration_support`\ncapability a destination backend must advertise (994913), and the\n`update_migrated_snapshot` (994908) and `copy_volume_data_to_existing_volume`\n(994910) driver hooks, with their signatures and what a driver should return.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":false,"context_lines":[{"line_number":352,"context_line":"  volume includes many snapshots."},{"line_number":353,"context_line":"* Backends should support necessary snapshot operations for best results."},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"Developer impact"},{"line_number":356,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"Drivers may optionally implement:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"ed5a9b93_4fa1f490","line":355,"in_reply_to":"27cad524_29f1e2b3","updated":"2026-10-22 11:53:00.000000000","message":"Done","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"d6ef7826c270a676d9362f36527180bb85209cbc","unresolved":true,"context_lines":[{"line_number":352,"context_line":"  volume includes many snapshots."},{"line_number":353,"context_line":"* Backends should support necessary snapshot operations for best results."},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"Developer impact"},{"line_number":356,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"Drivers may optionally implement:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"27cad524_29f1e2b3","line":355,"in_reply_to":"a4650c57_709d92f6","updated":"2026-10-21 23:35:16.000000000","message":"I named the driver contract explicitly.\n\nBoth source and destination backends must advertise ``snapshot_migration_support``. The optional hooks are:\n\n* ``copy_volume_data_to_existing_volume(context, src_vol, dest_vol,\n  remote\u003dNone) -\u003e bool``. ``True`` means the driver completed the copy;\n  ``False`` selects the generic host-assisted fallback.\n* ``update_migrated_snapshot(ctxt, snapshot, new_snapshot) -\u003e dict | None``.\n  A returned mapping may provide corrected ``provider_location``,\n  ``provider_id``, ``provider_auth``, or ``metadata`` values. Missing values,\n  an empty mapping, or ``None`` use the staging snapshot values and merged\n  metadata.\n* ``get_snapshots_in_migration_order(snapshots) -\u003e list`` for a driver that\n  requires dependency-safe ordering other than the default oldest-first\n  order.","commit_id":"40f4a1267adaf71cd6a2426acbfabf74204d1e05"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":true,"context_lines":[{"line_number":178,"context_line":"    that exposes parent/child or delta dependencies may override"},{"line_number":179,"context_line":"    ``get_snapshots_in_migration_order(snapshots)`` to return a dependency-safe"},{"line_number":180,"context_line":"    order."},{"line_number":181,"context_line":"  * The generic path does not promise to preserve backend-native lineage that"},{"line_number":182,"context_line":"    is not exposed to Cinder; it rebuilds each destination snapshot from the"},{"line_number":183,"context_line":"    staging volume. Drivers that require native lineage must advertise and"},{"line_number":184,"context_line":"    implement the appropriate ordering and adoption behavior."}],"source_content_type":"text/x-rst","patch_set":10,"id":"4c846b9f_16bf628e","line":181,"updated":"2026-10-22 11:53:00.000000000","message":"One step further: backend snapshots with no Cinder record at all (CBT\nreference points, for example) are never enumerated, so they are neither\nrebuilt nor cleaned up and vanish with the source volume. Two sentences\nwould do: they are out of scope and may not survive the retype, and the\nsource volume may still carry them when the migration deletes it. A\ndocumented limitation is fine.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"5a11f751111589de4167dd885bdeb7bcea3b5110","unresolved":true,"context_lines":[{"line_number":178,"context_line":"    that exposes parent/child or delta dependencies may override"},{"line_number":179,"context_line":"    ``get_snapshots_in_migration_order(snapshots)`` to return a dependency-safe"},{"line_number":180,"context_line":"    order."},{"line_number":181,"context_line":"  * The generic path does not promise to preserve backend-native lineage that"},{"line_number":182,"context_line":"    is not exposed to Cinder; it rebuilds each destination snapshot from the"},{"line_number":183,"context_line":"    staging volume. Drivers that require native lineage must advertise and"},{"line_number":184,"context_line":"    implement the appropriate ordering and adoption behavior."}],"source_content_type":"text/x-rst","patch_set":10,"id":"f89fdc30_b05586e6","line":181,"in_reply_to":"4c846b9f_16bf628e","updated":"2026-10-22 13:43:13.000000000","message":"Agreed. I added this as an explicit limitation.\n\nThe snapshot-aware retype flow enumerates Cinder snapshot records; it does not\ndiscover backend-native snapshots or reference points that have no\ncorresponding Cinder record. Those artifacts are therefore out of scope: they\nare not rebuilt on the destination and may not survive the retype. The spec\nalso now states that they may still be attached to the source volume when the\nmigration deletes it.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    that exposes parent/child or delta dependencies may override"},{"line_number":179,"context_line":"    ``get_snapshots_in_migration_order(snapshots)`` to return a dependency-safe"},{"line_number":180,"context_line":"    order."},{"line_number":181,"context_line":"  * The generic path does not promise to preserve backend-native lineage that"},{"line_number":182,"context_line":"    is not exposed to Cinder; it rebuilds each destination snapshot from the"},{"line_number":183,"context_line":"    staging volume. Drivers that require native lineage must advertise and"},{"line_number":184,"context_line":"    implement the appropriate ordering and adoption behavior."}],"source_content_type":"text/x-rst","patch_set":10,"id":"7081a8ff_3d940060","line":181,"in_reply_to":"f89fdc30_b05586e6","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":true,"context_lines":[{"line_number":391,"context_line":"Upgrade impact"},{"line_number":392,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"The volume RPC API is bumped to version ``3.22`` for the"},{"line_number":395,"context_line":"``include_snapshots`` argument to ``retype``. The snapshot finalization RPCs"},{"line_number":396,"context_line":"``update_migrated_snapshot`` and ``delete_migrated_source_snapshot`` require"},{"line_number":397,"context_line":"RPC version ``3.21``. Cinder selects its volume RPC version cap from the"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fad81cea_b00cfd22","line":394,"updated":"2026-10-22 11:53:00.000000000","message":"Nit: 3.21, 3.22 and microversion 3.72 are each claimed by other open\nchanges, so expect to renumber on rebase. No change needed.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":391,"context_line":"Upgrade impact"},{"line_number":392,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"The volume RPC API is bumped to version ``3.22`` for the"},{"line_number":395,"context_line":"``include_snapshots`` argument to ``retype``. The snapshot finalization RPCs"},{"line_number":396,"context_line":"``update_migrated_snapshot`` and ``delete_migrated_source_snapshot`` require"},{"line_number":397,"context_line":"RPC version ``3.21``. Cinder selects its volume RPC version cap from the"}],"source_content_type":"text/x-rst","patch_set":10,"id":"6dd998a2_00f7a4b8","line":394,"in_reply_to":"d2700484_3a32e75e","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"5a11f751111589de4167dd885bdeb7bcea3b5110","unresolved":true,"context_lines":[{"line_number":391,"context_line":"Upgrade impact"},{"line_number":392,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"The volume RPC API is bumped to version ``3.22`` for the"},{"line_number":395,"context_line":"``include_snapshots`` argument to ``retype``. The snapshot finalization RPCs"},{"line_number":396,"context_line":"``update_migrated_snapshot`` and ``delete_migrated_source_snapshot`` require"},{"line_number":397,"context_line":"RPC version ``3.21``. Cinder selects its volume RPC version cap from the"}],"source_content_type":"text/x-rst","patch_set":10,"id":"d2700484_3a32e75e","line":394,"in_reply_to":"fad81cea_b00cfd22","updated":"2026-10-22 13:43:13.000000000","message":"Thanks for the heads-up. I made no change for this comment, as suggested. I\nwill renumber RPC versions 3.21 and 3.22 and API microversion 3.72, in both the\nimplementation and the spec, as needed when the change stack is rebased.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b9ff76102cd281f160b74f9ed6780e9a6119af5b","unresolved":true,"context_lines":[{"line_number":394,"context_line":"The volume RPC API is bumped to version ``3.22`` for the"},{"line_number":395,"context_line":"``include_snapshots`` argument to ``retype``. The snapshot finalization RPCs"},{"line_number":396,"context_line":"``update_migrated_snapshot`` and ``delete_migrated_source_snapshot`` require"},{"line_number":397,"context_line":"RPC version ``3.21``. Cinder selects its volume RPC version cap from the"},{"line_number":398,"context_line":"minimum version advertised by all registered cinder-volume services. During a"},{"line_number":399,"context_line":"rolling upgrade, snapshot-aware retype must therefore not be used until every"},{"line_number":400,"context_line":"registered cinder-volume service can receive version ``3.22``; that also"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bf3f8465_7e7767da","line":397,"updated":"2026-10-22 11:53:00.000000000","message":"The code does better than this says. 994913 catches `ServiceTooOld` in the\nscheduler, takes the volume out of `retyping` and releases the\nreservations, so on a mixed-version deployment the request is accepted and\nthen fails cleanly — nothing is left stuck. Please describe that, and the\nresulting volume status / `migration_status`, since that is what API\nconsumers will poll.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":38251,"name":"Fuli Qi","display_name":"Fuli Qi","email":"qi.fuli@fujitsu.com","username":"fqi"},"change_message_id":"5a11f751111589de4167dd885bdeb7bcea3b5110","unresolved":true,"context_lines":[{"line_number":394,"context_line":"The volume RPC API is bumped to version ``3.22`` for the"},{"line_number":395,"context_line":"``include_snapshots`` argument to ``retype``. The snapshot finalization RPCs"},{"line_number":396,"context_line":"``update_migrated_snapshot`` and ``delete_migrated_source_snapshot`` require"},{"line_number":397,"context_line":"RPC version ``3.21``. Cinder selects its volume RPC version cap from the"},{"line_number":398,"context_line":"minimum version advertised by all registered cinder-volume services. During a"},{"line_number":399,"context_line":"rolling upgrade, snapshot-aware retype must therefore not be used until every"},{"line_number":400,"context_line":"registered cinder-volume service can receive version ``3.22``; that also"}],"source_content_type":"text/x-rst","patch_set":10,"id":"f8961106_4ae667ab","line":397,"in_reply_to":"bf3f8465_7e7767da","updated":"2026-10-22 13:43:13.000000000","message":"Agreed. I updated the Upgrade impact section to describe the behavior already\nimplemented in change 994913.\n\nDuring a rolling upgrade, the API accepts the asynchronous snapshot-aware\nretype request. If the volume RPC version cap cannot send version 3.22, the\nscheduler catches ``ServiceTooOld``, releases both the new and old volume-type\nquota reservations, and restores the volume status to its pre-request\n``available`` or ``in-use`` value. The scheduler does not modify\n``migration_status``, so it remains at its pre-request value, normally\n``None``. This prevents the volume from being left in ``retyping`` and gives\nAPI consumers a stable terminal state to observe.","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a9c1f6db6ed9e6788b2f865422717a8b244f3620","unresolved":false,"context_lines":[{"line_number":394,"context_line":"The volume RPC API is bumped to version ``3.22`` for the"},{"line_number":395,"context_line":"``include_snapshots`` argument to ``retype``. The snapshot finalization RPCs"},{"line_number":396,"context_line":"``update_migrated_snapshot`` and ``delete_migrated_source_snapshot`` require"},{"line_number":397,"context_line":"RPC version ``3.21``. Cinder selects its volume RPC version cap from the"},{"line_number":398,"context_line":"minimum version advertised by all registered cinder-volume services. During a"},{"line_number":399,"context_line":"rolling upgrade, snapshot-aware retype must therefore not be used until every"},{"line_number":400,"context_line":"registered cinder-volume service can receive version ``3.22``; that also"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dc70de04_cb52294c","line":397,"in_reply_to":"f8961106_4ae667ab","updated":"2026-10-22 14:21:50.000000000","message":"Done","commit_id":"cc6a91a1517df643ab5cc6ce9ef4e2d1d379941e"}]}
