)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"e49343ddb82ea7dbcb60178b026cae0836bf3ddb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"952000b6_adbae9c6","updated":"2026-08-24 17:11:24.000000000","message":"thanks for reviewing Dan, working on the changes","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"4c7ef93a19218b267b4269e5fddc1d60564f0401","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3af7ebfc_f05dd2fb","updated":"2026-08-25 04:35:43.000000000","message":"ugh, messed up the commit order. New patch incoming","commit_id":"d0056383cee0ff61f9bd589855c1964d5f19b4aa"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"5dfb468deced34e2663430c0269ab301120df472","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"a17c8a43_a15bb9ab","updated":"2026-08-27 23:44:02.000000000","message":"recheck\n\n\ngate roulette","commit_id":"6b8a0456a118d7d04c679f9d43d48f39c04e2de0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"2873a846b6621d0c297a6eca3181c3a816dffbc4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"7a905860_3d158ac8","updated":"2026-08-27 14:56:57.000000000","message":"recheck\n\n\ntest flakiness (shelve/unshelve)","commit_id":"6b8a0456a118d7d04c679f9d43d48f39c04e2de0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"06400e148f36f3ce6eb9e1ed6056f19812dc0973","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"cd4c93d8_03ff7de4","updated":"2026-08-27 06:24:04.000000000","message":"recheck\n\nPOST_FAILURE","commit_id":"6b8a0456a118d7d04c679f9d43d48f39c04e2de0"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"d7e913e996d3f7b2e36e5a4464030722be0b1d40","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"965cff03_8b75df37","updated":"2026-09-01 17:07:54.000000000","message":"The series is looking good now and I\u0027m happy with it overall.\n\nRegarding the feature freeze exception: given the testing I\u0027ve done (see below), the code quality that Dan has already been validating, and the fact that gate failures have been annoying last week, I personally think we are very close to being ready to merge and I\u0027m in favor of the FFE.\n\nThat said, I\u0027ll leave it to Dan and Melanie for a final round of review and the decision on whether this can be merged. The merge needs to happen before the end of this week, otherwise we put RC1 at risk. If we really can\u0027t make it, this will have to wait for the next cycle.\n\nTest I did on a devstack multinode setup (devstack01 + devstack02) with Ceph backend (Cinder RBD + Manila CephFS). Dan covered the NFS side, this focuses on CephFS.\n\nTest results:\n\n1. Multiple cold migrations between nodes with confirm - OK\n2. Cold migration devstack01 to devstack02 with revert - OK\n3. Same-host resize (allow_resize_to_same_host \u003d true) with flavor change - OK\n4. CephFS mounts on hosts are correctly mounted and unmounted during migration lifecycle - OK\n5. Two VMs sharing the same CephFS share on devstack01, cold migrate one VM to devstack02 - host-side mounts look correct - OK  (failed last week corrected now)\n6. Migration with 2 shares - OK\n7. Migration with 2 shares, 1 share with an associated tag - OK\n8. Disable 1 host to prevent migration - OK\n9. Check shares metadata - OK\n10. Corrupt the share_mapping.status with db surgery (set \"active\" to \"attaching\") - OK, I get the expected error: \"ShareErrorUnexpectedStatus: Share ... used by instance ... is in an unexpected state.\"\n11. Live migration with a share attached is correctly blocked - OK\n\nRecovery from a corrupted share_mapping.status (\"attaching\" instead of \"active\") is a bit tricky:\n\n- Stopping or rebooting the instance will set it into ERROR (instance still running on the hypervisor).\n- Because the VM is in ERROR, you can remove the faulty share attachment.\n- Rebooting the instance once fails but the instance should now be ACTIVE.\n- Rebooting the instance a second time is now OK.\n- A dangling share mount remains on the host and needs to be unmounted manually (should be cleaned up once the reconcile periodic task lands).\n- The instance is now back to normal.","commit_id":"220c859e1c4286029a9fbe7b62a302cf877c30e5"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4eb0d45319373b10cfb4113bef38f856fac026ad","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"d3f219c4_4274fc70","in_reply_to":"04f8e782_392ee2bc","updated":"2026-09-03 09:58:04.000000000","message":"@melwittt@gmail.com, @gouthamh4@gmail.com\n\n\u003e On this part, do you know what is the reason it requires two reboots to recover?  \u003e I\u0027m afraid most users would not figure that out.\n\nI can try to reproduce it and dig into it. But that should not be a blocker because it is really unlikely to happen.\nThis happened to recover test 10, which I had to force with DB surgery. I wanted to highlight the positive: although recovering from this uncommon situation was tricky, it can be done with regular commands.","commit_id":"220c859e1c4286029a9fbe7b62a302cf877c30e5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"63da8ce416acc7030deb911f5b79ed288272d3d6","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"864eaaa2_db5edd84","in_reply_to":"20f2355b_cead52a9","updated":"2026-09-02 02:27:23.000000000","message":"\u003e * Rebooting the instance once fails but the instance should now be ACTIVE.\n\u003e * Rebooting the instance a second time is now OK.\n\nOn this part, do you know what is the reason it requires two reboots to recover? I\u0027m afraid most users would not figure that out.","commit_id":"220c859e1c4286029a9fbe7b62a302cf877c30e5"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"bc0a15bd6c178a24a45d2448c2f711ee7c99e2be","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"04f8e782_392ee2bc","in_reply_to":"864eaaa2_db5edd84","updated":"2026-09-03 05:31:11.000000000","message":"There\u0027s a status gate in `get_share_info` during reboots that won\u0027t proceed while a mapping is in attaching/detaching state, it sets the instance to \"error\" instead.\n\nI couldn\u0027t reproduce the problem once the attachment status is fixed - did something muck with the mount as well? If you have logs from it I\u0027d be happy to dig in.","commit_id":"220c859e1c4286029a9fbe7b62a302cf877c30e5"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"e6d38289e9b3e7744dd56e5cc8c35dedffce4f2c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"20f2355b_cead52a9","in_reply_to":"965cff03_8b75df37","updated":"2026-09-01 21:17:41.000000000","message":"Thank you @rene.ribaud@gmail.com\n\nI\u0027ve updated the patch series now. \n\nHoping @dms@danplanet.com and @melwittt@gmail.com can take a look. I\u0027ll keep the test patches on gerrit up to date too.","commit_id":"220c859e1c4286029a9fbe7b62a302cf877c30e5"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"64ed6260c6beb5891457d4539d31b68b1b997053","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"4d739fcf_f3c8c272","updated":"2026-09-02 01:37:26.000000000","message":"recheck\n\nFlaky threading job","commit_id":"9f37b3e239c8062133c3ef40b6a8cb9500e09cbd"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"bc0a15bd6c178a24a45d2448c2f711ee7c99e2be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"7918d357_7670196e","updated":"2026-09-03 05:31:11.000000000","message":"recheck\n\n\nfailures unrelated","commit_id":"89b8d0d8277dd422c26b377a2bd26a94b17af8a4"}],"nova/compute/manager.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f7fd9cf6bbaea8d90c5aff992be1e811cd9e7cff","unresolved":true,"context_lines":[{"line_number":1673,"context_line":"        # Non-fatal: manila may be down at startup and the periodic task"},{"line_number":1674,"context_line":"        # retries."},{"line_number":1675,"context_line":"        try:"},{"line_number":1676,"context_line":"            self.share_manager.reconcile_stale_share_access(context)"},{"line_number":1677,"context_line":"        except Exception:"},{"line_number":1678,"context_line":"            LOG.exception("},{"line_number":1679,"context_line":"                \"Failed to reconcile stale share access rules at startup\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"2f6395d2_dca1d388","line":1676,"updated":"2026-08-24 16:28:23.000000000","message":"AFAICT, this will always fail for people not using manila, right? That means at startup and every `reconcile_interval` afterwards, we get this in the logs:\n```\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management [None req-5383a111-666a-492b-8906-4d969d8dec61 None None] Failed to reconcile stale access rules for share 9f40e823-3f6d-4125-989f-2d52d93e2f6a: keystoneauth1.exceptions.auth_plugins.MissingAuthPlugin: An auth plugin is required to determine endpoint URL\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management Traceback (most recent call last):\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/compute/share_management.py\", line 581, in reconcile_stale_share_access\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     self._reconcile_share(context, share_id)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/compute/share_management.py\", line 634, in _reconcile_share\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     _locked()\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_concurrency/lockutils.py\", line 534, in inner\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     return f(*args, **kwargs)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management            ^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/compute/share_management.py\", line 626, in _locked\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     rules \u003d self.manila_api.get_access_rules(context, share_id)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/share/manila.py\", line 127, in wrapper\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     res \u003d method(self, *args, **kwargs)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/share/manila.py\", line 145, in wrapper\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     res \u003d method(self, *args, **kwargs)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/share/manila.py\", line 264, in get_access_rules\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     access_list \u003d _manilaclient(\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management                   ^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/share/manila.py\", line 41, in _manilaclient\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     return utils.get_sdk_adapter(\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management            ^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/nova/nova/utils.py\", line 838, in get_sdk_adapter\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     return getattr(conn, service_type.replace(\u0027-\u0027, \u0027_\u0027))\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/data/venv/lib/python3.12/site-packages/openstack/service_description.py\", line 116, in __get__\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     proxy \u003d self._make_proxy(instance)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management             ^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/data/venv/lib/python3.12/site-packages/openstack/service_description.py\", line 360, in _make_proxy\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     found_version \u003d temp_adapter.get_api_major_version()\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/data/venv/lib/python3.12/site-packages/keystoneauth1/adapter.py\", line 426, in get_api_major_version\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     return self.session.get_api_major_version(auth or self.auth, **kwargs)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/data/venv/lib/python3.12/site-packages/keystoneauth1/session.py\", line 1472, in get_api_major_version\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     auth \u003d self._auth_required(auth, \u0027determine endpoint URL\u0027)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management   File \"/opt/stack/data/venv/lib/python3.12/site-packages/keystoneauth1/session.py\", line 1360, in _auth_required\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management     raise exceptions.MissingAuthPlugin(msg_fmt % msg)\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management keystoneauth1.exceptions.auth_plugins.MissingAuthPlugin: An auth plugin is required to determine endpoint URL\nAug 24 16:21:28 noble nova-compute[185543]: ERROR nova.compute.share_management\n```","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"e49343ddb82ea7dbcb60178b026cae0836bf3ddb","unresolved":true,"context_lines":[{"line_number":1673,"context_line":"        # Non-fatal: manila may be down at startup and the periodic task"},{"line_number":1674,"context_line":"        # retries."},{"line_number":1675,"context_line":"        try:"},{"line_number":1676,"context_line":"            self.share_manager.reconcile_stale_share_access(context)"},{"line_number":1677,"context_line":"        except Exception:"},{"line_number":1678,"context_line":"            LOG.exception("},{"line_number":1679,"context_line":"                \"Failed to reconcile stale share access rules at startup\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"48ae3c79_c251e862","line":1676,"in_reply_to":"2f6395d2_dca1d388","updated":"2026-08-24 17:11:24.000000000","message":"yikes, you\u0027re right. fixing that part. we can still try it, if it fails, ignore and log a single line (instead of spamming the log with an exception)","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"506f2f116c2ef6eaa270d8a93b6e260e63402290","unresolved":true,"context_lines":[{"line_number":1673,"context_line":"        # Non-fatal: manila may be down at startup and the periodic task"},{"line_number":1674,"context_line":"        # retries."},{"line_number":1675,"context_line":"        try:"},{"line_number":1676,"context_line":"            self.share_manager.reconcile_stale_share_access(context)"},{"line_number":1677,"context_line":"        except Exception:"},{"line_number":1678,"context_line":"            LOG.exception("},{"line_number":1679,"context_line":"                \"Failed to reconcile stale share access rules at startup\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"a3436dfc_64759167","line":1676,"in_reply_to":"48ae3c79_c251e862","updated":"2026-08-24 17:55:50.000000000","message":"Well, I think it\u0027d be better if we try to not even log. Can\u0027t we test for the presence of a configured manila in some way? Or maybe just if there are no share objects that we need to care about, don\u0027t even make the call?","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b918c1397919579215ed8cb13fbe12ee2c4d0071","unresolved":false,"context_lines":[{"line_number":1673,"context_line":"        # Non-fatal: manila may be down at startup and the periodic task"},{"line_number":1674,"context_line":"        # retries."},{"line_number":1675,"context_line":"        try:"},{"line_number":1676,"context_line":"            self.share_manager.reconcile_stale_share_access(context)"},{"line_number":1677,"context_line":"        except Exception:"},{"line_number":1678,"context_line":"            LOG.exception("},{"line_number":1679,"context_line":"                \"Failed to reconcile stale share access rules at startup\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"2e4b6077_a9759143","line":1676,"in_reply_to":"a3436dfc_64759167","updated":"2026-08-26 05:56:02.000000000","message":"ack; \n\nif manila isn\u0027t configured, we just skip the reconciliation [1], no logs are emitted for that case.\n\n[1] https://review.opendev.org/c/openstack/nova/+/1001916/7/nova/compute/share_management.py#580","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"}],"nova/compute/share_management.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"63da8ce416acc7030deb911f5b79ed288272d3d6","unresolved":true,"context_lines":[{"line_number":592,"context_line":"        # that the source host cannot drain."},{"line_number":593,"context_line":"        for mig in objects.MigrationList.get_by_filters("},{"line_number":594,"context_line":"                context,"},{"line_number":595,"context_line":"                {\u0027dest_compute\u0027: CONF.host,"},{"line_number":596,"context_line":"                 \u0027status\u0027: [\u0027reverted\u0027, \u0027error\u0027]}):"},{"line_number":597,"context_line":"            for sm in objects.ShareMappingList.get_by_instance_uuid("},{"line_number":598,"context_line":"                    context, mig.instance_uuid):"}],"source_content_type":"text/x-python","patch_set":16,"id":"82f1c4fd_8023b882","line":595,"range":{"start_line":595,"start_character":18,"end_line":595,"end_character":30},"updated":"2026-09-02 02:27:23.000000000","message":"It looks like `dest_compute` is not a valid filter in the database [1] so this part of the filtering will not work as expected and is misleading.\n\nThe `host` filter key would pick up migrations where this host was the source or destination though, and because `share_ids` is a set then you could just let it add duplicates if there are any and it would not affect the set.\n\nAlternatively could do one query using `host` and not use `source_compute` but that would also pick up confirmed migrations where this host was the destination and check rules that are expected to be fine.\n\n[1] https://github.com/openstack/nova/blob/d3a1c95d06c2d97368207c2728fc262796683ad8/nova/db/main/api.py#L3364","commit_id":"9f37b3e239c8062133c3ef40b6a8cb9500e09cbd"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"654914156d56e1c1e0e368a2ea4def1857a292dc","unresolved":true,"context_lines":[{"line_number":592,"context_line":"        # that the source host cannot drain."},{"line_number":593,"context_line":"        for mig in objects.MigrationList.get_by_filters("},{"line_number":594,"context_line":"                context,"},{"line_number":595,"context_line":"                {\u0027dest_compute\u0027: CONF.host,"},{"line_number":596,"context_line":"                 \u0027status\u0027: [\u0027reverted\u0027, \u0027error\u0027]}):"},{"line_number":597,"context_line":"            for sm in objects.ShareMappingList.get_by_instance_uuid("},{"line_number":598,"context_line":"                    context, mig.instance_uuid):"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfc800b4_124127af","line":595,"range":{"start_line":595,"start_character":18,"end_line":595,"end_character":30},"in_reply_to":"82f1c4fd_8023b882","updated":"2026-09-02 02:32:22.000000000","message":"And obviously another option would be to add `dest_compute` as a filter in the DB code ^.","commit_id":"9f37b3e239c8062133c3ef40b6a8cb9500e09cbd"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"bc0a15bd6c178a24a45d2448c2f711ee7c99e2be","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        # that the source host cannot drain."},{"line_number":593,"context_line":"        for mig in objects.MigrationList.get_by_filters("},{"line_number":594,"context_line":"                context,"},{"line_number":595,"context_line":"                {\u0027dest_compute\u0027: CONF.host,"},{"line_number":596,"context_line":"                 \u0027status\u0027: [\u0027reverted\u0027, \u0027error\u0027]}):"},{"line_number":597,"context_line":"            for sm in objects.ShareMappingList.get_by_instance_uuid("},{"line_number":598,"context_line":"                    context, mig.instance_uuid):"}],"source_content_type":"text/x-python","patch_set":16,"id":"98e74a81_5de069e6","line":595,"range":{"start_line":595,"start_character":18,"end_line":595,"end_character":30},"in_reply_to":"dfc800b4_124127af","updated":"2026-09-03 05:31:11.000000000","message":"I was overthinking this. I fixed the query to just filter by host (source or destination) of a migration.\n\nThere\u0027s a liveness guard in `_reconcile_share` that will ensure that there\u0027s no active attachment using the rule before trying to reap it.","commit_id":"9f37b3e239c8062133c3ef40b6a8cb9500e09cbd"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"63da8ce416acc7030deb911f5b79ed288272d3d6","unresolved":true,"context_lines":[{"line_number":686,"context_line":"                continue"},{"line_number":687,"context_line":"            if rule.access_to in legit:"},{"line_number":688,"context_line":"                continue"},{"line_number":689,"context_line":"            self._revoke(context, share_id, \u0027cephx\u0027, rule.access_to)"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"    def _reconcile_nfs_rules("},{"line_number":692,"context_line":"        self, context, share_id, mappings, instances, rules"}],"source_content_type":"text/x-python","patch_set":16,"id":"0e730c7f_40f25870","line":689,"updated":"2026-09-02 02:27:23.000000000","message":"In `_reconcile_nfs_rules`, `_revoke` is not called if the rule state is `queued_to_deny` or `denying`, is there a reason not to do it with cephfs?","commit_id":"9f37b3e239c8062133c3ef40b6a8cb9500e09cbd"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"bc0a15bd6c178a24a45d2448c2f711ee7c99e2be","unresolved":false,"context_lines":[{"line_number":686,"context_line":"                continue"},{"line_number":687,"context_line":"            if rule.access_to in legit:"},{"line_number":688,"context_line":"                continue"},{"line_number":689,"context_line":"            self._revoke(context, share_id, \u0027cephx\u0027, rule.access_to)"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"    def _reconcile_nfs_rules("},{"line_number":692,"context_line":"        self, context, share_id, mappings, instances, rules"}],"source_content_type":"text/x-python","patch_set":16,"id":"bfae71ea_37c369ca","line":689,"in_reply_to":"0e730c7f_40f25870","updated":"2026-09-03 05:31:11.000000000","message":"nope, no reason. That should be happening here too.. fixed.","commit_id":"9f37b3e239c8062133c3ef40b6a8cb9500e09cbd"}],"nova/objects/share_mapping.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f7fd9cf6bbaea8d90c5aff992be1e811cd9e7cff","unresolved":true,"context_lines":[{"line_number":196,"context_line":"class ShareMappingList(base.ObjectListBase, base.NovaObject):"},{"line_number":197,"context_line":"    # Version 1.0: Initial version"},{"line_number":198,"context_line":"    # Version 1.1: Add get_all() method"},{"line_number":199,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":200,"context_line":"    fields \u003d {"},{"line_number":201,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ShareMapping\u0027),"},{"line_number":202,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"0afd15ca_dca426bf","line":199,"updated":"2026-08-24 16:28:23.000000000","message":"Let\u0027s please just add this into the patch below instead of landing this basically a version up from 1.0 in order to have the basic required functionality. I went to deploy this and only restarted compute (not expecting to see an object version bump in a patch that just adds a periodic) and conductor is of course yelling at me because it doesn\u0027t know about this bump.","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"506f2f116c2ef6eaa270d8a93b6e260e63402290","unresolved":true,"context_lines":[{"line_number":196,"context_line":"class ShareMappingList(base.ObjectListBase, base.NovaObject):"},{"line_number":197,"context_line":"    # Version 1.0: Initial version"},{"line_number":198,"context_line":"    # Version 1.1: Add get_all() method"},{"line_number":199,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":200,"context_line":"    fields \u003d {"},{"line_number":201,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ShareMapping\u0027),"},{"line_number":202,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"a95cab81_f3af9910","line":199,"in_reply_to":"037d3bf6_5a0bb071","updated":"2026-08-24 17:55:50.000000000","message":"Nope, convention is to try to avoid bumping whenever we don\u0027t need to :)","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"e49343ddb82ea7dbcb60178b026cae0836bf3ddb","unresolved":true,"context_lines":[{"line_number":196,"context_line":"class ShareMappingList(base.ObjectListBase, base.NovaObject):"},{"line_number":197,"context_line":"    # Version 1.0: Initial version"},{"line_number":198,"context_line":"    # Version 1.1: Add get_all() method"},{"line_number":199,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":200,"context_line":"    fields \u003d {"},{"line_number":201,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ShareMapping\u0027),"},{"line_number":202,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"037d3bf6_5a0bb071","line":199,"in_reply_to":"0afd15ca_dca426bf","updated":"2026-08-24 17:11:24.000000000","message":"ah, i thought it was convention; attempting this","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b918c1397919579215ed8cb13fbe12ee2c4d0071","unresolved":false,"context_lines":[{"line_number":196,"context_line":"class ShareMappingList(base.ObjectListBase, base.NovaObject):"},{"line_number":197,"context_line":"    # Version 1.0: Initial version"},{"line_number":198,"context_line":"    # Version 1.1: Add get_all() method"},{"line_number":199,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":200,"context_line":"    fields \u003d {"},{"line_number":201,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ShareMapping\u0027),"},{"line_number":202,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"4fbce38b_d125bd4b","line":199,"in_reply_to":"0ba5305d_7e08e9f7","updated":"2026-08-26 05:56:02.000000000","message":"We don\u0027t store the host value in manila either :(\n\nI went back to the drawing board a bit, and settled bck on a host based reconciliation.. \n\nOn init, and periodically, a host will run InstanceList.get_by_host() for live instances, then MigrationList.get_by_filters() scoped to source_compute/dest_compute \u003d this host for the migration-error cases, then ShareMappingList.get_by_instance_uuid() for each. The querying and RPC payload is now proportional to a single compute\u0027s own instances and recent migrations... \n\nit\u0027s definitely better than a cell-wide scan in that regard.. I think being able to query MigrationList was what I was missing earlier.","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b44b306c3cdfcb543e49222ff77f823ade1f48a5","unresolved":true,"context_lines":[{"line_number":196,"context_line":"class ShareMappingList(base.ObjectListBase, base.NovaObject):"},{"line_number":197,"context_line":"    # Version 1.0: Initial version"},{"line_number":198,"context_line":"    # Version 1.1: Add get_all() method"},{"line_number":199,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":200,"context_line":"    fields \u003d {"},{"line_number":201,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ShareMapping\u0027),"},{"line_number":202,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"f7b8c92f_7f999cc1","line":199,"in_reply_to":"a95cab81_f3af9910","updated":"2026-08-25 00:43:51.000000000","message":"Ack; but the patch below (the share management extraction) has an object mapping that it\u0027s carrying forward from Epoxy.. this is the first place where I needed a cell-wide query. I tried hard to make this a \"host\"-based lookup.. I had \"InstanceList.get_by_host\" that I could use in that case, and then enumerate the list of shares by \"get_by_instance_uuid\".. \n\nbut i\u0027d miss the case where an instance isn\u0027t on the host, but its mappings are :( \n\n\n\nAck; the ShareMapping object model hasn\u0027t changed since Epoxy — this reconcile patch is the first place I\u0027ve needed a cell-wide query against it; I tried hard to keep it host-local: run InstanceList.get_by_host() and grab teh host\u0027s instances, then ShareMappingList.get_by_instance_uuid() to enumerate their shares. That covers most leaks.\n\nHowever, it falls apart when running the issue you highlighted: if an instance has already moved off this host, get_by_host() wouldn\u0027t grab that, and i can\u0027t find a way to ask \"do any shares still map to me?\" without a cell-wide scan. \n\nOperationally, this should be fine, correct? It\u0027ll address the issue going forward.. (I can\u0027t/don\u0027t intend to backport this)","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"99f73e3aea978b5ab12f521b85950f25405ed6bc","unresolved":true,"context_lines":[{"line_number":196,"context_line":"class ShareMappingList(base.ObjectListBase, base.NovaObject):"},{"line_number":197,"context_line":"    # Version 1.0: Initial version"},{"line_number":198,"context_line":"    # Version 1.1: Add get_all() method"},{"line_number":199,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":200,"context_line":"    fields \u003d {"},{"line_number":201,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ShareMapping\u0027),"},{"line_number":202,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"0ba5305d_7e08e9f7","line":199,"in_reply_to":"f7b8c92f_7f999cc1","updated":"2026-08-25 13:55:18.000000000","message":"\u003e Ack; but the patch below (the share management extraction) has an object mapping that it\u0027s carrying forward from Epoxy..\n\nAh, you\u0027re right. My brain was thinking of all this starting in the previous patch (confusing the new share_management module probably) which of course makes no sense. In that case it should be in this patch, my apologies.\n\n\u003e However, it falls apart when running the issue you highlighted: if an instance has already moved off this host, get_by_host() wouldn\u0027t grab that, and i can\u0027t find a way to ask \"do any shares still map to me?\" without a cell-wide scan. \n\u003e \n\u003e Operationally, this should be fine, correct? It\u0027ll address the issue going forward.. (I can\u0027t/don\u0027t intend to backport this)\n\nOh I hadn\u0027t even looked that deep yet at what you\u0027re doing here.. so you\u0027re going to literally query every share in the whole deployment (or cell), serialize and send it over RPC. ...to each compute on a timer. That could be massive.\n\nI guess it seems wrong to start with the objects - can\u0027t you ask manila for a list of all shares for this host and then compare that with the list of all _objects_ for this host and remove the ones in manila you think don\u0027t apply to you?","commit_id":"dfe68b5cc49a4088eda933cefdf4cd6f5cb84f94"}]}
