)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"51de9298ef0b2403fee08c8e8110aa1633910ed3","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Anthony Galica \u003canthony.galica@hitachivantara.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-11 14:50:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Hitachi] Bug fix: Introduce Host Group and target/WWN caching and"},{"line_number":8,"context_line":"batching to address severe performance issues (especially when using"},{"line_number":9,"context_line":"custom Host Groups, or creating several VMs at once)."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"b00434a5_28a76d2c","line":7,"updated":"2026-03-12 21:39:49.000000000","message":"Nit: limit subject to 50 chars\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure\n\nYou can file a launchpad bug for this issue, and then the description of what you\u0027re doing can be shorter, because you\u0027ll have a \"Closes-bug: #12345\" line in the commit message that people can follow for more info\n\nAlso, we usually require a release note with a bug fix, which would be good because you can describe for operators what your fix does (i.e., that the gazpacho driver shows better performance under some circumstances)","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"81069ad78b1e7f78e729f88fff11515eed6508c2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Anthony Galica \u003canthony.galica@hitachivantara.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-11 14:50:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Hitachi] Bug fix: Introduce Host Group and target/WWN caching and"},{"line_number":8,"context_line":"batching to address severe performance issues (especially when using"},{"line_number":9,"context_line":"custom Host Groups, or creating several VMs at once)."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"ad9a0f58_794b7639","line":7,"in_reply_to":"b00434a5_28a76d2c","updated":"2026-03-12 22:49:23.000000000","message":"Acknowledged","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"129a43fa3078326ce488bd279edfe819bf071882","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c952f43f_9403271b","updated":"2026-02-19 18:11:46.000000000","message":"recheck pep8","commit_id":"cf5d372ae0515131c4e3852bba50442bdd24ea05"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"d45a0fcdf5066859d6aa41591ae97e832ee6bcda","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0263133b_00c0b12c","updated":"2026-02-20 19:13:41.000000000","message":"Apply fixes for problems found by Silvan.  Excellent review, my friend.","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"642f0bd772ec3ad555aaeea4a96cd60d470e42de","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"47108b1c_9e120399","updated":"2026-02-20 15:55:25.000000000","message":"This looks like a good thing to do. The concept is sound but I think there are some implementation details (see below) to be addressed.\nI have a hard time seeing these, there might be more similars that I didn\u0027t get, unless I am wrong with the leakages anyways. 😊","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c64e9304b6d0967f2f315f6a5f4104f105b47644","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a9b51b95_90869c97","updated":"2026-02-20 13:56:03.000000000","message":"recheck devstack-plugin-nfs-tempest-full - 85 failures, but (a) look unrelated to this patch, and (b) look like resource issues on the host","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"07e4148397e9fa99102dd0b44f88b29d1100badf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3c66c43a_d774b551","updated":"2026-02-20 19:22:57.000000000","message":"Also updated version.","commit_id":"b0fe126e1408c0f209e3f4ae011f23ca6b480b80"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"6323f0a4fc665bd9f56140a12463b1019dcb0b55","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"27edbc6f_6e1c81a7","updated":"2026-02-20 23:14:50.000000000","message":"recheck py310 py313 unreproducible failures","commit_id":"b0fe126e1408c0f209e3f4ae011f23ca6b480b80"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"4b25dfa9d856d056f05860b96fc9ac8f6c44feed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"50f89976_dde9de9d","in_reply_to":"27edbc6f_6e1c81a7","updated":"2026-02-20 23:15:30.000000000","message":"This is completely bizarre. I can\u0027t get this one test to fail locally, but it failed here for both py310 and py313. While new MT capability has been added, it\u0027s not something that should cause a collision here / out of ordering mock requests since there\u0027s only a single port involved (so a single worker thread).  Going to run this again and might have to add debug logging here in gerrit if it fails again.","commit_id":"b0fe126e1408c0f209e3f4ae011f23ca6b480b80"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"144e7d0220b78f6e40c81fe99f13e778ce197e9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"110ccc34_cc1254ac","updated":"2026-02-24 07:47:53.000000000","message":"I believe I have gotten to the bottom of the issue.\n\nIt seems that something has changed since the updates for the UT system (mock object changs?), whereby 2024.1 does not fail the UT test, but current master does.\n\nI found a very subtle (but ultimately benign) bug that was causing more of a search than the UT expected, so it failed.  Still a mystery why it did not fail on older versions of devstack, but I have fixed the bug, validated UT, etc.","commit_id":"b6950fdd16e479b8ac54efd8cdc184114d0f14ba"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e078c633a1e154bbd52a4a2db7e86c9beaf2bcf3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9958ecfd_c3983f7d","in_reply_to":"110ccc34_cc1254ac","updated":"2026-02-24 08:14:39.000000000","message":"Reverted back to old devstack for giggles, and it fails there now too without using the new patch set.  Completely bizarre, and the mind boggles at what copying mishaps must have occurred for it to get missed.  I don\u0027t even see how it\u0027s possible since I had to fix several UT, etc, and adjust this file.","commit_id":"b6950fdd16e479b8ac54efd8cdc184114d0f14ba"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"39f659bdd16b78628c9a3673e9925b7213249a40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ac3d82d4_209fb3f1","updated":"2026-02-27 08:08:37.000000000","message":"Fix port leakage that somehow got missed from the fixes I made in Silvan\u0027s initial review.","commit_id":"b99f413935082260034ddbf9dd66ee88a224fc16"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"2bbe4262e6da2cd8e9e5c10605549d0fb6e52266","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"bde367db_c7fc290d","updated":"2026-03-05 23:25:08.000000000","message":"I\u0027m simplified the cache due to a bug found, and added several more unit tests.","commit_id":"576687fbbeecadbc553b79607e38e17e5bb97f99"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9045031b9c13cf449f211c59cdd41d126bf6480f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"774e54c1_6423c7c3","updated":"2026-03-05 09:02:19.000000000","message":"LGTM","commit_id":"576687fbbeecadbc553b79607e38e17e5bb97f99"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"006eb5235e25413ab294d59ffdbf7e8d846b129e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"10e320e5_2adffbdd","updated":"2026-03-05 16:34:07.000000000","message":"recheck devstack-plugin-nfs-tempest-full timeout","commit_id":"576687fbbeecadbc553b79607e38e17e5bb97f99"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9c5c02f3db4d60955c5e0548265a149901ee9a95","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"eefd98d3_8bd07e51","updated":"2026-03-06 14:10:50.000000000","message":"LGTM","commit_id":"d4ee94ea96a3aa0095984f3eb1e16b6d6f91098e"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"f32a10294bda2f9307137b4e037cc5d8fb749b6e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"82cf7511_c816aee2","updated":"2026-03-06 14:08:39.000000000","message":"recheck openstack-tox-pep8 py310, etc.  Bizarre backend failures.","commit_id":"d4ee94ea96a3aa0095984f3eb1e16b6d6f91098e"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"00a64f3f6d9b71f72e8cd5f8de855e9e37844581","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"877f4d33_afb1fb2f","updated":"2026-03-06 13:58:31.000000000","message":"recheck strange zuul failures","commit_id":"d4ee94ea96a3aa0095984f3eb1e16b6d6f91098e"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"026369543fb3229544825eb28c6dfa8e2b21e69b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1406ea1c_3dee68cd","updated":"2026-03-06 05:47:19.000000000","message":"recheck tons of failures unrelated to driver (seems Zuul is having an issue)","commit_id":"d4ee94ea96a3aa0095984f3eb1e16b6d6f91098e"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e250f83d551d44f95048c280cb5fe8cd8f48101a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"051a1730_f766ad8e","updated":"2026-03-06 16:45:23.000000000","message":"Respond to comments, minor updates.","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"8a627e27fdfc083e9716149666a83b5fc35eada3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"47647657_2ede90ea","updated":"2026-03-06 15:12:30.000000000","message":"Some concerns on the thread pool cleanup..please take a look.","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"4a8c489daa09b815210c075a4b4105576c180705","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"2afa791f_ebc65d60","updated":"2026-03-06 15:09:00.000000000","message":"big change, two things to check out, pls.","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e250f83d551d44f95048c280cb5fe8cd8f48101a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"dc2056af_e2a53064","in_reply_to":"2afa791f_ebc65d60","updated":"2026-03-06 16:45:23.000000000","message":"Yeah, sorry about that.\n\nQA found a subtle bug, and I decided to simplify the whole thing and make it more readable instead of continue to add more keys for making sure the cache can\u0027t get stale by the program itself.\n\nLooking at your comments - thank you again.","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a74ee036ecdfed2449e0fcb21d21257785e67ec8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"9ee072e6_f18a2bf5","updated":"2026-03-07 18:20:45.000000000","message":"Updated for pep8","commit_id":"e3f55e21082e776c5cfda145face26aee8680caa"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ee56a351506371a423aa31c01e9bace886501bfd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"c36d20a0_97bee6ce","updated":"2026-03-08 04:46:41.000000000","message":"pep8 update added new pep8 failure, lol.","commit_id":"1e66820176a992e2e10a03e62a065c37dbb6cd8c"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"9574bbec7ecc38d44f7233b87d9586c6884c4a52","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"6e263835_38b90ae9","updated":"2026-03-10 22:32:07.000000000","message":"I fixed some additional python hints similar to what Silvan found earlier.","commit_id":"9902d7ec05307a36e6322ad33ca3e94f5e362620"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"81069ad78b1e7f78e729f88fff11515eed6508c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"2914babe_62588163","updated":"2026-03-12 22:49:23.000000000","message":"Acknowledging Brian\u0027s comments.","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"6ba6e7cd44022193e16bfddaefe689d35fdb6a7d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"82538122_80182a7a","updated":"2026-03-13 11:46:41.000000000","message":"I agree with Brian\u0027s comments, patch looks good, really nice to see collaboration - thanks to all.","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"51de9298ef0b2403fee08c8e8110aa1633910ed3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":20,"id":"f739e2f3_b6df874d","updated":"2026-03-12 21:39:49.000000000","message":"See comment inline about the commit message.  I\u0027m not going to hold this patch up over that, but if you need to push a revision, please address my comments.\n\nVery nice collaboration among driver maintainers (particularly Silvan, but also jayaanand and annop) to review this patch.\n\nCode and tests LGTM; it is smart to put this behind an option gate so if there\u0027s a problem, the driver just goes back to using the old HostConnectorSearcher that\u0027s been around for a while.  The option defaults to True, however, so I think you definitely need a release note with an \"upgrade\" section to document for operators that (a) the new caching facility exists, (b) it\u0027s enabled by default, and (c) how to turn it off for \"legacy\" behavior.  That can be done as a followup (since it will be doc-only), unless you need to push a new patch set on this review.\n\nAlso, third party CI has passed; since the CachingHostConnectorSearcher is enabled by default, it\u0027s been exercised a bit by tempest, so we have some confidence that this patch doesn\u0027t cause a regression.","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"2da3c8ef750c171d8f642d0a985510cc788d4169","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"62459b66_3550873a","updated":"2026-03-13 22:26:01.000000000","message":"recheck devstack-plugin-nfs-tempest-full failing likely due to all the traffic","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"d29e2f619f3468d8f1a47806e7c17741a4813c00","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"57c4215c_d3a5d446","updated":"2026-03-13 17:36:14.000000000","message":"recheck tempest-integrated-storage","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"81069ad78b1e7f78e729f88fff11515eed6508c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"b8a30bc4_976d5d88","in_reply_to":"f739e2f3_b6df874d","updated":"2026-03-12 22:49:23.000000000","message":"Understood - if this patch merges I will create a follow up doc patch.  Otherwise I will attach it here.  Thank you for your review! (also to the others, as I know this is a gigantic patch).","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"}],"cinder/volume/drivers/hitachi/hbsd_rest.py":[{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"642f0bd772ec3ad555aaeea4a96cd60d470e42de","unresolved":true,"context_lines":[{"line_number":891,"context_line":"            return None"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"        futures \u003d []"},{"line_number":894,"context_line":"        for port, gid in targets[\u0027list\u0027][head:]:"},{"line_number":895,"context_line":"            # When multipath is configured, Nova compute expects that"},{"line_number":896,"context_line":"            # target_lun define the same value in all storage target."},{"line_number":897,"context_line":"            # Therefore, it should use same value of lun in other target."},{"line_number":898,"context_line":"            future \u003d self.request_thread_pool_executor.submit("},{"line_number":899,"context_line":"                _worker, ldev, port, gid, lun)"},{"line_number":900,"context_line":"            futures.append(future)"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"        for future in futures:"},{"line_number":903,"context_line":"            result \u003d future.result()"},{"line_number":904,"context_line":"            if result is not None:"},{"line_number":905,"context_line":"                targets[\u0027lun\u0027][port] \u003d True"},{"line_number":906,"context_line":"                raise_err \u003d False"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        if raise_err:"},{"line_number":909,"context_line":"            msg \u003d self.output_log("},{"line_number":910,"context_line":"                MSG.CONNECT_VOLUME_FAILED,"}],"source_content_type":"text/x-python","patch_set":4,"id":"cb9c0d61_f8343495","line":907,"range":{"start_line":894,"start_character":1,"end_line":907,"end_character":0},"updated":"2026-02-20 15:55:25.000000000","message":"I think the variable \u0027port\u0027 is initialised in the else path of the first if clause or on the first loop run of the first for loop. It then retains the last value it used in the first for loop in this block. It then is used in the second for loop but the value is not clear, no? It will contain the last port value from the first for loop and I do not think that is intended in here?","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"d45a0fcdf5066859d6aa41591ae97e832ee6bcda","unresolved":false,"context_lines":[{"line_number":891,"context_line":"            return None"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"        futures \u003d []"},{"line_number":894,"context_line":"        for port, gid in targets[\u0027list\u0027][head:]:"},{"line_number":895,"context_line":"            # When multipath is configured, Nova compute expects that"},{"line_number":896,"context_line":"            # target_lun define the same value in all storage target."},{"line_number":897,"context_line":"            # Therefore, it should use same value of lun in other target."},{"line_number":898,"context_line":"            future \u003d self.request_thread_pool_executor.submit("},{"line_number":899,"context_line":"                _worker, ldev, port, gid, lun)"},{"line_number":900,"context_line":"            futures.append(future)"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"        for future in futures:"},{"line_number":903,"context_line":"            result \u003d future.result()"},{"line_number":904,"context_line":"            if result is not None:"},{"line_number":905,"context_line":"                targets[\u0027lun\u0027][port] \u003d True"},{"line_number":906,"context_line":"                raise_err \u003d False"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        if raise_err:"},{"line_number":909,"context_line":"            msg \u003d self.output_log("},{"line_number":910,"context_line":"                MSG.CONNECT_VOLUME_FAILED,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9708c45f_6373af91","line":907,"range":{"start_line":894,"start_character":1,"end_line":907,"end_character":0},"in_reply_to":"cb9c0d61_f8343495","updated":"2026-02-20 19:13:41.000000000","message":"Wow, *great* catch!  It should be targets[\u0027lun\u0027][result].","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"642f0bd772ec3ad555aaeea4a96cd60d470e42de","unresolved":true,"context_lines":[{"line_number":969,"context_line":"                LOG.debug("},{"line_number":970,"context_line":"                    \u0027Deleted logical unit path of the specified logical \u0027"},{"line_number":971,"context_line":"                    \u0027device. (LDEV: %(ldev)s, host group: %(target)s)\u0027,"},{"line_number":972,"context_line":"                    {\u0027ldev\u0027: ldev, \u0027target\u0027: target})"},{"line_number":973,"context_line":"                return None"},{"line_number":974,"context_line":"            except Exception as ex:"},{"line_number":975,"context_line":"                return ex"}],"source_content_type":"text/x-python","patch_set":4,"id":"48e76342_6220a637","line":972,"range":{"start_line":972,"start_character":45,"end_line":972,"end_character":51},"updated":"2026-02-20 15:55:25.000000000","message":"This also looks like it might suffer from value leakage. I think depending on the timing of the thread execution and the log.debug method this may print values of target that are from other worker instances as target is not explicitly passed into the _worker but referenced implicitly.","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"d45a0fcdf5066859d6aa41591ae97e832ee6bcda","unresolved":false,"context_lines":[{"line_number":969,"context_line":"                LOG.debug("},{"line_number":970,"context_line":"                    \u0027Deleted logical unit path of the specified logical \u0027"},{"line_number":971,"context_line":"                    \u0027device. (LDEV: %(ldev)s, host group: %(target)s)\u0027,"},{"line_number":972,"context_line":"                    {\u0027ldev\u0027: ldev, \u0027target\u0027: target})"},{"line_number":973,"context_line":"                return None"},{"line_number":974,"context_line":"            except Exception as ex:"},{"line_number":975,"context_line":"                return ex"}],"source_content_type":"text/x-python","patch_set":4,"id":"2e2b5ae5_71be6ee3","line":972,"range":{"start_line":972,"start_character":45,"end_line":972,"end_character":51},"in_reply_to":"48e76342_6220a637","updated":"2026-02-20 19:13:41.000000000","message":"Please review more of my patches, sir.  Another great catch.  Should have been \u0027gid\u0027 instead of \u0027target\u0027.","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"6ca7351e544d6de3ce6c34f9b5025b8e50ed2f14","unresolved":true,"context_lines":[{"line_number":902,"context_line":"        for future in futures:"},{"line_number":903,"context_line":"            result \u003d future.result()"},{"line_number":904,"context_line":"            if result is not None:"},{"line_number":905,"context_line":"                targets[\u0027lun\u0027][port] \u003d True"},{"line_number":906,"context_line":"                raise_err \u003d False"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        if raise_err:"}],"source_content_type":"text/x-python","patch_set":9,"id":"00dfa3de_59de9ea4","line":905,"updated":"2026-02-27 07:56:23.000000000","message":"port is last iterated value from ln#894 and earlier it is at 0 index at ln#880. Is it correct? can you get port from result and use?","commit_id":"e99900205a6fdf5fd1314c175ea489c613beb4f7"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"39f659bdd16b78628c9a3673e9925b7213249a40","unresolved":false,"context_lines":[{"line_number":902,"context_line":"        for future in futures:"},{"line_number":903,"context_line":"            result \u003d future.result()"},{"line_number":904,"context_line":"            if result is not None:"},{"line_number":905,"context_line":"                targets[\u0027lun\u0027][port] \u003d True"},{"line_number":906,"context_line":"                raise_err \u003d False"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        if raise_err:"}],"source_content_type":"text/x-python","patch_set":9,"id":"0f24d7cc_46e46ee4","line":905,"in_reply_to":"00dfa3de_59de9ea4","updated":"2026-02-27 08:08:37.000000000","message":"Yeah, Silvan caught this one too.  I went and modified it, but either I neglected to push the change or it got undone somehow.  It  should be ```targets[\u0027lun\u0027][result]```.  Thanks for pointing this out again.","commit_id":"e99900205a6fdf5fd1314c175ea489c613beb4f7"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"8a627e27fdfc083e9716149666a83b5fc35eada3","unresolved":true,"context_lines":[{"line_number":332,"context_line":"            self.connector_searcher \u003d utils.HostConnectorSearcher("},{"line_number":333,"context_line":"                self.connector_searcher_query)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def __del__(self):"},{"line_number":336,"context_line":"        \"\"\"Shut down the driver.\"\"\""},{"line_number":337,"context_line":"        self.request_thread_pool_executor.shutdown(wait\u003dFalse,"},{"line_number":338,"context_line":"                                                   cancel_futures\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"195dd8bc_bdf414ca","line":335,"updated":"2026-03-06 15:12:30.000000000","message":"Is the __del__ method guaranteed to run? If not, the pool executor doesn\u0027t get cleaned?","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e250f83d551d44f95048c280cb5fe8cd8f48101a","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            self.connector_searcher \u003d utils.HostConnectorSearcher("},{"line_number":333,"context_line":"                self.connector_searcher_query)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def __del__(self):"},{"line_number":336,"context_line":"        \"\"\"Shut down the driver.\"\"\""},{"line_number":337,"context_line":"        self.request_thread_pool_executor.shutdown(wait\u003dFalse,"},{"line_number":338,"context_line":"                                                   cancel_futures\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"f8b41468_1e1a2f32","line":335,"in_reply_to":"195dd8bc_bdf414ca","updated":"2026-03-06 16:45:23.000000000","message":"Hi Anoop!  It gets called when the object goes out of scope and hits the garbage collector.  There is no reason to shut it down otherwise while the driver is still in use.  However, if you have a better suggestion you can let me know!","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"51de9298ef0b2403fee08c8e8110aa1633910ed3","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    def __del__(self):"},{"line_number":336,"context_line":"        \"\"\"Shut down the driver.\"\"\""},{"line_number":337,"context_line":"        self.request_thread_pool_executor.shutdown(wait\u003dFalse,"},{"line_number":338,"context_line":"                                                   cancel_futures\u003dTrue)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def do_setup(self, context):"},{"line_number":341,"context_line":"        if hasattr("}],"source_content_type":"text/x-python","patch_set":20,"id":"d1c5df79_0106bd90","line":338,"updated":"2026-03-12 21:39:49.000000000","message":"the parent class doesn\u0027t define a ``__del__``, so no worries about not calling it","commit_id":"2696d0b9c77d720c332931ef219b0bdf102bd955"}],"cinder/volume/drivers/hitachi/hbsd_rest_fc.py":[{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"642f0bd772ec3ad555aaeea4a96cd60d470e42de","unresolved":true,"context_lines":[{"line_number":249,"context_line":"                    if groupAndMeta is not None:"},{"line_number":250,"context_line":"                        group, meta \u003d groupAndMeta"},{"line_number":251,"context_line":"                        return (port, group, meta)"},{"line_number":252,"context_line":"                    return None"},{"line_number":253,"context_line":"            except Exception as ex:"},{"line_number":254,"context_line":"                return ex"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3ad8226a_d4fddfd0","line":252,"range":{"start_line":252,"start_character":0,"end_line":252,"end_character":31},"updated":"2026-02-20 15:55:25.000000000","message":"This looks like it will always return on the first loop iteration, I think this needs to be outdented? If not the for loop doesn\u0027t make much sense, no?","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"d45a0fcdf5066859d6aa41591ae97e832ee6bcda","unresolved":false,"context_lines":[{"line_number":249,"context_line":"                    if groupAndMeta is not None:"},{"line_number":250,"context_line":"                        group, meta \u003d groupAndMeta"},{"line_number":251,"context_line":"                        return (port, group, meta)"},{"line_number":252,"context_line":"                    return None"},{"line_number":253,"context_line":"            except Exception as ex:"},{"line_number":254,"context_line":"                return ex"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"abd44e55_ec02a1fc","line":252,"range":{"start_line":252,"start_character":0,"end_line":252,"end_character":31},"in_reply_to":"3ad8226a_d4fddfd0","updated":"2026-02-20 19:13:41.000000000","message":"Agreed.","commit_id":"725e338ecdd2e21dd616f41128eed7be142949a3"}],"cinder/volume/drivers/hitachi/hbsd_utils.py":[{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"4a8c489daa09b815210c075a4b4105576c180705","unresolved":true,"context_lines":[{"line_number":1326,"context_line":"    # We may want to change that in the future, but for the time being it"},{"line_number":1327,"context_line":"    # will prevent the storage API from being overwhelmed on big searches."},{"line_number":1328,"context_line":"    @coordination.synchronized("},{"line_number":1329,"context_line":"        \u0027{self._storage_id}-{port}-{targetOrWwns}\u0027)"},{"line_number":1330,"context_line":"    def _locked_search(self, port: str, targetOrWwns: list[str],"},{"line_number":1331,"context_line":"                       groupNameHints: list[str]) -\u003e int | None:"},{"line_number":1332,"context_line":"        \u0027\u0027\u0027Perform the search with a lock.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"5468e29f_67835fc6","line":1329,"range":{"start_line":1329,"start_character":36,"end_line":1329,"end_character":48},"updated":"2026-03-06 15:09:00.000000000","message":"Thought: targetOrWwns is a list from what I see. Are you sure this list is always in the same order? If not the locking might fail because two lists with the same but differently sorted members would create different locks.","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e250f83d551d44f95048c280cb5fe8cd8f48101a","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"    # We may want to change that in the future, but for the time being it"},{"line_number":1327,"context_line":"    # will prevent the storage API from being overwhelmed on big searches."},{"line_number":1328,"context_line":"    @coordination.synchronized("},{"line_number":1329,"context_line":"        \u0027{self._storage_id}-{port}-{targetOrWwns}\u0027)"},{"line_number":1330,"context_line":"    def _locked_search(self, port: str, targetOrWwns: list[str],"},{"line_number":1331,"context_line":"                       groupNameHints: list[str]) -\u003e int | None:"},{"line_number":1332,"context_line":"        \u0027\u0027\u0027Perform the search with a lock.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"fefa910d_c6cf9489","line":1329,"range":{"start_line":1329,"start_character":36,"end_line":1329,"end_character":48},"in_reply_to":"5468e29f_67835fc6","updated":"2026-03-06 16:45:23.000000000","message":"Great question!\n\nI think it\u0027s safe as the ordering would come from Cinder, and it\u0027s merely there to reduce congestion (not as MT data loss prevention).  \n\nHowever, as I type that out I realize it\u0027s a dumb answer and I shouldn\u0027t rely on external forces to be accurate in that way -- on the plus side, I think it\u0027s basically benign as the lock doesn\u0027t need to be that specific anyway (less specific should be better for congestion since it\u0027s a search on the same port).\n\nSo, I\u0027ve changed the lock to have some static text (so as not to collide with future potential locks in unrelated areas), and removed the targetOrWwns part of it.","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"4a8c489daa09b815210c075a4b4105576c180705","unresolved":true,"context_lines":[{"line_number":1328,"context_line":"    @coordination.synchronized("},{"line_number":1329,"context_line":"        \u0027{self._storage_id}-{port}-{targetOrWwns}\u0027)"},{"line_number":1330,"context_line":"    def _locked_search(self, port: str, targetOrWwns: list[str],"},{"line_number":1331,"context_line":"                       groupNameHints: list[str]) -\u003e int | None:"},{"line_number":1332,"context_line":"        \u0027\u0027\u0027Perform the search with a lock.\u0027\u0027\u0027"},{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"        # Once we have our search lock we\u0027ll do a lookup"}],"source_content_type":"text/x-python","patch_set":15,"id":"9352b72f_263737b4","line":1331,"range":{"start_line":1331,"start_character":50,"end_line":1331,"end_character":64},"updated":"2026-03-06 15:09:00.000000000","message":"The return value is the value of groupAndMeta, which in turn is populated by self._lookup , the latter showing a tuple as a return type. Thus it may return the mentioned tuple which in turn differs from int | None. This needs to be aligned.","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e250f83d551d44f95048c280cb5fe8cd8f48101a","unresolved":false,"context_lines":[{"line_number":1328,"context_line":"    @coordination.synchronized("},{"line_number":1329,"context_line":"        \u0027{self._storage_id}-{port}-{targetOrWwns}\u0027)"},{"line_number":1330,"context_line":"    def _locked_search(self, port: str, targetOrWwns: list[str],"},{"line_number":1331,"context_line":"                       groupNameHints: list[str]) -\u003e int | None:"},{"line_number":1332,"context_line":"        \u0027\u0027\u0027Perform the search with a lock.\u0027\u0027\u0027"},{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"        # Once we have our search lock we\u0027ll do a lookup"}],"source_content_type":"text/x-python","patch_set":15,"id":"a891a877_dfd7902d","line":1331,"range":{"start_line":1331,"start_character":50,"end_line":1331,"end_character":64},"in_reply_to":"9352b72f_263737b4","updated":"2026-03-06 16:45:23.000000000","message":"Acknowledged","commit_id":"e7b831bd685b3298521fc65c9fecab88539dd116"}]}
