)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"76ae03c1_d6646e34","updated":"2025-10-10 16:42:07.000000000","message":"Hi Dan, Thank you for review, I have tried to answer your inline questions, please have a look.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"bcdb4045_ae222398","updated":"2026-01-06 07:27:47.000000000","message":"Thank you Dan for your detailed review, I have added inline answers for your comments. Kindly let me know your opinion about the same.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"eb5f9728_c83cd3b7","updated":"2026-01-07 19:11:45.000000000","message":"As discussed in meeting, I will rewrite the spec to be more generic and not NFS specific. Thank you for your inputs.","commit_id":"212c8c32278a4fc1b99547cf46d657217cfc79f1"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"0700ae97132e603ee8f4aa0f9aea9be3ffb10d94","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"cec86f67_90f7041b","updated":"2026-01-08 15:45:14.000000000","message":"Thank you for review dan, made changes as per your suggestion.","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"32daed896220fbc0683c17758fb72ee8850bf375","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"775dfbf4_23b4be2b","updated":"2026-01-08 16:57:03.000000000","message":"recheck again no logs available, tox -e docs works locally","commit_id":"5c9380ea6065bc7ca234c0c2541a3beaac804f75"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"801da38db72973455af671613f4e179ce0d5b0e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9d942930_90a8379c","updated":"2026-01-08 15:51:22.000000000","message":"recheck no logs generated","commit_id":"5c9380ea6065bc7ca234c0c2541a3beaac804f75"}],"specs/2026.1/approved/glance_store/enhanced-filesystem-nfs-detection.rst":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"75072b79e0d537a3a8284ae04c7b0a9189e6069a","unresolved":true,"context_lines":[{"line_number":62,"context_line":"### Core Components"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"1. **Automatic NFS Detection**: Detect NFS mounts automatically at runtime"},{"line_number":65,"context_line":"   using `/proc/mounts` analysis and filesystem characteristics."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"2. **Adaptive Timeout Management**: Apply different timeout values based on"},{"line_number":68,"context_line":"   detected filesystem type (NFS vs local)."}],"source_content_type":"text/x-rst","patch_set":1,"id":"2ab6e784_02d13f10","line":65,"updated":"2025-10-10 15:05:26.000000000","message":"I\u0027m not sure this is a reliable way to determine anything. The path we get in a store definition is not necessarily directly pointing at the mount - there could be overlays or symbolic links involved.\n\nI think `fstatfs()` is the best bet, although I\u0027m not sure how that will behave if glance-api is running in a container with a bind mounted filesystem. I suspect it will do the right thing, but we should check.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":false,"context_lines":[{"line_number":62,"context_line":"### Core Components"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"1. **Automatic NFS Detection**: Detect NFS mounts automatically at runtime"},{"line_number":65,"context_line":"   using `/proc/mounts` analysis and filesystem characteristics."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"2. **Adaptive Timeout Management**: Apply different timeout values based on"},{"line_number":68,"context_line":"   detected filesystem type (NFS vs local)."}],"source_content_type":"text/x-rst","patch_set":1,"id":"07c59a3f_108d3da2","line":65,"in_reply_to":"2ab6e784_02d13f10","updated":"2025-10-10 16:42:07.000000000","message":"Ack, I think I need to test the container bind mount scenario to verify behavior. But overall using fstatfs will be a good option, I recollect eric (cinder core) has suggested to use this as well, so I will check about this.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"75072b79e0d537a3a8284ae04c7b0a9189e6069a","unresolved":true,"context_lines":[{"line_number":68,"context_line":"   detected filesystem type (NFS vs local)."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"3. **NFS-Specific Error Handling**: Provide specialized error handling and"},{"line_number":71,"context_line":"   optimization recommendations for NFS operations."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"4. **Signal-Based Timeout Protection**: Implement robust timeout mechanisms"},{"line_number":74,"context_line":"   using Python\u0027s `signal.alarm()` to prevent indefinite hanging."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ec0035f9_f20f17a2","line":71,"updated":"2025-10-10 15:05:26.000000000","message":"I\u0027m not sure what this entails... can you add detail?","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":false,"context_lines":[{"line_number":68,"context_line":"   detected filesystem type (NFS vs local)."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"3. **NFS-Specific Error Handling**: Provide specialized error handling and"},{"line_number":71,"context_line":"   optimization recommendations for NFS operations."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"4. **Signal-Based Timeout Protection**: Implement robust timeout mechanisms"},{"line_number":74,"context_line":"   using Python\u0027s `signal.alarm()` to prevent indefinite hanging."}],"source_content_type":"text/x-rst","patch_set":1,"id":"c6cc9159_ad104994","line":71,"in_reply_to":"30ad6f59_233152e5","updated":"2026-01-06 07:27:47.000000000","message":"Done","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":true,"context_lines":[{"line_number":68,"context_line":"   detected filesystem type (NFS vs local)."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"3. **NFS-Specific Error Handling**: Provide specialized error handling and"},{"line_number":71,"context_line":"   optimization recommendations for NFS operations."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"4. **Signal-Based Timeout Protection**: Implement robust timeout mechanisms"},{"line_number":74,"context_line":"   using Python\u0027s `signal.alarm()` to prevent indefinite hanging."}],"source_content_type":"text/x-rst","patch_set":1,"id":"30ad6f59_233152e5","line":71,"in_reply_to":"ec0035f9_f20f17a2","updated":"2025-10-10 16:42:07.000000000","message":"When NFS operations fail, we can distinguish between timeout errors, connection errors and generic errors (like log meaningful error messages for above cases.)","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"75072b79e0d537a3a8284ae04c7b0a9189e6069a","unresolved":true,"context_lines":[{"line_number":71,"context_line":"   optimization recommendations for NFS operations."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"4. **Signal-Based Timeout Protection**: Implement robust timeout mechanisms"},{"line_number":74,"context_line":"   using Python\u0027s `signal.alarm()` to prevent indefinite hanging."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"### Configuration Options"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"daef7ac6_6fb08ad2","line":74,"updated":"2025-10-10 15:05:26.000000000","message":"AFAIK, this is problematic when running inside things like `mod_wsgi` where apache gets the signal, not us. Have you tested this? Here\u0027s the reference:\n\nhttps://modwsgi.readthedocs.io/en/latest/configuration-directives/WSGIRestrictSignal.html\n\nwhere the documentation says \"A well behaved Python WSGI application should not in general register any signal handlers of its own\"\n\nI would think we\u0027d need to use non-blocking IO or a worker thread pool to handle this sort of thing.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":false,"context_lines":[{"line_number":71,"context_line":"   optimization recommendations for NFS operations."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"4. **Signal-Based Timeout Protection**: Implement robust timeout mechanisms"},{"line_number":74,"context_line":"   using Python\u0027s `signal.alarm()` to prevent indefinite hanging."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"### Configuration Options"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"e6e10f7d_35dd45dd","line":74,"in_reply_to":"b5658e2a_2cf50dde","updated":"2026-01-06 07:27:47.000000000","message":"Done","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":true,"context_lines":[{"line_number":71,"context_line":"   optimization recommendations for NFS operations."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"4. **Signal-Based Timeout Protection**: Implement robust timeout mechanisms"},{"line_number":74,"context_line":"   using Python\u0027s `signal.alarm()` to prevent indefinite hanging."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"### Configuration Options"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b5658e2a_2cf50dde","line":74,"in_reply_to":"daef7ac6_6fb08ad2","updated":"2025-10-10 16:42:07.000000000","message":"Thanks for the reference, the documentatin suggests that this does not work with mod_wsgi, I think thread pool approach will be better here.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"f557ee92db596714baaab8ea5de27e96f9f3a53c","unresolved":true,"context_lines":[{"line_number":84,"context_line":"filesystem_store_timeout \u003d 30"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# Enable automatic NFS detection and optimization"},{"line_number":87,"context_line":"filesystem_nfs_auto_detect \u003d true"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"# NFS-specific timeout (overrides filesystem_store_timeout when NFS detected)"},{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"}],"source_content_type":"text/x-rst","patch_set":1,"id":"342494d7_3ba1b810","line":87,"range":{"start_line":87,"start_character":27,"end_line":87,"end_character":28},"updated":"2025-09-30 15:58:01.000000000","message":"Is there any reason why admins would turn this off?","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"filesystem_store_timeout \u003d 30"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# Enable automatic NFS detection and optimization"},{"line_number":87,"context_line":"filesystem_nfs_auto_detect \u003d true"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"# NFS-specific timeout (overrides filesystem_store_timeout when NFS detected)"},{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"}],"source_content_type":"text/x-rst","patch_set":1,"id":"879f41c7_4944f395","line":87,"range":{"start_line":87,"start_character":27,"end_line":87,"end_character":28},"in_reply_to":"0034ef6b_ec01f95e","updated":"2026-01-06 07:27:47.000000000","message":"Done","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"7fb848852059a35bc42cd9e4083e11817cc21c4e","unresolved":true,"context_lines":[{"line_number":84,"context_line":"filesystem_store_timeout \u003d 30"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# Enable automatic NFS detection and optimization"},{"line_number":87,"context_line":"filesystem_nfs_auto_detect \u003d true"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"# NFS-specific timeout (overrides filesystem_store_timeout when NFS detected)"},{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"}],"source_content_type":"text/x-rst","patch_set":1,"id":"0034ef6b_ec01f95e","line":87,"range":{"start_line":87,"start_character":27,"end_line":87,"end_character":28},"in_reply_to":"342494d7_3ba1b810","updated":"2025-09-30 16:28:26.000000000","message":"if they are not using nfs?","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"75072b79e0d537a3a8284ae04c7b0a9189e6069a","unresolved":true,"context_lines":[{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# Recommended NFS mount options for optimization"},{"line_number":93,"context_line":"filesystem_nfs_mount_options \u003d rsize\u003d8192,wsize\u003d8192,timeo\u003d14,retrans\u003d2,soft"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"f64d9f49_6f6657e8","line":93,"updated":"2025-10-10 15:05:26.000000000","message":"What does this do? Is this for cases where we\u0027re using a cinder backend and direct-mounting NFS or something? Also, AFAIK since like NFSv3 I think soft mounts are discouraged:\n\nhttps://docs.redhat.com/en/documentation/red_hat_enterprise_linux/5/html/deployment_guide/s1-nfs-client-config-options","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":false,"context_lines":[{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# Recommended NFS mount options for optimization"},{"line_number":93,"context_line":"filesystem_nfs_mount_options \u003d rsize\u003d8192,wsize\u003d8192,timeo\u003d14,retrans\u003d2,soft"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"46656f98_5749b703","line":93,"in_reply_to":"2833050e_4ace62cc","updated":"2026-01-06 07:27:47.000000000","message":"Done","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"217a353b9e89af75a0e7aa50bfbc79c44abfc194","unresolved":true,"context_lines":[{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# Recommended NFS mount options for optimization"},{"line_number":93,"context_line":"filesystem_nfs_mount_options \u003d rsize\u003d8192,wsize\u003d8192,timeo\u003d14,retrans\u003d2,soft"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"2833050e_4ace62cc","line":93,"in_reply_to":"7790da13_053ee9e3","updated":"2025-10-10 18:04:03.000000000","message":"The original idea was to use this in log message when any operation fails like `You might want to remount with these options: [filesystem_nfs_mount_options]`\n\nBut as you pointed out this does not makes sense I glance does not do the mounting.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":true,"context_lines":[{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# Recommended NFS mount options for optimization"},{"line_number":93,"context_line":"filesystem_nfs_mount_options \u003d rsize\u003d8192,wsize\u003d8192,timeo\u003d14,retrans\u003d2,soft"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa5d1231_9df8e1c2","line":93,"in_reply_to":"f64d9f49_6f6657e8","updated":"2025-10-10 16:42:07.000000000","message":"Ack, should I move to hard mount option or remove this config option entirely?\nI think we does not mount the share as cinder do so this definitely not needed.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ef55ddd7b880efdb0c619d758a330e22a937e47","unresolved":true,"context_lines":[{"line_number":90,"context_line":"filesystem_nfs_timeout \u003d 30"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# Recommended NFS mount options for optimization"},{"line_number":93,"context_line":"filesystem_nfs_mount_options \u003d rsize\u003d8192,wsize\u003d8192,timeo\u003d14,retrans\u003d2,soft"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"7790da13_053ee9e3","line":93,"in_reply_to":"fa5d1231_9df8e1c2","updated":"2025-10-10 16:59:21.000000000","message":"Okay, so why is this config option here at all then? What was it proposed to be used for?","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"75072b79e0d537a3a8284ae04c7b0a9189e6069a","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"#### FilesystemTypeDetector"},{"line_number":98,"context_line":"Automatically detects whether a path is on an NFS mount or local filesystem:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Analyzes `/proc/mounts` to identify NFS mounts"}],"source_content_type":"text/x-rst","patch_set":1,"id":"85537ff7_c8c6e195","line":97,"updated":"2025-10-10 15:05:26.000000000","message":"Where are all these new NFS-specific things supposed to be used? Sorry, I\u0027m just really grasping for the details here...","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"71f374cebae352b51ac3d51b0d6a86b5f139625a","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"#### FilesystemTypeDetector"},{"line_number":98,"context_line":"Automatically detects whether a path is on an NFS mount or local filesystem:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Analyzes `/proc/mounts` to identify NFS mounts"}],"source_content_type":"text/x-rst","patch_set":1,"id":"8da3ea6d_5bbd8914","line":97,"in_reply_to":"3dff6268_c7c5419b","updated":"2025-10-10 16:51:45.000000000","message":"I got it now :) I think we can keep it simple by just defining one flag at service start and based on that we can filter out error message etc.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ef55ddd7b880efdb0c619d758a330e22a937e47","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"#### FilesystemTypeDetector"},{"line_number":98,"context_line":"Automatically detects whether a path is on an NFS mount or local filesystem:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Analyzes `/proc/mounts` to identify NFS mounts"}],"source_content_type":"text/x-rst","patch_set":1,"id":"e3614676_a26b92ce","line":97,"in_reply_to":"3dff6268_c7c5419b","updated":"2025-10-10 16:59:21.000000000","message":"This \"implementation details\" section appears to be suggesting building new objects called `FilesystemTypeDetector`, `AdaptiveTimeoutManager`, etc. How are those going to be used? Take the `NFSErrorHandler` below -- you\u0027re going to use that, if we detect we\u0027re on NFS, in what way? Is that supposed to wrap something else? Is there going to be a `NotNFSErrorHandler` for the regular/other cases? I understand that multiple things will need to be done differently/better for NFS, but it seems like this is proposing actual classes/objects and thus I assume there must be some non-nfs implementations of these? Will they be used instead of, for example, direct calls to `delete()` in all cases?","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"#### FilesystemTypeDetector"},{"line_number":98,"context_line":"Automatically detects whether a path is on an NFS mount or local filesystem:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Analyzes `/proc/mounts` to identify NFS mounts"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3dff6268_c7c5419b","line":97,"in_reply_to":"85537ff7_c8c6e195","updated":"2025-10-10 16:42:07.000000000","message":"May be I am misreading your comment here but let me try to answer it.\nDuring service startup we can check the file_path is on NFS or not using fstatfs (earlier I was thinking to use /proc/mount) and based on this we can use timeout parameter and error messages during normal operations.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"217a353b9e89af75a0e7aa50bfbc79c44abfc194","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"#### FilesystemTypeDetector"},{"line_number":98,"context_line":"Automatically detects whether a path is on an NFS mount or local filesystem:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Analyzes `/proc/mounts` to identify NFS mounts"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fd3ab8be_9939bc42","line":97,"in_reply_to":"e3614676_a26b92ce","updated":"2025-10-10 18:04:03.000000000","message":"I have changed the implementation details based on my previous comment and removed these classes from the latest revision (Which I will push shortly). I am planning to do something like this;\n\n```\n    def delete(self, location):\n       # Wrap the actual operation in thread pool\n       future \u003d self.thread_pool.submit(os.unlink, path)\n       try:\n           future.result(timeout\u003dself.timeout)\n       except TimeoutError:\n           if self.is_nfs:\n               raise Exception(\"Operation timed out. NFS mount may be unavailable...\")\n           else:\n               raise Exception(\"Operation timed out. Check filesystem...\")\n```","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"### Implementation Details"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"#### FilesystemTypeDetector"},{"line_number":98,"context_line":"Automatically detects whether a path is on an NFS mount or local filesystem:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Analyzes `/proc/mounts` to identify NFS mounts"}],"source_content_type":"text/x-rst","patch_set":1,"id":"234c2e98_94b1791b","line":97,"in_reply_to":"fd3ab8be_9939bc42","updated":"2026-01-06 07:27:47.000000000","message":"Done","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"75072b79e0d537a3a8284ae04c7b0a9189e6069a","unresolved":true,"context_lines":[{"line_number":124,"context_line":"* `delete()`: NFS-aware timeout protection and error handling"},{"line_number":125,"context_line":"* `get()`: NFS-aware timeout protection and error handling"},{"line_number":126,"context_line":"* `get_size()`: NFS-aware timeout protection and error handling"},{"line_number":127,"context_line":"* `_get_capacity_info()`: NFS-aware timeout protection"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"### Backward Compatibility"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5264a85e_f7ad5067","line":127,"updated":"2025-10-10 15:05:26.000000000","message":"Again, please, details on what \"NFS-aware delete\" means (et al).","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"174c1314195aef538463dc704ee94fb9a2c346a4","unresolved":false,"context_lines":[{"line_number":124,"context_line":"* `delete()`: NFS-aware timeout protection and error handling"},{"line_number":125,"context_line":"* `get()`: NFS-aware timeout protection and error handling"},{"line_number":126,"context_line":"* `get_size()`: NFS-aware timeout protection and error handling"},{"line_number":127,"context_line":"* `_get_capacity_info()`: NFS-aware timeout protection"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"### Backward Compatibility"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"506b5c74_53f79eec","line":127,"in_reply_to":"2369e335_a05c5141","updated":"2025-10-30 14:40:21.000000000","message":"Done","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":true,"context_lines":[{"line_number":124,"context_line":"* `delete()`: NFS-aware timeout protection and error handling"},{"line_number":125,"context_line":"* `get()`: NFS-aware timeout protection and error handling"},{"line_number":126,"context_line":"* `get_size()`: NFS-aware timeout protection and error handling"},{"line_number":127,"context_line":"* `_get_capacity_info()`: NFS-aware timeout protection"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"### Backward Compatibility"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"91034184_3c8765e2","line":127,"in_reply_to":"5264a85e_f7ad5067","updated":"2025-10-10 16:42:07.000000000","message":"Once we detect whether file_path is mounted on NFS we can wrap these calls like unlink, open etc in a thread with timeout to raise clear error instead of hanging indefinitely.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ef55ddd7b880efdb0c619d758a330e22a937e47","unresolved":true,"context_lines":[{"line_number":124,"context_line":"* `delete()`: NFS-aware timeout protection and error handling"},{"line_number":125,"context_line":"* `get()`: NFS-aware timeout protection and error handling"},{"line_number":126,"context_line":"* `get_size()`: NFS-aware timeout protection and error handling"},{"line_number":127,"context_line":"* `_get_capacity_info()`: NFS-aware timeout protection"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"### Backward Compatibility"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"d13d75b0_490f3546","line":127,"in_reply_to":"91034184_3c8765e2","updated":"2025-10-10 16:59:21.000000000","message":"Ack, the timeout is clear, but \"error handling\"? Is there something else other than just raising a reasonable error if we timeout? If it\u0027s just wrapping these with timeouts, I think maybe it would be better to just list the things you\u0027re going to wrap \"with enhanced timeout protection\" to avoid making it look like there\u0027s more NFS-aware-ness going on here :)","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"217a353b9e89af75a0e7aa50bfbc79c44abfc194","unresolved":true,"context_lines":[{"line_number":124,"context_line":"* `delete()`: NFS-aware timeout protection and error handling"},{"line_number":125,"context_line":"* `get()`: NFS-aware timeout protection and error handling"},{"line_number":126,"context_line":"* `get_size()`: NFS-aware timeout protection and error handling"},{"line_number":127,"context_line":"* `_get_capacity_info()`: NFS-aware timeout protection"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"### Backward Compatibility"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"2369e335_a05c5141","line":127,"in_reply_to":"d13d75b0_490f3546","updated":"2025-10-10 18:04:03.000000000","message":"Yep, made the change in new reviesion.","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"f557ee92db596714baaab8ea5de27e96f9f3a53c","unresolved":true,"context_lines":[{"line_number":254,"context_line":"* NFS mount options documentation for timeout configuration"},{"line_number":255,"context_line":"* Python signal module documentation for timeout implementation"},{"line_number":256,"context_line":"* Glance store driver architecture documentation"},{"line_number":257,"context_line":"* `/proc/mounts` format documentation for NFS detection"}],"source_content_type":"text/x-rst","patch_set":1,"id":"27366faf_4f10f1bf","line":257,"range":{"start_line":257,"start_character":24,"end_line":257,"end_character":37},"updated":"2025-09-30 15:58:01.000000000","message":"I think this section is a big TODO right now :)","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"aef6327bf4c4e2515fa14017dba8440439c432fc","unresolved":false,"context_lines":[{"line_number":254,"context_line":"* NFS mount options documentation for timeout configuration"},{"line_number":255,"context_line":"* Python signal module documentation for timeout implementation"},{"line_number":256,"context_line":"* Glance store driver architecture documentation"},{"line_number":257,"context_line":"* `/proc/mounts` format documentation for NFS detection"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3db28737_4a1b2fdb","line":257,"range":{"start_line":257,"start_character":24,"end_line":257,"end_character":37},"in_reply_to":"27366faf_4f10f1bf","updated":"2025-10-10 16:42:07.000000000","message":"Acknowledged","commit_id":"5b2a856f9711968f04d87e748a3443fb3a412d50"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":77,"context_line":"  # Set higher for NFS/network storage, lower for local storage"},{"line_number":78,"context_line":"  filesystem_store_timeout \u003d 30"},{"line_number":79,"context_line":"  "},{"line_number":80,"context_line":"  # Enable automatic NFS detection for better error messages"},{"line_number":81,"context_line":"  filesystem_nfs_auto_detect \u003d true"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"Implementation Details"}],"source_content_type":"text/x-rst","patch_set":3,"id":"691da89d_19983a67","line":80,"updated":"2026-01-05 15:12:57.000000000","message":"Cyril asked, but I don\u0027t think the answer was very satisfying...why would this be turned off? False positives? If we\u0027re able to reliably detect NFS then it seems like we would never need to turn that off.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":true,"context_lines":[{"line_number":77,"context_line":"  # Set higher for NFS/network storage, lower for local storage"},{"line_number":78,"context_line":"  filesystem_store_timeout \u003d 30"},{"line_number":79,"context_line":"  "},{"line_number":80,"context_line":"  # Enable automatic NFS detection for better error messages"},{"line_number":81,"context_line":"  filesystem_nfs_auto_detect \u003d true"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"Implementation Details"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5c629f73_28eb8e1a","line":80,"in_reply_to":"59dfd94f_5b9d3a05","updated":"2026-01-07 15:46:19.000000000","message":"Okay I guess I don\u0027t see the benefit of providing FS-specific error messages for this kind of thing. Like, if we\u0027re timing out on IO, then...we\u0027re timing out. The same near-infinite hang behavior can happen with local filesystems with a failing disk.\n\nWhat I\u0027m saying is.. it seems to me like just providing the IO worker/timeout behavior is maybe useful and trying to give different error messages based on whether or not the underlying filesystem is NFS (or CIFS, or...) doesn\u0027t really give that much benefit. Just MHO.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"  # Set higher for NFS/network storage, lower for local storage"},{"line_number":78,"context_line":"  filesystem_store_timeout \u003d 30"},{"line_number":79,"context_line":"  "},{"line_number":80,"context_line":"  # Enable automatic NFS detection for better error messages"},{"line_number":81,"context_line":"  filesystem_nfs_auto_detect \u003d true"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"Implementation Details"}],"source_content_type":"text/x-rst","patch_set":3,"id":"f9c80318_1817d69c","line":80,"in_reply_to":"5c629f73_28eb8e1a","updated":"2026-01-07 19:11:45.000000000","message":"Acknowledged","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":77,"context_line":"  # Set higher for NFS/network storage, lower for local storage"},{"line_number":78,"context_line":"  filesystem_store_timeout \u003d 30"},{"line_number":79,"context_line":"  "},{"line_number":80,"context_line":"  # Enable automatic NFS detection for better error messages"},{"line_number":81,"context_line":"  filesystem_nfs_auto_detect \u003d true"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"Implementation Details"}],"source_content_type":"text/x-rst","patch_set":3,"id":"59dfd94f_5b9d3a05","line":80,"in_reply_to":"691da89d_19983a67","updated":"2026-01-06 07:27:47.000000000","message":"Ack, Detection only improves error messages, not functionality. The timeout protection works regardless. If fstatfs() is reliable, we should make detection always-on. I will update the spec to remove the filesystem_nfs_auto_detect option and always perform detection, with a fallback to False if fstatfs() is unavailable or fails.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"During store initialization, we\u0027ll use fstatfs() to check the filesystem type."},{"line_number":89,"context_line":"This call returns the filesystem magic number - for NFS it\u0027s 0x6969. We store"},{"line_number":90,"context_line":"the result in an is_nfs flag that gets used later for error messages."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Using fstatfs() instead of parsing /proc/mounts handles edge cases better:"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"e2a8a422_e1966a56","line":90,"updated":"2026-01-05 15:12:57.000000000","message":"What about other remote filesystems with similar characteristics? Namely CIFS, but could be others like AFS, gluster, etc. Do we want to make this NFS-specific or \"remote fs detection\"?","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"During store initialization, we\u0027ll use fstatfs() to check the filesystem type."},{"line_number":89,"context_line":"This call returns the filesystem magic number - for NFS it\u0027s 0x6969. We store"},{"line_number":90,"context_line":"the result in an is_nfs flag that gets used later for error messages."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Using fstatfs() instead of parsing /proc/mounts handles edge cases better:"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"546fd685_6d39b1f7","line":90,"in_reply_to":"3cf8fde6_d51e0ba7","updated":"2026-01-07 15:46:19.000000000","message":"Well, I guess my point is .. I\u0027m not sure the flag should be `is_nfs` in that case, and I don\u0027t really think that NFS-specific error messages are really important. I don\u0027t know why we wouldn\u0027t at least check for the next most common one (CIFS) as well while we\u0027re at it and that would make the error messages need to be more generic. But, see above.. I\u0027m not sure it\u0027s really necessary.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"During store initialization, we\u0027ll use fstatfs() to check the filesystem type."},{"line_number":89,"context_line":"This call returns the filesystem magic number - for NFS it\u0027s 0x6969. We store"},{"line_number":90,"context_line":"the result in an is_nfs flag that gets used later for error messages."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Using fstatfs() instead of parsing /proc/mounts handles edge cases better:"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"e40788e5_df75523c","line":90,"in_reply_to":"546fd685_6d39b1f7","updated":"2026-01-07 19:11:45.000000000","message":"Acknowledged","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"During store initialization, we\u0027ll use fstatfs() to check the filesystem type."},{"line_number":89,"context_line":"This call returns the filesystem magic number - for NFS it\u0027s 0x6969. We store"},{"line_number":90,"context_line":"the result in an is_nfs flag that gets used later for error messages."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Using fstatfs() instead of parsing /proc/mounts handles edge cases better:"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3cf8fde6_d51e0ba7","line":90,"in_reply_to":"e2a8a422_e1966a56","updated":"2026-01-06 07:27:47.000000000","message":"I was planning to keep the detection NFS-specific for now, but I\u0027m open to making it generic if there are advantages. Let me know and I will update the spec accordingly.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"* Symbolic links - fstatfs follows them to the actual mount point"},{"line_number":95,"context_line":"* Overlay filesystems"},{"line_number":96,"context_line":"* Bind mounts in containerized environments"},{"line_number":97,"context_line":"* Subdirectories within NFS mounts"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"If we can\u0027t determine the filesystem type, is_nfs defaults to False."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bc5ec45b_516bff9d","line":96,"updated":"2026-01-05 15:12:57.000000000","message":"This means you\u0027ve confirmed that we\u0027ll still see the NFS magic number through an overlay or bind mount (i.e. inside a container) right?","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"* Symbolic links - fstatfs follows them to the actual mount point"},{"line_number":95,"context_line":"* Overlay filesystems"},{"line_number":96,"context_line":"* Bind mounts in containerized environments"},{"line_number":97,"context_line":"* Subdirectories within NFS mounts"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"If we can\u0027t determine the filesystem type, is_nfs defaults to False."}],"source_content_type":"text/x-rst","patch_set":3,"id":"2cb2c148_1515ca89","line":96,"in_reply_to":"8514f55a_1618db0a","updated":"2026-01-07 15:46:19.000000000","message":"Acknowledged","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"* Symbolic links - fstatfs follows them to the actual mount point"},{"line_number":95,"context_line":"* Overlay filesystems"},{"line_number":96,"context_line":"* Bind mounts in containerized environments"},{"line_number":97,"context_line":"* Subdirectories within NFS mounts"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"If we can\u0027t determine the filesystem type, is_nfs defaults to False."}],"source_content_type":"text/x-rst","patch_set":3,"id":"8514f55a_1618db0a","line":96,"in_reply_to":"bc5ec45b_516bff9d","updated":"2026-01-06 07:27:47.000000000","message":"I have verified this locally. I tested fstatfs() with bind mounts and it returns the same filesystem magic number for both the original path and the bind mount path.\n\nI have not tested in a containerized environment, but as containers use the same bind mount mechanism, it should work there.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Timeout Implementation"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations. Each"},{"line_number":104,"context_line":"operation (delete, read, stat, etc.) gets submitted to the thread pool and we"},{"line_number":105,"context_line":"wait for completion up to the configured timeout. The thread pool will have a"},{"line_number":106,"context_line":"reasonable default size like 100 workers."}],"source_content_type":"text/x-rst","patch_set":3,"id":"4bd6113f_d66b0b3d","line":103,"updated":"2026-01-05 15:12:57.000000000","message":"Even defer to threads for local filesystems? If the config flag above disabled this threading too, that might be more useful. Doing this even for local filesystems seems like it\u0027s going to inflate glance\u0027s memory footprint and reduce efficiency for what should be local filesystem reads, etc. Having a way to opt out of that seems like it _would_ be desirable, but obviously it increases complexity. Which are you proposing here?","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Timeout Implementation"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations. Each"},{"line_number":104,"context_line":"operation (delete, read, stat, etc.) gets submitted to the thread pool and we"},{"line_number":105,"context_line":"wait for completion up to the configured timeout. The thread pool will have a"},{"line_number":106,"context_line":"reasonable default size like 100 workers."}],"source_content_type":"text/x-rst","patch_set":3,"id":"618fffe6_593134fa","line":103,"in_reply_to":"4bd6113f_d66b0b3d","updated":"2026-01-06 07:27:47.000000000","message":"Good catch, I have updated the spec to mention using thread pool only when nfs is detected.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Timeout Implementation"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations. Each"},{"line_number":104,"context_line":"operation (delete, read, stat, etc.) gets submitted to the thread pool and we"},{"line_number":105,"context_line":"wait for completion up to the configured timeout. The thread pool will have a"},{"line_number":106,"context_line":"reasonable default size like 100 workers."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5100908b_1d80af2d","line":103,"in_reply_to":"618fffe6_593134fa","updated":"2026-01-07 15:46:19.000000000","message":"Okay, but..","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":103,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations. Each"},{"line_number":104,"context_line":"operation (delete, read, stat, etc.) gets submitted to the thread pool and we"},{"line_number":105,"context_line":"wait for completion up to the configured timeout. The thread pool will have a"},{"line_number":106,"context_line":"reasonable default size like 100 workers."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"When an operation times out:"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"912924c8_0ce5d2b7","line":106,"updated":"2026-01-05 15:12:57.000000000","message":"Is this 100 workers per store or per service? 100 seems like a lot as a default, FWIW, but I also can imagine it being easily exhaustible when the mount gets stuck.\n\nIf a glance has a local and remote store and they all use the same worker pool for everything, you could easily get a hundred pending operations suck on doing things, starving out the local one which still works.\n\nAlso, having a hundred IO workers doesn\u0027t really help if your parallelism is limited to 2, 4, 8, etc by the WSGI layer. It helps in that you can get a huge number of threads wasted on timed out operations (i.e. costing memory) but you won\u0027t be able to actually be doing that many things. Something smaller and per-store seems like it would be better so that local keeps working even if you\u0027ve exhausted all your nfs workers due to a stuck mount.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":false,"context_lines":[{"line_number":103,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations. Each"},{"line_number":104,"context_line":"operation (delete, read, stat, etc.) gets submitted to the thread pool and we"},{"line_number":105,"context_line":"wait for completion up to the configured timeout. The thread pool will have a"},{"line_number":106,"context_line":"reasonable default size like 100 workers."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"When an operation times out:"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"c18852e8_4439c27c","line":106,"in_reply_to":"5fe9d714_bb50befe","updated":"2026-01-07 15:46:19.000000000","message":"Acknowledged","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":103,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations. Each"},{"line_number":104,"context_line":"operation (delete, read, stat, etc.) gets submitted to the thread pool and we"},{"line_number":105,"context_line":"wait for completion up to the configured timeout. The thread pool will have a"},{"line_number":106,"context_line":"reasonable default size like 100 workers."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"When an operation times out:"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5fe9d714_bb50befe","line":106,"in_reply_to":"912924c8_0ce5d2b7","updated":"2026-01-06 07:27:47.000000000","message":"Good catch, I have updated the spec to mention that thread pool will be per store and will not affect local filesystems in multibackend environment.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"Operations that will be wrapped:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* delete() - wraps os.unlink()"},{"line_number":123,"context_line":"* get() - wraps file open() and initial read"},{"line_number":124,"context_line":"* get_size() - wraps os.path.getsize()"},{"line_number":125,"context_line":"* _get_capacity_info() - wraps os.statvfs()"}],"source_content_type":"text/x-rst","patch_set":3,"id":"93a1fcd0_4e61ca76","line":122,"updated":"2026-01-05 15:12:57.000000000","message":"When you wrap `delete()` and it times out, you\u0027ll do what - return 500 to the user and not delete the image from glance\u0027s DB? If the mount comes back and we actually delete the image underneath glance, I assume a re-delete will clean up the result, but a GET will fail as the actual image is gone, right?","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":true,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"Operations that will be wrapped:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* delete() - wraps os.unlink()"},{"line_number":123,"context_line":"* get() - wraps file open() and initial read"},{"line_number":124,"context_line":"* get_size() - wraps os.path.getsize()"},{"line_number":125,"context_line":"* _get_capacity_info() - wraps os.statvfs()"}],"source_content_type":"text/x-rst","patch_set":3,"id":"df5aaee0_0e1e31d2","line":122,"in_reply_to":"38017f15_2c48f3a8","updated":"2026-01-07 15:46:19.000000000","message":"I dunno. Perhaps the best thing for the user is to make sure we delete the image in glance before we delete in the store (not sure the current ordering). Then such an infra fail just penalizes the operator as they need to clean it up later.\n\nAnyway, at least a note (doc, reno, both) about the potential would be good I think.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"Operations that will be wrapped:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* delete() - wraps os.unlink()"},{"line_number":123,"context_line":"* get() - wraps file open() and initial read"},{"line_number":124,"context_line":"* get_size() - wraps os.path.getsize()"},{"line_number":125,"context_line":"* _get_capacity_info() - wraps os.statvfs()"}],"source_content_type":"text/x-rst","patch_set":3,"id":"38017f15_2c48f3a8","line":122,"in_reply_to":"93a1fcd0_4e61ca76","updated":"2026-01-06 07:27:47.000000000","message":"Yes, this is highly possible, I think we should document this during implementation or is there a better way to handle this gracefully?","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"Operations that will be wrapped:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* delete() - wraps os.unlink()"},{"line_number":123,"context_line":"* get() - wraps file open() and initial read"},{"line_number":124,"context_line":"* get_size() - wraps os.path.getsize()"},{"line_number":125,"context_line":"* _get_capacity_info() - wraps os.statvfs()"}],"source_content_type":"text/x-rst","patch_set":3,"id":"287f9503_27f34672","line":122,"in_reply_to":"df5aaee0_0e1e31d2","updated":"2026-01-07 19:11:45.000000000","message":"Acknowledged","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":148,"context_line":"NFS-Specific Solutions Only"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"We could implement timeout handling only for NFS. This was rejected because the"},{"line_number":151,"context_line":"hanging issue affects all network filesystems, not just NFS."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"No Configuration Options"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5a5f275f_082a219b","line":151,"updated":"2026-01-05 15:12:57.000000000","message":"...but you will only enable this for the NFS magic number per above? :)","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"NFS-Specific Solutions Only"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"We could implement timeout handling only for NFS. This was rejected because the"},{"line_number":151,"context_line":"hanging issue affects all network filesystems, not just NFS."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"No Configuration Options"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"c4b22098_4bdb6f93","line":151,"in_reply_to":"5a5f275f_082a219b","updated":"2026-01-06 07:27:47.000000000","message":"right, correcting it.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"We could skip adding configuration options and just hardcode timeouts. This was"},{"line_number":156,"context_line":"rejected because different storage backends have different latency"},{"line_number":157,"context_line":"characteristics and operators need the flexibility to tune timeouts."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Data model impact"},{"line_number":160,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"691fce63_8b2fd52e","line":157,"updated":"2026-01-05 15:12:57.000000000","message":"Presumably we could also just handle this with nothing more than the timeout config on the store, right? I\u0027m not really sure the benefit of having this timeout for local filesystems (perhaps a failing disk that is returning IO errors) but.. are the semantics for `is_nfs\u003dTrue` ever different or is it just the error messages? If the latter, maybe all we need is a timeout, with zero meaning \"wait forever\" (i.e. current behavior)?","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"We could skip adding configuration options and just hardcode timeouts. This was"},{"line_number":156,"context_line":"rejected because different storage backends have different latency"},{"line_number":157,"context_line":"characteristics and operators need the flexibility to tune timeouts."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Data model impact"},{"line_number":160,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bf7e96bc_482183bf","line":157,"in_reply_to":"691fce63_8b2fd52e","updated":"2026-01-06 07:27:47.000000000","message":"What is your preference? IMO we should keep the current proposed way for NFS specific error messages/","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"We could skip adding configuration options and just hardcode timeouts. This was"},{"line_number":156,"context_line":"rejected because different storage backends have different latency"},{"line_number":157,"context_line":"characteristics and operators need the flexibility to tune timeouts."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Data model impact"},{"line_number":160,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfa25527_ee302206","line":157,"in_reply_to":"b4e591a2_34ccd13d","updated":"2026-01-07 19:11:45.000000000","message":"Acknowledged","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":true,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"We could skip adding configuration options and just hardcode timeouts. This was"},{"line_number":156,"context_line":"rejected because different storage backends have different latency"},{"line_number":157,"context_line":"characteristics and operators need the flexibility to tune timeouts."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Data model impact"},{"line_number":160,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"b4e591a2_34ccd13d","line":157,"in_reply_to":"bf7e96bc_482183bf","updated":"2026-01-07 15:46:19.000000000","message":"IDK, since I don\u0027t personally like the idea of NFS-specific error messages, you could reposition this whole thing as \"stores can be direct/blocking or threaded/timeout-able. If you set a worker pool and/or timeout then we\u0027ll use a pool and provide app-level timeouts. If not, we\u0027ll block on IO.\" Then it would apply to any filesystem in the same way. You\u0027ll have extra error messages for the threaded ones when you time out or a thread pool is full, etc, but it wouldn\u0027t (need to) be FS-specific.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25b1a4b72335ea00e3cf2e63facaa69948b45128","unresolved":true,"context_lines":[{"line_number":170,"context_line":"---------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"This prevents resource exhaustion attacks where an attacker could exploit"},{"line_number":173,"context_line":"hanging filesystem operations to consume server resources."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"Notifications impact"},{"line_number":176,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"8ed772e0_cb11a5bb","line":173,"updated":"2026-01-05 15:12:57.000000000","message":"If it\u0027s one worker pool per server, then this is still doable, except that they\u0027ll consume a lot more memory while doing so. If this is pool-per-filesystem, then I agree it will contain the damage.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d12eea1c96fb1a6fb3442edf59498e573a504a0b","unresolved":true,"context_lines":[{"line_number":170,"context_line":"---------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"This prevents resource exhaustion attacks where an attacker could exploit"},{"line_number":173,"context_line":"hanging filesystem operations to consume server resources."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"Notifications impact"},{"line_number":176,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"a2631ab8_7731005f","line":173,"in_reply_to":"8ed772e0_cb11a5bb","updated":"2026-01-06 07:27:47.000000000","message":"I have updated this as now we will be having per store thread pool the attack will be limited to specific store.","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":false,"context_lines":[{"line_number":170,"context_line":"---------------"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"This prevents resource exhaustion attacks where an attacker could exploit"},{"line_number":173,"context_line":"hanging filesystem operations to consume server resources."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"Notifications impact"},{"line_number":176,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"50951b4f_14fecfdf","line":173,"in_reply_to":"a2631ab8_7731005f","updated":"2026-01-07 15:46:19.000000000","message":"Acknowledged","commit_id":"542209ab18a06913ef881c3c63bd5f574fc04348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":true,"context_lines":[{"line_number":107,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations only when"},{"line_number":108,"context_line":"the filesystem is detected as NFS (or other remote filesystem). For local"},{"line_number":109,"context_line":"filesystems, operations will execute directly without thread pool overhead to"},{"line_number":110,"context_line":"maintain efficiency."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Each store instance will have its own thread pool."},{"line_number":113,"context_line":"When the filesystem is NFS:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"444482c5_ba7435bc","line":110,"updated":"2026-01-07 15:46:19.000000000","message":"This seems in conflict with the above:\n\n\u003e Detection only improves error messages, not functionality. The timeout protection works regardless.\n\nSo are you still going to do regular blocking IO for local filesystems, no thread pooling and no (glance-provided) timeouts? Or trying to do the timeouts a different way for local?\n\nI too would be worried about performance overhead (and footprint) of delegating all IO operations to worker threads, in which case it makes sense to only do that for remote filesystems (but also increases the importance of detecting other common ones like CIFS).","commit_id":"212c8c32278a4fc1b99547cf46d657217cfc79f1"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[{"line_number":107,"context_line":"We\u0027ll use Python\u0027s ThreadPoolExecutor to wrap filesystem operations only when"},{"line_number":108,"context_line":"the filesystem is detected as NFS (or other remote filesystem). For local"},{"line_number":109,"context_line":"filesystems, operations will execute directly without thread pool overhead to"},{"line_number":110,"context_line":"maintain efficiency."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Each store instance will have its own thread pool."},{"line_number":113,"context_line":"When the filesystem is NFS:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3489f208_7c5d75c8","line":110,"in_reply_to":"444482c5_ba7435bc","updated":"2026-01-07 19:11:45.000000000","message":"Acknowledged","commit_id":"212c8c32278a4fc1b99547cf46d657217cfc79f1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":true,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"When the filesystem is local:"},{"line_number":119,"context_line":"* Operations execute directly without thread pool overhead"},{"line_number":120,"context_line":"* No timeout protection needed (local filesystems don\u0027t hang like network ones)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"When an operation times out on NFS:"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"32b7290e_2e86685a","line":120,"updated":"2026-01-07 15:46:19.000000000","message":"Okay this seems to clarify my question about the intent above, but sounds like the earlier statement needs to be clarified.","commit_id":"212c8c32278a4fc1b99547cf46d657217cfc79f1"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"When the filesystem is local:"},{"line_number":119,"context_line":"* Operations execute directly without thread pool overhead"},{"line_number":120,"context_line":"* No timeout protection needed (local filesystems don\u0027t hang like network ones)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"When an operation times out on NFS:"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"abae638d_ca28a630","line":120,"in_reply_to":"32b7290e_2e86685a","updated":"2026-01-07 19:11:45.000000000","message":"Acknowledged","commit_id":"212c8c32278a4fc1b99547cf46d657217cfc79f1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e53d70c0f98ea15ffdbd652216262940ceab2a78","unresolved":true,"context_lines":[{"line_number":141,"context_line":"Backward Compatibility"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Existing configurations will continue to work. NFS detection is always"},{"line_number":144,"context_line":"enabled automatically and only affects error messages, not functionality."},{"line_number":145,"context_line":"Default timeout is 30 seconds which should work for most deployments."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":4,"id":"793353ab_ea70de9c","line":144,"updated":"2026-01-07 15:46:19.000000000","message":"Again, sounds like detection affects more than just error messages if we use it to determine if we use a thread pool or not.","commit_id":"212c8c32278a4fc1b99547cf46d657217cfc79f1"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c3f68af338473fe23d42b461f94d7150f3428f7c","unresolved":false,"context_lines":[{"line_number":141,"context_line":"Backward Compatibility"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Existing configurations will continue to work. NFS detection is always"},{"line_number":144,"context_line":"enabled automatically and only affects error messages, not functionality."},{"line_number":145,"context_line":"Default timeout is 30 seconds which should work for most deployments."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":4,"id":"e7647184_85ba20a7","line":144,"in_reply_to":"793353ab_ea70de9c","updated":"2026-01-07 19:11:45.000000000","message":"Acknowledged","commit_id":"212c8c32278a4fc1b99547cf46d657217cfc79f1"}],"specs/2026.1/approved/glance_store/filesystem-timeout-protection.rst":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9fe1487998ce2cbac412266b6eb95044b6dd7ccc","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"  [filesystem]"},{"line_number":54,"context_line":"  # Timeout for all filesystem operations (seconds)"},{"line_number":55,"context_line":"  # Set to 0 to disable timeout protection (blocking IO, current behavior)"},{"line_number":56,"context_line":"  # Set \u003e 0 to enable timeout protection with thread pool"},{"line_number":57,"context_line":"  # Recommended: 30 seconds for network storage, higher for slow networks"},{"line_number":58,"context_line":"  filesystem_store_timeout \u003d 0"}],"source_content_type":"text/x-rst","patch_set":5,"id":"de548900_b46f628f","line":55,"updated":"2026-01-08 15:20:04.000000000","message":"Just so you don\u0027t copy this into your `ConfigOpt` help text.. \"current behavior\" in context of a spec makes sense, but it won\u0027t in a config opt when someone is trying to figure out what to do. \"Normal behavior\" might be better.","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"0700ae97132e603ee8f4aa0f9aea9be3ffb10d94","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"  [filesystem]"},{"line_number":54,"context_line":"  # Timeout for all filesystem operations (seconds)"},{"line_number":55,"context_line":"  # Set to 0 to disable timeout protection (blocking IO, current behavior)"},{"line_number":56,"context_line":"  # Set \u003e 0 to enable timeout protection with thread pool"},{"line_number":57,"context_line":"  # Recommended: 30 seconds for network storage, higher for slow networks"},{"line_number":58,"context_line":"  filesystem_store_timeout \u003d 0"}],"source_content_type":"text/x-rst","patch_set":5,"id":"33002cc4_132e2502","line":55,"in_reply_to":"de548900_b46f628f","updated":"2026-01-08 15:45:14.000000000","message":"Acknowledged","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9fe1487998ce2cbac412266b6eb95044b6dd7ccc","unresolved":true,"context_lines":[{"line_number":118,"context_line":"     delete() finds the file already gone, treat it as success (idempotent"},{"line_number":119,"context_line":"     delete)."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* get() - wraps file open() and initial read"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"* get_size() - wraps os.path.getsize()"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"74f57ba6_6cbd443a","line":121,"updated":"2026-01-08 15:20:04.000000000","message":"As discussed in IRC, this may be more complicated than initially thought. Perhaps we consider limiting to just the metadata operations and not the data pipeline for the first attempt.","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"0700ae97132e603ee8f4aa0f9aea9be3ffb10d94","unresolved":false,"context_lines":[{"line_number":118,"context_line":"     delete() finds the file already gone, treat it as success (idempotent"},{"line_number":119,"context_line":"     delete)."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* get() - wraps file open() and initial read"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"* get_size() - wraps os.path.getsize()"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7da79cc6_53371a86","line":121,"in_reply_to":"74f57ba6_6cbd443a","updated":"2026-01-08 15:45:14.000000000","message":"Sounds good","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9fe1487998ce2cbac412266b6eb95044b6dd7ccc","unresolved":true,"context_lines":[{"line_number":138,"context_line":"Local filesystems can also hang (failing disks). Operators can configure timeout"},{"line_number":139,"context_line":"protection if needed."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Dedicated NFS Driver"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"We could create a separate NFS driver alongside the filesystem driver. This"},{"line_number":144,"context_line":"would require operators to change their driver configuration. This would break"}],"source_content_type":"text/x-rst","patch_set":5,"id":"54cf457a_ac3da09f","line":141,"updated":"2026-01-08 15:20:04.000000000","message":"I mean to say yesterday that if we got any more NFS-specific with things, this would be my preference. Obviously better to not have to go here though if what we\u0027re doing is generic enough to apply to more things :)","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"0700ae97132e603ee8f4aa0f9aea9be3ffb10d94","unresolved":false,"context_lines":[{"line_number":138,"context_line":"Local filesystems can also hang (failing disks). Operators can configure timeout"},{"line_number":139,"context_line":"protection if needed."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Dedicated NFS Driver"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"We could create a separate NFS driver alongside the filesystem driver. This"},{"line_number":144,"context_line":"would require operators to change their driver configuration. This would break"}],"source_content_type":"text/x-rst","patch_set":5,"id":"a1561156_d1022644","line":141,"in_reply_to":"54cf457a_ac3da09f","updated":"2026-01-08 15:45:14.000000000","message":"Agree. The current approach is generic and applies to all filesystem types","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9fe1487998ce2cbac412266b6eb95044b6dd7ccc","unresolved":true,"context_lines":[{"line_number":191,"context_line":"Performance Impact"},{"line_number":192,"context_line":"------------------"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"When timeout protection is enabled (timeout \u003e 0), there is a small overhead"},{"line_number":195,"context_line":"from thread pool operations. When disabled (timeout \u003d 0), there is no"},{"line_number":196,"context_line":"performance impact (current behavior). This prevents resource exhaustion from"},{"line_number":197,"context_line":"hanging operations when enabled."}],"source_content_type":"text/x-rst","patch_set":5,"id":"80688c11_219cc99d","line":194,"range":{"start_line":194,"start_character":61,"end_line":194,"end_character":75},"updated":"2026-01-08 15:20:04.000000000","message":"I think you should say \"some overhead\" because unless you have tested, I don\u0027t think we know how small it will be. There will definitely be memory footprint, but there could be other impacts. This is a \"paying for timeout ability with other downsides\" sort of thing -- not free, but I think we should probably avoid making too many guesses :)","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"0700ae97132e603ee8f4aa0f9aea9be3ffb10d94","unresolved":false,"context_lines":[{"line_number":191,"context_line":"Performance Impact"},{"line_number":192,"context_line":"------------------"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"When timeout protection is enabled (timeout \u003e 0), there is a small overhead"},{"line_number":195,"context_line":"from thread pool operations. When disabled (timeout \u003d 0), there is no"},{"line_number":196,"context_line":"performance impact (current behavior). This prevents resource exhaustion from"},{"line_number":197,"context_line":"hanging operations when enabled."}],"source_content_type":"text/x-rst","patch_set":5,"id":"cba42305_6980176d","line":194,"range":{"start_line":194,"start_character":61,"end_line":194,"end_character":75},"in_reply_to":"80688c11_219cc99d","updated":"2026-01-08 15:45:14.000000000","message":"Acknowledged, make sense!!","commit_id":"75c77fbb4a3efd0a6431aa2b637422274b071b9b"}]}
