)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"d8306d672ab014d83026e9a70d5470b5ef351280","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1797b8e0_8abe421f","updated":"2026-07-23 14:53:47.000000000","message":"We plan to finish and land https://review.opendev.org/c/openstack/cinder/+/977851 which makes some of these same changes","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"261fc3094505aeed6e92a0af5b3800a0d6e3b111","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"37b3fca5_e371ab45","updated":"2026-07-22 06:42:43.000000000","message":"utils.tpool_wrap is the core utility this change adds as a replacement, but it has no test coverage. can we add some tests that verifies it  returns the object unchanged in threading mode?","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"fd9a9c090c6051103fd0ee289113799dd762ee70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3eb577af_34b9ecd6","in_reply_to":"1797b8e0_8abe421f","updated":"2026-07-24 04:24:51.000000000","message":"Ah great, I just came back to check on this, it was a first pass with AI and it did seem to work (which makes sense as time.sleep(0) is effectively no-op) but I would love to not need to do this at all, if you\u0027re including the same fixes :D\nSo long as cinder works fully with no-eventlet I am happy. Thanks for your work!","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"a31268ccb867b6c91071d6b8ecf75a6953a73695","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5bc2d1aa_8fc19892","updated":"2026-07-29 13:26:58.000000000","message":"after seeing chat from IRC I looked again.\nall comments are not addressed","commit_id":"214cfa2579b7d7ad3143723cd9b5920335b8d19b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9933ea289a9e062734b186c611ec5762b9714359","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2c08d3b5_c64adefa","in_reply_to":"1797b8e0_8abe421f","updated":"2026-08-12 06:19:21.000000000","message":"Rebased onto 977851 and dropped the overlapping backup manager and chunkeddriver changes. The remaining patch is limited to the image_utils integration and focused tpool_wrap test coverage.","commit_id":"ce792840e84c832ce6b5b356de7cb85d26fac263"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9933ea289a9e062734b186c611ec5762b9714359","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"a5204b09_92081304","in_reply_to":"37b3fca5_e371ab45","updated":"2026-08-12 06:19:21.000000000","message":"Added TestTpoolWrap coverage in cinder/tests/unit/test_utils.py. It verifies native-thread pass-through for callables and objects, ignores autowrap under native threading, and preserves eventlet Proxy behavior.","commit_id":"ce792840e84c832ce6b5b356de7cb85d26fac263"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9933ea289a9e062734b186c611ec5762b9714359","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"10d52295_42ca5220","in_reply_to":"5bc2d1aa_8fc19892","updated":"2026-08-12 06:19:21.000000000","message":"Rebased onto the current 977851 and addressed the remaining applicable comments: added tpool_wrap coverage, removed the stale _verify_image comment, dropped the time.sleep and backup overlap, and updated the image_utils tests for the wrapper.","commit_id":"ce792840e84c832ce6b5b356de7cb85d26fac263"}],"cinder/backup/chunkeddriver.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"261fc3094505aeed6e92a0af5b3800a0d6e3b111","unresolved":true,"context_lines":[{"line_number":843,"context_line":"                          })"},{"line_number":844,"context_line":"                # Deleting a backup\u0027s objects can take some time."},{"line_number":845,"context_line":"                # Yield so other threads can run"},{"line_number":846,"context_line":"                time.sleep(0)"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"        LOG.debug(\u0027delete %s finished.\u0027, backup[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"47ce61fc_ec11bf83","line":846,"updated":"2026-07-22 06:42:43.000000000","message":"this does not make sense. time.sleep is not same as eventlet.sleep\n\nwith threading we actually have more threads working together while in eventlet, single manager handles everything, so each greenthread needed to say I am done to let others run","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"36eda89b204cf0749985765563205c196cb3431a","unresolved":false,"context_lines":[{"line_number":833,"context_line":"                          {"},{"line_number":834,"context_line":"                              \u0027object_name\u0027: object_name,"},{"line_number":835,"context_line":"                              \u0027container\u0027: container"},{"line_number":836,"context_line":"                           })"},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"        LOG.debug(\u0027delete %s finished.\u0027, backup[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"23b227cb_79a64e51","line":836,"updated":"2026-07-24 06:38:33.000000000","message":"pep8: E121 continuation line under-indented for hanging indent","commit_id":"214cfa2579b7d7ad3143723cd9b5920335b8d19b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9933ea289a9e062734b186c611ec5762b9714359","unresolved":false,"context_lines":[{"line_number":843,"context_line":"                          })"},{"line_number":844,"context_line":"                # Deleting a backup\u0027s objects can take some time."},{"line_number":845,"context_line":"                # Yield so other threads can run"},{"line_number":846,"context_line":"                time.sleep(0)"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"        LOG.debug(\u0027delete %s finished.\u0027, backup[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"145e3204_3511e3d2","line":846,"in_reply_to":"47ce61fc_ec11bf83","updated":"2026-08-12 06:19:21.000000000","message":"Dropped this change. After rebasing onto 977851, backup/chunkeddriver.py comes entirely from the parent, so this patch no longer replaces eventlet.sleep(0) with time.sleep(0).","commit_id":"ce792840e84c832ce6b5b356de7cb85d26fac263"}],"cinder/backup/manager.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"555ab7258013113bd71f0b46d51d10b8dc856d25","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"from castellan import key_manager"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"from oslo_config import cfg"},{"line_number":41,"context_line":"from oslo_log import log as logging"},{"line_number":42,"context_line":"import oslo_messaging as messaging"},{"line_number":43,"context_line":"from oslo_service import loopingcall"}],"source_content_type":"text/x-python","patch_set":4,"id":"d68e154e_cacfc1dd","line":40,"updated":"2026-07-11 10:57:23.000000000","message":"pep8: I202 Additional newline in a group of imports. \u0027from oslo_config import cfg\u0027 is identified as Third Party and \u0027from castellan import key_manager\u0027 is identified as Third Party.","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"555ab7258013113bd71f0b46d51d10b8dc856d25","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                # device_path is already file-like so no need to open it"},{"line_number":529,"context_line":"                else:"},{"line_number":530,"context_line":"                    updates \u003d backup_service.backup(backup,"},{"line_number":531,"context_line":"                                                    utils.tpool_wrap(device_path))"},{"line_number":532,"context_line":"            except Exception:"},{"line_number":533,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":534,"context_line":"                    if not message_created:"}],"source_content_type":"text/x-python","patch_set":4,"id":"8f6890f5_9d9d59af","line":531,"updated":"2026-07-11 10:57:23.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"555ab7258013113bd71f0b46d51d10b8dc856d25","unresolved":false,"context_lines":[{"line_number":799,"context_line":"                    with utils.temporary_chown(device_path):"},{"line_number":800,"context_line":"                        with open(device_path, \u0027wb\u0027) as device_file:"},{"line_number":801,"context_line":"                            backup_service.restore(backup, volume.id,"},{"line_number":802,"context_line":"                                                   utils.tpool_wrap(device_file),"},{"line_number":803,"context_line":"                                                   volume_is_new)"},{"line_number":804,"context_line":"            # device_path is already file-like so no need to open it"},{"line_number":805,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"cdaf7372_07d402a1","line":802,"updated":"2026-07-11 10:57:23.000000000","message":"pep8: E501 line too long (81 \u003e 79 characters)","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"36eda89b204cf0749985765563205c196cb3431a","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"from castellan import key_manager"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"from oslo_config import cfg"},{"line_number":41,"context_line":"from oslo_log import log as logging"},{"line_number":42,"context_line":"import oslo_messaging as messaging"},{"line_number":43,"context_line":"from oslo_service import loopingcall"}],"source_content_type":"text/x-python","patch_set":5,"id":"b58a0259_352d6727","line":40,"updated":"2026-07-24 06:38:33.000000000","message":"pep8: I202 Additional newline in a group of imports. \u0027from oslo_config import cfg\u0027 is identified as Third Party and \u0027from castellan import key_manager\u0027 is identified as Third Party.","commit_id":"214cfa2579b7d7ad3143723cd9b5920335b8d19b"}],"cinder/image/image_utils.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"267a74dbe0d203ef346451581f5521ffde5b8f96","unresolved":true,"context_lines":[{"line_number":670,"context_line":"                    if utils.concurrency_mode_threading():"},{"line_number":671,"context_line":"                        _verify_image(tem_file, verifier)"},{"line_number":672,"context_line":"                    else:"},{"line_number":673,"context_line":"                        from eventlet import tpool"},{"line_number":674,"context_line":"                        tpool.execute(_verify_image, tem_file, verifier)"},{"line_number":675,"context_line":"                    LOG.info(\u0027Image signature verification succeeded \u0027"},{"line_number":676,"context_line":"                             \u0027for image: %s\u0027, image_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"c60ee37c_81fc20bd","line":673,"updated":"2026-07-09 08:25:53.000000000","message":"direction is to remove eventlet completely from Cinder. why else block?","commit_id":"aab6e1823d05298c76648b8bb4fabe90aacfe426"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ad1704fe82c10eb0c3c3bba9f7eb1240e84fb72a","unresolved":true,"context_lines":[{"line_number":670,"context_line":"                    if utils.concurrency_mode_threading():"},{"line_number":671,"context_line":"                        _verify_image(tem_file, verifier)"},{"line_number":672,"context_line":"                    else:"},{"line_number":673,"context_line":"                        from eventlet import tpool"},{"line_number":674,"context_line":"                        tpool.execute(_verify_image, tem_file, verifier)"},{"line_number":675,"context_line":"                    LOG.info(\u0027Image signature verification succeeded \u0027"},{"line_number":676,"context_line":"                             \u0027for image: %s\u0027, image_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ce4ec16e_083beba8","line":673,"in_reply_to":"c60ee37c_81fc20bd","updated":"2026-07-10 02:55:06.000000000","message":"Are we ok to just *rip it out*? I thought most projects were still maintaining the old paths. I\u0027m fine with that if that\u0027s the approach we\u0027re going with, I love seeing zero eventlet!","commit_id":"aab6e1823d05298c76648b8bb4fabe90aacfe426"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a6fcb76a58f68f95d4b5a72629ebadfffa3c0f8b","unresolved":false,"context_lines":[{"line_number":670,"context_line":"                    if utils.concurrency_mode_threading():"},{"line_number":671,"context_line":"                        _verify_image(tem_file, verifier)"},{"line_number":672,"context_line":"                    else:"},{"line_number":673,"context_line":"                        from eventlet import tpool"},{"line_number":674,"context_line":"                        tpool.execute(_verify_image, tem_file, verifier)"},{"line_number":675,"context_line":"                    LOG.info(\u0027Image signature verification succeeded \u0027"},{"line_number":676,"context_line":"                             \u0027for image: %s\u0027, image_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"01f3d433_ec586ab4","line":673,"in_reply_to":"ce4ec16e_083beba8","updated":"2026-07-11 01:22:01.000000000","message":"Done, just removed the eventlet stuff entirely, if it\u0027s a problem I can fish it back out of an earlier patchset.","commit_id":"aab6e1823d05298c76648b8bb4fabe90aacfe426"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"261fc3094505aeed6e92a0af5b3800a0d6e3b111","unresolved":true,"context_lines":[{"line_number":612,"context_line":""},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"def _verify_image(img_file: io.RawIOBase, verifier) -\u003e None:"},{"line_number":615,"context_line":"    # This methods must be called from a native thread, as the file I/O may"},{"line_number":616,"context_line":"    # not yield to other greenthread in some cases, and since the update and"},{"line_number":617,"context_line":"    # verify operations are CPU bound there would not be any yielding either,"},{"line_number":618,"context_line":"    # which could lead to thread starvation."},{"line_number":619,"context_line":"    while True:"}],"source_content_type":"text/x-python","patch_set":4,"id":"8c49364e_e5f79fe1","line":616,"range":{"start_line":615,"start_character":4,"end_line":616,"end_character":37},"updated":"2026-07-22 06:42:43.000000000","message":"with L670 change - this is not valid anymore, now its just a regular function,\ncomment can be removed !!","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9933ea289a9e062734b186c611ec5762b9714359","unresolved":false,"context_lines":[{"line_number":613,"context_line":""},{"line_number":614,"context_line":"def _verify_image(img_file: io.RawIOBase, verifier) -\u003e None:"},{"line_number":615,"context_line":"    while True:"},{"line_number":616,"context_line":"        chunk \u003d img_file.read(1024)"},{"line_number":617,"context_line":"        if not chunk:"},{"line_number":618,"context_line":"            break"},{"line_number":619,"context_line":"        verifier.update(chunk)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f45611f_892f7d10","line":616,"range":{"start_line":615,"start_character":4,"end_line":616,"end_character":37},"in_reply_to":"8c49364e_e5f79fe1","updated":"2026-08-12 06:19:21.000000000","message":"Done.","commit_id":"ce792840e84c832ce6b5b356de7cb85d26fac263"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9933ea289a9e062734b186c611ec5762b9714359","unresolved":false,"context_lines":[{"line_number":670,"context_line":"                except cryptography.exceptions.InvalidSignature:"},{"line_number":671,"context_line":"                    message \u003d _(\u0027Image signature verification \u0027"},{"line_number":672,"context_line":"                                \u0027failed for image: %s\u0027) % image_id"},{"line_number":673,"context_line":"                    LOG.error(message)"},{"line_number":674,"context_line":"                    raise exception.ImageSignatureVerificationException("},{"line_number":675,"context_line":"                        reason\u003dmessage)"},{"line_number":676,"context_line":"                except Exception as ex:"}],"source_content_type":"text/x-python","patch_set":6,"id":"49fbca67_ce9c4d09","line":673,"in_reply_to":"c60ee37c_81fc20bd","updated":"2026-08-12 06:19:21.000000000","message":"Rebased onto 977851, which establishes utils.tpool_wrap as the transition mechanism: it is a no-op under native threading and preserves tpool behavior under eventlet. This patch now removes the direct eventlet dependency from image_utils while retaining compatibility for deployments still using eventlet. As much as I\u0027d love to just chuck eventlet into a bonfire, this seems like the more sane and measured approach.","commit_id":"ce792840e84c832ce6b5b356de7cb85d26fac263"}],"cinder/tests/unit/test_image_utils.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"261fc3094505aeed6e92a0af5b3800a0d6e3b111","unresolved":true,"context_lines":[{"line_number":1155,"context_line":"            mock_open.return_value.__enter__.return_value,"},{"line_number":1156,"context_line":"            store_id\u003dNone, base_image_ref\u003d\u0027xyz\u0027)"},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":""},{"line_number":1159,"context_line":"class TestFetchToVhd(test.TestCase):"},{"line_number":1160,"context_line":"    @mock.patch(\u0027cinder.image.image_utils.fetch_to_volume_format\u0027)"},{"line_number":1161,"context_line":"    def test_defaults(self, mock_fetch_to):"}],"source_content_type":"text/x-python","patch_set":4,"id":"90692b68_d2d46489","line":1158,"updated":"2026-07-22 06:42:43.000000000","message":"no tests added for utils.tpool_wrap","commit_id":"6a628fb512280bec632349227b2d9b1ff94a3104"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9933ea289a9e062734b186c611ec5762b9714359","unresolved":false,"context_lines":[{"line_number":1155,"context_line":"        ctxt \u003d mock.sentinel.context"},{"line_number":1156,"context_line":"        image_service \u003d mock.Mock()"},{"line_number":1157,"context_line":"        image_meta \u003d {\u0027id\u0027: \u0027test_id\u0027,"},{"line_number":1158,"context_line":"                      \u0027disk_format\u0027: \u0027raw\u0027,"},{"line_number":1159,"context_line":"                      \u0027container_format\u0027: mock.sentinel.container_format}"},{"line_number":1160,"context_line":"        volume_path \u003d mock.sentinel.volume_path"},{"line_number":1161,"context_line":"        mock_os.access.return_value \u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"ce654819_2aea507e","line":1158,"in_reply_to":"90692b68_d2d46489","updated":"2026-08-12 06:19:21.000000000","message":"Added dedicated utils.tpool_wrap tests for native-thread pass-through and eventlet Proxy behavior, and updated the image_utils tests to verify the wrapped callables and file objects.","commit_id":"ce792840e84c832ce6b5b356de7cb85d26fac263"}],"cinder/tests/unit/test_utils.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"36eda89b204cf0749985765563205c196cb3431a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7fe35ee2_83f37a9f","line":1641,"updated":"2026-07-24 06:38:33.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"214cfa2579b7d7ad3143723cd9b5920335b8d19b"}]}
