)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"d417482074340de587f83f94c8ebfecb4cddc725","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"31673865_e02e1b40","updated":"2026-06-11 08:46:38.000000000","message":"recheck, functional threading job consistency check","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"aa6e0cb67873dd95d9a66d266c9b32d9bc236f16","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3ef7ce59_07050e46","updated":"2026-06-11 06:28:06.000000000","message":"recheck, functional threading job consistency check","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"178e9844c1cc97c16b64a394f5618189411e11ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"7cc640a2_79639b78","updated":"2026-06-11 10:13:17.000000000","message":"recheck, functional threading job consistency check","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"5b6ecb589c0683bc2ea9f2822f5c0cec75f973ab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9146f4f6_524638d0","updated":"2026-06-10 20:49:29.000000000","message":"recheck, functional threading job consistency check","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"1cbed0043d15edd3c34ef37497bb6a78f1cbe184","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0c4438ae_bbd610f5","updated":"2026-06-15 07:58:53.000000000","message":"recheck","commit_id":"0e0fa3591fa64adc7a4e6975bf27830e0193fefa"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"0b146a095194362f76b4c07c9d070f31def29f63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"0c82b9d5_fa470421","updated":"2026-07-05 21:47:02.000000000","message":"recheck","commit_id":"0ea74575a14d03d668da0e20f53c5b26e5cd7913"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e271ab142aeb34bc25dd8ea0f44a44ce4b0ae0cd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"28ab7763_d29a0be5","updated":"2026-07-09 10:46:18.000000000","message":"two small things and probably it needs a change when you follow my comment on the placement patch about the function renaming.","commit_id":"34a0afdb38afa4acaa40d41a2ff89ec4b5c11b2d"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"ed8192d975b0501320c052f1217513c7417be524","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"e20f8b89_bb3a01bd","in_reply_to":"28ab7763_d29a0be5","updated":"2026-07-09 12:38:48.000000000","message":"Done","commit_id":"34a0afdb38afa4acaa40d41a2ff89ec4b5c11b2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4ee4de6cb49ab5a4add288e7e186680b37539e45","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"d4170fcd_a2d77093","updated":"2026-07-09 14:26:39.000000000","message":"Looks good","commit_id":"adcccfeac32729ea2b0ef6e7a3a17b48ad17c90b"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"c3d9f45180bd47b3aaeac261ed51c9afd2712c42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"4ba85cfe_96870dbc","updated":"2026-07-10 07:27:53.000000000","message":"recheck","commit_id":"adcccfeac32729ea2b0ef6e7a3a17b48ad17c90b"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"4e06d678736059569cf28e80542fda021daff582","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"93103045_9528b5fc","updated":"2026-07-09 16:32:47.000000000","message":"recheck","commit_id":"adcccfeac32729ea2b0ef6e7a3a17b48ad17c90b"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"95ee980c65b7f83f8c40f549347d7c32b5155f87","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"4984ddbb_c439a44f","updated":"2026-07-09 18:55:53.000000000","message":"recheck failure is unrelated but valid so filed separate bug.","commit_id":"adcccfeac32729ea2b0ef6e7a3a17b48ad17c90b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2287295fd81b2b35aac04be41e7b26100132580c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"d1bf3dcd_a697e824","updated":"2026-07-10 14:23:57.000000000","message":"recheck placement patch landed","commit_id":"adcccfeac32729ea2b0ef6e7a3a17b48ad17c90b"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2fe37576aff150a46611d5de5e6b72b43f5c6c2d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"580f9263_25ba0be8","updated":"2026-07-09 18:55:33.000000000","message":"tox cover failure seems bringing another timing issue in graceful shutdown functional tests (test_live_migration_source_compute_graceful_shutdown). I have logged a bug for that and will propose a fix separately. https://bugs.launchpad.net/nova/+bug/2160254 \n\nTraceback (most recent call last):\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/cover/lib/python3.12/site-packages/oslo_messaging/rpc/server.py\", line 174, in _process_incoming\n    res \u003d self.dispatcher.dispatch(message)\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/cover/lib/python3.12/site-packages/oslo_messaging/rpc/dispatcher.py\", line 309, in dispatch\n    return self._do_dispatch(endpoint, method, ctxt, args)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/cover/lib/python3.12/site-packages/oslo_messaging/rpc/dispatcher.py\", line 229, in _do_dispatch\n    result \u003d func(ctxt, **new_args)\n             ^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/manager.py\", line 103, in wrapper\n    return fn(self, context, *args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/compute/utils.py\", line 1483, in decorated_function\n    return function(self, context, *args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/manager.py\", line 490, in live_migrate_instance\n    self._live_migrate(context, instance, scheduler_hint,\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/manager.py\", line 542, in _live_migrate\n    with excutils.save_and_reraise_exception():\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/cover/lib/python3.12/site-packages/oslo_utils/excutils.py\", line 266, in __exit__\n    self.force_reraise()\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/cover/lib/python3.12/site-packages/oslo_utils/excutils.py\", line 232, in force_reraise\n    raise self.value\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/manager.py\", line 528, in _live_migrate\n    task.execute()\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/tasks/base.py\", line 25, in wrap\n    with excutils.save_and_reraise_exception():\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/cover/lib/python3.12/site-packages/oslo_utils/excutils.py\", line 266, in __exit__\n    self.force_reraise()\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/cover/lib/python3.12/site-packages/oslo_utils/excutils.py\", line 232, in force_reraise\n    raise self.value\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/tasks/base.py\", line 23, in wrap\n    return original(self)\n           ^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/tasks/base.py\", line 40, in execute\n    return self._execute()\n           ^^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/tasks/live_migrate.py\", line 84, in _execute\n    self._check_host_is_up(self.source)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/conductor/tasks/live_migrate.py\", line 305, in _check_host_is_up","commit_id":"adcccfeac32729ea2b0ef6e7a3a17b48ad17c90b"}],"nova/tests/functional/fixtures.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"941a44c4ce0c542c562d137a398ec7fdc6c486c5","unresolved":true,"context_lines":[{"line_number":39,"context_line":"_SHARED_PLACEMENT_DB_PATH \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class PlacementDatabaseLock(fixtures.Fixture):"},{"line_number":43,"context_line":"    \"\"\"Serialize Placement database transactions across threads in tests."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    Patches _TransactionContextManager._transaction_scope for the duration of"}],"source_content_type":"text/x-python","patch_set":7,"id":"4fd81332_332a8007","line":42,"updated":"2026-06-11 12:59:01.000000000","message":"I think the write locking should be enough and no read locking should be needed. The fact that this only works with read locking suggests me that we are missing something. \n\nI will take a look in some local runs to see what could be the problem...\n\n---\n\nWhen we make it work with the write locking only then I suggest to have a single DatabaseLock fixture class that takes a separate lock for each database we manage instead of duplicating this code.\n\nE.g. something like\n```\n    def __init__(self):\n        # to protect the _locks dict\n        self._lock \u003d threading.Lock()\n        # dict of DB URL string to write lock for that DB\n        self._locks \u003d collections.defaultdict(threading.RLock)\n\n    def _get_lock(self, tcm):\n        with self._lock:\n            db_url \u003d tcm.reader.get_engine().url\n            return self._locks[db_url]\n```\n\nI used the DB url as the unique key for this example but maybe tcm_self._root works as well.\n\n---\n\nAlso we can try to avoid the extra lock lookup at each transaction if we inject the lock into the TransactionContextManager itself at first. But we can ignore this optimization for now.","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"eb470d0529e83e542533fea1e73734448178255f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"_SHARED_PLACEMENT_DB_PATH \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class PlacementDatabaseLock(fixtures.Fixture):"},{"line_number":43,"context_line":"    \"\"\"Serialize Placement database transactions across threads in tests."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    Patches _TransactionContextManager._transaction_scope for the duration of"}],"source_content_type":"text/x-python","patch_set":7,"id":"2c292a95_60a76401","line":42,"in_reply_to":"0aca484f_1d58894f","updated":"2026-07-01 20:11:42.000000000","message":"Single DatabaseWriteLock is impletmented, Per DB lock will be implemented as a follow up","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a1fa40cd596583c9d9df9078632852b5ec8a8699","unresolved":true,"context_lines":[{"line_number":39,"context_line":"_SHARED_PLACEMENT_DB_PATH \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class PlacementDatabaseLock(fixtures.Fixture):"},{"line_number":43,"context_line":"    \"\"\"Serialize Placement database transactions across threads in tests."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    Patches _TransactionContextManager._transaction_scope for the duration of"}],"source_content_type":"text/x-python","patch_set":7,"id":"e81ddedb_dd2072a8","line":42,"in_reply_to":"4fd81332_332a8007","updated":"2026-06-11 13:01:36.000000000","message":"\u003e When we make it work with the write locking only then I suggest to have a single DatabaseLock fixture class that takes a separate lock for each database we manage instead of duplicating this code.\n\u003e \n\u003e E.g. something like\n\u003e ```\n\u003e     def __init__(self):\n\u003e         # to protect the _locks dict\n\u003e         self._lock \u003d threading.Lock()\n\u003e         # dict of DB URL string to write lock for that DB\n\u003e         self._locks \u003d collections.defaultdict(threading.RLock)\n\u003e \n\u003e     def _get_lock(self, tcm):\n\u003e         with self._lock:\n\u003e             db_url \u003d tcm.reader.get_engine().url\n\u003e             return self._locks[db_url]\n\u003e ```\n\u003e \n\u003e I used the DB url as the unique key for this example but maybe tcm_self._root works as well.\n\u003e \n\nI see you did something similar in the next patch https://review.opendev.org/c/openstack/nova/+/992862/1 I will comment further there","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4239f405cd959847d136f1c68a56715d1be257eb","unresolved":true,"context_lines":[{"line_number":39,"context_line":"_SHARED_PLACEMENT_DB_PATH \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class PlacementDatabaseLock(fixtures.Fixture):"},{"line_number":43,"context_line":"    \"\"\"Serialize Placement database transactions across threads in tests."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    Patches _TransactionContextManager._transaction_scope for the duration of"}],"source_content_type":"text/x-python","patch_set":7,"id":"0aca484f_1d58894f","line":42,"in_reply_to":"e81ddedb_dd2072a8","updated":"2026-06-18 15:11:01.000000000","message":"OK So now this is just a write lock. I think the exiting https://review.opendev.org/c/openstack/nova/+/988583/16/nova/tests/fixtures/nova.py#433 already does this write locking across all the DBs so at the moment if both that and this is enabled then a placement write transaction takes both locks, that is not needed. Lets have a single DatabaseWriteLock and have that handle locking either globally (one write lock across all DB as today, or a per DB lock as suggested)","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"941a44c4ce0c542c562d137a398ec7fdc6c486c5","unresolved":true,"context_lines":[{"line_number":147,"context_line":"                _ORIGINAL_DATABASE_SETUP(db_fixture_self)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            # Temporarily replace Database.setUp"},{"line_number":150,"context_line":"            placement_db_fixtures.Database.setUp \u003d patched_database_setup"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        super(PlacementFixture, self).setUp()"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"4709d822_f249b5a1","line":150,"updated":"2026-06-11 12:59:01.000000000","message":"Please modify this code in the placement repo directly as needed instead of dynamically patching it at runtime.","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4239f405cd959847d136f1c68a56715d1be257eb","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                _ORIGINAL_DATABASE_SETUP(db_fixture_self)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            # Temporarily replace Database.setUp"},{"line_number":150,"context_line":"            placement_db_fixtures.Database.setUp \u003d patched_database_setup"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        super(PlacementFixture, self).setUp()"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"49823684_2e90f154","line":150,"in_reply_to":"4709d822_f249b5a1","updated":"2026-06-18 15:11:01.000000000","message":"Done","commit_id":"3f20e6e5f182d63d0179bf07a102cc786e2c35b3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4239f405cd959847d136f1c68a56715d1be257eb","unresolved":true,"context_lines":[{"line_number":140,"context_line":"    \"\"\""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":143,"context_line":"        # placement_db.configure() is @run_once, so all functional tests in a"},{"line_number":144,"context_line":"        # stestr worker share one file-backed SQLite database in threading"},{"line_number":145,"context_line":"        # mode."},{"line_number":146,"context_line":"        if utils.concurrency_mode_threading() and kwargs.get(\u0027db\u0027, True):"},{"line_number":147,"context_line":"            file_db_path \u003d _get_shared_placement_db_path()"},{"line_number":148,"context_line":"            kwargs[\u0027db_connection\u0027] \u003d \u0027sqlite:///\u0027 + file_db_path"}],"source_content_type":"text/x-python","patch_set":9,"id":"677dc97d_40e87d52","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":15},"updated":"2026-06-18 15:11:01.000000000","message":"I\u0027m not sure about that. I mean even in the baseline code we initialize a placement_fixtures.PlacementFixture for each test and that calls configure eventually. Or in other perspective it might not matter that we configure only once effectively (as any subsequent configure call just leads to a warning) because we sneak in a different connection url to the DB stack by passing it to `AdHocDbFixture.__init__(url\u003d)` at each test case. So I feel like that if we pass in a new url from each test (or pass in the same url but we deleted the file at the end of the previous test case) then it will be used by that test case.","commit_id":"1f97bab230caf3aea21d094481b94f22908fb4ac"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"f3599c1abedd242c5715453a1cc8332afc365b3b","unresolved":true,"context_lines":[{"line_number":140,"context_line":"    \"\"\""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":143,"context_line":"        # placement_db.configure() is @run_once, so all functional tests in a"},{"line_number":144,"context_line":"        # stestr worker share one file-backed SQLite database in threading"},{"line_number":145,"context_line":"        # mode."},{"line_number":146,"context_line":"        if utils.concurrency_mode_threading() and kwargs.get(\u0027db\u0027, True):"},{"line_number":147,"context_line":"            file_db_path \u003d _get_shared_placement_db_path()"},{"line_number":148,"context_line":"            kwargs[\u0027db_connection\u0027] \u003d \u0027sqlite:///\u0027 + file_db_path"}],"source_content_type":"text/x-python","patch_set":9,"id":"8fec33bb_c1bcc88a","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":15},"in_reply_to":"677dc97d_40e87d52","updated":"2026-07-03 14:59:00.000000000","message":"We use one shared file-backed URL per stestr worker because that is what works with placement’s file-reuse fixture mode (993106): same URL across tests needs stable oslo.db ident and skip AdHoc per-test teardown and per-test isolation is via drop_all. When I tried shared file without that placement-side support in 993106, the worker failed on the second test with KeyError: \u0027_db_\u003cident\u003e\u0027.\n\nI have not tried a per-test Placement URL yet but would be happy to explore that if you prefer it over shared file + file-reuse block.","commit_id":"1f97bab230caf3aea21d094481b94f22908fb4ac"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"b243fa63f2609fb45d3209770319032c4041ee73","unresolved":true,"context_lines":[{"line_number":140,"context_line":"    \"\"\""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":143,"context_line":"        # placement_db.configure() is @run_once, so all functional tests in a"},{"line_number":144,"context_line":"        # stestr worker share one file-backed SQLite database in threading"},{"line_number":145,"context_line":"        # mode."},{"line_number":146,"context_line":"        if utils.concurrency_mode_threading() and kwargs.get(\u0027db\u0027, True):"},{"line_number":147,"context_line":"            file_db_path \u003d _get_shared_placement_db_path()"},{"line_number":148,"context_line":"            kwargs[\u0027db_connection\u0027] \u003d \u0027sqlite:///\u0027 + file_db_path"}],"source_content_type":"text/x-python","patch_set":9,"id":"914696aa_5e7bca22","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":15},"in_reply_to":"8fec33bb_c1bcc88a","updated":"2026-07-08 12:28:43.000000000","message":"Switched to per-test Placement URL approach","commit_id":"1f97bab230caf3aea21d094481b94f22908fb4ac"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"ad75f6d0124bf655ea143be3b8d0240453504fbc","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    \"\"\""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":143,"context_line":"        # placement_db.configure() is @run_once, so all functional tests in a"},{"line_number":144,"context_line":"        # stestr worker share one file-backed SQLite database in threading"},{"line_number":145,"context_line":"        # mode."},{"line_number":146,"context_line":"        if utils.concurrency_mode_threading() and kwargs.get(\u0027db\u0027, True):"},{"line_number":147,"context_line":"            file_db_path \u003d _get_shared_placement_db_path()"},{"line_number":148,"context_line":"            kwargs[\u0027db_connection\u0027] \u003d \u0027sqlite:///\u0027 + file_db_path"}],"source_content_type":"text/x-python","patch_set":9,"id":"4ab59252_bba3ad5f","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":15},"in_reply_to":"914696aa_5e7bca22","updated":"2026-07-08 12:28:56.000000000","message":"Done","commit_id":"1f97bab230caf3aea21d094481b94f22908fb4ac"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e271ab142aeb34bc25dd8ea0f44a44ce4b0ae0cd","unresolved":true,"context_lines":[{"line_number":65,"context_line":"        self.useFixture(placement_fixtures.Database(set_config\u003dTrue))"},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _configure_placement_database(self, conf_fixture):"},{"line_number":69,"context_line":"        if utils.concurrency_mode_threading() and self.db:"},{"line_number":70,"context_line":"            # Per-test temp file under NestedTempfile, same pattern as the"},{"line_number":71,"context_line":"            # Nova Database/CellDatabases fixtures. placement.db_api.configure"},{"line_number":72,"context_line":"            # is run_once, so replace the engine facade each test."}],"source_content_type":"text/x-python","patch_set":17,"id":"d2debb5d_af9e42dd","line":69,"range":{"start_line":68,"start_character":0,"end_line":69,"end_character":58},"updated":"2026-07-09 10:46:18.000000000","message":"I know it is noop but I would call\n```\nsuper()._configure_placement...\n```\nhere so the reader can notice that we are overriding a function from the base fixture.","commit_id":"34a0afdb38afa4acaa40d41a2ff89ec4b5c11b2d"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"ed8192d975b0501320c052f1217513c7417be524","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.useFixture(placement_fixtures.Database(set_config\u003dTrue))"},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _configure_placement_database(self, conf_fixture):"},{"line_number":69,"context_line":"        if utils.concurrency_mode_threading() and self.db:"},{"line_number":70,"context_line":"            # Per-test temp file under NestedTempfile, same pattern as the"},{"line_number":71,"context_line":"            # Nova Database/CellDatabases fixtures. placement.db_api.configure"},{"line_number":72,"context_line":"            # is run_once, so replace the engine facade each test."}],"source_content_type":"text/x-python","patch_set":17,"id":"88404054_b8c2f7cf","line":69,"range":{"start_line":68,"start_character":0,"end_line":69,"end_character":58},"in_reply_to":"d2debb5d_af9e42dd","updated":"2026-07-09 12:38:48.000000000","message":"Done","commit_id":"34a0afdb38afa4acaa40d41a2ff89ec4b5c11b2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e271ab142aeb34bc25dd8ea0f44a44ce4b0ae0cd","unresolved":true,"context_lines":[{"line_number":73,"context_line":"            self.useFixture(fixtures.NestedTempfile())"},{"line_number":74,"context_line":"            placement_db_url, _path \u003d ("},{"line_number":75,"context_line":"                _use_file_backed_sqlite_with_wal(\u0027placement\u0027))"},{"line_number":76,"context_line":"            placement_db.configure.reset()"},{"line_number":77,"context_line":"            placement_engine \u003d enginefacade.transaction_context()"},{"line_number":78,"context_line":"            self.useFixture("},{"line_number":79,"context_line":"                db_fixtures.ReplaceEngineFacadeFixture("},{"line_number":80,"context_line":"                    placement_db.placement_context_manager,"},{"line_number":81,"context_line":"                    placement_engine))"},{"line_number":82,"context_line":"            conf_fixture.config("},{"line_number":83,"context_line":"                connection\u003dplacement_db_url,"},{"line_number":84,"context_line":"                group\u003d\u0027placement_database\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"229a2055_1f5154bb","line":81,"range":{"start_line":76,"start_character":0,"end_line":81,"end_character":38},"updated":"2026-07-09 10:46:18.000000000","message":"I\u0027m not sure we need this.\nThe https://github.com/openstack/placement/blob/7ad9ef078b490423ac6605e805fad2b75c8f2107/placement/tests/fixtures.py#L63 does the patching as well as the oslo DB fixture the placement DB fixture inherits from https://github.com/openstack/oslo.db/blob/9d07b4124b6d77f5e79e4e40fc905745b2df583f/oslo_db/sqlalchemy/test_fixtures.py#L329\n\nI run couple of full test suite with these commented out and I see it is OK without it","commit_id":"34a0afdb38afa4acaa40d41a2ff89ec4b5c11b2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4ee4de6cb49ab5a4add288e7e186680b37539e45","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            self.useFixture(fixtures.NestedTempfile())"},{"line_number":74,"context_line":"            placement_db_url, _path \u003d ("},{"line_number":75,"context_line":"                _use_file_backed_sqlite_with_wal(\u0027placement\u0027))"},{"line_number":76,"context_line":"            placement_db.configure.reset()"},{"line_number":77,"context_line":"            placement_engine \u003d enginefacade.transaction_context()"},{"line_number":78,"context_line":"            self.useFixture("},{"line_number":79,"context_line":"                db_fixtures.ReplaceEngineFacadeFixture("},{"line_number":80,"context_line":"                    placement_db.placement_context_manager,"},{"line_number":81,"context_line":"                    placement_engine))"},{"line_number":82,"context_line":"            conf_fixture.config("},{"line_number":83,"context_line":"                connection\u003dplacement_db_url,"},{"line_number":84,"context_line":"                group\u003d\u0027placement_database\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfd7dda4_f8657e0b","line":81,"range":{"start_line":76,"start_character":0,"end_line":81,"end_character":38},"in_reply_to":"229a2055_1f5154bb","updated":"2026-07-09 14:26:39.000000000","message":"Done","commit_id":"34a0afdb38afa4acaa40d41a2ff89ec4b5c11b2d"}]}
