)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":20,"context_line":"It is disabled by default so existing deployments are unaffected on"},{"line_number":21,"context_line":"upgrade."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Changes:"},{"line_number":24,"context_line":"- ImageVolumeCache.get_local_entry(): new host-scoped cache lookup"},{"line_number":25,"context_line":"  used as the idempotency guard inside the promotion path."},{"line_number":26,"context_line":"- CreateVolumeFromSpecTask._promote_local_cache_entry(): best-effort"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"498815e8_b739f887","line":23,"updated":"2026-08-21 15:51:43.000000000","message":"Missing these:\n1. a NetApp ONTAP REST change: `Location`-header → LUN UUID, new `get_lun_by_uuid()`, and `return_headers` / `return_location` plumbed through `api.py` and `client_cmode_rest.py`, plus the `block_cmode.py` clone path\n2. an unrelated `test_backup_posix.py` fix","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"It is disabled by default so existing deployments are unaffected on"},{"line_number":21,"context_line":"upgrade."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Changes:"},{"line_number":24,"context_line":"- ImageVolumeCache.get_local_entry(): new host-scoped cache lookup"},{"line_number":25,"context_line":"  used as the idempotency guard inside the promotion path."},{"line_number":26,"context_line":"- CreateVolumeFromSpecTask._promote_local_cache_entry(): best-effort"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"f024ec21_5f0fb086","line":23,"in_reply_to":"498815e8_b739f887","updated":"2026-08-25 10:59:12.000000000","message":"The NetApp REST Location → UUID / get_lun_by_uuid / return_headers plumbing is in this change and will be listed in the commit message on the next PS.\n\ntest_backup_posix.py is not part of this change (it comes from I0afe33b4 / restrict-backup-container-creation). Dropping it from the commit message.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":23,"context_line":"Changes:"},{"line_number":24,"context_line":"- ImageVolumeCache.get_local_entry(): new host-scoped cache lookup"},{"line_number":25,"context_line":"  used as the idempotency guard inside the promotion path."},{"line_number":26,"context_line":"- CreateVolumeFromSpecTask._promote_local_cache_entry(): best-effort"},{"line_number":27,"context_line":"  helper that clones the just-created volume into the cache and cleans"},{"line_number":28,"context_line":"  up on failure."},{"line_number":29,"context_line":"- CreateVolumeFromSpecTask._create_from_cinder_store_image(): new"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"138b2a7a_178dd3cd","line":26,"updated":"2026-08-21 15:51:43.000000000","message":"Don\u0027t see this in the patch - I see `_do_create_cache_create()`","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Changes:"},{"line_number":24,"context_line":"- ImageVolumeCache.get_local_entry(): new host-scoped cache lookup"},{"line_number":25,"context_line":"  used as the idempotency guard inside the promotion path."},{"line_number":26,"context_line":"- CreateVolumeFromSpecTask._promote_local_cache_entry(): best-effort"},{"line_number":27,"context_line":"  helper that clones the just-created volume into the cache and cleans"},{"line_number":28,"context_line":"  up on failure."},{"line_number":29,"context_line":"- CreateVolumeFromSpecTask._create_from_cinder_store_image(): new"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"6e702b82_6061b878","line":26,"in_reply_to":"138b2a7a_178dd3cd","updated":"2026-08-25 10:59:12.000000000","message":"Agreed — that name is stale. The helper is _do_create_cache_entry(). Commit message updated accordingly. There is no _promote_local_cache_entry().","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":29,"context_line":"- CreateVolumeFromSpecTask._create_from_cinder_store_image(): new"},{"line_number":30,"context_line":"  coordination-locked helper for cinder-store Glance images that checks"},{"line_number":31,"context_line":"  the cache first, falls back to a direct clone, and then promotes."},{"line_number":32,"context_line":"- VolumeManager.init_host(): re-evaluates clone_across_pools after"},{"line_number":33,"context_line":"  driver initialisation so the cache always sees the correct value."},{"line_number":34,"context_line":"- Unit tests for all new code paths."},{"line_number":35,"context_line":"- Release note."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"85341bdf_b40abbce","line":32,"updated":"2026-08-21 15:51:43.000000000","message":"there is no `VolumeManage.init_host` change. Did this get dropped from an earlier PS?","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"- CreateVolumeFromSpecTask._create_from_cinder_store_image(): new"},{"line_number":30,"context_line":"  coordination-locked helper for cinder-store Glance images that checks"},{"line_number":31,"context_line":"  the cache first, falls back to a direct clone, and then promotes."},{"line_number":32,"context_line":"- VolumeManager.init_host(): re-evaluates clone_across_pools after"},{"line_number":33,"context_line":"  driver initialisation so the cache always sees the correct value."},{"line_number":34,"context_line":"- Unit tests for all new code paths."},{"line_number":35,"context_line":"- Release note."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"b73ac8ca_ad05af40","line":32,"in_reply_to":"85341bdf_b40abbce","updated":"2026-08-25 10:59:12.000000000","message":"Correct, VolumeManager.init_host() is not in this patch (dropped earlier). It will be removed from the commit message. clone_across_pools is read from driver.capabilities at request time in _should_promote_across_pools() / _create_from_image_cache(), so an init_host refresh is not required.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":18,"context_line":"If the destination pool already has a cache row, create-from-image"},{"line_number":19,"context_line":"clones it as today. If not, the cache row is created either by"},{"line_number":20,"context_line":"cloning from another pool\u0027s cache volume (when promotion is enabled)"},{"line_number":21,"context_line":"or by the existing Glance download path. Concurrent creates for the"},{"line_number":22,"context_line":"same image on the same host/pool are serialised so only one local"},{"line_number":23,"context_line":"cache row is seeded. Glance cinder-store image clone is unchanged."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"NetApp ONTAP REST clone verification uses the LUN create Location"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"29642647_d582890f","line":22,"range":{"start_line":21,"start_character":41,"end_line":22,"end_character":47},"updated":"2026-08-26 18:42:34.000000000","message":"Doesn\u0027t say the lock scope narrowed — it was `{image_id}` service-wide before. That\u0027s the part operators need.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":18,"context_line":"If the destination pool already has a cache row, create-from-image"},{"line_number":19,"context_line":"clones it as today. If not, the cache row is created either by"},{"line_number":20,"context_line":"cloning from another pool\u0027s cache volume (when promotion is enabled)"},{"line_number":21,"context_line":"or by the existing Glance download path. Concurrent creates for the"},{"line_number":22,"context_line":"same image on the same host/pool are serialised so only one local"},{"line_number":23,"context_line":"cache row is seeded. Glance cinder-store image clone is unchanged."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"NetApp ONTAP REST clone verification uses the LUN create Location"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"8299c28e_0ff25b7e","line":22,"range":{"start_line":21,"start_character":41,"end_line":22,"end_character":47},"in_reply_to":"29642647_d582890f","updated":"2026-08-30 12:56:41.000000000","message":"he commit message and the reno upgrade section both state that cache-entry preparation now uses image-promote-{image_id}-{volume.host} instead of the previous service-wide {image_id} lock, and that this applies even when image_volume_cache_promote_across_pools is False","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":30,"context_line":"Implements: blueprint per-pool-image-cache-promotion"},{"line_number":31,"context_line":"Change-Id: I4941197a2df741f80c317fb9e270f29f6fb085b2"},{"line_number":32,"context_line":"Signed-off-by: Jayaanan Borra \u003cjayaanand.borra@netapp.com\u003e"},{"line_number":33,"context_line":"Co-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"31ef58a9_3175bed2","line":33,"range":{"start_line":33,"start_character":0,"end_line":33,"end_character":15},"updated":"2026-08-26 18:42:34.000000000","message":"Should be `Assisted-By:`","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":30,"context_line":"Implements: blueprint per-pool-image-cache-promotion"},{"line_number":31,"context_line":"Change-Id: I4941197a2df741f80c317fb9e270f29f6fb085b2"},{"line_number":32,"context_line":"Signed-off-by: Jayaanan Borra \u003cjayaanand.borra@netapp.com\u003e"},{"line_number":33,"context_line":"Co-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"d28c2a7f_c7828a68","line":33,"range":{"start_line":33,"start_character":0,"end_line":33,"end_character":15},"in_reply_to":"31ef58a9_3175bed2","updated":"2026-08-30 12:56:41.000000000","message":"Patch set 15 20 are done using Cursor and lot of redundant code. I have to resolve comments manually. So removing Cursor in commit message.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"0e2b1f0e406dbb3450299785ae8982daf13433b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"51182990_2cd100ab","updated":"2026-06-09 14:58:16.000000000","message":"Hi Hemna, Thank you for your comment. I responded to you in line with details. Can you please review again.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b7a99b4a030680d067dc32c841982ec517d6bd1d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5ad4ed97_35a023e3","updated":"2026-06-11 13:33:39.000000000","message":"Please take a look at the comments.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6e56e6aef2a9522c6490f29132308ebb295fb01e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5df0ef58_da116dc2","updated":"2026-07-08 17:03:06.000000000","message":"Thank you! Anoop and Hemna for detailed review. Please review again.","commit_id":"b086e25a7038a2cda86699f571218b73ae0695fe"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d7c6fb51d09ad43ea6c08b589a4fa296eab0c56a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"84c266ff_f97e478a","updated":"2026-07-10 14:34:35.000000000","message":"recheck","commit_id":"b086e25a7038a2cda86699f571218b73ae0695fe"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"8a19257a6c0887ec090b6f005d249e2165d85617","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b7c3495c_3e988917","updated":"2026-07-10 07:38:48.000000000","message":"recheck","commit_id":"b086e25a7038a2cda86699f571218b73ae0695fe"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"374a0d228e5cd3fc4c9b095cad3bf9a97bf7d13f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"fd423917_93c4d668","updated":"2026-07-17 06:03:29.000000000","message":"recheck tempest timeout","commit_id":"1d07e587b4d249063749c74ae37cfb72903c027b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"f3559a6748c64935fbe319d99b65e679dde34bc4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8fa056f2_6d7993da","updated":"2026-07-17 09:52:08.000000000","message":"run-NetApp CI","commit_id":"1d07e587b4d249063749c74ae37cfb72903c027b"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"96f5754a98a924816a9dd766ed561d7f7c09e7b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b4f87d93_0b2060d9","updated":"2026-07-27 14:16:08.000000000","message":"LGTM. Please look at the nit comment.","commit_id":"94e1f80266d12e5746130f84128bf7a5bf52bd00"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"bd19f64f1bb828508db2c9b5bf3ad23c79c0dcdc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"aabc0616_fed13866","updated":"2026-08-07 16:02:03.000000000","message":"This patch looks good to me.  I have a few small comments.\n\nThe -1 is because I\u0027m wondering if the NetApp implementation should be a follow-on patch to the cinder implementation instead of grouped together (might make reviewing easier as well).  However, I won\u0027t enforce a -1 if this is not desired.","commit_id":"08be9dd02477e10a735230adb7717f0948f8b787"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"ea3c3cf45b7747cff698ebdca807bb81f20f4542","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d33ee3fc_e3a9cb9c","updated":"2026-08-07 09:22:32.000000000","message":"recheck","commit_id":"08be9dd02477e10a735230adb7717f0948f8b787"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"a2650848d43d63efd643125a93fd571418f30fb0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0ce5c7ce_5930b6ef","updated":"2026-08-07 03:27:13.000000000","message":"recheck tempest-slow-py3","commit_id":"08be9dd02477e10a735230adb7717f0948f8b787"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e238f557426e7aa3528f6e818f2a38ee723817ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"9b93d5df_7e060587","in_reply_to":"aabc0616_fed13866","updated":"2026-08-12 12:06:25.000000000","message":"Hi @anthony.galica@hitachivantara.com - I think it should be okay to merge this together? There are customers looking for this patch to get merged. If its okay and not important, can we move forward with this?","commit_id":"08be9dd02477e10a735230adb7717f0948f8b787"},{"author":{"_account_id":39225,"name":"Prudhvi","display_name":"Prudhvi","email":"prudhvi.openstack@gmail.com","username":"Prudhvi"},"change_message_id":"88f4667dbdfa1047ec99849b0be5e008f2c9f380","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"ee6e574b_64b9a417","updated":"2026-08-12 09:40:13.000000000","message":"Run-NetApp-cross-pool CI","commit_id":"307c95ab680001e7eba8197a8916d42f82931312"},{"author":{"_account_id":39225,"name":"Prudhvi","display_name":"Prudhvi","email":"prudhvi.openstack@gmail.com","username":"Prudhvi"},"change_message_id":"abaf87b2dfe5a51829e1fbe9b3fd8c78db15f0dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"2eebb445_3fdeb804","updated":"2026-08-12 09:41:09.000000000","message":"run-NetApp CI","commit_id":"307c95ab680001e7eba8197a8916d42f82931312"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"cced582992b8822e3e4c120fbab9527ef5bc2cbe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"d8da9986_5d492b5b","updated":"2026-08-12 10:55:00.000000000","message":"@agalica, thank you for detailed review. Addressed review comments. can you please review again.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3d3b67a6_a0f067ff","updated":"2026-08-21 15:51:43.000000000","message":"The big issues are those in `create_volume.py:860` and `866`.\nYou can probably simplify the whole patch by noting `cache.py:71`","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"75e36f73_ac84355b","in_reply_to":"3d3b67a6_a0f067ff","updated":"2026-08-25 10:59:12.000000000","message":"Simplified can you please take another look.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"7b37e79d59935b5ab145174034128623333c7c2e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":13,"id":"fa2a7d80_36f9130c","in_reply_to":"d8da9986_5d492b5b","updated":"2026-08-24 22:57:49.000000000","message":"Sorry for delay on this.  Please address Simon\u0027s comments and I will have another go at it.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"2ee70f4b_15ec6d1f","in_reply_to":"fa2a7d80_36f9130c","updated":"2026-08-25 10:59:12.000000000","message":"Addressed Simon\u0027s PS13 comments in this revision. The functional bugs (unconditional promotion, evict vs delete_cached_volume, get_local_entry dropping notifications, SnapshotLimitReached on the wrong entry, bare except Exception) are fixed in create_volume.py. Commit message and releasenote now match the code. Replies are on the individual comments. Please take another look.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"4634b3ca_a271473a","updated":"2026-08-25 10:59:12.000000000","message":"@simon@everpuredata.com, @anthony.galica@hitachivantara.com addressed your review comments and concerns. Please look at patch again","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"597326a6_29b4d499","updated":"2026-08-26 10:35:58.000000000","message":"This changes the fundamental understanding of glance cinder store image-volume and image-volume cache and introduces too much diversion from our original workflow to achieve a new cache entry in the destination pool which is undesired changes that can introduce regression is one of the key operations of Cinder.","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"81674466e4ba529b4e02e6852547fcad9e74700c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"d793fd95_77ea9a0c","updated":"2026-08-25 11:01:16.000000000","message":"recheck","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"cec9f271_b46397b1","updated":"2026-08-26 17:02:52.000000000","message":"@rajatdhasmana@gmail.com update code to suggested optimization. Please review again","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"42a18eda_184d171f","updated":"2026-08-26 18:42:34.000000000","message":"Two blockers left: 918 (default-config concurrency regression) and 946 (cache entry seeded before model_update is saved). The NetApp REST fix still wants its own change.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"e3c76dc8_e3ab66f4","updated":"2026-08-30 12:56:41.000000000","message":"@rajatdhasmana@gmail.com and @simon@everpuredata.com thank you! for detailed review. Addressed review comments please review again.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4320c5045942668c997484de2f52385c117fff73","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"b4c11af8_beb7ea4f","updated":"2026-08-31 08:57:01.000000000","message":"This looks way better and mantains backward compatibility while keeping the original workflow intact with just a new conditional for promotion logic.\nI still have a concern inline related to the lock granularity where we are not keeping backward compatibility for non-promote workflow.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"41c25318455566a5bb258a1d93959b13a2eab388","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"f4ccc7d2_03fc69d8","updated":"2026-09-29 13:56:54.000000000","message":"Please check the comments.","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"8b92b166237bdc295e01710014af8da715f99b67","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"f30e55da_0312eb2c","updated":"2026-09-04 07:04:56.000000000","message":"Run-NetApp CI","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"46e65ab96b0d382640c9900b4fb40a6c5a41b8cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"3ae02231_81412583","updated":"2026-09-01 12:07:28.000000000","message":"patch 22 fixes E123 bracket placement issue and reduced UTs","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"03c2304ffe98d34b7c702764da497c24709a70bc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"84c89ffe_ab7f0a20","updated":"2026-09-02 03:31:18.000000000","message":"recheck","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"d94d723d337d3ae8434af7dee42626f3a0299235","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"6ac4e338_4908926d","updated":"2026-10-02 14:31:04.000000000","message":"Note that this is still on my radar, but (now) I\u0027m waiting for Rajat\u0027s concerns to be addressed before I give it another go.","commit_id":"d67991f29da4af843c026ed1d9fbc81472660fc0"}],"cinder/image/cache.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":68,"context_line":"        # given host value hostname@backend#pool."},{"line_number":69,"context_line":"        return {}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def get_local_entry(self,"},{"line_number":72,"context_line":"                        context: context.RequestContext,"},{"line_number":73,"context_line":"                        volume_ref: objects.Volume,"},{"line_number":74,"context_line":"                        image_id: str,"}],"source_content_type":"text/x-python","patch_set":13,"id":"2c6f9596_462209f1","line":71,"updated":"2026-08-21 15:51:43.000000000","message":"This seems to be `get_entry(..., clone_across_pools\u003dFalse)` with the notifications removed. `_get_query_filters(volume_ref, clone_across_pools\u003dFalse)` at line 58 already returns `{\u0027cluster_name\u0027: ...}` when clustered and `{\u0027host\u0027: ...}` otherwise — identical to the logic here, and `_should_update_entry`/`delete_cached_volume` handling is the same too.\n\nThe one behavioural difference is that this method omits `_notify_cache_hit()` / `_notify_cache_miss()` and the \"Found image-volume cache entry\" debug log. Since `get_local_entry` is now the first lookup on every image-clone request, the common cases stop notifying entirely: a same-pool hit emits no hit event, and a miss on a non-cross-pool backend emits no miss event. Anyone tracking image-cache hit rate loses visibility.\n\nSuggest dropping this method and calling `get_entry(context, volume, image_id, image_meta, clone_across_pools\u003dFalse)` at the two call sites. That restores notifications and removes ~25 lines here plus ~87 lines of tests.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # given host value hostname@backend#pool."},{"line_number":69,"context_line":"        return {}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def get_local_entry(self,"},{"line_number":72,"context_line":"                        context: context.RequestContext,"},{"line_number":73,"context_line":"                        volume_ref: objects.Volume,"},{"line_number":74,"context_line":"                        image_id: str,"}],"source_content_type":"text/x-python","patch_set":13,"id":"63e9dbd5_4a6d6592","line":71,"in_reply_to":"2c6f9596_462209f1","updated":"2026-08-25 10:59:12.000000000","message":"Done. get_local_entry() is removed. Call sites use get_entry(..., clone_across_pools\u003dFalse), so hit/miss notifications and the existing debug log are unchanged.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"}],"cinder/tests/unit/backup/drivers/test_backup_posix.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":107,"context_line":"    def test_put_container_disabled(self):"},{"line_number":108,"context_line":"        container \u003d f\"{FAKE_CONTAINER}_new\""},{"line_number":109,"context_line":"        self.override_config(\u0027backup_create_containers\u0027, False)"},{"line_number":110,"context_line":"        self.driver.backup_create_containers \u003d False"},{"line_number":111,"context_line":"        self.mock_object(os.path, \u0027exists\u0027, return_value\u003dFalse)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self.assertRaises(OSError, self.driver.put_container, container)"}],"source_content_type":"text/x-python","patch_set":13,"id":"6f18612e_1da15500","line":110,"updated":"2026-08-21 15:51:43.000000000","message":"Is this a rebase artifact? It\u0027s unrelated to the change. Should be dropped, or if it\u0027s real, do it in its own patch","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    def test_put_container_disabled(self):"},{"line_number":108,"context_line":"        container \u003d f\"{FAKE_CONTAINER}_new\""},{"line_number":109,"context_line":"        self.override_config(\u0027backup_create_containers\u0027, False)"},{"line_number":110,"context_line":"        self.driver.backup_create_containers \u003d False"},{"line_number":111,"context_line":"        self.mock_object(os.path, \u0027exists\u0027, return_value\u003dFalse)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self.assertRaises(OSError, self.driver.put_container, container)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5350d10e_06140efe","line":110,"in_reply_to":"6f18612e_1da15500","updated":"2026-08-25 10:59:12.000000000","message":"Agreed it is unrelated. It is not in this change; no action here.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"}],"cinder/tests/unit/volume/flows/test_create_volume_flow.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2b85e1f64d5260d0b874412d5fe4e3ab59da82fc","unresolved":false,"context_lines":[{"line_number":2905,"context_line":"                    create_volume_manager.CreateVolumeFromSpecTask,"},{"line_number":2906,"context_line":"                    \u0027_create_from_source_volume\u0027,"},{"line_number":2907,"context_line":"                    side_effect\u003dfake_create_from_source"},{"line_number":2908,"context_line":"                    ) as mock_create_from_src:"},{"line_number":2909,"context_line":"                threads \u003d ["},{"line_number":2910,"context_line":"                    threading.Thread(target\u003dworker, args\u003d(i,))"},{"line_number":2911,"context_line":"                    for i in range(num_requests)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a1e5314_7618214b","line":2908,"updated":"2026-08-30 15:09:33.000000000","message":"pep8: E123 closing bracket does not match indentation of opening bracket\u0027s line","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"}],"cinder/volume/driver.py":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"96f5754a98a924816a9dd766ed561d7f7c09e7b0","unresolved":true,"context_lines":[{"line_number":381,"context_line":"                     \u0027a local image-volume cache entry on the destination \u0027"},{"line_number":382,"context_line":"                     \u0027pool after a successful cross-pool clone. Subsequent \u0027"},{"line_number":383,"context_line":"                     \u0027requests for the same image on that pool then use a \u0027"},{"line_number":384,"context_line":"                     \u0027fast same-pool clone instead of repeating the \u0027"},{"line_number":385,"context_line":"                     \u0027expensive cross-pool copy. Disabled by default so \u0027"},{"line_number":386,"context_line":"                     \u0027that existing deployments see no behavioural change \u0027"},{"line_number":387,"context_line":"                     \u0027on upgrade. Can be set in [DEFAULT] or per-backend.\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"adef0712_947cbc70","line":384,"range":{"start_line":384,"start_character":22,"end_line":384,"end_character":42},"updated":"2026-07-27 14:16:08.000000000","message":"fast-clone","commit_id":"5ae403a62cf616a85eacc8a3f76ce1ebc68fa82c"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"cced582992b8822e3e4c120fbab9527ef5bc2cbe","unresolved":false,"context_lines":[{"line_number":381,"context_line":"                     \u0027a local image-volume cache entry on the destination \u0027"},{"line_number":382,"context_line":"                     \u0027pool after a successful cross-pool clone. Subsequent \u0027"},{"line_number":383,"context_line":"                     \u0027requests for the same image on that pool then use a \u0027"},{"line_number":384,"context_line":"                     \u0027fast same-pool clone instead of repeating the \u0027"},{"line_number":385,"context_line":"                     \u0027expensive cross-pool copy. Disabled by default so \u0027"},{"line_number":386,"context_line":"                     \u0027that existing deployments see no behavioural change \u0027"},{"line_number":387,"context_line":"                     \u0027on upgrade. Can be set in [DEFAULT] or per-backend.\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5b77e3db_c13dece9","line":384,"range":{"start_line":384,"start_character":22,"end_line":384,"end_character":42},"in_reply_to":"06f2d6c6_f042fb8a","updated":"2026-08-12 10:55:00.000000000","message":"yes, comment reflect generic core level implementation.","commit_id":"5ae403a62cf616a85eacc8a3f76ce1ebc68fa82c"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"bd19f64f1bb828508db2c9b5bf3ad23c79c0dcdc","unresolved":true,"context_lines":[{"line_number":381,"context_line":"                     \u0027a local image-volume cache entry on the destination \u0027"},{"line_number":382,"context_line":"                     \u0027pool after a successful cross-pool clone. Subsequent \u0027"},{"line_number":383,"context_line":"                     \u0027requests for the same image on that pool then use a \u0027"},{"line_number":384,"context_line":"                     \u0027fast same-pool clone instead of repeating the \u0027"},{"line_number":385,"context_line":"                     \u0027expensive cross-pool copy. Disabled by default so \u0027"},{"line_number":386,"context_line":"                     \u0027that existing deployments see no behavioural change \u0027"},{"line_number":387,"context_line":"                     \u0027on upgrade. Can be set in [DEFAULT] or per-backend.\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"06f2d6c6_f042fb8a","line":384,"range":{"start_line":384,"start_character":22,"end_line":384,"end_character":42},"in_reply_to":"adef0712_947cbc70","updated":"2026-08-07 16:02:03.000000000","message":"I think the terminology is meant to be generic?","commit_id":"5ae403a62cf616a85eacc8a3f76ce1ebc68fa82c"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"41c25318455566a5bb258a1d93959b13a2eab388","unresolved":true,"context_lines":[{"line_number":373,"context_line":"               default\u003d0,"},{"line_number":374,"context_line":"               help\u003d\u0027Max number of entries allowed in the image volume cache. \u0027"},{"line_number":375,"context_line":"                    \u00270 \u003d\u003e unlimited.\u0027),"},{"line_number":376,"context_line":"    cfg.BoolOpt(\u0027image_volume_cache_promote_across_pools\u0027,"},{"line_number":377,"context_line":"                default\u003dFalse,"},{"line_number":378,"context_line":"                help\u003d\u0027When True, and when the backend driver reports \u0027"},{"line_number":379,"context_line":"                     \u0027clone_across_pools\u003dTrue and \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"aa6f4d36_203dcf7f","line":376,"range":{"start_line":376,"start_character":17,"end_line":376,"end_character":56},"updated":"2026-09-29 13:56:54.000000000","message":"Should we also mention that \"with the option enabled, each pool gets its own cache volume, and image_volume_cache_max_size_gb / image_volume_cache_max_count are enforced per host, so the footprint grows with the number of pools.\"","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"25f793bbc684a1b67d50b14c53c74c3eba46c4eb","unresolved":false,"context_lines":[{"line_number":373,"context_line":"               default\u003d0,"},{"line_number":374,"context_line":"               help\u003d\u0027Max number of entries allowed in the image volume cache. \u0027"},{"line_number":375,"context_line":"                    \u00270 \u003d\u003e unlimited.\u0027),"},{"line_number":376,"context_line":"    cfg.BoolOpt(\u0027image_volume_cache_promote_across_pools\u0027,"},{"line_number":377,"context_line":"                default\u003dFalse,"},{"line_number":378,"context_line":"                help\u003d\u0027When True, and when the backend driver reports \u0027"},{"line_number":379,"context_line":"                     \u0027clone_across_pools\u003dTrue and \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"16a25331_acc9a54b","line":376,"range":{"start_line":376,"start_character":17,"end_line":376,"end_character":56},"in_reply_to":"aa6f4d36_203dcf7f","updated":"2026-09-30 15:48:14.000000000","message":"Current image_volume_cache_max_size_gb / image_volume_cache_max_count behavior is not changed by this patch.","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"41c25318455566a5bb258a1d93959b13a2eab388","unresolved":true,"context_lines":[{"line_number":382,"context_line":"                     \u0027pool after a successful cross-pool clone. Subsequent \u0027"},{"line_number":383,"context_line":"                     \u0027requests for the same image on that pool then use a \u0027"},{"line_number":384,"context_line":"                     \u0027fast same-pool clone instead of repeating the \u0027"},{"line_number":385,"context_line":"                     \u0027expensive cross-pool copy. Disabled by default so \u0027"},{"line_number":386,"context_line":"                     \u0027that existing deployments see no behavioural change \u0027"},{"line_number":387,"context_line":"                     \u0027on upgrade. Can be set in [DEFAULT] or per-backend.\u0027),"},{"line_number":388,"context_line":"    cfg.BoolOpt(\u0027use_multipath_for_image_xfer\u0027,"},{"line_number":389,"context_line":"                default\u003dFalse,"},{"line_number":390,"context_line":"                help\u003d\u0027Do we attach/detach volumes in cinder using multipath \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"e765a279_13978c35","line":387,"range":{"start_line":385,"start_character":49,"end_line":387,"end_character":33},"updated":"2026-09-29 13:56:54.000000000","message":"Since the patch changes the locking behaviour - this may no longer be true? There will be change in all caching behaviour even if the option is configured as true as the lock applies to all the threads per host per image?","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"25f793bbc684a1b67d50b14c53c74c3eba46c4eb","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                     \u0027pool after a successful cross-pool clone. Subsequent \u0027"},{"line_number":383,"context_line":"                     \u0027requests for the same image on that pool then use a \u0027"},{"line_number":384,"context_line":"                     \u0027fast same-pool clone instead of repeating the \u0027"},{"line_number":385,"context_line":"                     \u0027expensive cross-pool copy. Disabled by default so \u0027"},{"line_number":386,"context_line":"                     \u0027that existing deployments see no behavioural change \u0027"},{"line_number":387,"context_line":"                     \u0027on upgrade. Can be set in [DEFAULT] or per-backend.\u0027),"},{"line_number":388,"context_line":"    cfg.BoolOpt(\u0027use_multipath_for_image_xfer\u0027,"},{"line_number":389,"context_line":"                default\u003dFalse,"},{"line_number":390,"context_line":"                help\u003d\u0027Do we attach/detach volumes in cinder using multipath \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"776dc4a6_0c28552d","line":387,"range":{"start_line":385,"start_character":49,"end_line":387,"end_character":33},"in_reply_to":"e765a279_13978c35","updated":"2026-09-30 15:48:14.000000000","message":"Addressed by removing unnecessary sentence.","commit_id":"844c4469326682859f62678ec597e84aa51ed272"}],"cinder/volume/drivers/netapp/dataontap/block_cmode.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":500,"context_line":"        ZAPI clone_lun has no UUID, so it still looks up by path."},{"line_number":501,"context_line":"        \"\"\""},{"line_number":502,"context_line":"        if lun_uuid:"},{"line_number":503,"context_line":"            getter \u003d getattr(self.zapi_client, \u0027get_lun_by_uuid\u0027, None)"},{"line_number":504,"context_line":"            if getter:"},{"line_number":505,"context_line":"                for attempt in range(3):"},{"line_number":506,"context_line":"                    lun \u003d getter(lun_uuid)"}],"source_content_type":"text/x-python","patch_set":16,"id":"43f6c975_56657953","line":503,"range":{"start_line":503,"start_character":21,"end_line":503,"end_character":71},"updated":"2026-08-26 18:42:34.000000000","message":"Duck-types a method added in this same patch; if it were ever missing with `lun_uuid` set, we fall past the else straight to the raise and silently lose the path fallback. Call it directly. Also, up to two `time.sleep(1)` calls block the volume manager thread — is the retry loop needed, or is the primary-key GET consistent enough to read once?","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":500,"context_line":"        ZAPI clone_lun has no UUID, so it still looks up by path."},{"line_number":501,"context_line":"        \"\"\""},{"line_number":502,"context_line":"        if lun_uuid:"},{"line_number":503,"context_line":"            getter \u003d getattr(self.zapi_client, \u0027get_lun_by_uuid\u0027, None)"},{"line_number":504,"context_line":"            if getter:"},{"line_number":505,"context_line":"                for attempt in range(3):"},{"line_number":506,"context_line":"                    lun \u003d getter(lun_uuid)"}],"source_content_type":"text/x-python","patch_set":16,"id":"6c3631cc_b790a90f","line":503,"range":{"start_line":503,"start_character":21,"end_line":503,"end_character":71},"in_reply_to":"43f6c975_56657953","updated":"2026-08-30 12:56:41.000000000","message":"raised separate patch for ONTAP changes. I will address in that patch.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"}],"cinder/volume/drivers/netapp/dataontap/client/client_cmode_rest.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":234,"context_line":"                    \"exhausted. Aborting.\") % job_url"},{"line_number":235,"context_line":"            raise na_utils.NetAppDriverException(msg)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def send_request(self, action_url, method, body\u003dNone, query\u003dNone,"},{"line_number":238,"context_line":"                     enable_tunneling\u003dTrue,"},{"line_number":239,"context_line":"                     max_page_length\u003dDEFAULT_MAX_PAGE_LENGTH,"},{"line_number":240,"context_line":"                     wait_on_accepted\u003dTrue, return_location\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"90f12760_36bdc268","line":237,"updated":"2026-08-21 15:51:43.000000000","message":"you are chanign the return type conditonally - calls now get either `response`or `(response, location)` depending on `retunr_location`. Doesn\u0027t every ONTAP REST caller depend on this, and it appears unrelated to the image-volume cache promotion. I\u0027d split this into a seperate change.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                    \"exhausted. Aborting.\") % job_url"},{"line_number":235,"context_line":"            raise na_utils.NetAppDriverException(msg)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def send_request(self, action_url, method, body\u003dNone, query\u003dNone,"},{"line_number":238,"context_line":"                     enable_tunneling\u003dTrue,"},{"line_number":239,"context_line":"                     max_page_length\u003dDEFAULT_MAX_PAGE_LENGTH,"},{"line_number":240,"context_line":"                     wait_on_accepted\u003dTrue, return_location\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"22b4b892_98fb10f6","line":237,"in_reply_to":"90f12760_36bdc268","updated":"2026-08-25 10:59:12.000000000","message":"Default is return_location\u003dFalse, so every existing send_request() caller still gets a single response. Only clone_lun() passes True.\n\nHappy to split Location capture + get_lun_by_uuid() into a prerequisite patch if you prefer that for review. Functionally it is opt-in and does not change other REST methods.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":244,"context_line":"                     enable_tunneling\u003dTrue,"},{"line_number":245,"context_line":"                     max_page_length\u003dDEFAULT_MAX_PAGE_LENGTH,"},{"line_number":246,"context_line":"                     wait_on_accepted\u003dTrue,"},{"line_number":247,"context_line":"                     return_location\u003dFalse):"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        \"\"\"Sends REST request to ONTAP."},{"line_number":250,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"94d912bc_1fc9ffb4","line":247,"range":{"start_line":247,"start_character":21,"end_line":247,"end_character":36},"updated":"2026-08-26 18:42:34.000000000","message":"Repeating my PS13 note, still unresolved. The ONTAP REST work — Location → UUID, `get_lun_by_uuid()`, `return_headers`/`return_location`, `do_direct_resize(uuid\u003d...)`, the `block_cmode` clone path — is a self-contained fix for a name-filtered collection GET missing a LUN that exists. Unrelated to cache promotion, and as its own change it\u0027d carry a `fixes` note and a bug reference (it has neither) plus review from the ONTAP owners. Please split and make this depend on it.\n\n`api.py:878` also makes `send_http_request` return a 3-tuple unconditionally, with `invoke_successfully` returning 2- or 3-tuple depending on `return_headers` — a shared-client signature change that wants its own review.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                     enable_tunneling\u003dTrue,"},{"line_number":245,"context_line":"                     max_page_length\u003dDEFAULT_MAX_PAGE_LENGTH,"},{"line_number":246,"context_line":"                     wait_on_accepted\u003dTrue,"},{"line_number":247,"context_line":"                     return_location\u003dFalse):"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        \"\"\"Sends REST request to ONTAP."},{"line_number":250,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"2ed5d432_fc0aee19","line":247,"range":{"start_line":247,"start_character":21,"end_line":247,"end_character":36},"in_reply_to":"94d912bc_1fc9ffb4","updated":"2026-08-30 12:56:41.000000000","message":"raised separate patch for ONTAP changes. I will address in that patch.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":284,"context_line":"            # Tests that mock invoke_successfully may still return a"},{"line_number":285,"context_line":"            # 2-tuple."},{"line_number":286,"context_line":"            code, response \u003d result[0], result[1]"},{"line_number":287,"context_line":"            if return_location and len(result) \u003d\u003d 3:"},{"line_number":288,"context_line":"                headers \u003d result[2] or {}"},{"line_number":289,"context_line":"                location \u003d (headers.get(\u0027Location\u0027)"},{"line_number":290,"context_line":"                            or headers.get(\u0027location\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"12306efd_42acb71d","line":287,"range":{"start_line":287,"start_character":36,"end_line":287,"end_character":51},"updated":"2026-08-26 18:42:34.000000000","message":"The comment says _\"Tests that mock `invoke_successfully` may still return a 2-tuple.\"_ Fix the mocks, not the production path. Same at 1866 (`isinstance(result, tuple)`, when the call always returns one) and block_cmode.py:303, 318.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            # Tests that mock invoke_successfully may still return a"},{"line_number":285,"context_line":"            # 2-tuple."},{"line_number":286,"context_line":"            code, response \u003d result[0], result[1]"},{"line_number":287,"context_line":"            if return_location and len(result) \u003d\u003d 3:"},{"line_number":288,"context_line":"                headers \u003d result[2] or {}"},{"line_number":289,"context_line":"                location \u003d (headers.get(\u0027Location\u0027)"},{"line_number":290,"context_line":"                            or headers.get(\u0027location\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"11ac2d7c_97e67761","line":287,"range":{"start_line":287,"start_character":36,"end_line":287,"end_character":51},"in_reply_to":"12306efd_42acb71d","updated":"2026-08-30 12:56:41.000000000","message":"raised separate patch for ONTAP changes. I will address in that patch.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":790,"context_line":"        uuid \u003d location.rstrip(\u0027/\u0027).rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":791,"context_line":"        return uuid or None"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"    def get_lun_by_uuid(self, uuid):"},{"line_number":794,"context_line":"        \"\"\"Fetch a LUN by UUID via GET /storage/luns/{uuid}."},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"        POST /storage/luns returns that UUID in the Location header. A"}],"source_content_type":"text/x-python","patch_set":16,"id":"4f92157e_3dd4e7f2","line":793,"range":{"start_line":793,"start_character":8,"end_line":793,"end_character":23},"updated":"2026-08-26 18:42:34.000000000","message":"Calls `self.connection.invoke_successfully()` directly instead of `send_request()`, bypassing the tunneling/job conventions the rest of the class uses. Any reason not to use `send_request()`?","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":790,"context_line":"        uuid \u003d location.rstrip(\u0027/\u0027).rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":791,"context_line":"        return uuid or None"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"    def get_lun_by_uuid(self, uuid):"},{"line_number":794,"context_line":"        \"\"\"Fetch a LUN by UUID via GET /storage/luns/{uuid}."},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"        POST /storage/luns returns that UUID in the Location header. A"}],"source_content_type":"text/x-python","patch_set":16,"id":"646441af_c5f8daa0","line":793,"range":{"start_line":793,"start_character":8,"end_line":793,"end_character":23},"in_reply_to":"4f92157e_3dd4e7f2","updated":"2026-08-30 12:56:41.000000000","message":"raised separate patch for ONTAP changes. I will address in that patch.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"}],"cinder/volume/flows/manager/create_volume.py":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b7a99b4a030680d067dc32c841982ec517d6bd1d","unresolved":true,"context_lines":[{"line_number":826,"context_line":"            volume: objects.Volume,"},{"line_number":827,"context_line":"            image_id: str,"},{"line_number":828,"context_line":"            image_meta: dict[str, Any]) -\u003e tuple[None, bool]:"},{"line_number":829,"context_line":"        \"\"\"Attempt to create the volume from the image cache.\"\"\""},{"line_number":830,"context_line":"        assert self.image_volume_cache is not None"},{"line_number":831,"context_line":"        LOG.debug(\u0027Attempting to retrieve cache entry for image \u003d \u0027"},{"line_number":832,"context_line":"                  \u0027%(image_id)s on host %(host)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"23d03e12_a53dd971","line":829,"updated":"2026-06-11 13:33:39.000000000","message":"Any reason for removing the comment? If the promote_across_pools config is false, the comment holds true right?","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6e56e6aef2a9522c6490f29132308ebb295fb01e","unresolved":false,"context_lines":[{"line_number":826,"context_line":"            volume: objects.Volume,"},{"line_number":827,"context_line":"            image_id: str,"},{"line_number":828,"context_line":"            image_meta: dict[str, Any]) -\u003e tuple[None, bool]:"},{"line_number":829,"context_line":"        \"\"\"Attempt to create the volume from the image cache.\"\"\""},{"line_number":830,"context_line":"        assert self.image_volume_cache is not None"},{"line_number":831,"context_line":"        LOG.debug(\u0027Attempting to retrieve cache entry for image \u003d \u0027"},{"line_number":832,"context_line":"                  \u0027%(image_id)s on host %(host)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9021405a_3dc469d8","line":829,"in_reply_to":"23d03e12_a53dd971","updated":"2026-07-08 17:03:06.000000000","message":"not sure how comments is remove. restored now.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"cb186bf721633f7669f381c8a71a055fc2841d46","unresolved":true,"context_lines":[{"line_number":874,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":875,"context_line":"        return None, False"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def _promote_local_cache_entry("},{"line_number":878,"context_line":"            self,"},{"line_number":879,"context_line":"            internal_context: cinder_context.RequestContext,"},{"line_number":880,"context_line":"            volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1c2f56c7_966dd037","line":877,"updated":"2026-05-20 20:35:03.000000000","message":"what do you mean by \u0027local\u0027 here.  it\u0027s not clear what this means.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"0e2b1f0e406dbb3450299785ae8982daf13433b6","unresolved":false,"context_lines":[{"line_number":874,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":875,"context_line":"        return None, False"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def _promote_local_cache_entry("},{"line_number":878,"context_line":"            self,"},{"line_number":879,"context_line":"            internal_context: cinder_context.RequestContext,"},{"line_number":880,"context_line":"            volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":4,"id":"c0f1be4c_e430fd9d","line":877,"in_reply_to":"1c2f56c7_966dd037","updated":"2026-06-09 14:58:16.000000000","message":"Thanks Hemna, good point. By \"local\" here I mean local to the destination where the requested volume is being created, not local filesystem storage and not specifically the cinder-volume node.\n\nIn this flow, Cinder may first create the requested volume from an image cache entry that exists on another pool/backend cache location because the driver supports cross-pool cloning. After that succeeds, this helper creates/promotes an image-volume cache entry on the destination side as well. That makes future requests for the same image on that destination use the destination-side cache entry instead of repeatedly going through the cross-pool clone path.\n\nSo \"local cache entry\" means \"cache entry local to the destination volume\u0027s cache scope\". Let me know if you think otherwise.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b7a99b4a030680d067dc32c841982ec517d6bd1d","unresolved":false,"context_lines":[{"line_number":874,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":875,"context_line":"        return None, False"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def _promote_local_cache_entry("},{"line_number":878,"context_line":"            self,"},{"line_number":879,"context_line":"            internal_context: cinder_context.RequestContext,"},{"line_number":880,"context_line":"            volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":4,"id":"a7d47d15_88f0ce3f","line":877,"in_reply_to":"bf372184_f536e6fb","updated":"2026-06-11 13:33:39.000000000","message":"+1 for adding code comment.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fc49719903d248a34c709adb2f481b46481ee98","unresolved":false,"context_lines":[{"line_number":874,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":875,"context_line":"        return None, False"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def _promote_local_cache_entry("},{"line_number":878,"context_line":"            self,"},{"line_number":879,"context_line":"            internal_context: cinder_context.RequestContext,"},{"line_number":880,"context_line":"            volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf372184_f536e6fb","line":877,"in_reply_to":"c0f1be4c_e430fd9d","updated":"2026-06-10 14:16:04.000000000","message":"That\u0027s a lot of explanation.  maybe add a comment in the code to clarify.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b7a99b4a030680d067dc32c841982ec517d6bd1d","unresolved":true,"context_lines":[{"line_number":923,"context_line":"            self.image_volume_cache.create_cache_entry("},{"line_number":924,"context_line":"                internal_context, image_volume, image_id, image_meta)"},{"line_number":925,"context_line":"        except Exception:"},{"line_number":926,"context_line":"            LOG.warning(\u0027Failed to create local cache promotion \u0027"},{"line_number":927,"context_line":"                        \u0027entry for image %(image_id)s on %(host)s. \u0027"},{"line_number":928,"context_line":"                        \u0027Future clones will still work via \u0027"},{"line_number":929,"context_line":"                        \u0027cross-pool path.\u0027,"},{"line_number":930,"context_line":"                        {\u0027image_id\u0027: image_id,"},{"line_number":931,"context_line":"                         \u0027host\u0027: volume.host})"},{"line_number":932,"context_line":"            if image_volume:"},{"line_number":933,"context_line":"                try:"},{"line_number":934,"context_line":"                    self.manager.delete_volume("}],"source_content_type":"text/x-python","patch_set":4,"id":"f8f26962_846505a2","line":931,"range":{"start_line":926,"start_character":12,"end_line":931,"end_character":46},"updated":"2026-06-11 13:33:39.000000000","message":"we are not printing the exception. It may not help debug what was the exact exception since the Exception can be a wide range of exceptions.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6e56e6aef2a9522c6490f29132308ebb295fb01e","unresolved":false,"context_lines":[{"line_number":923,"context_line":"            self.image_volume_cache.create_cache_entry("},{"line_number":924,"context_line":"                internal_context, image_volume, image_id, image_meta)"},{"line_number":925,"context_line":"        except Exception:"},{"line_number":926,"context_line":"            LOG.warning(\u0027Failed to create local cache promotion \u0027"},{"line_number":927,"context_line":"                        \u0027entry for image %(image_id)s on %(host)s. \u0027"},{"line_number":928,"context_line":"                        \u0027Future clones will still work via \u0027"},{"line_number":929,"context_line":"                        \u0027cross-pool path.\u0027,"},{"line_number":930,"context_line":"                        {\u0027image_id\u0027: image_id,"},{"line_number":931,"context_line":"                         \u0027host\u0027: volume.host})"},{"line_number":932,"context_line":"            if image_volume:"},{"line_number":933,"context_line":"                try:"},{"line_number":934,"context_line":"                    self.manager.delete_volume("}],"source_content_type":"text/x-python","patch_set":4,"id":"386ea8cf_9a534eb8","line":931,"range":{"start_line":926,"start_character":12,"end_line":931,"end_character":46},"in_reply_to":"f8f26962_846505a2","updated":"2026-07-08 17:03:06.000000000","message":"now printing exception information.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b7a99b4a030680d067dc32c841982ec517d6bd1d","unresolved":true,"context_lines":[{"line_number":934,"context_line":"                    self.manager.delete_volume("},{"line_number":935,"context_line":"                        internal_context, image_volume)"},{"line_number":936,"context_line":"                except Exception:"},{"line_number":937,"context_line":"                    LOG.warning(\u0027Failed to clean up promotion \u0027"},{"line_number":938,"context_line":"                                \u0027volume %(vol)s.\u0027,"},{"line_number":939,"context_line":"                                {\u0027vol\u0027: image_volume.id})"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    @coordination.synchronized(\u0027{image_id}\u0027)"},{"line_number":942,"context_line":"    def _create_from_cinder_store_image("}],"source_content_type":"text/x-python","patch_set":4,"id":"0dea13aa_2a5f1f88","line":939,"range":{"start_line":937,"start_character":20,"end_line":939,"end_character":57},"updated":"2026-06-11 13:33:39.000000000","message":"we are not printing the exception. It may not help debug what was the exact exception since the Exception can be a wide range of exceptions.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6e56e6aef2a9522c6490f29132308ebb295fb01e","unresolved":false,"context_lines":[{"line_number":934,"context_line":"                    self.manager.delete_volume("},{"line_number":935,"context_line":"                        internal_context, image_volume)"},{"line_number":936,"context_line":"                except Exception:"},{"line_number":937,"context_line":"                    LOG.warning(\u0027Failed to clean up promotion \u0027"},{"line_number":938,"context_line":"                                \u0027volume %(vol)s.\u0027,"},{"line_number":939,"context_line":"                                {\u0027vol\u0027: image_volume.id})"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    @coordination.synchronized(\u0027{image_id}\u0027)"},{"line_number":942,"context_line":"    def _create_from_cinder_store_image("}],"source_content_type":"text/x-python","patch_set":4,"id":"d3efec89_9aefa995","line":939,"range":{"start_line":937,"start_character":20,"end_line":939,"end_character":57},"in_reply_to":"0dea13aa_2a5f1f88","updated":"2026-07-08 17:03:06.000000000","message":"now printing exception information.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b7a99b4a030680d067dc32c841982ec517d6bd1d","unresolved":true,"context_lines":[{"line_number":966,"context_line":"                            context, internal_context, volume,"},{"line_number":967,"context_line":"                            image_id, image_meta))"},{"line_number":968,"context_line":"                except Exception:"},{"line_number":969,"context_line":"                    LOG.warning("},{"line_number":970,"context_line":"                        \u0027Failed to use image-volume cache for \u0027"},{"line_number":971,"context_line":"                        \u0027cinder-stored image %(image_id)s, \u0027"},{"line_number":972,"context_line":"                        \u0027falling through to direct clone.\u0027,"},{"line_number":973,"context_line":"                        {\u0027image_id\u0027: image_id})"},{"line_number":974,"context_line":"                    cloned \u003d False"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"        if not cloned:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fc15947_321197f0","line":973,"range":{"start_line":969,"start_character":19,"end_line":973,"end_character":47},"updated":"2026-06-11 13:33:39.000000000","message":"we are not printing the exception. It may not help debug what was the exact exception since the Exception can be a wide range of exceptions. Also not throwing exception here - is it to enable download of image if the it fails here? If so, we can add comments here.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6e56e6aef2a9522c6490f29132308ebb295fb01e","unresolved":false,"context_lines":[{"line_number":966,"context_line":"                            context, internal_context, volume,"},{"line_number":967,"context_line":"                            image_id, image_meta))"},{"line_number":968,"context_line":"                except Exception:"},{"line_number":969,"context_line":"                    LOG.warning("},{"line_number":970,"context_line":"                        \u0027Failed to use image-volume cache for \u0027"},{"line_number":971,"context_line":"                        \u0027cinder-stored image %(image_id)s, \u0027"},{"line_number":972,"context_line":"                        \u0027falling through to direct clone.\u0027,"},{"line_number":973,"context_line":"                        {\u0027image_id\u0027: image_id})"},{"line_number":974,"context_line":"                    cloned \u003d False"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"        if not cloned:"}],"source_content_type":"text/x-python","patch_set":4,"id":"0c7f3782_6a73d0bf","line":973,"range":{"start_line":969,"start_character":19,"end_line":973,"end_character":47},"in_reply_to":"9fc15947_321197f0","updated":"2026-07-08 17:03:06.000000000","message":"now printing exception information.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b7a99b4a030680d067dc32c841982ec517d6bd1d","unresolved":true,"context_lines":[{"line_number":990,"context_line":"                            internal_context, volume,"},{"line_number":991,"context_line":"                            image_id, image_meta)"},{"line_number":992,"context_line":"                    except Exception:"},{"line_number":993,"context_line":"                        LOG.warning("},{"line_number":994,"context_line":"                            \u0027Failed to promote local cache \u0027"},{"line_number":995,"context_line":"                            \u0027entry for cinder-stored image \u0027"},{"line_number":996,"context_line":"                            \u0027%(image_id)s after direct clone. \u0027"},{"line_number":997,"context_line":"                            \u0027Future clones will still work via \u0027"},{"line_number":998,"context_line":"                            \u0027cross-pool path.\u0027,"},{"line_number":999,"context_line":"                            {\u0027image_id\u0027: image_id})"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"        return model_update, cloned"},{"line_number":1002,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"20f24c5e_6f592a7f","line":999,"range":{"start_line":993,"start_character":24,"end_line":999,"end_character":51},"updated":"2026-06-11 13:33:39.000000000","message":"Same comment as above. should we add exception to the log?","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6e56e6aef2a9522c6490f29132308ebb295fb01e","unresolved":false,"context_lines":[{"line_number":990,"context_line":"                            internal_context, volume,"},{"line_number":991,"context_line":"                            image_id, image_meta)"},{"line_number":992,"context_line":"                    except Exception:"},{"line_number":993,"context_line":"                        LOG.warning("},{"line_number":994,"context_line":"                            \u0027Failed to promote local cache \u0027"},{"line_number":995,"context_line":"                            \u0027entry for cinder-stored image \u0027"},{"line_number":996,"context_line":"                            \u0027%(image_id)s after direct clone. \u0027"},{"line_number":997,"context_line":"                            \u0027Future clones will still work via \u0027"},{"line_number":998,"context_line":"                            \u0027cross-pool path.\u0027,"},{"line_number":999,"context_line":"                            {\u0027image_id\u0027: image_id})"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"        return model_update, cloned"},{"line_number":1002,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"f5826685_24c768cd","line":999,"range":{"start_line":993,"start_character":24,"end_line":999,"end_character":51},"in_reply_to":"20f24c5e_6f592a7f","updated":"2026-07-08 17:03:06.000000000","message":"now printing exception information.","commit_id":"ea60738727d4aa828b1793ca53525cdc4bc754b0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"bd19f64f1bb828508db2c9b5bf3ad23c79c0dcdc","unresolved":true,"context_lines":[{"line_number":861,"context_line":"                context, internal_context, volume, image_id, image_meta,"},{"line_number":862,"context_line":"                source_vol_id\u003dcache_entry[\u0027volume_id\u0027])"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        except exception.SnapshotLimitReached:"},{"line_number":865,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":866,"context_line":"                self.image_volume_cache.evict(context, cache_entry)"},{"line_number":867,"context_line":"        except NotImplementedError:"}],"source_content_type":"text/x-python","patch_set":11,"id":"f135c265_0ba5addb","line":864,"updated":"2026-08-07 16:02:03.000000000","message":"Should we be removing the original commentary?","commit_id":"08be9dd02477e10a735230adb7717f0948f8b787"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"cced582992b8822e3e4c120fbab9527ef5bc2cbe","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                context, internal_context, volume, image_id, image_meta,"},{"line_number":862,"context_line":"                source_vol_id\u003dcache_entry[\u0027volume_id\u0027])"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        except exception.SnapshotLimitReached:"},{"line_number":865,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":866,"context_line":"                self.image_volume_cache.evict(context, cache_entry)"},{"line_number":867,"context_line":"        except NotImplementedError:"}],"source_content_type":"text/x-python","patch_set":11,"id":"97bab6e7_1a8bdd45","line":864,"in_reply_to":"f135c265_0ba5addb","updated":"2026-08-12 10:55:00.000000000","message":"Original commentary is restored.","commit_id":"08be9dd02477e10a735230adb7717f0948f8b787"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":857,"context_line":""},{"line_number":858,"context_line":"            # Cross-pool hit: locked clone-then-promote from the other"},{"line_number":859,"context_line":"            # pool\u0027s cache volume (see _clone_and_promote_locked)."},{"line_number":860,"context_line":"            return self._clone_and_promote_locked("},{"line_number":861,"context_line":"                context, internal_context, volume, image_id, image_meta,"},{"line_number":862,"context_line":"                source_vol_id\u003dcache_entry[\u0027volume_id\u0027])"},{"line_number":863,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"d2ea0e7f_1f5ecf7c","line":860,"updated":"2026-08-21 15:51:43.000000000","message":"This is the main promotion path and it never checks `image_volume_cache_promote_across_pools`. Grepping the patch, the option is read in exactly one place in production code — line 1005, inside `_create_from_cinder_store_image`. So on any `clone_across_pools\u003dTrue` backend with the cache enabled, we get here on a cross-pool hit, call `_clone_and_promote_locked`, and promote unconditionally with the option at its default `False`.\n\nThat makes the feature on-by-default, which contradicts both the commit message and the `upgrade` section of the release note. Can the gate move inside `_clone_and_promote_locked` (before the `_do_create_cache_entry` call at line 963), so both callers honour it from one place?","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":857,"context_line":""},{"line_number":858,"context_line":"            # Cross-pool hit: locked clone-then-promote from the other"},{"line_number":859,"context_line":"            # pool\u0027s cache volume (see _clone_and_promote_locked)."},{"line_number":860,"context_line":"            return self._clone_and_promote_locked("},{"line_number":861,"context_line":"                context, internal_context, volume, image_id, image_meta,"},{"line_number":862,"context_line":"                source_vol_id\u003dcache_entry[\u0027volume_id\u0027])"},{"line_number":863,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"13efa9f7_df5467a1","line":860,"in_reply_to":"d2ea0e7f_1f5ecf7c","updated":"2026-08-25 10:59:12.000000000","message":"Done. Cross-pool hit now consults _should_promote_across_pools() before any promote:\n\nFalse (default): _create_from_source_volume from the remote cache and return — same as today\u0027s clone_across_pools path, no extra cache row.\nTrue: _clone_and_promote_locked, which also gates _do_create_cache_entry() on the same helper (one place both callers honour).","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        except exception.SnapshotLimitReached:"},{"line_number":865,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":866,"context_line":"                self.image_volume_cache.evict(context, cache_entry)"},{"line_number":867,"context_line":"        except NotImplementedError:"},{"line_number":868,"context_line":"            LOG.warning(\u0027Backend does not support creating image-volume \u0027"},{"line_number":869,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"afc5d95a_965866f3","line":866,"updated":"2026-08-21 15:51:43.000000000","message":"`evict()` and `delete_cached_volume()` aren\u0027t interchangeable, and swapping them here leaks the cache volume:\n\n* `delete_cached_volume()` → `volume_api.delete(volume)`, which deletes the volume; the delete flow evicts the entry as a side effect.\n* `evict()` → `db.image_volume_cache_delete()` only. The volume is never touched.\n\nAfter this change, hitting the snapshot limit removes the DB row so Cinder forgets the volume exists, but the image-volume stays on the backend permanently. That\u0027s a guaranteed orphan on every occurrence.\n\nCould you restore `delete_cached_volume(context, cache_entry, msg)` and the comment that explained it? Note this is the same line Anthony flagged on PS11; it\u0027s marked resolved as \"original commentary is restored\", but 864-866 is unchanged from PS11.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        except exception.SnapshotLimitReached:"},{"line_number":865,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":866,"context_line":"                self.image_volume_cache.evict(context, cache_entry)"},{"line_number":867,"context_line":"        except NotImplementedError:"},{"line_number":868,"context_line":"            LOG.warning(\u0027Backend does not support creating image-volume \u0027"},{"line_number":869,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"af1a929f_bcbadb16","line":866,"in_reply_to":"afc5d95a_965866f3","updated":"2026-08-25 10:59:12.000000000","message":"Done. Restored delete_cached_volume() via _delete_cache_entry_on_snapshot_limit(). evict() is no longer used on this path, so the cache volume is deleted rather than orphaned.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":920,"context_line":"                                {\u0027vol\u0027: image_volume.id})"},{"line_number":921,"context_line":"            return None"},{"line_number":922,"context_line":""},{"line_number":923,"context_line":"    @coordination.synchronized(\u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":924,"context_line":"    def _clone_and_promote_locked("},{"line_number":925,"context_line":"            self,"},{"line_number":926,"context_line":"            context: cinder_context.RequestContext,"}],"source_content_type":"text/x-python","patch_set":13,"id":"99aedcc8_6494472d","line":923,"updated":"2026-08-21 15:51:43.000000000","message":"This lock doesn\u0027t cover the pre-existing cache-population path. `_prepare_image_cache_entry` (line 1027) uses `@coordination.synchronized(\u0027{image_id}\u0027)` — a different namespace, so there\u0027s no mutual exclusion between the two. Two concurrent requests for the same image on the same pool, one going download → `_prepare_image_cache_entry` and one going the promote path, can both create an entry.\n\nRelated, the docstring below says \"The ONE lock shared by...\" — that\u0027s true of the two new paths only, and reads as a stronger guarantee than it is. Worth rewording even if the race is judged acceptable.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":920,"context_line":"                                {\u0027vol\u0027: image_volume.id})"},{"line_number":921,"context_line":"            return None"},{"line_number":922,"context_line":""},{"line_number":923,"context_line":"    @coordination.synchronized(\u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":924,"context_line":"    def _clone_and_promote_locked("},{"line_number":925,"context_line":"            self,"},{"line_number":926,"context_line":"            context: cinder_context.RequestContext,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1f11dbe4_d839067f","line":923,"in_reply_to":"99aedcc8_6494472d","updated":"2026-08-25 10:59:12.000000000","message":"Agreed the locks are different namespaces. Docstring now states that this lock only serialises the two new clone-then-promote callers, and that a Glance-download fill ({image_id}) can still race. That race is accepted: both sides re-check get_entry(..., clone_across_pools\u003dFalse) and reuse a local entry on the next lookup. Taking {image_id} on the promote path would serialise unrelated same-image work on other pools.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":948,"context_line":"                      \u0027the promotion lock, reusing it.\u0027,"},{"line_number":949,"context_line":"                      {\u0027image_id\u0027: image_id, \u0027host\u0027: volume.host})"},{"line_number":950,"context_line":"            model_update \u003d self._create_from_source_volume("},{"line_number":951,"context_line":"                context, volume, local_entry[\u0027volume_id\u0027])"},{"line_number":952,"context_line":"            return model_update, True"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        if source_vol_id:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3e5e1efd_cef5b605","line":951,"updated":"2026-08-21 15:51:43.000000000","message":"If `_create_from_source_volume` raises `SnapshotLimitReached` here, it propagates to the handler at 864, which evicts `cache_entry` — the cross-pool entry from line 856. But the entry that actually hit its snapshot limit is `local_entry`. So we punish the wrong entry and leave the offending one in place, meaning the next request hits the same limit again.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":948,"context_line":"                      \u0027the promotion lock, reusing it.\u0027,"},{"line_number":949,"context_line":"                      {\u0027image_id\u0027: image_id, \u0027host\u0027: volume.host})"},{"line_number":950,"context_line":"            model_update \u003d self._create_from_source_volume("},{"line_number":951,"context_line":"                context, volume, local_entry[\u0027volume_id\u0027])"},{"line_number":952,"context_line":"            return model_update, True"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        if source_vol_id:"}],"source_content_type":"text/x-python","patch_set":13,"id":"d79c763c_8545170c","line":951,"in_reply_to":"3e5e1efd_cef5b605","updated":"2026-08-25 10:59:12.000000000","message":"Done. SnapshotLimitReached on the waiter clone deletes local_entry. On the source clone it deletes source_cache_entry. The outer handler no longer evicts the remote entry for a local snapshot-limit.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":991,"context_line":"                    model_update, cloned \u003d self._create_from_image_cache("},{"line_number":992,"context_line":"                        context, internal_context, volume,"},{"line_number":993,"context_line":"                        image_id, image_meta)"},{"line_number":994,"context_line":"                except Exception:"},{"line_number":995,"context_line":"                    LOG.warning("},{"line_number":996,"context_line":"                        \u0027Failed to use image-volume cache for \u0027"},{"line_number":997,"context_line":"                        \u0027cinder-stored image %(image_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"dc7bbc13_f870bc2b","line":994,"updated":"2026-08-21 15:51:43.000000000","message":"Bare `except Exception` over the whole cache path collapses any failure into a warning and `cloned \u003d False`. Two concerns:\n\n1. It masks programming errors — an `AttributeError` or `TypeError` in the new code would surface only as \"Failed to use image-volume cache...\" in the log, with the real traceback lost.\n2. It swallows `SnapshotLimitReached`, which `_create_from_image_cache` deliberately re-raises via `save_and_reraise_exception` so the caller\u0027s retry decorator can rebuild a fresh entry. That contract is now broken.\n\nCan this narrow to the exceptions actually expected here?","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":991,"context_line":"                    model_update, cloned \u003d self._create_from_image_cache("},{"line_number":992,"context_line":"                        context, internal_context, volume,"},{"line_number":993,"context_line":"                        image_id, image_meta)"},{"line_number":994,"context_line":"                except Exception:"},{"line_number":995,"context_line":"                    LOG.warning("},{"line_number":996,"context_line":"                        \u0027Failed to use image-volume cache for \u0027"},{"line_number":997,"context_line":"                        \u0027cinder-stored image %(image_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3c6e91dd_0be910b1","line":994,"in_reply_to":"dc7bbc13_f870bc2b","updated":"2026-08-25 10:59:12.000000000","message":"Done. SnapshotLimitReached is re-raised for the retry decorator. Other failures are except exception.CinderException. Programming errors (AttributeError, TypeError, …) propagate.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":1011,"context_line":"                    model_update, cloned \u003d self._clone_and_promote_locked("},{"line_number":1012,"context_line":"                        context, internal_context, volume, image_id,"},{"line_number":1013,"context_line":"                        image_meta, image_location\u003dimage_location)"},{"line_number":1014,"context_line":"                except Exception:"},{"line_number":1015,"context_line":"                    LOG.warning("},{"line_number":1016,"context_line":"                        \u0027Failed locked direct clone/promotion for \u0027"},{"line_number":1017,"context_line":"                        \u0027cinder-stored image %(image_id)s, falling \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"17e4ebe3_3321ea58","line":1014,"updated":"2026-08-21 15:51:43.000000000","message":"same comment as for line 994","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"                    model_update, cloned \u003d self._clone_and_promote_locked("},{"line_number":1012,"context_line":"                        context, internal_context, volume, image_id,"},{"line_number":1013,"context_line":"                        image_meta, image_location\u003dimage_location)"},{"line_number":1014,"context_line":"                except Exception:"},{"line_number":1015,"context_line":"                    LOG.warning("},{"line_number":1016,"context_line":"                        \u0027Failed locked direct clone/promotion for \u0027"},{"line_number":1017,"context_line":"                        \u0027cinder-stored image %(image_id)s, falling \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3e528846_087ddbed","line":1014,"in_reply_to":"17e4ebe3_3321ea58","updated":"2026-08-25 10:59:12.000000000","message":"Done. SnapshotLimitReached is re-raised for the retry decorator. Other failures are except exception.CinderException. Programming errors (AttributeError, TypeError, …) propagate.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":885,"context_line":"                LOG.debug(\u0027Creating from source image-volume %(volume_id)s\u0027,"},{"line_number":886,"context_line":"                          {\u0027volume_id\u0027: cache_entry[\u0027volume_id\u0027]})"},{"line_number":887,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":888,"context_line":"                    context, volume, cache_entry[\u0027volume_id\u0027])"},{"line_number":889,"context_line":"                return model_update, True"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"            if not clone_across_pools:"}],"source_content_type":"text/x-python","patch_set":15,"id":"aaabb6ea_af8869c0","line":888,"range":{"start_line":888,"start_character":20,"end_line":888,"end_character":62},"updated":"2026-08-26 10:35:58.000000000","message":"refactor, no functional change","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":885,"context_line":"                LOG.debug(\u0027Creating from source image-volume %(volume_id)s\u0027,"},{"line_number":886,"context_line":"                          {\u0027volume_id\u0027: cache_entry[\u0027volume_id\u0027]})"},{"line_number":887,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":888,"context_line":"                    context, volume, cache_entry[\u0027volume_id\u0027])"},{"line_number":889,"context_line":"                return model_update, True"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"            if not clone_across_pools:"}],"source_content_type":"text/x-python","patch_set":15,"id":"a40e0615_ce2458d2","line":888,"range":{"start_line":888,"start_character":20,"end_line":888,"end_character":62},"in_reply_to":"aaabb6ea_af8869c0","updated":"2026-08-26 17:02:52.000000000","message":"code is refactored","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":887,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":888,"context_line":"                    context, volume, cache_entry[\u0027volume_id\u0027])"},{"line_number":889,"context_line":"                return model_update, True"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"            if not clone_across_pools:"},{"line_number":892,"context_line":"                return None, False"},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"            cache_entry \u003d self.image_volume_cache.get_entry("},{"line_number":895,"context_line":"                internal_context, volume, image_id, image_meta,"}],"source_content_type":"text/x-python","patch_set":15,"id":"e36ad4a7_b9e5ae86","line":892,"range":{"start_line":890,"start_character":0,"end_line":892,"end_character":34},"updated":"2026-08-26 10:35:58.000000000","message":"the call should return for most of the drivers here.\nIIRC, only storpool and netapp currently support/publish this capability","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":887,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":888,"context_line":"                    context, volume, cache_entry[\u0027volume_id\u0027])"},{"line_number":889,"context_line":"                return model_update, True"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"            if not clone_across_pools:"},{"line_number":892,"context_line":"                return None, False"},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"            cache_entry \u003d self.image_volume_cache.get_entry("},{"line_number":895,"context_line":"                internal_context, volume, image_id, image_meta,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9c7cc41a_0d0484f3","line":892,"range":{"start_line":890,"start_character":0,"end_line":892,"end_character":34},"in_reply_to":"e36ad4a7_b9e5ae86","updated":"2026-08-26 17:02:52.000000000","message":"yes, updated to support/publish","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":891,"context_line":"            if not clone_across_pools:"},{"line_number":892,"context_line":"                return None, False"},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"            cache_entry \u003d self.image_volume_cache.get_entry("},{"line_number":895,"context_line":"                internal_context, volume, image_id, image_meta,"},{"line_number":896,"context_line":"                clone_across_pools\u003dTrue)"},{"line_number":897,"context_line":"            if not cache_entry:"},{"line_number":898,"context_line":"                return None, False"},{"line_number":899,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"d2956587_75307333","line":896,"range":{"start_line":894,"start_character":0,"end_line":896,"end_character":40},"updated":"2026-08-26 10:35:58.000000000","message":"NOTE: this is an additional DB call introduced here in the workflow when clone_across_pools\u003dTrue","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":891,"context_line":"            if not clone_across_pools:"},{"line_number":892,"context_line":"                return None, False"},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"            cache_entry \u003d self.image_volume_cache.get_entry("},{"line_number":895,"context_line":"                internal_context, volume, image_id, image_meta,"},{"line_number":896,"context_line":"                clone_across_pools\u003dTrue)"},{"line_number":897,"context_line":"            if not cache_entry:"},{"line_number":898,"context_line":"                return None, False"},{"line_number":899,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"d7c83907_6ce14759","line":896,"range":{"start_line":894,"start_character":0,"end_line":896,"end_character":40},"in_reply_to":"d2956587_75307333","updated":"2026-08-26 17:02:52.000000000","message":"code is refactored to reuss current code no additinal DB calls","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":939,"context_line":"        Only called from within ``_clone_and_promote_locked``, while"},{"line_number":940,"context_line":"        holding its lock."},{"line_number":941,"context_line":"        \"\"\""},{"line_number":942,"context_line":"        image_volume \u003d None"},{"line_number":943,"context_line":"        try:"},{"line_number":944,"context_line":"            if not self.image_volume_cache.ensure_space("},{"line_number":945,"context_line":"                    internal_context, volume):"}],"source_content_type":"text/x-python","patch_set":15,"id":"98faa3a3_56bdb318","line":942,"range":{"start_line":942,"start_character":8,"end_line":942,"end_character":20},"updated":"2026-08-26 10:35:58.000000000","message":"image-volume is highly overloaded term used for\n1. the volume storing the glance image when glance is backed by cinder\n2. prefix of image-volume-cache\n\nadding another meaning signifying the cloned copy that is to be created as image-volume cache seems confusing","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":939,"context_line":"        Only called from within ``_clone_and_promote_locked``, while"},{"line_number":940,"context_line":"        holding its lock."},{"line_number":941,"context_line":"        \"\"\""},{"line_number":942,"context_line":"        image_volume \u003d None"},{"line_number":943,"context_line":"        try:"},{"line_number":944,"context_line":"            if not self.image_volume_cache.ensure_space("},{"line_number":945,"context_line":"                    internal_context, volume):"}],"source_content_type":"text/x-python","patch_set":15,"id":"a3981c58_67e26c56","line":942,"range":{"start_line":942,"start_character":8,"end_line":942,"end_character":20},"in_reply_to":"98faa3a3_56bdb318","updated":"2026-08-26 17:02:52.000000000","message":"code is refactored to reuse current code to redue clone copy","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":928,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":929,"context_line":"            return None, False"},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"    def _do_create_cache_entry("},{"line_number":932,"context_line":"            self,"},{"line_number":933,"context_line":"            internal_context: cinder_context.RequestContext,"},{"line_number":934,"context_line":"            volume: objects.Volume,"},{"line_number":935,"context_line":"            image_id: str,"},{"line_number":936,"context_line":"            image_meta: dict[str, Any]) -\u003e Optional[str]:"},{"line_number":937,"context_line":"        \"\"\"Clone the (already-populated) volume into a persisted cache entry."},{"line_number":938,"context_line":""},{"line_number":939,"context_line":"        Only called from within ``_clone_and_promote_locked``, while"},{"line_number":940,"context_line":"        holding its lock."},{"line_number":941,"context_line":"        \"\"\""},{"line_number":942,"context_line":"        image_volume \u003d None"},{"line_number":943,"context_line":"        try:"},{"line_number":944,"context_line":"            if not self.image_volume_cache.ensure_space("},{"line_number":945,"context_line":"                    internal_context, volume):"},{"line_number":946,"context_line":"                LOG.warning(\u0027Unable to ensure space for \u0027"},{"line_number":947,"context_line":"                            \u0027image-volume cache promotion of \u0027"},{"line_number":948,"context_line":"                            \u0027image %(image_id)s on %(host)s.\u0027,"},{"line_number":949,"context_line":"                            {\u0027image_id\u0027: image_id,"},{"line_number":950,"context_line":"                             \u0027host\u0027: volume.host})"},{"line_number":951,"context_line":"                return None"},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"            image_volume \u003d self.manager._clone_image_volume("},{"line_number":954,"context_line":"                internal_context, volume, image_meta)"},{"line_number":955,"context_line":"            if not image_volume:"},{"line_number":956,"context_line":"                LOG.warning(\u0027Unable to clone image volume for \u0027"},{"line_number":957,"context_line":"                            \u0027cache promotion of image \u0027"},{"line_number":958,"context_line":"                            \u0027%(image_id)s.\u0027,"},{"line_number":959,"context_line":"                            {\u0027image_id\u0027: image_id})"},{"line_number":960,"context_line":"                return None"},{"line_number":961,"context_line":""},{"line_number":962,"context_line":"            self.image_volume_cache.create_cache_entry("},{"line_number":963,"context_line":"                internal_context, image_volume, image_id, image_meta)"},{"line_number":964,"context_line":"            return image_volume.id"},{"line_number":965,"context_line":"        except Exception as err:"},{"line_number":966,"context_line":"            LOG.warning(\u0027Failed to create local cache promotion \u0027"},{"line_number":967,"context_line":"                        \u0027entry for image %(image_id)s on %(host)s. \u0027"},{"line_number":968,"context_line":"                        \u0027Future clones will still work via \u0027"},{"line_number":969,"context_line":"                        \u0027cross-pool path. Error: %(error)s\u0027,"},{"line_number":970,"context_line":"                        {\u0027image_id\u0027: image_id,"},{"line_number":971,"context_line":"                         \u0027host\u0027: volume.host,"},{"line_number":972,"context_line":"                         \u0027error\u0027: err})"},{"line_number":973,"context_line":"            if image_volume:"},{"line_number":974,"context_line":"                try:"},{"line_number":975,"context_line":"                    self.manager.delete_volume("},{"line_number":976,"context_line":"                        internal_context, image_volume)"},{"line_number":977,"context_line":"                except Exception as cleanup_err:"},{"line_number":978,"context_line":"                    LOG.warning(\u0027Failed to clean up promotion \u0027"},{"line_number":979,"context_line":"                                \u0027volume %(vol)s. Error: %(error)s\u0027,"},{"line_number":980,"context_line":"                                {\u0027vol\u0027: image_volume.id,"},{"line_number":981,"context_line":"                                 \u0027error\u0027: cleanup_err})"},{"line_number":982,"context_line":"            return None"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"    @coordination.synchronized(\u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":985,"context_line":"    def _clone_and_promote_locked("}],"source_content_type":"text/x-python","patch_set":15,"id":"74d34998_a69bcf68","line":982,"range":{"start_line":931,"start_character":0,"end_line":982,"end_character":23},"updated":"2026-08-26 10:35:58.000000000","message":"this looks like redundant code, we should use the existing code by which we create the cache entry today","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":928,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":929,"context_line":"            return None, False"},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"    def _do_create_cache_entry("},{"line_number":932,"context_line":"            self,"},{"line_number":933,"context_line":"            internal_context: cinder_context.RequestContext,"},{"line_number":934,"context_line":"            volume: objects.Volume,"},{"line_number":935,"context_line":"            image_id: str,"},{"line_number":936,"context_line":"            image_meta: dict[str, Any]) -\u003e Optional[str]:"},{"line_number":937,"context_line":"        \"\"\"Clone the (already-populated) volume into a persisted cache entry."},{"line_number":938,"context_line":""},{"line_number":939,"context_line":"        Only called from within ``_clone_and_promote_locked``, while"},{"line_number":940,"context_line":"        holding its lock."},{"line_number":941,"context_line":"        \"\"\""},{"line_number":942,"context_line":"        image_volume \u003d None"},{"line_number":943,"context_line":"        try:"},{"line_number":944,"context_line":"            if not self.image_volume_cache.ensure_space("},{"line_number":945,"context_line":"                    internal_context, volume):"},{"line_number":946,"context_line":"                LOG.warning(\u0027Unable to ensure space for \u0027"},{"line_number":947,"context_line":"                            \u0027image-volume cache promotion of \u0027"},{"line_number":948,"context_line":"                            \u0027image %(image_id)s on %(host)s.\u0027,"},{"line_number":949,"context_line":"                            {\u0027image_id\u0027: image_id,"},{"line_number":950,"context_line":"                             \u0027host\u0027: volume.host})"},{"line_number":951,"context_line":"                return None"},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"            image_volume \u003d self.manager._clone_image_volume("},{"line_number":954,"context_line":"                internal_context, volume, image_meta)"},{"line_number":955,"context_line":"            if not image_volume:"},{"line_number":956,"context_line":"                LOG.warning(\u0027Unable to clone image volume for \u0027"},{"line_number":957,"context_line":"                            \u0027cache promotion of image \u0027"},{"line_number":958,"context_line":"                            \u0027%(image_id)s.\u0027,"},{"line_number":959,"context_line":"                            {\u0027image_id\u0027: image_id})"},{"line_number":960,"context_line":"                return None"},{"line_number":961,"context_line":""},{"line_number":962,"context_line":"            self.image_volume_cache.create_cache_entry("},{"line_number":963,"context_line":"                internal_context, image_volume, image_id, image_meta)"},{"line_number":964,"context_line":"            return image_volume.id"},{"line_number":965,"context_line":"        except Exception as err:"},{"line_number":966,"context_line":"            LOG.warning(\u0027Failed to create local cache promotion \u0027"},{"line_number":967,"context_line":"                        \u0027entry for image %(image_id)s on %(host)s. \u0027"},{"line_number":968,"context_line":"                        \u0027Future clones will still work via \u0027"},{"line_number":969,"context_line":"                        \u0027cross-pool path. Error: %(error)s\u0027,"},{"line_number":970,"context_line":"                        {\u0027image_id\u0027: image_id,"},{"line_number":971,"context_line":"                         \u0027host\u0027: volume.host,"},{"line_number":972,"context_line":"                         \u0027error\u0027: err})"},{"line_number":973,"context_line":"            if image_volume:"},{"line_number":974,"context_line":"                try:"},{"line_number":975,"context_line":"                    self.manager.delete_volume("},{"line_number":976,"context_line":"                        internal_context, image_volume)"},{"line_number":977,"context_line":"                except Exception as cleanup_err:"},{"line_number":978,"context_line":"                    LOG.warning(\u0027Failed to clean up promotion \u0027"},{"line_number":979,"context_line":"                                \u0027volume %(vol)s. Error: %(error)s\u0027,"},{"line_number":980,"context_line":"                                {\u0027vol\u0027: image_volume.id,"},{"line_number":981,"context_line":"                                 \u0027error\u0027: cleanup_err})"},{"line_number":982,"context_line":"            return None"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"    @coordination.synchronized(\u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":985,"context_line":"    def _clone_and_promote_locked("}],"source_content_type":"text/x-python","patch_set":15,"id":"a737eef4_3e1b1f6d","line":982,"range":{"start_line":931,"start_character":0,"end_line":982,"end_character":23},"in_reply_to":"74d34998_a69bcf68","updated":"2026-08-26 17:02:52.000000000","message":"redundant code is removed","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"        Waiters re-check for a same-host cache entry under the lock and"},{"line_number":1002,"context_line":"        reuse it instead of repeating the clone."},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"        This is not the lock used by ``_prepare_image_cache_entry``"},{"line_number":1005,"context_line":"        (``{image_id}``), so a Glance-download cache fill can still race"},{"line_number":1006,"context_line":"        a promotion on the same pool. That race is accepted; both sides"},{"line_number":1007,"context_line":"        will notice an existing same-host entry on the next lookup."},{"line_number":1008,"context_line":"        \"\"\""},{"line_number":1009,"context_line":"        local_entry \u003d self.image_volume_cache.get_entry("}],"source_content_type":"text/x-python","patch_set":15,"id":"94218b26_19146efe","line":1006,"range":{"start_line":1004,"start_character":8,"end_line":1006,"end_character":37},"updated":"2026-08-26 10:35:58.000000000","message":"how can this happen? If the clone across pool capability is reported and cache exists (that\u0027s why we reached here), why will the another operation call go to image download?","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"        Waiters re-check for a same-host cache entry under the lock and"},{"line_number":1002,"context_line":"        reuse it instead of repeating the clone."},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"        This is not the lock used by ``_prepare_image_cache_entry``"},{"line_number":1005,"context_line":"        (``{image_id}``), so a Glance-download cache fill can still race"},{"line_number":1006,"context_line":"        a promotion on the same pool. That race is accepted; both sides"},{"line_number":1007,"context_line":"        will notice an existing same-host entry on the next lookup."},{"line_number":1008,"context_line":"        \"\"\""},{"line_number":1009,"context_line":"        local_entry \u003d self.image_volume_cache.get_entry("}],"source_content_type":"text/x-python","patch_set":15,"id":"4c8637c8_49d0628c","line":1006,"range":{"start_line":1004,"start_character":8,"end_line":1006,"end_character":37},"in_reply_to":"94218b26_19146efe","updated":"2026-08-26 17:02:52.000000000","message":"code is refactored to reuse current code no download now","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":1006,"context_line":"        a promotion on the same pool. That race is accepted; both sides"},{"line_number":1007,"context_line":"        will notice an existing same-host entry on the next lookup."},{"line_number":1008,"context_line":"        \"\"\""},{"line_number":1009,"context_line":"        local_entry \u003d self.image_volume_cache.get_entry("},{"line_number":1010,"context_line":"            internal_context, volume, image_id, image_meta,"},{"line_number":1011,"context_line":"            clone_across_pools\u003dFalse)"},{"line_number":1012,"context_line":"        if local_entry:"},{"line_number":1013,"context_line":"            LOG.debug(\u0027Local cache entry was created concurrently for \u0027"},{"line_number":1014,"context_line":"                      \u0027image %(image_id)s on %(host)s while waiting for \u0027"},{"line_number":1015,"context_line":"                      \u0027the promotion lock, reusing it.\u0027,"},{"line_number":1016,"context_line":"                      {\u0027image_id\u0027: image_id, \u0027host\u0027: volume.host})"},{"line_number":1017,"context_line":"            try:"},{"line_number":1018,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":1019,"context_line":"                    context, volume, local_entry[\u0027volume_id\u0027])"},{"line_number":1020,"context_line":"                return model_update, True"},{"line_number":1021,"context_line":"            except exception.SnapshotLimitReached:"},{"line_number":1022,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1023,"context_line":"                    self._delete_cache_entry_on_snapshot_limit("},{"line_number":1024,"context_line":"                        context, local_entry)"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"        try:"},{"line_number":1027,"context_line":"            if source_vol_id:"},{"line_number":1028,"context_line":"                model_update \u003d self._create_from_source_volume("}],"source_content_type":"text/x-python","patch_set":15,"id":"7559392d_9833a424","line":1025,"range":{"start_line":1009,"start_character":0,"end_line":1025,"end_character":0},"updated":"2026-08-26 10:35:58.000000000","message":"based on the comment above, doesn\u0027t look like this should be happening","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":1006,"context_line":"        a promotion on the same pool. That race is accepted; both sides"},{"line_number":1007,"context_line":"        will notice an existing same-host entry on the next lookup."},{"line_number":1008,"context_line":"        \"\"\""},{"line_number":1009,"context_line":"        local_entry \u003d self.image_volume_cache.get_entry("},{"line_number":1010,"context_line":"            internal_context, volume, image_id, image_meta,"},{"line_number":1011,"context_line":"            clone_across_pools\u003dFalse)"},{"line_number":1012,"context_line":"        if local_entry:"},{"line_number":1013,"context_line":"            LOG.debug(\u0027Local cache entry was created concurrently for \u0027"},{"line_number":1014,"context_line":"                      \u0027image %(image_id)s on %(host)s while waiting for \u0027"},{"line_number":1015,"context_line":"                      \u0027the promotion lock, reusing it.\u0027,"},{"line_number":1016,"context_line":"                      {\u0027image_id\u0027: image_id, \u0027host\u0027: volume.host})"},{"line_number":1017,"context_line":"            try:"},{"line_number":1018,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":1019,"context_line":"                    context, volume, local_entry[\u0027volume_id\u0027])"},{"line_number":1020,"context_line":"                return model_update, True"},{"line_number":1021,"context_line":"            except exception.SnapshotLimitReached:"},{"line_number":1022,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1023,"context_line":"                    self._delete_cache_entry_on_snapshot_limit("},{"line_number":1024,"context_line":"                        context, local_entry)"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"        try:"},{"line_number":1027,"context_line":"            if source_vol_id:"},{"line_number":1028,"context_line":"                model_update \u003d self._create_from_source_volume("}],"source_content_type":"text/x-python","patch_set":15,"id":"49f80b7c_64841c47","line":1025,"range":{"start_line":1009,"start_character":0,"end_line":1025,"end_character":0},"in_reply_to":"7559392d_9833a424","updated":"2026-08-26 17:02:52.000000000","message":"remove this code","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":1028,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":1029,"context_line":"                    context, volume, source_vol_id)"},{"line_number":1030,"context_line":"                cloned \u003d True"},{"line_number":1031,"context_line":"            else:"},{"line_number":1032,"context_line":"                model_update, cloned \u003d self._clone_image_volume("},{"line_number":1033,"context_line":"                    context, volume, image_location, image_meta)"},{"line_number":1034,"context_line":"        except exception.SnapshotLimitReached:"},{"line_number":1035,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":1036,"context_line":"                self._delete_cache_entry_on_snapshot_limit("}],"source_content_type":"text/x-python","patch_set":15,"id":"1cac054e_6f7adc91","line":1033,"range":{"start_line":1031,"start_character":0,"end_line":1033,"end_character":64},"updated":"2026-08-26 10:35:58.000000000","message":"should not be allowing the glance cinder store case in image-volume cache workflow","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"                model_update \u003d self._create_from_source_volume("},{"line_number":1029,"context_line":"                    context, volume, source_vol_id)"},{"line_number":1030,"context_line":"                cloned \u003d True"},{"line_number":1031,"context_line":"            else:"},{"line_number":1032,"context_line":"                model_update, cloned \u003d self._clone_image_volume("},{"line_number":1033,"context_line":"                    context, volume, image_location, image_meta)"},{"line_number":1034,"context_line":"        except exception.SnapshotLimitReached:"},{"line_number":1035,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":1036,"context_line":"                self._delete_cache_entry_on_snapshot_limit("}],"source_content_type":"text/x-python","patch_set":15,"id":"0c00ebc8_bdc55768","line":1033,"range":{"start_line":1031,"start_character":0,"end_line":1033,"end_character":64},"in_reply_to":"1cac054e_6f7adc91","updated":"2026-08-26 17:02:52.000000000","message":"yes, reusing current cache flows","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"30c9e81f9dd8a0c1697c2e6b80747de3efaf65bc","unresolved":true,"context_lines":[{"line_number":1057,"context_line":"                   \u0027image_id\u0027: image_id,"},{"line_number":1058,"context_line":"                   \u0027encrypted\u0027: volume_is_encrypted})"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        cloned \u003d False"},{"line_number":1061,"context_line":"        model_update \u003d None"},{"line_number":1062,"context_line":"        cache_usable \u003d self.image_volume_cache and not volume_is_encrypted"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        if cache_usable:"},{"line_number":1065,"context_line":"            internal_context \u003d cinder_context.get_internal_tenant_context()"},{"line_number":1066,"context_line":"            if internal_context:"},{"line_number":1067,"context_line":"                try:"},{"line_number":1068,"context_line":"                    model_update, cloned \u003d self._create_from_image_cache("},{"line_number":1069,"context_line":"                        context, internal_context, volume,"},{"line_number":1070,"context_line":"                        image_id, image_meta)"},{"line_number":1071,"context_line":"                except exception.SnapshotLimitReached:"},{"line_number":1072,"context_line":"                    raise"},{"line_number":1073,"context_line":"                except exception.CinderException as err:"},{"line_number":1074,"context_line":"                    LOG.warning("},{"line_number":1075,"context_line":"                        \u0027Failed to use image-volume cache for \u0027"},{"line_number":1076,"context_line":"                        \u0027cinder-stored image %(image_id)s, \u0027"},{"line_number":1077,"context_line":"                        \u0027falling through to direct clone. \u0027"},{"line_number":1078,"context_line":"                        \u0027Error: %(error)s\u0027,"},{"line_number":1079,"context_line":"                        {\u0027image_id\u0027: image_id, \u0027error\u0027: err})"},{"line_number":1080,"context_line":"                    cloned \u003d False"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        if not cloned:"},{"line_number":1083,"context_line":"            promote_across_pools \u003d ("},{"line_number":1084,"context_line":"                cache_usable and self._should_promote_across_pools())"},{"line_number":1085,"context_line":"            internal_context \u003d ("},{"line_number":1086,"context_line":"                cinder_context.get_internal_tenant_context()"},{"line_number":1087,"context_line":"                if promote_across_pools else None)"},{"line_number":1088,"context_line":"            if internal_context:"},{"line_number":1089,"context_line":"                try:"},{"line_number":1090,"context_line":"                    model_update, cloned \u003d self._clone_and_promote_locked("},{"line_number":1091,"context_line":"                        context, internal_context, volume, image_id,"},{"line_number":1092,"context_line":"                        image_meta, image_location\u003dimage_location)"},{"line_number":1093,"context_line":"                except exception.SnapshotLimitReached:"},{"line_number":1094,"context_line":"                    raise"},{"line_number":1095,"context_line":"                except exception.CinderException as err:"},{"line_number":1096,"context_line":"                    LOG.warning("},{"line_number":1097,"context_line":"                        \u0027Failed locked direct clone/promotion for \u0027"},{"line_number":1098,"context_line":"                        \u0027cinder-stored image %(image_id)s, falling \u0027"},{"line_number":1099,"context_line":"                        \u0027through to unlocked direct clone. \u0027"},{"line_number":1100,"context_line":"                        \u0027Error: %(error)s\u0027,"},{"line_number":1101,"context_line":"                        {\u0027image_id\u0027: image_id, \u0027error\u0027: err})"},{"line_number":1102,"context_line":"                    cloned \u003d False"},{"line_number":1103,"context_line":"            if not cloned:"},{"line_number":1104,"context_line":"                model_update, cloned \u003d self._clone_image_volume("},{"line_number":1105,"context_line":"                    context, volume, image_location, image_meta)"}],"source_content_type":"text/x-python","patch_set":15,"id":"f471690f_45b0b376","line":1102,"range":{"start_line":1060,"start_character":0,"end_line":1102,"end_character":34},"updated":"2026-08-26 10:35:58.000000000","message":"-2 for this\nimage-volume cache and cloning from glance image are two completely different operations, mixing one into another is not a good idea and might break existing workflow","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"                   \u0027image_id\u0027: image_id,"},{"line_number":1058,"context_line":"                   \u0027encrypted\u0027: volume_is_encrypted})"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        cloned \u003d False"},{"line_number":1061,"context_line":"        model_update \u003d None"},{"line_number":1062,"context_line":"        cache_usable \u003d self.image_volume_cache and not volume_is_encrypted"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        if cache_usable:"},{"line_number":1065,"context_line":"            internal_context \u003d cinder_context.get_internal_tenant_context()"},{"line_number":1066,"context_line":"            if internal_context:"},{"line_number":1067,"context_line":"                try:"},{"line_number":1068,"context_line":"                    model_update, cloned \u003d self._create_from_image_cache("},{"line_number":1069,"context_line":"                        context, internal_context, volume,"},{"line_number":1070,"context_line":"                        image_id, image_meta)"},{"line_number":1071,"context_line":"                except exception.SnapshotLimitReached:"},{"line_number":1072,"context_line":"                    raise"},{"line_number":1073,"context_line":"                except exception.CinderException as err:"},{"line_number":1074,"context_line":"                    LOG.warning("},{"line_number":1075,"context_line":"                        \u0027Failed to use image-volume cache for \u0027"},{"line_number":1076,"context_line":"                        \u0027cinder-stored image %(image_id)s, \u0027"},{"line_number":1077,"context_line":"                        \u0027falling through to direct clone. \u0027"},{"line_number":1078,"context_line":"                        \u0027Error: %(error)s\u0027,"},{"line_number":1079,"context_line":"                        {\u0027image_id\u0027: image_id, \u0027error\u0027: err})"},{"line_number":1080,"context_line":"                    cloned \u003d False"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        if not cloned:"},{"line_number":1083,"context_line":"            promote_across_pools \u003d ("},{"line_number":1084,"context_line":"                cache_usable and self._should_promote_across_pools())"},{"line_number":1085,"context_line":"            internal_context \u003d ("},{"line_number":1086,"context_line":"                cinder_context.get_internal_tenant_context()"},{"line_number":1087,"context_line":"                if promote_across_pools else None)"},{"line_number":1088,"context_line":"            if internal_context:"},{"line_number":1089,"context_line":"                try:"},{"line_number":1090,"context_line":"                    model_update, cloned \u003d self._clone_and_promote_locked("},{"line_number":1091,"context_line":"                        context, internal_context, volume, image_id,"},{"line_number":1092,"context_line":"                        image_meta, image_location\u003dimage_location)"},{"line_number":1093,"context_line":"                except exception.SnapshotLimitReached:"},{"line_number":1094,"context_line":"                    raise"},{"line_number":1095,"context_line":"                except exception.CinderException as err:"},{"line_number":1096,"context_line":"                    LOG.warning("},{"line_number":1097,"context_line":"                        \u0027Failed locked direct clone/promotion for \u0027"},{"line_number":1098,"context_line":"                        \u0027cinder-stored image %(image_id)s, falling \u0027"},{"line_number":1099,"context_line":"                        \u0027through to unlocked direct clone. \u0027"},{"line_number":1100,"context_line":"                        \u0027Error: %(error)s\u0027,"},{"line_number":1101,"context_line":"                        {\u0027image_id\u0027: image_id, \u0027error\u0027: err})"},{"line_number":1102,"context_line":"                    cloned \u003d False"},{"line_number":1103,"context_line":"            if not cloned:"},{"line_number":1104,"context_line":"                model_update, cloned \u003d self._clone_image_volume("},{"line_number":1105,"context_line":"                    context, volume, image_location, image_meta)"}],"source_content_type":"text/x-python","patch_set":15,"id":"d021c4d9_0d6646db","line":1102,"range":{"start_line":1060,"start_character":0,"end_line":1102,"end_character":34},"in_reply_to":"34ace08b_71fdceca","updated":"2026-08-30 12:56:41.000000000","message":"Glance cinder-store and image-volume cache are still separate. _create_from_image still tries _clone_image_volume first when cinder is in allowed_direct_url_schemes. Cache prepare runs only if that did not clone. There is no _create_from_cinder_store_image. Please re-review.","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e93287b5e5fff94dfad0431ad56a8ae73c1a66","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"                   \u0027image_id\u0027: image_id,"},{"line_number":1058,"context_line":"                   \u0027encrypted\u0027: volume_is_encrypted})"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        cloned \u003d False"},{"line_number":1061,"context_line":"        model_update \u003d None"},{"line_number":1062,"context_line":"        cache_usable \u003d self.image_volume_cache and not volume_is_encrypted"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        if cache_usable:"},{"line_number":1065,"context_line":"            internal_context \u003d cinder_context.get_internal_tenant_context()"},{"line_number":1066,"context_line":"            if internal_context:"},{"line_number":1067,"context_line":"                try:"},{"line_number":1068,"context_line":"                    model_update, cloned \u003d self._create_from_image_cache("},{"line_number":1069,"context_line":"                        context, internal_context, volume,"},{"line_number":1070,"context_line":"                        image_id, image_meta)"},{"line_number":1071,"context_line":"                except exception.SnapshotLimitReached:"},{"line_number":1072,"context_line":"                    raise"},{"line_number":1073,"context_line":"                except exception.CinderException as err:"},{"line_number":1074,"context_line":"                    LOG.warning("},{"line_number":1075,"context_line":"                        \u0027Failed to use image-volume cache for \u0027"},{"line_number":1076,"context_line":"                        \u0027cinder-stored image %(image_id)s, \u0027"},{"line_number":1077,"context_line":"                        \u0027falling through to direct clone. \u0027"},{"line_number":1078,"context_line":"                        \u0027Error: %(error)s\u0027,"},{"line_number":1079,"context_line":"                        {\u0027image_id\u0027: image_id, \u0027error\u0027: err})"},{"line_number":1080,"context_line":"                    cloned \u003d False"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        if not cloned:"},{"line_number":1083,"context_line":"            promote_across_pools \u003d ("},{"line_number":1084,"context_line":"                cache_usable and self._should_promote_across_pools())"},{"line_number":1085,"context_line":"            internal_context \u003d ("},{"line_number":1086,"context_line":"                cinder_context.get_internal_tenant_context()"},{"line_number":1087,"context_line":"                if promote_across_pools else None)"},{"line_number":1088,"context_line":"            if internal_context:"},{"line_number":1089,"context_line":"                try:"},{"line_number":1090,"context_line":"                    model_update, cloned \u003d self._clone_and_promote_locked("},{"line_number":1091,"context_line":"                        context, internal_context, volume, image_id,"},{"line_number":1092,"context_line":"                        image_meta, image_location\u003dimage_location)"},{"line_number":1093,"context_line":"                except exception.SnapshotLimitReached:"},{"line_number":1094,"context_line":"                    raise"},{"line_number":1095,"context_line":"                except exception.CinderException as err:"},{"line_number":1096,"context_line":"                    LOG.warning("},{"line_number":1097,"context_line":"                        \u0027Failed locked direct clone/promotion for \u0027"},{"line_number":1098,"context_line":"                        \u0027cinder-stored image %(image_id)s, falling \u0027"},{"line_number":1099,"context_line":"                        \u0027through to unlocked direct clone. \u0027"},{"line_number":1100,"context_line":"                        \u0027Error: %(error)s\u0027,"},{"line_number":1101,"context_line":"                        {\u0027image_id\u0027: image_id, \u0027error\u0027: err})"},{"line_number":1102,"context_line":"                    cloned \u003d False"},{"line_number":1103,"context_line":"            if not cloned:"},{"line_number":1104,"context_line":"                model_update, cloned \u003d self._clone_image_volume("},{"line_number":1105,"context_line":"                    context, volume, image_location, image_meta)"}],"source_content_type":"text/x-python","patch_set":15,"id":"34ace08b_71fdceca","line":1102,"range":{"start_line":1060,"start_character":0,"end_line":1102,"end_character":34},"in_reply_to":"f471690f_45b0b376","updated":"2026-08-26 17:02:52.000000000","message":"yes, removed separate branch for cross-pool and branch logic. Please take a look again","commit_id":"5afe7a6eeb9beb523f63b33a8547dbd9c0c6339b"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":897,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":898,"context_line":"        return None, False"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    @coordination.synchronized("},{"line_number":901,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":902,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":903,"context_line":"                                   context: cinder_context.RequestContext,"}],"source_content_type":"text/x-python","patch_set":16,"id":"aa0b895f_85b39f07","line":900,"updated":"2026-08-26 18:42:34.000000000","message":"`{image_id}` → `image-promote-{image_id}-{volume.host}` applies unconditionally. Narrowing it may be right, but it changes concurrency for every operator on upgrade and isn\u0027t mentioned in the commit message or release note. If it\u0027s only needed for the promote path, use a distinct name and leave `{image_id}` alone.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":897,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":898,"context_line":"        return None, False"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    @coordination.synchronized("},{"line_number":901,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":902,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":903,"context_line":"                                   context: cinder_context.RequestContext,"}],"source_content_type":"text/x-python","patch_set":16,"id":"b2f6f4ce_95443ece","line":900,"in_reply_to":"aa0b895f_85b39f07","updated":"2026-08-30 12:56:41.000000000","message":"Granular lock will benefit both copy and cross-pool flows. That is called out in the commit message and the reno upgrade section.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":917,"context_line":"        # (else) or later in _create_from_image_cache."},{"line_number":918,"context_line":"        cache_entry \u003d self.image_volume_cache.get_entry("},{"line_number":919,"context_line":"            internal_context, volume, image_id, image_meta,"},{"line_number":920,"context_line":"            clone_across_pools\u003dFalse)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"        # If the entry is in the cache then return ASAP in order to minimize"},{"line_number":923,"context_line":"        # the scope of the lock. If it isn\u0027t in the cache then do the work"}],"source_content_type":"text/x-python","patch_set":16,"id":"2efd038f_2983163e","line":920,"range":{"start_line":920,"start_character":12,"end_line":920,"end_character":36},"updated":"2026-08-26 18:42:34.000000000","message":"Hardcoding this changes behaviour for every deployment, not just ones that opt in. On a `clone_across_pools\u003dTrue` backend with a remote entry and no local one, master hits at `get_entry(clone_across_pools\u003dTrue)` and returns at 930 — \"return ASAP in order to minimize the scope of the lock\" — so the clone runs outside the lock. Here it\u0027s a miss, so we take the else at 931, skip the promote branch (default off), and call `_create_from_image_cache_or_download` at 949 **holding the lock**, which does the cross-pool clone inside.\n\nConcurrent creates of the same image on the same pool now serialise behind a full cross-pool copy, and since no local row is ever seeded they keep serialising forever. Can the miss path stay `clone_across_pools`-aware when promotion is disabled?\n\nAlso 956 passes `update_cache\u003dTrue` where master used the default `False` — so a swallowed clone failure now seeds a local entry where it previously didn\u0027t.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":917,"context_line":"        # (else) or later in _create_from_image_cache."},{"line_number":918,"context_line":"        cache_entry \u003d self.image_volume_cache.get_entry("},{"line_number":919,"context_line":"            internal_context, volume, image_id, image_meta,"},{"line_number":920,"context_line":"            clone_across_pools\u003dFalse)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"        # If the entry is in the cache then return ASAP in order to minimize"},{"line_number":923,"context_line":"        # the scope of the lock. If it isn\u0027t in the cache then do the work"}],"source_content_type":"text/x-python","patch_set":16,"id":"ad80bcff_8c12428d","line":920,"range":{"start_line":920,"start_character":12,"end_line":920,"end_character":36},"in_reply_to":"2efd038f_2983163e","updated":"2026-08-30 12:56:41.000000000","message":"The first get_entry is clone_across_pools\u003dFalse only when promotion is on. When the option is False it still uses the driver capability, so a remote hit still returns ASAP and the clone runs outside the lock, same as master.\n\nupdate_cache\u003dTrue on the prepare-miss download path is unchanged from master _prepare_image_cache_entry.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":943,"context_line":"                    image_id,"},{"line_number":944,"context_line":"                    image_meta)"},{"line_number":945,"context_line":"                if cloned:"},{"line_number":946,"context_line":"                    self.manager._create_image_cache_volume_entry("},{"line_number":947,"context_line":"                        internal_context, volume, image_id, image_meta)"},{"line_number":948,"context_line":"                    return model_update, True"},{"line_number":949,"context_line":"            model_update \u003d self._create_from_image_cache_or_download("}],"source_content_type":"text/x-python","patch_set":16,"id":"a12493f2_6709600f","line":946,"range":{"start_line":946,"start_character":33,"end_line":946,"end_character":65},"updated":"2026-08-26 18:42:34.000000000","message":"Line 1093 does this first, deliberately:\n\n```\nif model_update:\n    volume.update(model_update)\n    volume.save()\n```\n\nThe helper goes `_clone_image_volume` → `create_volume` → driver re-reads the source via `get_by_id()`. At this point the volume\u0027s DB row hasn\u0027t been updated — `model_update (provider_location, provider_id)` is still travelling up the taskflow. So we clone from a row that doesn\u0027t describe the backend volume yet. Needs the same two lines.\n\n(`_cleanup_cg_in_volume` is fine — `_create_from_source_volume` handles it in a finally.)","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":943,"context_line":"                    image_id,"},{"line_number":944,"context_line":"                    image_meta)"},{"line_number":945,"context_line":"                if cloned:"},{"line_number":946,"context_line":"                    self.manager._create_image_cache_volume_entry("},{"line_number":947,"context_line":"                        internal_context, volume, image_id, image_meta)"},{"line_number":948,"context_line":"                    return model_update, True"},{"line_number":949,"context_line":"            model_update \u003d self._create_from_image_cache_or_download("}],"source_content_type":"text/x-python","patch_set":16,"id":"18cf4f6f_75155597","line":946,"range":{"start_line":946,"start_character":33,"end_line":946,"end_character":65},"in_reply_to":"a12493f2_6709600f","updated":"2026-08-30 12:56:41.000000000","message":"After a successful promote clone we now volume.update(model_update) and volume.save() before _create_image_cache_volume_entry, same as the download path.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":946,"context_line":"                    self.manager._create_image_cache_volume_entry("},{"line_number":947,"context_line":"                        internal_context, volume, image_id, image_meta)"},{"line_number":948,"context_line":"                    return model_update, True"},{"line_number":949,"context_line":"            model_update \u003d self._create_from_image_cache_or_download("},{"line_number":950,"context_line":"                context,"},{"line_number":951,"context_line":"                volume,"},{"line_number":952,"context_line":"                image_location,"}],"source_content_type":"text/x-python","patch_set":16,"id":"c15e7c1e_12a09fd8","line":949,"updated":"2026-08-26 18:42:34.000000000","message":"On `cloned \u003d False` we fall through and `get_entry` runs a second time for the same image. Minor, but it means \"no additional DB calls\" in reply to PS15:896 isn\u0027t quite right for the miss case.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":946,"context_line":"                    self.manager._create_image_cache_volume_entry("},{"line_number":947,"context_line":"                        internal_context, volume, image_id, image_meta)"},{"line_number":948,"context_line":"                    return model_update, True"},{"line_number":949,"context_line":"            model_update \u003d self._create_from_image_cache_or_download("},{"line_number":950,"context_line":"                context,"},{"line_number":951,"context_line":"                volume,"},{"line_number":952,"context_line":"                image_location,"}],"source_content_type":"text/x-python","patch_set":16,"id":"831a79ce_ac38372c","line":949,"in_reply_to":"c15e7c1e_12a09fd8","updated":"2026-08-30 12:56:41.000000000","message":"If the promote clone does not succeed we call _create_from_image_cache_or_download(..., try_cache\u003dFalse) so get_entry is not run again on that miss.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4320c5045942668c997484de2f52385c117fff73","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"927c5bbe_a752c279","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"updated":"2026-08-31 08:57:01.000000000","message":"I\u0027m still skeptical if we should modify the existing lock to make it more granular on the host level\nthis decision should happen if we are trying to promote and keep it as image level lock if not to preserve old behavior, let\u0027s see what others say about this.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"2ce8d481e1033e2c29c8eef67ce7dc959103300c","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"69d67c56_6291ad3f","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"in_reply_to":"114c996a_179f8566","updated":"2026-10-02 14:42:27.000000000","message":"Ok, I think I was wrong and that is not a concern :)","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"f8ac4b0db58e9d7d61b16997f76b1a1543f276cc","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"1be07479_032213d0","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"in_reply_to":"114c996a_179f8566","updated":"2026-10-02 14:50:06.000000000","message":"Thank you! Dmitriy, in active-active scenario volume.host values is different and cache will be promoted for both the hosts so that both active hosts can execute cross-pool workflows and server VMs from cache.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"25f793bbc684a1b67d50b14c53c74c3eba46c4eb","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"96dc2dcf_d585add6","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"in_reply_to":"20c947d6_d953e3b0","updated":"2026-09-30 15:48:14.000000000","message":"on master, with clone_across_pools\u003dTrue, both pools take {image_id}. The second waits, the empty host filter makes the first pool\u0027s row a hit, and the second clones outside the lock. That is one download, then a queue. The case this lock change is for is the one where every cold pool does a full copy anyway. The image lock only lines those copies up. A pool lock lets them overlap, so the batch tracks one build instead of the pool count. A create that starts after another pool\u0027s row is already committed still hits and can clone. It does not download again.\n\nKeeping {image_id} whenever promotion is off would leave that queue in place. The deployments that pay it are not using the promote option. The first-time cost is still one copy per pool. The host lock is what stops that cost from being multiplied by the number of pools.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"41c25318455566a5bb258a1d93959b13a2eab388","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"20c947d6_d953e3b0","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"in_reply_to":"57285a50_621f6f1c","updated":"2026-09-29 13:56:54.000000000","message":"Will this end up with two simultaneous creates of a new image both miss and both download? With clone_across_pools\u003dTrue, ImageVolumeCache._get_query_filters() returns {} for a non-clustered volume, so any host\u0027s row is a hit. Today the second pool blocks on {image_id} until the first download inserts that row, then returns here and clones outside the lock.\n\nShouldnt we just keep {image_id} when promotion is off?","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"0162539163dc5ea7826e98388a8001174d35313c","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"57285a50_621f6f1c","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"in_reply_to":"927c5bbe_a752c279","updated":"2026-09-01 12:14:49.000000000","message":"Thank you! Rajat, lock is updated based on our testing.\n\nBy caching rows scoped to host/pool. Two hosts filling the same image are filling different rows, so they should not share {image_id}. Keeping {image_id} would serialize every host creating that image.\n\nDownload fill and promote fill both go through this method. If we used {image_id} when the option is off and image-promote-…-{host} when it is on, a download and a promote on the same host could race and double-seed. One lock on this method avoids that.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"dd94581d86ace67b3a30bf735800400d8289dfbe","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"c6fe4473_16b63d2e","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"in_reply_to":"96dc2dcf_d585add6","updated":"2026-09-30 15:48:37.000000000","message":"The image-wide {image_id} lock is what makes a first boot of one new image across several pools take N times one pool. _prepare_image_cache_entry now uses image-promote-{image_id}-{volume.host} so different pools do not queue on each other. The promote option does not choose the lock name. Creates for the same pool still share one lock, because volume.host is the same.\n\nOn a cold image, each pool still does its own Glance download, convert, and cache insert. Those steps are the long part. Clones from a pool\u0027s cache after that are short. With one lock per image, pool 2 cannot start its download until pool 1 has inserted its cache row, so the batch is the sum of the per-pool builds. A like-for-like bulk run showed that: the same images, the same volume count, the same per-pool build time, and the batch time tracked the number of cold pools. Twice as many pools took about twice as long. The per-pool download rate was not the difference.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"71f137df147987daeb6a81423a33f87b0643bd25","unresolved":true,"context_lines":[{"line_number":872,"context_line":"                        \u0027clone. Image will be downloaded from Glance.\u0027)"},{"line_number":873,"context_line":"        return None, False"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    @coordination.synchronized("},{"line_number":876,"context_line":"        \u0027image-promote-{image_id}-{volume.host}\u0027)"},{"line_number":877,"context_line":"    def _prepare_image_cache_entry(self,"},{"line_number":878,"context_line":"                                   context: cinder_context.RequestContext,"},{"line_number":879,"context_line":"                                   volume: objects.Volume,"}],"source_content_type":"text/x-python","patch_set":21,"id":"114c996a_179f8566","line":876,"range":{"start_line":875,"start_character":0,"end_line":876,"end_character":49},"in_reply_to":"c6fe4473_16b63d2e","updated":"2026-10-02 14:22:21.000000000","message":"I would be kinda concerned of how volume.host would play out with drivers that SUPPORTS_ACTIVE_ACTIVE is true, but it seems that clone_across_pools is available only for storpool, which does not have active/active mode?\n\nAs otherwise host would create other sort of overhead.","commit_id":"c2893a9e2c1d9433f336ce5f152eb12cb037220f"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"41c25318455566a5bb258a1d93959b13a2eab388","unresolved":true,"context_lines":[{"line_number":916,"context_line":"            # Create the local cache row. clone_across_pools + promote"},{"line_number":917,"context_line":"            # clones from an existing remote cache volume; otherwise the"},{"line_number":918,"context_line":"            # existing Glance download path fills the cache."},{"line_number":919,"context_line":"            if promote:"},{"line_number":920,"context_line":"                model_update, cloned \u003d self._create_from_image_cache("},{"line_number":921,"context_line":"                    context,"},{"line_number":922,"context_line":"                    internal_context,"}],"source_content_type":"text/x-python","patch_set":22,"id":"d55f1984_0a6a3182","line":919,"range":{"start_line":919,"start_character":12,"end_line":919,"end_character":23},"updated":"2026-09-29 13:56:54.000000000","message":"I see that in case of download path, we are also resizing the volume i.e. volume.size to virtual_size (Ln 1045 and in the finally block). \n\nif virtual_size and virtual_size !\u003d original_size:\n    volume.size \u003d virtual_size\n    volume.save()\n...\nself.manager._create_image_cache_volume_entry(...)\n...\nif volume.size !\u003d original_size:\n    self.driver.extend_volume(volume, original_size)\n\nThat step is skipped in case of promote logic. Can you please ensure that this does not create unwanted scenarios?","commit_id":"844c4469326682859f62678ec597e84aa51ed272"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"25f793bbc684a1b67d50b14c53c74c3eba46c4eb","unresolved":false,"context_lines":[{"line_number":916,"context_line":"            # Create the local cache row. clone_across_pools + promote"},{"line_number":917,"context_line":"            # clones from an existing remote cache volume; otherwise the"},{"line_number":918,"context_line":"            # existing Glance download path fills the cache."},{"line_number":919,"context_line":"            if promote:"},{"line_number":920,"context_line":"                model_update, cloned \u003d self._create_from_image_cache("},{"line_number":921,"context_line":"                    context,"},{"line_number":922,"context_line":"                    internal_context,"}],"source_content_type":"text/x-python","patch_set":22,"id":"00ddfe1a_cdf6cf3f","line":919,"range":{"start_line":919,"start_character":12,"end_line":919,"end_character":23},"in_reply_to":"d55f1984_0a6a3182","updated":"2026-09-30 15:48:14.000000000","message":"The shrink to virtual_size is only in _create_from_image_cache_or_download, and only when should_create_cache_entry is set, so the cache clone is taken at virtual size. The finally block then extend_volume()s the user volume back. Promotion returns before that block. On this path volume.size is never changed","commit_id":"844c4469326682859f62678ec597e84aa51ed272"}],"releasenotes/notes/per-pool-image-cache-promotion-f1f1a279680f9866.yaml":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":11,"context_line":"    for the same image on that pool is served from a local cache entry,"},{"line_number":12,"context_line":"    making it as fast as a same-pool clone."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    This behaviour is opt-in and disabled by default.  To enable it, set"},{"line_number":15,"context_line":"    the following option in ``cinder.conf`` under ``[DEFAULT]`` or a"},{"line_number":16,"context_line":"    per-backend section::"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":13,"id":"573492e1_35797cac","line":14,"updated":"2026-08-21 15:51:43.000000000","message":"Incorrect as the code currently stands - see comments. Promotion on the cross-pool cache-hit patch doesn\u0027t consult the config opton, so it\u0027s neither opt-in or disabled by default.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    for the same image on that pool is served from a local cache entry,"},{"line_number":12,"context_line":"    making it as fast as a same-pool clone."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    This behaviour is opt-in and disabled by default.  To enable it, set"},{"line_number":15,"context_line":"    the following option in ``cinder.conf`` under ``[DEFAULT]`` or a"},{"line_number":16,"context_line":"    per-backend section::"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":13,"id":"536f33ae_e66b7591","line":14,"in_reply_to":"573492e1_35797cac","updated":"2026-08-25 10:59:12.000000000","message":"Those statements were wrong on PS13. They are true on this revision: promotion runs only when _should_promote_across_pools() is True (capability and image_volume_cache_promote_across_pools). Default False: clone_across_pools backends still clone from a remote cache entry and do not seed a local one.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b0698e97dc5bdc5f9a4aa578a0a2729ed0853b87","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    \u003chttps://blueprints.launchpad.net/cinder/+spec/per-pool-image-cache-promotion\u003e`_."},{"line_number":26,"context_line":"upgrade:"},{"line_number":27,"context_line":"  - |"},{"line_number":28,"context_line":"    No impact. The per-pool image-volume cache promotion feature is disabled"},{"line_number":29,"context_line":"    by default and existing deployments will see no behavioural change on"},{"line_number":30,"context_line":"    upgrade."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"47c003cf_796a96d6","line":28,"updated":"2026-08-21 15:51:43.000000000","message":"Again, untrue as per current code. An upgraded deployment on a `clone_across_pools \u003d True` backend _will_ see a behavioural change.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6a361e8a88223d60687a01a9d08963ad444d359e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \u003chttps://blueprints.launchpad.net/cinder/+spec/per-pool-image-cache-promotion\u003e`_."},{"line_number":26,"context_line":"upgrade:"},{"line_number":27,"context_line":"  - |"},{"line_number":28,"context_line":"    No impact. The per-pool image-volume cache promotion feature is disabled"},{"line_number":29,"context_line":"    by default and existing deployments will see no behavioural change on"},{"line_number":30,"context_line":"    upgrade."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"85bad278_746aaa8c","line":28,"in_reply_to":"47c003cf_796a96d6","updated":"2026-08-25 10:59:12.000000000","message":"Those statements were wrong on PS13. They are true on this revision: promotion runs only when _should_promote_across_pools() is True (capability and image_volume_cache_promote_across_pools). Default False: clone_across_pools backends still clone from a remote cache entry and do not seed a local one.","commit_id":"5f7aef0c8855b1a77bac24b120c5939060da7b2d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"e3b071887ce69fa24a4d6eb142dab36d173cf5cf","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    \u003chttps://blueprints.launchpad.net/cinder/+spec/per-pool-image-cache-promotion\u003e`_."},{"line_number":26,"context_line":"upgrade:"},{"line_number":27,"context_line":"  - |"},{"line_number":28,"context_line":"    No impact. The per-pool image-volume cache promotion feature is disabled"},{"line_number":29,"context_line":"    by default and existing deployments will see no behavioural change on"},{"line_number":30,"context_line":"    upgrade."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"137643bc_4d58787b","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":13},"updated":"2026-08-26 18:42:34.000000000","message":"Two changes apply regardless of the option: the `clone_across_pools\u003dFalse` lookup (`create_volume.py:918`) and the lock rename (900). Either make both conditional, or describe them here.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"4dee89518e8a94d8b1cb4b12248ff42ebf11f966","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \u003chttps://blueprints.launchpad.net/cinder/+spec/per-pool-image-cache-promotion\u003e`_."},{"line_number":26,"context_line":"upgrade:"},{"line_number":27,"context_line":"  - |"},{"line_number":28,"context_line":"    No impact. The per-pool image-volume cache promotion feature is disabled"},{"line_number":29,"context_line":"    by default and existing deployments will see no behavioural change on"},{"line_number":30,"context_line":"    upgrade."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"4fafd726_35b21a0e","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":13},"in_reply_to":"137643bc_4d58787b","updated":"2026-08-30 12:56:41.000000000","message":"he upgrade note now says: the lock rename applies even when the option is False; the first lookup stays clone_across_pools-aware when the option is False and is host-local only when it is True. Dest-pool rows are still not seeded unless the option is enabled.","commit_id":"6c6942897623a2d604e4410b40a63c021ffa4f3e"}]}
