)]}'
{"/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":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aa49e056c867417b0bb5718818bef5adc51e73a7","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"ee162026_1a257bfe","in_reply_to":"d3f219c4_4274fc70","updated":"2026-09-03 17:40:32.000000000","message":"Thanks Goutham, the status gate seems a likely reason. Ack that it was not reproducible. Let\u0027s keep it in mind in case it shows up again later on.\n\nRe: uggla, I\u0027m not suggesting it as a blocker -- just that it is strange ... why two reboots needed vs one. If someone happened to know the answer I would be interested to know, and it could help us with supporting users in the future.\n\nI think the steps you shared is good information for all of us.","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":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bb2acb172bd7b87be258b989386dab87bb50193f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"16971f81_200d9293","updated":"2026-09-03 18:00:21.000000000","message":"Updates look good to me","commit_id":"89b8d0d8277dd422c26b377a2bd26a94b17af8a4"},{"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"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"950f3858c35a70ebe3d9039783c446a94474a809","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"6b64c123_2d431d2a","updated":"2026-09-03 17:54:17.000000000","message":"recheck\n\nunrelated test failures","commit_id":"89b8d0d8277dd422c26b377a2bd26a94b17af8a4"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f2777126874dcabf06665dc865a9ce4ae3616daa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"ace72f88_c40177c1","updated":"2026-09-03 17:59:22.000000000","message":"recheck [instance: 8d424550-c19e-451c-b0b8-c65ac4e8b4d9] Timeout waiting for [\u0027network-vif-plugged-cef13595-775e-4033-b157-70dc45323acf\u0027] for instance with vm_state shelved_offloaded and task_state spawning. Event states are: network-vif-plugged-cef13595-775e-4033-b157-70dc45323acf: timed out after 300.00 seconds: nova.exception.InstanceEventTimeout","commit_id":"89b8d0d8277dd422c26b377a2bd26a94b17af8a4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"70537e2047f1e41d8a2061a160d59d74b89920f5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"62f75fa8_565d94f6","updated":"2026-09-04 18:45:18.000000000","message":"As discussed in IRC just now, I think this is far too heavyweight to do as proposed here. I think that as Sean suggested, a single query method on `ShareMappingList` that is basically a hyper-efficient \"give me all share mappings I need to look at for reconciliation\" operation would be ideal. Computed server-side, ideally with reasonably efficient SQL queries.\n\nThat might be a bit much to swallow all at once, so a stepping stone would be to make that remotable method less efficient, querying more things into Python space than would be really required, but then doing the sorting, filtering, and merging in a single request. That would turn it into one compute-\u003eMQ-\u003econductor round-trip, with multiple direct to DB queries to finish the list. Far more efficient than doing that all at the end of the pipeline (in compute) and less bespoke/laborious than rolling a new mega-query.","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39b1bb834367457587e7c4914412522f0454022d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"7c871bf4_f7244bef","updated":"2026-09-04 21:10:16.000000000","message":"I\u0027m disappointed you *only* made this a billion times more efficient :/","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"971f5dedc3f26ff159644cd08130461b3f0692e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"9eb2a653_31b0de43","updated":"2026-09-04 22:25:45.000000000","message":"Update looks OK to me","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"cc921da9b11b4afd93f3c50a30a7a3075522ba68","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"1ad4ca49_620b8ffb","updated":"2026-09-06 14:25:45.000000000","message":"recheck","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"f43884536f98b99f22eb9844341e2669ca171d86","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"4b3646e1_1b949474","updated":"2026-09-05 13:55:43.000000000","message":"recheck","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"6c9cbd747c35e188d198c5ac1d3fbb937ddf5aa4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"6157d416_81fe74cd","updated":"2026-09-06 06:18:49.000000000","message":"recheck","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"6e413c194af3645260d317ce4c21aae89b7d3860","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"8a00b816_f0f98f08","updated":"2026-09-06 16:58:56.000000000","message":"recheck","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"3f055bc1289e6a928249e0b5cff8a88bbb9edbd8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"e25f4318_92e8da26","updated":"2026-09-06 08:16:44.000000000","message":"recheck","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"e32579c9fdab1cb8a1eb86d35f5d7c81314e63c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"d08f817d_c31f231b","updated":"2026-09-06 02:59:15.000000000","message":"recheck \n\nparent merged","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"}],"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"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"70537e2047f1e41d8a2061a160d59d74b89920f5","unresolved":true,"context_lines":[{"line_number":596,"context_line":"                context, CONF.host, expected_attrs\u003d[]):"},{"line_number":597,"context_line":"            for sm in objects.ShareMappingList.get_by_instance_uuid("},{"line_number":598,"context_line":"                    context, inst.uuid):"},{"line_number":599,"context_line":"                share_ids.add(sm.share_id)"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        # Migrations touching this host as source or destination may have"},{"line_number":602,"context_line":"        # left a stale grant: \u0027host\u0027 matches source_compute or dest_compute."}],"source_content_type":"text/x-python","patch_set":19,"id":"ca31f83c_aa84fabb","line":599,"updated":"2026-09-04 18:45:18.000000000","message":"For a host with 500 instances on it, this will generate 501 MQ-\u003eDB queries even if no instances are using shares. At startup for every compute node, and every $interval minutes for the periodic.","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"06a41238b0d887ebb3d784d730d84beaf401a3ed","unresolved":true,"context_lines":[{"line_number":596,"context_line":"                context, CONF.host, expected_attrs\u003d[]):"},{"line_number":597,"context_line":"            for sm in objects.ShareMappingList.get_by_instance_uuid("},{"line_number":598,"context_line":"                    context, inst.uuid):"},{"line_number":599,"context_line":"                share_ids.add(sm.share_id)"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        # Migrations touching this host as source or destination may have"},{"line_number":602,"context_line":"        # left a stale grant: \u0027host\u0027 matches source_compute or dest_compute."}],"source_content_type":"text/x-python","patch_set":19,"id":"d1e196ec_9f9ea49d","line":599,"in_reply_to":"ca31f83c_aa84fabb","updated":"2026-09-04 20:35:11.000000000","message":"Ack; ty for the chat on #openstack-nova.. Agreed on the load and the per-instance fan-out. As we discussed, i replaced these nested queries with a single remotable call that does the whole gather conductor-side. It gathers instances currently on the host, unioned with instances whose migration touched it (as source or dest), then one share-mapping lookup. So it\u0027s one compute→conductor round-trip and a bounded set of DB queries regardless of instance count (instead of one query per instance and per migration)","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"70537e2047f1e41d8a2061a160d59d74b89920f5","unresolved":true,"context_lines":[{"line_number":608,"context_line":"                 \u0027status\u0027: [\u0027confirmed\u0027, \u0027reverted\u0027, \u0027error\u0027]}):"},{"line_number":609,"context_line":"            for sm in objects.ShareMappingList.get_by_instance_uuid("},{"line_number":610,"context_line":"                    context, mig.instance_uuid):"},{"line_number":611,"context_line":"                share_ids.add(sm.share_id)"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        if not share_ids:"},{"line_number":614,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a757e6c_797149e4","line":611,"updated":"2026-09-04 18:45:18.000000000","message":"For a compute node that has been in service for years and has had almost every living instance run through it during slide puzzle upgrades, this could easily be 10k migrations, upping the number so far here to 10501 queries.","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"06a41238b0d887ebb3d784d730d84beaf401a3ed","unresolved":false,"context_lines":[{"line_number":608,"context_line":"                 \u0027status\u0027: [\u0027confirmed\u0027, \u0027reverted\u0027, \u0027error\u0027]}):"},{"line_number":609,"context_line":"            for sm in objects.ShareMappingList.get_by_instance_uuid("},{"line_number":610,"context_line":"                    context, mig.instance_uuid):"},{"line_number":611,"context_line":"                share_ids.add(sm.share_id)"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        if not share_ids:"},{"line_number":614,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":19,"id":"a6f92449_f5066a17","line":611,"in_reply_to":"9a757e6c_797149e4","updated":"2026-09-04 20:35:11.000000000","message":"++","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"70537e2047f1e41d8a2061a160d59d74b89920f5","unresolved":true,"context_lines":[{"line_number":616,"context_line":"        try:"},{"line_number":617,"context_line":"            for share_id in share_ids:"},{"line_number":618,"context_line":"                try:"},{"line_number":619,"context_line":"                    self._reconcile_share(context, share_id)"},{"line_number":620,"context_line":"                except ("},{"line_number":621,"context_line":"                    exception.ManilaConnectionFailed,"},{"line_number":622,"context_line":"                    keystone_exception.MissingAuthPlugin,"}],"source_content_type":"text/x-python","patch_set":19,"id":"921f7af2_43555912","line":619,"updated":"2026-09-04 18:45:18.000000000","message":"For each share we decide is relevant, this will generate a ShareMapping list query and then an InstanceList query that will include any instance in the deployment using that share (right?) Say half the instances here are using a share, all different shares. That\u0027s 250 more ShareMapping queries, and thus 250 InstanceList queries, potentially with a bunch of large instance objects returned each. So call that 11k queries total and quite a bit of result traffic.","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"06a41238b0d887ebb3d784d730d84beaf401a3ed","unresolved":false,"context_lines":[{"line_number":616,"context_line":"        try:"},{"line_number":617,"context_line":"            for share_id in share_ids:"},{"line_number":618,"context_line":"                try:"},{"line_number":619,"context_line":"                    self._reconcile_share(context, share_id)"},{"line_number":620,"context_line":"                except ("},{"line_number":621,"context_line":"                    exception.ManilaConnectionFailed,"},{"line_number":622,"context_line":"                    keystone_exception.MissingAuthPlugin,"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a920cf8_e4ab51b2","line":619,"in_reply_to":"921f7af2_43555912","updated":"2026-09-04 20:35:11.000000000","message":"++","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"70537e2047f1e41d8a2061a160d59d74b89920f5","unresolved":true,"context_lines":[{"line_number":656,"context_line":""},{"line_number":657,"context_line":"            instance_uuids \u003d list({m.instance_uuid for m in mappings})"},{"line_number":658,"context_line":"            found \u003d objects.InstanceList.get_by_filters("},{"line_number":659,"context_line":"                context, {\u0027uuid\u0027: instance_uuids}, expected_attrs\u003d[])"},{"line_number":660,"context_line":"            instances_by_uuid \u003d {inst.uuid: inst for inst in found}"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"            # Conservative: if any of the share\u0027s instances is unknown"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a2f9783_39cf70ad","line":659,"updated":"2026-09-04 18:45:18.000000000","message":"Why can\u0027t we filter this by `CONF.host`? Won\u0027t this return a lot of instances we don\u0027t care about?","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39b1bb834367457587e7c4914412522f0454022d","unresolved":false,"context_lines":[{"line_number":656,"context_line":""},{"line_number":657,"context_line":"            instance_uuids \u003d list({m.instance_uuid for m in mappings})"},{"line_number":658,"context_line":"            found \u003d objects.InstanceList.get_by_filters("},{"line_number":659,"context_line":"                context, {\u0027uuid\u0027: instance_uuids}, expected_attrs\u003d[])"},{"line_number":660,"context_line":"            instances_by_uuid \u003d {inst.uuid: inst for inst in found}"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"            # Conservative: if any of the share\u0027s instances is unknown"}],"source_content_type":"text/x-python","patch_set":19,"id":"2937d95b_0034b077","line":659,"in_reply_to":"47853ad4_c54627b8","updated":"2026-09-04 21:10:16.000000000","message":"Okay right, I guess I keep forgetting that we\u0027re trying to reconcile all the *other* instances. That said, we should also be able to query for only the additional instances we haven\u0027t already looked up as on-this host right? If there were no other nodes for example, you will have gotten a list of \"instances on this host\", collected the uuids of those and then re-queried the same set out of the database by uuid.","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"06a41238b0d887ebb3d784d730d84beaf401a3ed","unresolved":false,"context_lines":[{"line_number":656,"context_line":""},{"line_number":657,"context_line":"            instance_uuids \u003d list({m.instance_uuid for m in mappings})"},{"line_number":658,"context_line":"            found \u003d objects.InstanceList.get_by_filters("},{"line_number":659,"context_line":"                context, {\u0027uuid\u0027: instance_uuids}, expected_attrs\u003d[])"},{"line_number":660,"context_line":"            instances_by_uuid \u003d {inst.uuid: inst for inst in found}"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"            # Conservative: if any of the share\u0027s instances is unknown"}],"source_content_type":"text/x-python","patch_set":19,"id":"47853ad4_c54627b8","line":659,"in_reply_to":"5a2f9783_39cf70ad","updated":"2026-09-04 20:35:11.000000000","message":"We\u0027re draining stale rules on CONF.host, but the instances we\u0027re checking may have migrated away.. this lookup is scoped to the one share\u0027s mappings (get_by_share_id under the lock), most likely a single instance. Added a comment saying so. Let me know if you\u0027d like to re-visit","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"70537e2047f1e41d8a2061a160d59d74b89920f5","unresolved":true,"context_lines":[{"line_number":763,"context_line":"        )"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"    @staticmethod"},{"line_number":766,"context_line":"    def _nfs_share_mounted(export_location):"},{"line_number":767,"context_line":"        # Read /proc/mounts (procfs, never blocks) rather than"},{"line_number":768,"context_line":"        # os.path.ismount (which stats the mountpoint and can hang on a"},{"line_number":769,"context_line":"        # wedged NFS mount). The NFS mount device is the export location"}],"source_content_type":"text/x-python","patch_set":19,"id":"c5e29ea5_ce2fa1be","line":766,"updated":"2026-09-04 18:45:18.000000000","message":"Is there no better way to do this with some standard library? I also thought sean was trying to get us to stop doing local filesystem stuff directly. This will cause this code to not run on macos for example without mocking. I think this needs to go into `nova.filesystem` to be easily mocked out for tests.\n\ncc @smooney@redhat.com","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"06a41238b0d887ebb3d784d730d84beaf401a3ed","unresolved":false,"context_lines":[{"line_number":763,"context_line":"        )"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"    @staticmethod"},{"line_number":766,"context_line":"    def _nfs_share_mounted(export_location):"},{"line_number":767,"context_line":"        # Read /proc/mounts (procfs, never blocks) rather than"},{"line_number":768,"context_line":"        # os.path.ismount (which stats the mountpoint and can hang on a"},{"line_number":769,"context_line":"        # wedged NFS mount). The NFS mount device is the export location"}],"source_content_type":"text/x-python","patch_set":19,"id":"6ab76638_aa719c56","line":766,"in_reply_to":"c5e29ea5_ce2fa1be","updated":"2026-09-04 20:35:11.000000000","message":"yeah, i tried stdlib, and unfortunately, `os.path.ismount()` isn\u0027t feasible for the hard mount reason.. \n\nBut, it appears psutil has a good replacement we can use (works cross platform), and it\u0027s already being used in the quobyte driver. I copied that approach instead; ty for the \"nova.filesystem.is_mounted()\" suggestion - makes this cleaner to mock","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"70537e2047f1e41d8a2061a160d59d74b89920f5","unresolved":true,"context_lines":[{"line_number":771,"context_line":"        try:"},{"line_number":772,"context_line":"            with open(\u0027/proc/mounts\u0027) as f:"},{"line_number":773,"context_line":"                for line in f:"},{"line_number":774,"context_line":"                    if line.split(\u0027 \u0027, 1)[0] \u003d\u003d export_location:"},{"line_number":775,"context_line":"                        return True"},{"line_number":776,"context_line":"        except OSError:"},{"line_number":777,"context_line":"            # Cannot read the mount table; assume mounted so we do not"}],"source_content_type":"text/x-python","patch_set":19,"id":"b7381da0_8a1fe37e","line":774,"updated":"2026-09-04 18:45:18.000000000","message":"Is this always going to be right? I was thinking short DNS names got expanded by userspace tooling before being passed to the kernel such that this may not always be identical. I really also thought sometimes this would be the IP instead of the name (google confirms this is sometimes the case, maybe with nfsv3).","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"06a41238b0d887ebb3d784d730d84beaf401a3ed","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        try:"},{"line_number":772,"context_line":"            with open(\u0027/proc/mounts\u0027) as f:"},{"line_number":773,"context_line":"                for line in f:"},{"line_number":774,"context_line":"                    if line.split(\u0027 \u0027, 1)[0] \u003d\u003d export_location:"},{"line_number":775,"context_line":"                        return True"},{"line_number":776,"context_line":"        except OSError:"},{"line_number":777,"context_line":"            # Cannot read the mount table; assume mounted so we do not"}],"source_content_type":"text/x-python","patch_set":19,"id":"7d0cdf43_e3dfa862","line":774,"in_reply_to":"b7381da0_8a1fe37e","updated":"2026-09-04 20:35:11.000000000","message":"Ack; I dropped the export-location comparison and match on the deterministic mountpoint we derive for the share instead. ty for flagging this","commit_id":"521b783cf34fd572a8067c8c5043115c4b0066ef"}],"nova/filesystem.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39b1bb834367457587e7c4914412522f0454022d","unresolved":true,"context_lines":[{"line_number":82,"context_line":"        raise exception.FileNotFound(file_path\u003dpath) from exc"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def is_mounted(mountpoint: str) -\u003e bool:"},{"line_number":86,"context_line":"    \"\"\"Return whether ``mountpoint`` is a mounted filesystem."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Uses psutil to read the mount table rather than os.path.ismount(), which"}],"source_content_type":"text/x-python","patch_set":20,"id":"24a23663_b4f911ba","line":85,"updated":"2026-09-04 21:10:16.000000000","message":"This is not critical to fix right now but I think this could maybe use a better name. \"Is mounted\" should take a \"thing that can be mounted\" and \"is something mounted here\" should take .. \"a here\".","commit_id":"6b9fd51dc3c2bf0bb0ddf66e225ed3b3e96341d0"}],"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"}]}
