)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"e712f8af255a2f2fabe2e6cca74bdf3f0416080b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6ddbd6e8_2a57213a","updated":"2026-07-16 03:55:58.000000000","message":"OK let\u0027s address my comments in follow-up","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"5af34fbb105c799615cc4b6dec950655e078eaa4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0133c520_b33fb69b","updated":"2026-07-14 16:58:03.000000000","message":"The change looks almost good. Leaving a few suggestions.","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"b3a644092093b856b234b8d97ffc57e77a4d5b40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"dc717d14_496fbf47","updated":"2026-07-14 18:33:01.000000000","message":"lgtm, we can extend the tests as Takashi mentioned but I am ok to merge it as it is and extend the coverage as a separate change,","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5bd147841296b3435f1db7a19b9fea15a805156b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a4f50757_6f596793","in_reply_to":"6ddbd6e8_2a57213a","updated":"2026-07-16 09:20:03.000000000","message":"sorry I was busy elsewhere.Thanks for taking care of the extra test","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"}],"oslo_concurrency/tests/unit/test_lockutils_eventlet.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"5af34fbb105c799615cc4b6dec950655e078eaa4","unresolved":true,"context_lines":[{"line_number":53,"context_line":"        self.assertTrue(self.completed)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class TestReaderWriterLockEventlet(test_base.BaseTestCase):"},{"line_number":57,"context_line":"    def test_second_lock_provides_mutual_exclusion_spawn_n(self):"},{"line_number":58,"context_line":"        # Create a first lock to consume the _EVENTLET_CHECKED flag"},{"line_number":59,"context_line":"        lockutils.ReaderWriterLock()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ddda1da_f2a9e4a1","line":56,"range":{"start_line":56,"start_character":6,"end_line":56,"end_character":34},"updated":"2026-07-14 16:58:03.000000000","message":"I wonder if you mind adding a test case which uses the first ReaderWriterLock instance. That\u0027s not directly related to the bug, but would be a simple scenario we may want to verify.","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9c48e0df83149045807b2e13626a6489a9dc6e44","unresolved":true,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class TestReaderWriterLockEventlet(test_base.BaseTestCase):"},{"line_number":57,"context_line":"    def test_second_lock_provides_mutual_exclusion_spawn_n(self):"},{"line_number":58,"context_line":"        # Create a first lock to consume the _EVENTLET_CHECKED flag"},{"line_number":59,"context_line":"        lockutils.ReaderWriterLock()"},{"line_number":60,"context_line":"        # This second lock is the one affected by the bug"},{"line_number":61,"context_line":"        rw \u003d lockutils.ReaderWriterLock()"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"cb580c5b_53068ae0","line":59,"range":{"start_line":58,"start_character":7,"end_line":59,"end_character":36},"updated":"2026-07-14 12:16:28.000000000","message":"note this is imparnat to make sure the test work regardless of the order of execution of the tests.\nthe current bug is cause by module level caching/early out","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"5af34fbb105c799615cc4b6dec950655e078eaa4","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        eventlet.spawn_n(acquire_write_lock, rw, thread1_acquired)"},{"line_number":77,"context_line":"        eventlet.spawn_n(acquire_write_lock, rw, thread2_acquired)"},{"line_number":78,"context_line":"        t1_acquired \u003d thread1_acquired.wait(1)"},{"line_number":79,"context_line":"        t2_acquired \u003d thread2_acquired.wait(1)"},{"line_number":80,"context_line":"        # This is bug https://bugs.launchpad.net/oslo.concurrency/+bug/2160596"},{"line_number":81,"context_line":"        # both thread acquired the same write lock at the same time."},{"line_number":82,"context_line":"        self.assertTrue(t1_acquired and t2_acquired)"},{"line_number":83,"context_line":"        # When we fix this, the following should pass:"},{"line_number":84,"context_line":"        # self.assertFalse(t1_acquired and t2_acquired)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6663f517_e0fa4ded","line":81,"range":{"start_line":79,"start_character":46,"end_line":81,"end_character":68},"updated":"2026-07-14 16:58:03.000000000","message":"Only this line contains the bug number but it is being removed. Can we record the bug number somewhere else, too, so that we can find the context more easily in the future.","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9c48e0df83149045807b2e13626a6489a9dc6e44","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        # both thread acquired the same write lock at the same time."},{"line_number":82,"context_line":"        self.assertTrue(t1_acquired and t2_acquired)"},{"line_number":83,"context_line":"        # When we fix this, the following should pass:"},{"line_number":84,"context_line":"        # self.assertFalse(t1_acquired and t2_acquired)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_second_lock_provides_mutual_exclusion_spawn(self):"},{"line_number":87,"context_line":"        # Create a first lock to consume the _EVENTLET_CHECKED flag"}],"source_content_type":"text/x-python","patch_set":1,"id":"d53b7133_afde0bf5","line":84,"updated":"2026-07-14 12:16:28.000000000","message":"this is a really nice repoducer and show that this affect spwan_n very well\n\nhow this actully manifest in real code in nova is via futruist\u0027s GreenThreadPoolExecutor\n\nhttps://github.com/openstack/futurist/blob/6f870896819197ca323b3dd8af8f3b0389aff69c/futurist/_futures.py#L718\n\nevery worker that is created uses spwan_n to create a worker in the greenpool since the worker does not return anything and instaead weo comuicate the results via futures.\n\nso this bug means that all lockutils.ReaderWriterLocks including oslo\u0027s fairlocks dont work when shared acrosss task spawned on the GreenThreadPoolExecutor","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9c48e0df83149045807b2e13626a6489a9dc6e44","unresolved":true,"context_lines":[{"line_number":106,"context_line":"        eventlet.spawn(acquire_write_lock, rw, thread2_acquired)"},{"line_number":107,"context_line":"        t1_acquired \u003d thread1_acquired.wait(1)"},{"line_number":108,"context_line":"        t2_acquired \u003d thread2_acquired.wait(1)"},{"line_number":109,"context_line":"        self.assertFalse(t1_acquired and t2_acquired)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class TestInternalLock(test_base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3de37091_17a06ace","line":109,"updated":"2026-07-14 12:16:28.000000000","message":"+1 for whowing that this is spawn_n related due to https://github.com/eventlet/eventlet/issues/731","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"b3a644092093b856b234b8d97ffc57e77a4d5b40","unresolved":true,"context_lines":[{"line_number":106,"context_line":"        eventlet.spawn(acquire_write_lock, rw, thread2_acquired)"},{"line_number":107,"context_line":"        t1_acquired \u003d thread1_acquired.wait(1)"},{"line_number":108,"context_line":"        t2_acquired \u003d thread2_acquired.wait(1)"},{"line_number":109,"context_line":"        self.assertFalse(t1_acquired and t2_acquired)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class TestInternalLock(test_base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"64ce3dfe_5f5241f6","line":109,"in_reply_to":"3de37091_17a06ace","updated":"2026-07-14 18:33:01.000000000","message":"++, good to have test for that explicitly and make sure spawn works fine.","commit_id":"5caf1b77719f056e5e6bc5715422663039419372"}]}
