)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"8ceac159febe1e36573401dea3dfce4b5d348659","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Anthony Galica \u003canthony.galica@hitachivantara.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-08-18 20:36:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Hitachi] Remove Eventlet"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I369ac232b47c713722273242118ac81ed608b934"},{"line_number":10,"context_line":"Signed-off-by: anthonygamboa \u003canthony.gamboa@hitachivantara.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"f100ce22_4925f1c9","line":7,"updated":"2026-08-19 13:16:15.000000000","message":"Commit message can add details. A one liner commit message does not help.","commit_id":"c1ef7a93d08851a36dcf10efdcd96dcc655af8bc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"b50f9830a0ba89a6de09ff4649a8d500b15eb735","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Anthony Galica \u003canthony.galica@hitachivantara.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-08-18 20:36:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Hitachi] Remove Eventlet"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I369ac232b47c713722273242118ac81ed608b934"},{"line_number":10,"context_line":"Signed-off-by: anthonygamboa \u003canthony.gamboa@hitachivantara.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5c2cd7c4_4ab9859e","line":7,"in_reply_to":"f100ce22_4925f1c9","updated":"2026-08-19 14:21:27.000000000","message":"Acknowledged","commit_id":"c1ef7a93d08851a36dcf10efdcd96dcc655af8bc"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"5d2345fab95d10b731479c49811da0e69303870c","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Hitachi] Remove Eventlet"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch removes eventlet usage currently in the Hitachi Driver. This"},{"line_number":10,"context_line":"includes greenthread.spawn() and greenthread.time() calls."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I369ac232b47c713722273242118ac81ed608b934"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"4b5fa008_61677f52","line":9,"updated":"2026-08-24 11:21:52.000000000","message":"The subject and body do not match the scope.\n\nThis patch replaces greenthread.spawn() calls in\nhbsd_replication.py. It does not remove all Eventlet usage from the\nHitachi driver in this patch set/base:\n\n  cinder/volume/drivers/hitachi/hbsd_rest_api.py\n      from eventlet import greenthread\n\n      greenthread.sleep(idle)\n\nAlso, “greenthread.time()” is not the API replaced by this patch.\n\nPlease either:\n\n1. rebase/depend on the existing volume-driver sleep-removal change\n   that converts hbsd_rest_api.py;\n2. include that conversion here if it is not already covered; or\n3. retitle this change to “[Hitachi] Replace greenthread.spawn in\n   replication” and update the commit body to describe the exact\n   scope.\n\nAs written, “[Hitachi] Remove Eventlet” overstates changes.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"42004995163ac16c21c4f3d2d6e95c2f8aed59c9","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Hitachi] Remove Eventlet"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch removes eventlet usage currently in the Hitachi Driver. This"},{"line_number":10,"context_line":"includes greenthread.spawn() and greenthread.time() calls."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I369ac232b47c713722273242118ac81ed608b934"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"9d2a751c_2304a4e9","line":9,"in_reply_to":"4b5fa008_61677f52","updated":"2026-08-24 20:21:01.000000000","message":"Hi @jayaanand.borra@netapp.com,\n\nI\u0027ve now checked multiple times. hbsd_rest_api.py does not have anything greenthread in it on this patch.\n\nThis last time:\n1. I validated by going into edit mode and opening the file\n2. I validated by downloading the entire patch\n\nWhere are you seeing this?\n\nAs far as greenthread.time(), that was a typo and has been fixed.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"390aaaba59495b790f2e39e882e0d2864f02586a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Hitachi] Remove Eventlet"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch removes eventlet usage currently in the Hitachi Driver. This"},{"line_number":10,"context_line":"includes greenthread.spawn() and greenthread.time() calls."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I369ac232b47c713722273242118ac81ed608b934"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"934bcd0b_db8a9365","line":9,"in_reply_to":"9d2a751c_2304a4e9","updated":"2026-08-25 10:39:45.000000000","message":"You are right that this change does not modify hbsd_rest_api.py, so the patch download will not show greenthread there.\n\nI fetched this revision’s hbsd_rest_api.py: it already uses time.sleep (line 382). That came from 950695, which is in this parent. My earlier comment was about Eventlet remaining in the Hitachi tree / a local tree that still has greenthread in rest_api; it does not apply to PS14’s parent. Sorry for the confusion.\n\nPlease still fix the body. This diff does not remove greenthread.sleep() — 950695 already did. This patch replaces greenthread.spawn() in hbsd_replication.py and switches the REST executor to futurist with cancel_futures\u003dFalse. Writing sleep() instead of time() in the commit message is not the right correction.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"8ceac159febe1e36573401dea3dfce4b5d348659","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"57aa372d_3ca2889e","updated":"2026-08-19 13:16:15.000000000","message":"Please check the comment around commit message. code wise looks clean.","commit_id":"c1ef7a93d08851a36dcf10efdcd96dcc655af8bc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"3449771a6d313434a4621dcad8836298402b8be6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"52ad365d_8a2f9295","updated":"2026-08-18 20:52:32.000000000","message":"Thanks for your review @jayaanand.borra@netapp.com!  I\u0027ve made some adjustments.","commit_id":"c1ef7a93d08851a36dcf10efdcd96dcc655af8bc"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"10a29351f77cbbc86d10f573495e9146edc614d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"aea8a7f8_fb5a715f","updated":"2026-08-20 15:44:37.000000000","message":"LGTM","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"b50f9830a0ba89a6de09ff4649a8d500b15eb735","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"9d3462be_feb8269e","updated":"2026-08-19 14:21:27.000000000","message":"Thanks Anoop, I\u0027ve made it more clear.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"365f1390355ff4c141802da42fe2bf6ddc8a8cea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"267fe896_c46c1fad","updated":"2026-08-21 15:11:21.000000000","message":"looks good, we need this for the other eventlet work.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"5d2345fab95d10b731479c49811da0e69303870c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"6b377c17_1bb1e417","updated":"2026-08-24 11:21:52.000000000","message":"please check these comments","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"42004995163ac16c21c4f3d2d6e95c2f8aed59c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"371102be_111f7949","updated":"2026-08-24 20:21:01.000000000","message":"Thanks for the review @jayaanand.borra@netapp.com.\n\nPlease see comments","commit_id":"85005681e2356da1803b20c04a4664f22a7ab3b5"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"6c745ce35938252b911c2c04b5cc57cdcb97d32f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"72620928_c07c57b6","updated":"2026-08-26 14:10:47.000000000","message":"I somehow managed to put the new tests into the actual driver file (!!!).  Score 0 for hand-edits I guess.","commit_id":"2c2a083841118c8f3ceb9a88c608696c378b44dd"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"7ec207851547af0a291fdddd24e893422285ea8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"52426982_de196d14","updated":"2026-08-27 23:59:52.000000000","message":"@anoop.shukla@netapp.com: approving this since the C is passing now","commit_id":"2d609bc0cb11ba4a37ce4baf630cb75f24368868"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"6c695bffb376ce117781f14b260cc04d1a194e71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"5f60c745_9bcbb3ca","updated":"2026-08-26 14:33:14.000000000","message":"Good stuff.","commit_id":"2d609bc0cb11ba4a37ce4baf630cb75f24368868"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"55123f5eccb5f8c3d4a544f3ffeb27ca9a2d7993","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"0f201db3_715f7bb0","updated":"2026-08-26 17:19:20.000000000","message":"Needs a successful ZUUL run. Otherwise the code looks good to me.","commit_id":"2d609bc0cb11ba4a37ce4baf630cb75f24368868"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"27ae58ff31d9f5270f45b49e649cef1734342a8d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"3c4d992a_50866e91","in_reply_to":"0f201db3_715f7bb0","updated":"2026-08-26 21:44:17.000000000","message":"Hi @anoop.shukla@netapp.com Zuul has succeeded","commit_id":"2d609bc0cb11ba4a37ce4baf630cb75f24368868"}],"cinder/volume/drivers/hitachi/hbsd_replication.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from futurist import ThreadPoolExecutor"},{"line_number":23,"context_line":"import time"},{"line_number":24,"context_line":"from oslo_config import cfg"},{"line_number":25,"context_line":"from oslo_log import log as logging"},{"line_number":26,"context_line":"from oslo_utils import excutils"}],"source_content_type":"text/x-python","patch_set":2,"id":"65ac723e_767831a6","line":23,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F811 redefinition of unused \u0027time\u0027 from line 20","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from futurist import ThreadPoolExecutor"},{"line_number":23,"context_line":"import time"},{"line_number":24,"context_line":"from oslo_config import cfg"},{"line_number":25,"context_line":"from oslo_log import log as logging"},{"line_number":26,"context_line":"from oslo_utils import excutils"}],"source_content_type":"text/x-python","patch_set":2,"id":"333dabb6_7740a97a","line":23,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: I100 Import statements are in the wrong order. \u0027import time\u0027 should be before \u0027from futurist import ThreadPoolExecutor\u0027 and in a different group.","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from futurist import ThreadPoolExecutor"},{"line_number":23,"context_line":"import time"},{"line_number":24,"context_line":"from oslo_config import cfg"},{"line_number":25,"context_line":"from oslo_log import log as logging"},{"line_number":26,"context_line":"from oslo_utils import excutils"}],"source_content_type":"text/x-python","patch_set":2,"id":"967a84bb_981b9600","line":23,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: I201 Missing newline between import groups. \u0027import time\u0027 is identified as Stdlib and \u0027from futurist import ThreadPoolExecutor\u0027 is identified as Third Party.","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from futurist import ThreadPoolExecutor"},{"line_number":23,"context_line":"import time"},{"line_number":24,"context_line":"from oslo_config import cfg"},{"line_number":25,"context_line":"from oslo_log import log as logging"},{"line_number":26,"context_line":"from oslo_utils import excutils"},{"line_number":27,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":2,"id":"6443ec0e_db2d8333","line":24,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: H306: imports not in alphabetical order (time, oslo_config.cfg)","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from futurist import ThreadPoolExecutor"},{"line_number":23,"context_line":"import time"},{"line_number":24,"context_line":"from oslo_config import cfg"},{"line_number":25,"context_line":"from oslo_log import log as logging"},{"line_number":26,"context_line":"from oslo_utils import excutils"},{"line_number":27,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":2,"id":"a24a3ce2_f66286a3","line":24,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: I201 Missing newline between import groups. \u0027from oslo_config import cfg\u0027 is identified as Third Party and \u0027import time\u0027 is identified as Stdlib.","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":"MSG \u003d utils.HBSDMsg"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"def _check_rep_ldev(self, volume, operation):"},{"line_number":279,"context_line":"    if ((\u0027group_id\u0027 in volume and volume.group_id) or"},{"line_number":280,"context_line":"            (\u0027consistencygroup_id\u0027 in volume and volume.consistencygroup_id)):"},{"line_number":281,"context_line":"        group \u003d (volume.group_id if \u0027group_id\u0027 in volume and"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f5dc5c2_de3541fb","line":278,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        pool_id \u003d self.rep_secondary.storage_info[\u0027pool_id\u0027][0]"},{"line_number":655,"context_line":"        ldev_range \u003d self.rep_secondary.storage_info[\u0027ldev_range\u0027]"},{"line_number":656,"context_line":"        qos_specs \u003d utils.get_qos_specs_from_volume(volume)"},{"line_number":657,"context_line":"        thread \u003d spawn("},{"line_number":658,"context_line":"            self.rep_secondary.create_ldev, volume.size, extra_specs,"},{"line_number":659,"context_line":"            pool_id, ldev_range, qos_specs\u003dqos_specs)"},{"line_number":660,"context_line":"        if pvol is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"885ded4c_866ca13c","line":657,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F821 undefined name \u0027spawn\u0027","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                else:"},{"line_number":685,"context_line":"                    instance.delete_ldev(vol)"},{"line_number":686,"context_line":"            self.raise_error(msg)"},{"line_number":687,"context_line":"        thread \u003d spawn("},{"line_number":688,"context_line":"            self.rep_secondary.modify_ldev_name,"},{"line_number":689,"context_line":"            svol, volume[\u0027id\u0027].replace(\"-\", \"\"))"},{"line_number":690,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"f8ace746_749a10e6","line":687,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F821 undefined name \u0027spawn\u0027","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":951,"context_line":"        svol \u003d None"},{"line_number":952,"context_line":"        pvol, svol \u003d self._create_rep_ldev(volume, extra_specs, rep_type, pvol)"},{"line_number":953,"context_line":"        try:"},{"line_number":954,"context_line":"            thread \u003d spawn("},{"line_number":955,"context_line":"                self.rep_secondary.initialize_pair_connection, svol)"},{"line_number":956,"context_line":"            try:"},{"line_number":957,"context_line":"                self.rep_primary.initialize_pair_connection(pvol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3eeda994_fe952938","line":954,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F821 undefined name \u0027spawn\u0027","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"        # Delete LDEVs if they are valid."},{"line_number":1220,"context_line":"        thread \u003d None"},{"line_number":1221,"context_line":"        if not svol_is_invalid:"},{"line_number":1222,"context_line":"            thread \u003d spawn("},{"line_number":1223,"context_line":"                self.rep_secondary.delete_volume, volume)"},{"line_number":1224,"context_line":"        try:"},{"line_number":1225,"context_line":"            if not pvol_is_invalid:"}],"source_content_type":"text/x-python","patch_set":2,"id":"c0bab319_baa5f49b","line":1222,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F821 undefined name \u0027spawn\u0027","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"                self.driver_info[\u0027mirror_attr\u0027],"},{"line_number":1246,"context_line":"                pair_info[\u0027svol_info\u0027][0][\u0027rep_type\u0027] !\u003d"},{"line_number":1247,"context_line":"                self.driver_info[\u0027mirror_attr\u0027])"},{"line_number":1248,"context_line":"            th \u003d spawn(self.rep_secondary.delete_ldev,"},{"line_number":1249,"context_line":"                                   pair_info[\u0027svol_info\u0027][0][\u0027ldev\u0027])"},{"line_number":1250,"context_line":"            try:"},{"line_number":1251,"context_line":"                self.rep_primary.delete_ldev(ldev)"}],"source_content_type":"text/x-python","patch_set":2,"id":"a4dad418_f4fb4f88","line":1248,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F821 undefined name \u0027spawn\u0027","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"                pair_info[\u0027svol_info\u0027][0][\u0027rep_type\u0027] !\u003d"},{"line_number":1247,"context_line":"                self.driver_info[\u0027mirror_attr\u0027])"},{"line_number":1248,"context_line":"            th \u003d spawn(self.rep_secondary.delete_ldev,"},{"line_number":1249,"context_line":"                                   pair_info[\u0027svol_info\u0027][0][\u0027ldev\u0027])"},{"line_number":1250,"context_line":"            try:"},{"line_number":1251,"context_line":"                self.rep_primary.delete_ldev(ldev)"},{"line_number":1252,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7439fe4c_e302f1df","line":1249,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":1505,"context_line":"        self._delete_rep_pair("},{"line_number":1506,"context_line":"            ldev, pair_info[\u0027svol_info\u0027][0][\u0027ldev\u0027],"},{"line_number":1507,"context_line":"            rep_type \u003d\u003d self.driver_info[\u0027mirror_attr\u0027], delete_journal\u003dFalse)"},{"line_number":1508,"context_line":"        thread \u003d spawn("},{"line_number":1509,"context_line":"            self.rep_secondary.extend_volume, volume, new_size)"},{"line_number":1510,"context_line":"        try:"},{"line_number":1511,"context_line":"            self.rep_primary.extend_volume(volume, new_size)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9e3adc62_e1121254","line":1508,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F821 undefined name \u0027spawn\u0027","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":1597,"context_line":"        if self._has_rep_pair(ldev):"},{"line_number":1598,"context_line":"            if self.conf.hitachi_mirror_storage_id:"},{"line_number":1599,"context_line":"                self._require_rep_secondary()"},{"line_number":1600,"context_line":"                th \u003d spawn("},{"line_number":1601,"context_line":"                    self.rep_secondary.discard_zero_page, volume)"},{"line_number":1602,"context_line":"                try:"},{"line_number":1603,"context_line":"                    self.rep_primary.discard_zero_page(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"771d3767_7440d011","line":1600,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: F821 undefined name \u0027spawn\u0027","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":2011,"context_line":""},{"line_number":2012,"context_line":"    def spawn(fn, *args, **kwargs):"},{"line_number":2013,"context_line":"        return HBSDREPLICATION.GreenThreadCompat("},{"line_number":2014,"context_line":"            HBSDREPLICATION.GreenThreadCompat._executor.submit(fn, *args, **kwargs)"},{"line_number":2015,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":2,"id":"bba3e74c_67913b16","line":2014,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: E501 line too long (83 \u003e 79 characters)","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d03a44e2ffdf82d64aa45e46b8c16f6af47df6fb","unresolved":true,"context_lines":[{"line_number":410,"context_line":"        self._executor \u003d ThreadPoolExecutor("},{"line_number":411,"context_line":"            max_workers\u003dself.conf.safe_get("},{"line_number":412,"context_line":"                self.driver_info[\u0027param_prefix\u0027] +"},{"line_number":413,"context_line":"                \u0027_rest_max_request_workers\u0027))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def __del__(self):"},{"line_number":416,"context_line":"        \"\"\"Shut down the driver.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"f4c4bc62_342c99f7","line":413,"updated":"2026-08-16 10:58:42.000000000","message":"ThreadPoolExecutor sized to individual REST requests. Usually caped to fixed number like CPU*small number. ThreadPoolExecutor comes with Queue to handle multiple requests. Request may be high number.","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"3449771a6d313434a4621dcad8836298402b8be6","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        self._executor \u003d ThreadPoolExecutor("},{"line_number":411,"context_line":"            max_workers\u003dself.conf.safe_get("},{"line_number":412,"context_line":"                self.driver_info[\u0027param_prefix\u0027] +"},{"line_number":413,"context_line":"                \u0027_rest_max_request_workers\u0027))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def __del__(self):"},{"line_number":416,"context_line":"        \"\"\"Shut down the driver.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"0ab6fb15_e05560cd","line":413,"in_reply_to":"f4c4bc62_342c99f7","updated":"2026-08-18 20:52:32.000000000","message":"That\u0027s why we just let the user configure it as they like.  This is existing implementation detail, so for the moment I\u0027m not going to adjust it.","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d03a44e2ffdf82d64aa45e46b8c16f6af47df6fb","unresolved":true,"context_lines":[{"line_number":412,"context_line":"                self.driver_info[\u0027param_prefix\u0027] +"},{"line_number":413,"context_line":"                \u0027_rest_max_request_workers\u0027))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def __del__(self):"},{"line_number":416,"context_line":"        \"\"\"Shut down the driver.\"\"\""},{"line_number":417,"context_line":"        self._executor.shutdown(wait\u003dFalse,"},{"line_number":418,"context_line":"                                cancel_futures\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"8fc61d42_43c3d57c","line":415,"updated":"2026-08-16 10:58:42.000000000","message":"HBSDREPLICATION inherits HBSDREST, which already owns\nrequest_thread_pool_executor and its cleanup. This __del__ overrides the\nparent destructor without calling it, so the parent REST executor is no\nlonger shut down through that path.\n\n Destructor-based executor lifecycle is unreliable and can run during partial construction or interpreter shutdown. Use an explicit, idempotent shutdown path that closes both executors and is called from the driver lifecycle.","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"3449771a6d313434a4621dcad8836298402b8be6","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                self.driver_info[\u0027param_prefix\u0027] +"},{"line_number":413,"context_line":"                \u0027_rest_max_request_workers\u0027))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def __del__(self):"},{"line_number":416,"context_line":"        \"\"\"Shut down the driver.\"\"\""},{"line_number":417,"context_line":"        self._executor.shutdown(wait\u003dFalse,"},{"line_number":418,"context_line":"                                cancel_futures\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7c73f90a_562927fe","line":415,"in_reply_to":"8fc61d42_43c3d57c","updated":"2026-08-18 20:52:32.000000000","message":"Good catch, thanks.  I am going to use the same executor as from HBSDREST.  There should probably not have been a new one.\n\nAs far as the destructor, I\u0027m not going to change that for the time being, in particular since I don\u0027t think Cinder has a good/alternate way of doing this (google seems to confirm this, but I guess it could be lying).","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d03a44e2ffdf82d64aa45e46b8c16f6af47df6fb","unresolved":true,"context_lines":[{"line_number":415,"context_line":"    def __del__(self):"},{"line_number":416,"context_line":"        \"\"\"Shut down the driver.\"\"\""},{"line_number":417,"context_line":"        self._executor.shutdown(wait\u003dFalse,"},{"line_number":418,"context_line":"                                cancel_futures\u003dTrue)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"    def update_mirror_conf(self, conf, opts):"},{"line_number":421,"context_line":"        for opt in opts:"}],"source_content_type":"text/x-python","patch_set":9,"id":"25ff7bb6_a84bed84","line":418,"updated":"2026-08-16 10:58:42.000000000","message":"cancel_futures\u003dTrue can cancel queued S-VOL mutations such as\ncreate, delete, extend or pair initialisation while the corresponding\nP-VOL operation has already run.\n\nThat can leave the primary and secondary arrays inconsistent. Executor\nshutdown must drain or explicitly reconcile submitted storage mutations\nrather than silently cancelling queued work.","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"3449771a6d313434a4621dcad8836298402b8be6","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    def __del__(self):"},{"line_number":416,"context_line":"        \"\"\"Shut down the driver.\"\"\""},{"line_number":417,"context_line":"        self._executor.shutdown(wait\u003dFalse,"},{"line_number":418,"context_line":"                                cancel_futures\u003dTrue)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"    def update_mirror_conf(self, conf, opts):"},{"line_number":421,"context_line":"        for opt in opts:"}],"source_content_type":"text/x-python","patch_set":9,"id":"6b2d5d9b_8a5b105c","line":418,"in_reply_to":"25ff7bb6_a84bed84","updated":"2026-08-18 20:52:32.000000000","message":"Agreed.  I have changed the parent class destructor.","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d03a44e2ffdf82d64aa45e46b8c16f6af47df6fb","unresolved":true,"context_lines":[{"line_number":654,"context_line":"        pool_id \u003d self.rep_secondary.storage_info[\u0027pool_id\u0027][0]"},{"line_number":655,"context_line":"        ldev_range \u003d self.rep_secondary.storage_info[\u0027ldev_range\u0027]"},{"line_number":656,"context_line":"        qos_specs \u003d utils.get_qos_specs_from_volume(volume)"},{"line_number":657,"context_line":"        thread \u003d self.spawn("},{"line_number":658,"context_line":"            self.rep_secondary.create_ldev, volume.size, extra_specs,"},{"line_number":659,"context_line":"            pool_id, ldev_range, qos_specs\u003dqos_specs)"},{"line_number":660,"context_line":"        if pvol is None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"396fb6cc_76e93f45","line":657,"updated":"2026-08-16 10:58:42.000000000","message":"Moving rep_secondary.create_ldev to a native worker preserves the existing\nP-VOL/S-VOL parallel structure.\nHowever, this call reaches the REST retry path where hbsd_rest_api.py still\nuses greenthread.sleep. That leaves an unconditional Eventlet dependency on.","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"3449771a6d313434a4621dcad8836298402b8be6","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        pool_id \u003d self.rep_secondary.storage_info[\u0027pool_id\u0027][0]"},{"line_number":655,"context_line":"        ldev_range \u003d self.rep_secondary.storage_info[\u0027ldev_range\u0027]"},{"line_number":656,"context_line":"        qos_specs \u003d utils.get_qos_specs_from_volume(volume)"},{"line_number":657,"context_line":"        thread \u003d self.spawn("},{"line_number":658,"context_line":"            self.rep_secondary.create_ldev, volume.size, extra_specs,"},{"line_number":659,"context_line":"            pool_id, ldev_range, qos_specs\u003dqos_specs)"},{"line_number":660,"context_line":"        if pvol is None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"51cf7fea_b892c7f3","line":657,"in_reply_to":"396fb6cc_76e93f45","updated":"2026-08-18 20:52:32.000000000","message":"Can you point this out?  I see it only using ``time.sleep()``.","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d03a44e2ffdf82d64aa45e46b8c16f6af47df6fb","unresolved":true,"context_lines":[{"line_number":2002,"context_line":"        self.failover_completed(secondary_id)"},{"line_number":2003,"context_line":"        return backend_id, volumes_update, groups_update"},{"line_number":2004,"context_line":""},{"line_number":2005,"context_line":"    class GreenThreadCompat:"},{"line_number":2006,"context_line":"        def __init__(self, future):"},{"line_number":2007,"context_line":"            self._future \u003d future"},{"line_number":2008,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"93d8ec40_315de7ef","line":2005,"updated":"2026-08-16 10:58:42.000000000","message":"Is this needed?","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"3449771a6d313434a4621dcad8836298402b8be6","unresolved":false,"context_lines":[{"line_number":2002,"context_line":"        self.failover_completed(secondary_id)"},{"line_number":2003,"context_line":"        return backend_id, volumes_update, groups_update"},{"line_number":2004,"context_line":""},{"line_number":2005,"context_line":"    class GreenThreadCompat:"},{"line_number":2006,"context_line":"        def __init__(self, future):"},{"line_number":2007,"context_line":"            self._future \u003d future"},{"line_number":2008,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"55967a15_a9416987","line":2005,"in_reply_to":"93d8ec40_315de7ef","updated":"2026-08-18 20:52:32.000000000","message":"It could probably have been avoided, but since ``Future`` doesn\u0027t have a ``wait`` call it was added to change as little as possible in each iteration (at least that\u0027s why I expect it was added).","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"5d2345fab95d10b731479c49811da0e69303870c","unresolved":true,"context_lines":[{"line_number":1999,"context_line":"        def wait(self):"},{"line_number":2000,"context_line":"            return self._future.result()"},{"line_number":2001,"context_line":""},{"line_number":2002,"context_line":"    def spawn(self, fn, *args, **kwargs):"},{"line_number":2003,"context_line":"        return HBSDREPLICATION.GreenThreadCompat("},{"line_number":2004,"context_line":"            self.request_thread_pool_executor.submit(fn, *args, **kwargs)"},{"line_number":2005,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":12,"id":"747ac3a7_7174a46a","line":2002,"updated":"2026-08-24 11:21:52.000000000","message":"Please add focused unit coverage for the new execution contract.\n\nAt minimum, verify that spawn(...).wait():\n\n* returns the callable result;\n* propagates an exception raised by the callable; and\n* is still waited from one converted try/finally workflow when the\n  primary-side operation fails.\n\nThis change exists specifically because greenthread.spawn fails when\nthe Hitachi replication path is invoked from a native-thread Cinder\nworker. The replacement path should have a regression test.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"42004995163ac16c21c4f3d2d6e95c2f8aed59c9","unresolved":true,"context_lines":[{"line_number":1999,"context_line":"        def wait(self):"},{"line_number":2000,"context_line":"            return self._future.result()"},{"line_number":2001,"context_line":""},{"line_number":2002,"context_line":"    def spawn(self, fn, *args, **kwargs):"},{"line_number":2003,"context_line":"        return HBSDREPLICATION.GreenThreadCompat("},{"line_number":2004,"context_line":"            self.request_thread_pool_executor.submit(fn, *args, **kwargs)"},{"line_number":2005,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":12,"id":"cb271b68_532b47e1","line":2002,"in_reply_to":"747ac3a7_7174a46a","updated":"2026-08-24 20:21:01.000000000","message":"Working on this.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"20d1f84bc350e4d21fa331b19343171473f446ab","unresolved":false,"context_lines":[{"line_number":1999,"context_line":"        def wait(self):"},{"line_number":2000,"context_line":"            return self._future.result()"},{"line_number":2001,"context_line":""},{"line_number":2002,"context_line":"    def spawn(self, fn, *args, **kwargs):"},{"line_number":2003,"context_line":"        return HBSDREPLICATION.GreenThreadCompat("},{"line_number":2004,"context_line":"            self.request_thread_pool_executor.submit(fn, *args, **kwargs)"},{"line_number":2005,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":12,"id":"e5f41c73_edf545c2","line":2002,"in_reply_to":"cb271b68_532b47e1","updated":"2026-08-24 23:57:14.000000000","message":"Added UT","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2e6b2df73f4259101f78de39bb3464911aced4dd","unresolved":false,"context_lines":[{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":""},{"line_number":2009,"context_line":"# Shorthand alias"},{"line_number":2010,"context_line":"_GreenThreadCompat \u003d hbsd_replication.HBSDREPLICATION.GreenThreadCompat"},{"line_number":2011,"context_line":""},{"line_number":2012,"context_line":""},{"line_number":2013,"context_line":"def _make_resolved_future(value):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fd840fd5_39826e22","line":2010,"updated":"2026-08-25 02:46:47.000000000","message":"pep8: F821 undefined name \u0027hbsd_replication\u0027","commit_id":"776c38dcaffe314a4eefca907a4b12f16a12b351"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2e6b2df73f4259101f78de39bb3464911aced4dd","unresolved":false,"context_lines":[{"line_number":2024,"context_line":"    return f"},{"line_number":2025,"context_line":""},{"line_number":2026,"context_line":""},{"line_number":2027,"context_line":"class TestGreenThreadCompatWait(test.TestCase):"},{"line_number":2028,"context_line":"    \"\"\"Tests for HBSDREPLICATION.GreenThreadCompat.wait().\"\"\""},{"line_number":2029,"context_line":""},{"line_number":2030,"context_line":"    # ------------------------------------------------------------------"}],"source_content_type":"text/x-python","patch_set":14,"id":"cd1c60dd_6f6527f4","line":2027,"updated":"2026-08-25 02:46:47.000000000","message":"pep8: F821 undefined name \u0027test\u0027","commit_id":"776c38dcaffe314a4eefca907a4b12f16a12b351"}],"cinder/volume/drivers/hitachi/hbsd_rest.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\"REST interface module for Hitachi HBSD Driver.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from collections import defaultdict"},{"line_number":19,"context_line":"import futurist"},{"line_number":20,"context_line":"from itertools import count"},{"line_number":21,"context_line":"import json"},{"line_number":22,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":2,"id":"f782c7db_c738ffa2","line":19,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: I201 Missing newline between import groups. \u0027import futurist\u0027 is identified as Third Party and \u0027from collections import defaultdict\u0027 is identified as Stdlib.","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from collections import defaultdict"},{"line_number":19,"context_line":"import futurist"},{"line_number":20,"context_line":"from itertools import count"},{"line_number":21,"context_line":"import json"},{"line_number":22,"context_line":"import re"},{"line_number":23,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":2,"id":"26fac1b6_7e678101","line":20,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: I100 Import statements are in the wrong order. \u0027from itertools import count\u0027 should be before \u0027import futurist\u0027 and in a different group.","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from collections import defaultdict"},{"line_number":19,"context_line":"import futurist"},{"line_number":20,"context_line":"from itertools import count"},{"line_number":21,"context_line":"import json"},{"line_number":22,"context_line":"import re"},{"line_number":23,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":2,"id":"6c04e8ae_cc600591","line":20,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: I201 Missing newline between import groups. \u0027from itertools import count\u0027 is identified as Stdlib and \u0027import futurist\u0027 is identified as Third Party.","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f8344171f34a35ffcab01b9f09bd65a0783bcfa","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\"REST interface module for Hitachi HBSD Driver.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from collections import defaultdict"},{"line_number":19,"context_line":"from itertools import count"},{"line_number":20,"context_line":"import json"},{"line_number":21,"context_line":"import re"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa438724_5625e31a","line":19,"updated":"2026-08-13 17:03:19.000000000","message":"pep8: F401 \u0027itertools.count\u0027 imported but unused","commit_id":"e726eadd9272cc8a3af29d4d7a523b10a738ae35"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"5d2345fab95d10b731479c49811da0e69303870c","unresolved":true,"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\u003dFalse)"},{"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":12,"id":"fa165954_7433f665","line":338,"updated":"2026-08-24 11:21:52.000000000","message":"That preserves already submitted storage work which is important here:\ncancel_futures\u003dTrue would cancel futures that are still queued, even\nthough the corresponding P-VOL operation may already have executed.\n \nwait\u003dFalse only means that shutdown() returns without synchronously\nwaiting. It does not cancel running or pending futures when\ncancel_futures\u003dFalse.\n\nThe remaining concern is that __del__ is nondeterministic lifecycle\nmanagement, but that predates this change and is not a blocker for this\nspawn conversion.","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"42004995163ac16c21c4f3d2d6e95c2f8aed59c9","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\u003dFalse)"},{"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":12,"id":"0503d853_cdf63e74","line":338,"in_reply_to":"fa165954_7433f665","updated":"2026-08-24 20:21:01.000000000","message":"Acknowledged","commit_id":"ed2a4a9b9eb9a2fd46d2d20f029378d2e6362acc"}],"cinder/volume/drivers/hitachi/hbsd_rest_api.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3ae6babc3bd6d37d03b73f773513e42861b80ce0","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import threading"},{"line_number":23,"context_line":"import time"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\u003c\u003c\u003c\u003c\u003c\u003c\u003c PATCH SET (1fbcbc53b50a042bc9206e4e228b58b390d41b6e [Hitachi] Remove Eventlet)"},{"line_number":26,"context_line":"import time"},{"line_number":27,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":28,"context_line":"\u003e\u003e\u003e\u003e\u003e\u003e\u003e BASE      (dae90eec954411bae3689e029e9460a020bc50de [Hitachi] Small documentation updates)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3c62fa95_4be55f47","line":25,"updated":"2026-07-31 19:54:55.000000000","message":"pep8: E999 SyntaxError: invalid decimal literal","commit_id":"6f3e7c45c12b86c735ff0f79f9599e06925bbb89"}]}
