)]}'
{"cinder/volume/drivers/hpe/hpe_3par_common.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":142,"context_line":"                    \"(3) the backend is prezoned with this \""},{"line_number":143,"context_line":"                    \"specific nsp only. For example if nsp is 2 1 2, the \""},{"line_number":144,"context_line":"                    \"format of the option\u0027s value is 2:1:2\"),"},{"line_number":145,"context_line":"    cfg.BoolOpt(\u0027hpe3par_image_seed_cache_enabled\u0027,"},{"line_number":146,"context_line":"                default\u003dTrue,"},{"line_number":147,"context_line":"                help\u003d\"Enable the per-size image seed clone cache. When a \""},{"line_number":148,"context_line":"                     \"bootable volume larger than its source image is \""}],"source_content_type":"text/x-python","patch_set":2,"id":"c690d9f0_55ba8540","line":145,"updated":"2026-10-25 16:21:07.000000000","message":"default\u003dTrue creates ims- volumes on upgrade with no config change. They are not Cinder volumes (lines 2864–2865), so they are not in a project quota, and there is no max count or max GiB. Image cache has image_volume_cache_max_size_gb and image_volume_cache_max_count. Each distinct (cache volume id, size) keeps one full-size copy until hpe3par_image_seed_max_age_days. N-1 has none of this cleanup, so a downgrade leaves the VVs on the array. Please default the option to False until the delete path re-reads inside the lock, and add an upgrade: note for the orphaned ims- volumes. The features: note is otherwise accurate about the age and the replication skip.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":1846,"context_line":"                      \u0027replication_targets\u0027: self._get_replication_targets(),"},{"line_number":1847,"context_line":"                      \u0027pools\u0027: pools}"},{"line_number":1848,"context_line":""},{"line_number":1849,"context_line":"        self._maybe_cleanup_image_seeds()"},{"line_number":1850,"context_line":""},{"line_number":1851,"context_line":"    def _check_license_enabled(self, valid_licenses,"},{"line_number":1852,"context_line":"                               license_to_check, capability):"}],"source_content_type":"text/x-python","patch_set":2,"id":"e2aacae8_81abe96f","line":1849,"updated":"2026-10-25 16:21:07.000000000","message":"_maybe_cleanup_image_seeds runs at the end of _update_volume_stats, on the get_volume_stats path. The first call in each IMAGE_SEED_CLEANUP_INTERVAL (3600s, line 3106) calls client.getVolumes() and walks every member (line 3118). That list is not required to publish pool stats. Please run cleanup from a separate periodic task, or after a seed operation, so a slow full-array list does not sit on the stats RPC.\n\nThis does not block on an in-progress seed build. Create and cleanup take the lock in disjoint cases, as described above.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":2776,"context_line":"                handled, seed_model_update \u003d ("},{"line_number":2777,"context_line":"                    self._maybe_clone_via_image_seed("},{"line_number":2778,"context_line":"                        volume, src_vref, vol_name))"},{"line_number":2779,"context_line":"                if handled:"},{"line_number":2780,"context_line":"                    return seed_model_update"},{"line_number":2781,"context_line":""},{"line_number":2782,"context_line":"                LOG.debug(\"Creating a clone of volume, using non-online copy.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"a52d2c39_8840d5c7","line":2779,"updated":"2026-10-25 16:21:07.000000000","message":"This return replaces create_volume(volume, perform_replica\u003dFalse) at line 2785. On the success path the boot volume never goes through that function.\n\ncreate_volume does three things this path does not:\n\nLines 2468–2532 write an OpenStack comment, including _name_id, on every API version. _get_online_clone_comment returns None when API_VERSION \u003e\u003d API_VERSION_2023 (line 2833). _image_seed_cache_enabled is true only in that same range (line 2878). Every seed-created Alletra MP boot volume therefore has no array comment. _update_comment tolerates an empty comment (line 3628); this is missing metadata, not a KeyError I can point at.\nLines 2499–2502 set vvs_name to _get_3par_vvs_name(cg_id) when group_id is set and the type is a consistent-group-snapshot type. _clone_boot_volume_from_seed uses type_info[\u0027vvs_name\u0027] (line 3068) and never applies that override. A larger-than-cache create into such a group is added to the type vvset, not the group vvset. The equal-size online branch already behaves this way (line 2724). The branch this return replaces does not.\nLines 2541–2545 call _add_vol_to_remote_group when the loaded group is replicated and the type is both consistent-group-snapshot and Tiramisu (hpe_tiramisu is set only at lines 2536–2538). The seed path never calls _add_vol_to_remote_group.\n_get_model_update is also called with hpe_tiramisu\u003d_volume_of_hpe_tiramisu_type(volume) (line 3099). create_volume sets that flag only for the consistent-group-snapshot case above. A larger Tiramisu volume that is not a group-snapshot type gets provider_location from the seed path and would not get it from line 2785.\n\nPlease build the boot volume with create_volume, or call the same group, comment, and remote-group code it calls.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":2888,"context_line":"        return days * 24 * 60 * 60"},{"line_number":2889,"context_line":""},{"line_number":2890,"context_line":"    def _image_seed_name(self, image_id, size):"},{"line_number":2891,"context_line":"        digest \u003d hashlib.sha1("},{"line_number":2892,"context_line":"            (\"%s:%s\" % (image_id, size)).encode(\"utf-8\")).hexdigest()"},{"line_number":2893,"context_line":"        return \"%s%s\" % (self.IMAGE_SEED_PREFIX, digest[:24])"},{"line_number":2894,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"306137f3_33046942","line":2891,"updated":"2026-10-25 16:21:07.000000000","message":"hashlib.sha1(...) does not pass usedforsecurity\u003dFalse. Name hashes elsewhere in Cinder do (cinder/volume/drivers/remotefs.py uses hashlib.md5(..., usedforsecurity\u003dFalse); the PowerFlex driver does the same). Please pass usedforsecurity\u003dFalse. This digest is only a volume name. I have not run this call on a FIPS interpreter; the flag is what those other name hashes already pass so a policy that rejects SHA-1 for security use does not raise here.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":2892,"context_line":"            (\"%s:%s\" % (image_id, size)).encode(\"utf-8\")).hexdigest()"},{"line_number":2893,"context_line":"        return \"%s%s\" % (self.IMAGE_SEED_PREFIX, digest[:24])"},{"line_number":2894,"context_line":""},{"line_number":2895,"context_line":"    def _is_image_cache_entry(self, vref):"},{"line_number":2896,"context_line":"        \"\"\"Return True if vref is a Cinder image-volume-cache entry.\"\"\""},{"line_number":2897,"context_line":"        check \u003d getattr(volume_utils, \u0027is_image_cache_entry\u0027, None)"},{"line_number":2898,"context_line":"        if check:"}],"source_content_type":"text/x-python","patch_set":2,"id":"52dedfe9_636b435f","line":2895,"updated":"2026-10-25 16:21:07.000000000","message":"volume_utils.is_image_cache_entry is on master (cinder/volume/volume_utils.py:1649). The getattr fallback and the Wallaby comment cannot run. Please call it directly and drop the cinder.db import this branch adds.\n\nThe real helper returns False unless src_vref is a Volume with _context (volume_utils.py:1660–1665). The image-cache path does pass that: _create_from_source_volume uses objects.Volume.get_by_id, and _from_db_object sets _context. The new tests mock the helper, so they do not cover that. Please add one test that calls the real function with a Volume and one with a plain dict.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":2918,"context_line":"            return False, None"},{"line_number":2919,"context_line":"        if self._volume_of_replicated_type(volume, hpe_tiramisu_check\u003dTrue):"},{"line_number":2920,"context_line":"            return False, None"},{"line_number":2921,"context_line":"        if self._client_conf.get(\u0027hpe3par_iscsi_chap_enabled\u0027):"},{"line_number":2922,"context_line":"            return False, None"},{"line_number":2923,"context_line":"        if not self._is_image_cache_entry(src_vref):"},{"line_number":2924,"context_line":"            return False, None"}],"source_content_type":"text/x-python","patch_set":2,"id":"e1cbed51_4f7ada44","line":2921,"updated":"2026-10-25 16:21:07.000000000","message":"hpe3par_iscsi_chap_enabled skips every seed clone on that backend. The flag is the backend iSCSI setting (line 134), not a property of this clone.\n\nThe equal-size decision is lines 2714–2717. Online copy is skipped only when backing-up is set and getVolumeMetaData(..., \u0027HPQ-cinder-CHAP-name\u0027) returned a value (lines 2694–2701), or when the type is replicated. A CHAP-enabled backend still online-copies a source that is not in backing-up. The larger-size branch this feature sits in does not read the backend CHAP flag at all.\n\nThe help text at line 153 documents the skip. Please point at the array failure that makes a seed clone unsafe whenever the backend flag is set. As written, bulk boot on a normal CHAP iSCSI backend never uses the cache.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":2945,"context_line":""},{"line_number":2946,"context_line":"            model_update \u003d self._clone_boot_volume_from_seed("},{"line_number":2947,"context_line":"                volume, vol_name, seed_name, type_info)"},{"line_number":2948,"context_line":"        except Exception as ex:"},{"line_number":2949,"context_line":"            # Never fail volume creation because of the optimization."},{"line_number":2950,"context_line":"            LOG.warning(\"Image seed clone failed for volume %(vol)s; falling \""},{"line_number":2951,"context_line":"                        \"back to standard clone. Reason: %(err)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"6ee76e58_c3500a1b","line":2948,"updated":"2026-10-25 16:21:07.000000000","message":"This handler returns (False, None) after _clone_boot_volume_from_seed may already have created vol_name.\n\n_copy_volume at line 3071 creates the destination. The InvalidInput handler at line 3088 deletes it and then raises CinderException. If that deleteVolume raises, this except still falls through to create_volume at line 2785, which raises Duplicate on HTTPConflict (lines 2564–2567).\n\nThe other vvset failure does not delete the volume at all. _add_volume_to_volume_set raises CinderException at line 2265 when vvs_name is None and creating or populating the per-volume vvset fails. Line 3087 catches only InvalidInput, so that exception hits this handler with the boot VV still on the array, and line 2785 then raises Duplicate.\n\nFall back only when the destination was not created. If it was created, delete it before falling back, and if the delete fails, raise.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":3009,"context_line":""},{"line_number":3010,"context_line":"        meta \u003d dict(meta)"},{"line_number":3011,"context_line":"        meta[\u0027last_used_at\u0027] \u003d now"},{"line_number":3012,"context_line":"        threading.Thread(target\u003dself._update_image_seed_comment,"},{"line_number":3013,"context_line":"                         args\u003d(seed_name, json.dumps(meta)),"},{"line_number":3014,"context_line":"                         daemon\u003dTrue).start()"},{"line_number":3015,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"eecd7b6a_2f9eb925","line":3012,"updated":"2026-10-25 16:21:07.000000000","message":"threading.Thread(..., daemon\u003dTrue) calls self.client.modifyVolume while create_cloned_volume is still using that same client. doc/source/contributor/threading.rst is the eventlet-to-native-thread transition; this thread is a greenthread or a real thread depending on how the process is running. The update is one WSAPI call, and lines 3002–3008 already limit it to once an hour per seed. Call _update_image_seed_comment on this request and delete the thread.\n\n_image_seed_touch_lock and _image_seed_touched (lines 2873–2874) are class attributes and nothing removes a name after the seed is deleted. The key includes the volume id, so two backends will not share a key. Please keep the dict on the instance anyway.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":3021,"context_line":"        \"\"\""},{"line_number":3022,"context_line":"        LOG.info(\"Building image seed %(seed)s from %(img)s at %(size)s GiB.\","},{"line_number":3023,"context_line":"                 {\u0027seed\u0027: seed_name, \u0027img\u0027: image_vol_name, \u0027size\u0027: size})"},{"line_number":3024,"context_line":"        task_id \u003d self._copy_volume("},{"line_number":3025,"context_line":"            image_vol_name, seed_name, cpg\u003dtype_info[\u0027cpg\u0027],"},{"line_number":3026,"context_line":"            snap_cpg\u003dtype_info[\u0027snap_cpg\u0027], tpvv\u003dtype_info[\u0027tpvv\u0027],"},{"line_number":3027,"context_line":"            tdvv\u003dtype_info[\u0027tdvv\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"2034d0e2_16cae8a0","line":3024,"updated":"2026-10-25 16:21:07.000000000","message":"_copy_volume is before the try at line 3030. The handler that deletes a failed seed does not run if copyVolume raises after the array has created the VV. If the later deleteVolume at line 3054 also fails, the name is left with no hpe_image_seed comment. The comment at line 3052 is what the code does: _cleanup_expired_image_seeds hits line 3129 and continues whenever the comment does not parse. The next boot sees None from _get_image_seed_meta, calls copyVolume onto that existing name, and falls back again.\n\nMove _copy_volume inside the cleanup try. If the name exists and the comment is not a seed, delete it before copying.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":3046,"context_line":"            meta_str \u003d self._build_image_seed_comment(image_id, size, now,"},{"line_number":3047,"context_line":"                                                      now)"},{"line_number":3048,"context_line":"            # The seed is only treated as ready once this comment exists."},{"line_number":3049,"context_line":"            self.client.modifyVolume(seed_name, {\u0027comment\u0027: meta_str})"},{"line_number":3050,"context_line":"        except Exception:"},{"line_number":3051,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3052,"context_line":"                # An untagged seed would never be reused nor expired."}],"source_content_type":"text/x-python","patch_set":2,"id":"7f35d6b0_dfd8cdbf","line":3049,"updated":"2026-10-25 16:21:07.000000000","message":"The comment at line 2862 and the help text at line 150 call the seed read-only. modifyVolume here writes only comment. Nothing sets readOnly. This driver does set \u0027readOnly\u0027: True on snapshots (line 3405).\n\nThe equal-size online path copies a one-hour temp snapshot (line 2721), not the source VV. Line 3071 copies the seed VV directly, and later boots do that in parallel because the clone is outside the lock. Please either set the seed read-only or copy from a snapshot of it, and confirm Alletra MP allows concurrent online copies from one source VV. Bug 1851512 is why the image-cache clone path cannot assume every backend serializes those copies.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"263fe13062b0574a5ae4693c742aae94b4eae502","unresolved":true,"context_lines":[{"line_number":3133,"context_line":"                continue"},{"line_number":3134,"context_line":"            lock_name \u003d \u0027alletramp-image-seed-%s\u0027 % name"},{"line_number":3135,"context_line":"            try:"},{"line_number":3136,"context_line":"                with coordination.COORDINATOR.get_lock(lock_name):"},{"line_number":3137,"context_line":"                    self.client.deleteVolume(name)"},{"line_number":3138,"context_line":"                LOG.info(\"Deleted expired image seed %(seed)s.\","},{"line_number":3139,"context_line":"                         {\u0027seed\u0027: name})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1bf4dbdf_c31dbb15","line":3136,"updated":"2026-10-25 16:21:07.000000000","message":"_clone_boot_volume_from_seed is outside the lock. The with ends at line 2944; copyVolume is at line 3071 and is not waited on (lines 3077–3078). _touch_image_seed runs only after that returns (line 2955), on another thread (line 3012), so the array comment is still the old last_used_at while the copy is running.\n\nCleanup decides expiry at lines 3131–3133, then deletes at line 3137 without reading the comment again. An idle seed that has passed hpe3par_image_seed_max_age_days can be deleted after a new boot has already called copyVolume and before the touch lands. Cinder has already been returned success from line 2958.\n\nRe-read the volume inside the lock. Delete only if the fresh last_used_at is still expired. Do not delete while a copy from this name is still active.\n\nThe subtraction at line 3132 is outside the per-volume try that starts at line 3135. A non-numeric last_used_at raises, _maybe_cleanup_image_seeds swallows it at line 3112, and _last_image_seed_cleanup was already set at line 3109, so the rest of the scan waits another hour.","commit_id":"0ef29baf74dbc215ceb96e2ed6619e13785ea4aa"}]}
