)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"8c0511df868ec77512eb331c4193e265b7f9d753","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"31ac44ba_6943e8d8","updated":"2026-08-13 13:07:54.000000000","message":"Needs test updates re:     \n    self.assertNotEqual(thread_dict[\u0027thread\u0027], threading.current_thread())\n\n\nSee cinder-without-eventlet job results","commit_id":"763f958a3b7b4fb00c3963fbd1e5a7f99fd34520"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"60595ca98227fdf38790383725b91ab03a2c8078","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"0e72fee7_2fdafe3b","in_reply_to":"31ac44ba_6943e8d8","updated":"2026-08-18 06:53:45.000000000","message":"cheks are gone now, test not verify routing through utils.tpool_proxy.\nso this is addressed too.\n\nthreading job `cinder-without-eventlet` passing too \\o/","commit_id":"763f958a3b7b4fb00c3963fbd1e5a7f99fd34520"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"276b4931eb08931d32a0aa95d3c52bdc3a4f9508","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"ac3afc61_f7ec5ff3","updated":"2026-08-17 06:29:51.000000000","message":"As a follow-up, right now we dont have test for tpool_wrap itself - covering its two modes (Proxy under eventlet, pass-through under threading).\n\nI\u0027ll add those in a separate change.","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7e37e093137aa0234eea23c3b353a264c4da8aba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"f13bf4fb_e5a02f48","updated":"2026-08-17 16:07:19.000000000","message":"Thanks for the review!  Will put up a new patch set shortly.","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"eb6ee3d27004dd9531692ceebe92246a94f31d58","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"4262f2d1_a4776941","updated":"2026-08-17 06:24:29.000000000","message":"seems ok to me, IMO it would be nice to update comment.","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"bd2fbf82e9801f95f16d2a601c66a810392212dd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":18,"id":"9b602244_e326969c","in_reply_to":"ac3afc61_f7ec5ff3","updated":"2026-08-17 13:09:58.000000000","message":"https://review.opendev.org/c/openstack/cinder/+/1001087","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"60595ca98227fdf38790383725b91ab03a2c8078","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"02719a39_097372e8","updated":"2026-08-18 06:53:45.000000000","message":"thanks for addressing all comments, lgtm.","commit_id":"5f8d6c545254032c402d27a8b0afab036a6109e8"}],"cinder/backup/drivers/ceph.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"2decbb7281f7f33d798bcf817c578df87804b420","unresolved":true,"context_lines":[{"line_number":1235,"context_line":"                _src \u003d src_snap"},{"line_number":1236,"context_line":"                src_rbd \u003d utils.thread_proxy("},{"line_number":1237,"context_line":"                    self.rbd.Image(client.ioctx,"},{"line_number":1238,"context_line":"                                   backup_name,"},{"line_number":1239,"context_line":"                                   client.ioctx,"},{"line_number":1240,"context_line":"                                   backup_name,"},{"line_number":1241,"context_line":"                                   snapshot\u003d_src,"}],"source_content_type":"text/x-python","patch_set":4,"id":"498e5d60_319ec4c5","line":1238,"updated":"2026-02-28 10:35:51.000000000","message":"backup_name is repeated twice. is this correct?","commit_id":"85063ea1fbc002aad76e62a183c332448bc76ba2"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"92f6300205e812820aa634313d55c637a2ef84e6","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"                _src \u003d src_snap"},{"line_number":1236,"context_line":"                src_rbd \u003d utils.thread_proxy("},{"line_number":1237,"context_line":"                    self.rbd.Image(client.ioctx,"},{"line_number":1238,"context_line":"                                   backup_name,"},{"line_number":1239,"context_line":"                                   client.ioctx,"},{"line_number":1240,"context_line":"                                   backup_name,"},{"line_number":1241,"context_line":"                                   snapshot\u003d_src,"}],"source_content_type":"text/x-python","patch_set":4,"id":"e094baf1_a1e04275","line":1238,"in_reply_to":"498e5d60_319ec4c5","updated":"2026-08-03 16:46:45.000000000","message":"Done","commit_id":"85063ea1fbc002aad76e62a183c332448bc76ba2"}],"cinder/tests/unit/backup/drivers/test_backup_ceph.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"7469111f867de097b9839cf87f4c4f99c291d707","unresolved":true,"context_lines":[{"line_number":1157,"context_line":"                                         mock.call(zeroes, self.chunk_size)])"},{"line_number":1158,"context_line":"            self.assertNotEqual(threading.current_thread(),"},{"line_number":1159,"context_line":"                                thread_dict[\u0027thread\u0027])"},{"line_number":1160,"context_line":""},{"line_number":1161,"context_line":"        image.reset_mock()"},{"line_number":1162,"context_line":"        image.write.reset_mock()"},{"line_number":1163,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"66fd4a64_ad13273d","side":"PARENT","line":1160,"updated":"2026-08-17 05:26:52.000000000","message":"removeing this assert seems wrong.","commit_id":"b5b763129e2bde5077c0cf3a5eb434021abaa6e0"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"60595ca98227fdf38790383725b91ab03a2c8078","unresolved":false,"context_lines":[{"line_number":1157,"context_line":"                                         mock.call(zeroes, self.chunk_size)])"},{"line_number":1158,"context_line":"            self.assertNotEqual(threading.current_thread(),"},{"line_number":1159,"context_line":"                                thread_dict[\u0027thread\u0027])"},{"line_number":1160,"context_line":""},{"line_number":1161,"context_line":"        image.reset_mock()"},{"line_number":1162,"context_line":"        image.write.reset_mock()"},{"line_number":1163,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9b5756b2_50a0243d","side":"PARENT","line":1160,"in_reply_to":"0e2ae379_32088074","updated":"2026-08-18 06:53:45.000000000","message":"yeah, this is the first instance I saw. then I found the easiest test to understand and discuss at L1733.","commit_id":"b5b763129e2bde5077c0cf3a5eb434021abaa6e0"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7e37e093137aa0234eea23c3b353a264c4da8aba","unresolved":true,"context_lines":[{"line_number":1157,"context_line":"                                         mock.call(zeroes, self.chunk_size)])"},{"line_number":1158,"context_line":"            self.assertNotEqual(threading.current_thread(),"},{"line_number":1159,"context_line":"                                thread_dict[\u0027thread\u0027])"},{"line_number":1160,"context_line":""},{"line_number":1161,"context_line":"        image.reset_mock()"},{"line_number":1162,"context_line":"        image.write.reset_mock()"},{"line_number":1163,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"0e2ae379_32088074","side":"PARENT","line":1160,"in_reply_to":"66fd4a64_ad13273d","updated":"2026-08-17 16:07:19.000000000","message":"I think it\u0027s being checked by the mock_discard function; the wrapped_tpool_wrap mock is reset at line 1146, so called() would apply to lines 1149-1161","commit_id":"b5b763129e2bde5077c0cf3a5eb434021abaa6e0"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"eb6ee3d27004dd9531692ceebe92246a94f31d58","unresolved":true,"context_lines":[{"line_number":1735,"context_line":""},{"line_number":1736,"context_line":"        def mock_remove():"},{"line_number":1737,"context_line":"            # record the thread running this function"},{"line_number":1738,"context_line":"            thread_dict[\u0027thread\u0027] \u003d threading.current_thread()"},{"line_number":1739,"context_line":""},{"line_number":1740,"context_line":"        # case 1: remove() succeeds"},{"line_number":1741,"context_line":"        self.mock_rados.Object.return_value.remove \u003d mock_remove"}],"source_content_type":"text/x-python","patch_set":18,"id":"e338eb21_a068ed09","side":"PARENT","line":1738,"updated":"2026-08-17 06:24:29.000000000","message":"record who started","commit_id":"b5b763129e2bde5077c0cf3a5eb434021abaa6e0"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"60595ca98227fdf38790383725b91ab03a2c8078","unresolved":false,"context_lines":[{"line_number":1735,"context_line":""},{"line_number":1736,"context_line":"        def mock_remove():"},{"line_number":1737,"context_line":"            # record the thread running this function"},{"line_number":1738,"context_line":"            thread_dict[\u0027thread\u0027] \u003d threading.current_thread()"},{"line_number":1739,"context_line":""},{"line_number":1740,"context_line":"        # case 1: remove() succeeds"},{"line_number":1741,"context_line":"        self.mock_rados.Object.return_value.remove \u003d mock_remove"}],"source_content_type":"text/x-python","patch_set":18,"id":"cda74f74_0cf4e03c","side":"PARENT","line":1738,"in_reply_to":"e338eb21_a068ed09","updated":"2026-08-18 06:53:45.000000000","message":"Done","commit_id":"b5b763129e2bde5077c0cf3a5eb434021abaa6e0"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"eb6ee3d27004dd9531692ceebe92246a94f31d58","unresolved":true,"context_lines":[{"line_number":1742,"context_line":"        self.mb.remove_if_exists()"},{"line_number":1743,"context_line":"        self.assertEqual([], RAISED_EXCEPTIONS)"},{"line_number":1744,"context_line":"        # make sure remove() was called from a tpool.Proxy thread"},{"line_number":1745,"context_line":"        self.assertNotEqual(thread_dict[\u0027thread\u0027], threading.current_thread())"},{"line_number":1746,"context_line":""},{"line_number":1747,"context_line":"        # case 2: remove() raises object not found (the function under"},{"line_number":1748,"context_line":"        # test is not supposed to raise in this case)"}],"source_content_type":"text/x-python","patch_set":18,"id":"0562b371_78903efc","side":"PARENT","line":1745,"updated":"2026-08-17 06:24:29.000000000","message":"if we take example of this. \nthis tells us main thread did not used and something else (worker thread) did the stuff/call.","commit_id":"b5b763129e2bde5077c0cf3a5eb434021abaa6e0"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"60595ca98227fdf38790383725b91ab03a2c8078","unresolved":false,"context_lines":[{"line_number":1742,"context_line":"        self.mb.remove_if_exists()"},{"line_number":1743,"context_line":"        self.assertEqual([], RAISED_EXCEPTIONS)"},{"line_number":1744,"context_line":"        # make sure remove() was called from a tpool.Proxy thread"},{"line_number":1745,"context_line":"        self.assertNotEqual(thread_dict[\u0027thread\u0027], threading.current_thread())"},{"line_number":1746,"context_line":""},{"line_number":1747,"context_line":"        # case 2: remove() raises object not found (the function under"},{"line_number":1748,"context_line":"        # test is not supposed to raise in this case)"}],"source_content_type":"text/x-python","patch_set":18,"id":"d785b388_9a6852fb","side":"PARENT","line":1745,"in_reply_to":"0562b371_78903efc","updated":"2026-08-18 06:53:45.000000000","message":"Done","commit_id":"b5b763129e2bde5077c0cf3a5eb434021abaa6e0"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"eb6ee3d27004dd9531692ceebe92246a94f31d58","unresolved":true,"context_lines":[{"line_number":1732,"context_line":"        self.mb.remove_if_exists()"},{"line_number":1733,"context_line":"        self.assertEqual([], RAISED_EXCEPTIONS)"},{"line_number":1734,"context_line":"        # verify that thread behavior will be correct if we\u0027re using eventlet"},{"line_number":1735,"context_line":"        wrapped_tpool_wrap.assert_called_once()"},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"        # case 2: remove() raises object not found (the function under"},{"line_number":1738,"context_line":"        # test is not supposed to raise in this case)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ad83b12_3bf2ee86","line":1735,"updated":"2026-08-17 06:24:29.000000000","message":"today tpool_wrap did it.\n\nbut this is only true for eventlet , right ? for threading mode it returned same obj back.\n\n\nso for comment, I think we should not that we are verifying thread behaviour, we should say instead we are verifying that ceph-driver routes this stuff or IO call in this case through tpool_wrap (dual mode w.r.t eventlet)","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"60595ca98227fdf38790383725b91ab03a2c8078","unresolved":false,"context_lines":[{"line_number":1732,"context_line":"        self.mb.remove_if_exists()"},{"line_number":1733,"context_line":"        self.assertEqual([], RAISED_EXCEPTIONS)"},{"line_number":1734,"context_line":"        # verify that thread behavior will be correct if we\u0027re using eventlet"},{"line_number":1735,"context_line":"        wrapped_tpool_wrap.assert_called_once()"},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"        # case 2: remove() raises object not found (the function under"},{"line_number":1738,"context_line":"        # test is not supposed to raise in this case)"}],"source_content_type":"text/x-python","patch_set":18,"id":"de04f866_0c18055a","line":1735,"in_reply_to":"0d1db65b_48af9f28","updated":"2026-08-18 06:53:45.000000000","message":"ack seems good to me.","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7e37e093137aa0234eea23c3b353a264c4da8aba","unresolved":true,"context_lines":[{"line_number":1732,"context_line":"        self.mb.remove_if_exists()"},{"line_number":1733,"context_line":"        self.assertEqual([], RAISED_EXCEPTIONS)"},{"line_number":1734,"context_line":"        # verify that thread behavior will be correct if we\u0027re using eventlet"},{"line_number":1735,"context_line":"        wrapped_tpool_wrap.assert_called_once()"},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"        # case 2: remove() raises object not found (the function under"},{"line_number":1738,"context_line":"        # test is not supposed to raise in this case)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bbffb540_2dd520bb","line":1735,"in_reply_to":"7ad83b12_3bf2ee86","updated":"2026-08-17 16:07:19.000000000","message":"This is a good point, I couldn\u0027t think of a good way to describe what we\u0027re looking for here, and you nailed it!  Will correct the comments throughout.","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"d051846657f68d9e11197ec710f5f91b881d72ab","unresolved":true,"context_lines":[{"line_number":1732,"context_line":"        self.mb.remove_if_exists()"},{"line_number":1733,"context_line":"        self.assertEqual([], RAISED_EXCEPTIONS)"},{"line_number":1734,"context_line":"        # verify that thread behavior will be correct if we\u0027re using eventlet"},{"line_number":1735,"context_line":"        wrapped_tpool_wrap.assert_called_once()"},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"        # case 2: remove() raises object not found (the function under"},{"line_number":1738,"context_line":"        # test is not supposed to raise in this case)"}],"source_content_type":"text/x-python","patch_set":18,"id":"0d1db65b_48af9f28","line":1735,"in_reply_to":"bbffb540_2dd520bb","updated":"2026-08-17 19:58:33.000000000","message":"I decided to remove these comments because they were basically saying \"verify that tpool_wrap was called\", which is exactly what the code is already saying.","commit_id":"350febf34cf72b254feaf6d6d55d74e9ef2195cb"}]}
