-
Notifications
You must be signed in to change notification settings - Fork 13.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tracking Issue for File lock API #130994
Comments
Implement file_lock feature This adds lock(), lock_shared(), try_lock(), try_lock_shared(), and unlock() to File gated behind the file_lock feature flag This is the initial implementation of rust-lang#130994 for Unix and Windows platforms. I will follow it up with an implementation for WASI preview 2
Rollup merge of rust-lang#130999 - cberner:flock_pr, r=joboet Implement file_lock feature This adds lock(), lock_shared(), try_lock(), try_lock_shared(), and unlock() to File gated behind the file_lock feature flag This is the initial implementation of rust-lang#130994 for Unix and Windows platforms. I will follow it up with an implementation for WASI preview 2
Implement file_lock feature This adds lock(), lock_shared(), try_lock(), try_lock_shared(), and unlock() to File gated behind the file_lock feature flag This is the initial implementation of rust-lang#130994 for Unix and Windows platforms. I will follow it up with an implementation for WASI preview 2
apparently not supported on all tier 2 OS: #132921 |
Note that this triggers the This lint fires on the 1.84 beta release, so there might be a number of people who discover this once 1.84 stable goes out. |
It would also be useful to atomically create and lock a file. This is possible on MacOS using the |
While there are more features we may want to add to this in the future, the current state of this seems useful, and works. Stabilizing it would let people who encounter the warnings about a future conflict switch to the new API. Shall we stabilize the current File locking APIs? @rfcbot merge |
Team member @joshtriplett has proposed to merge this. The next step is review by the rest of the tagged team members: No concerns currently listed. Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up! See this document for info about what commands tagged team members can give me. |
I'd like to see some documentation on the lock methods that make it clear that you don't need to manually unlock / that the lock is automatically unlocked when the File is dropped. Right now, that's only documented on the unlock method. Other than that, the documentation could be made a lot less confusing by adding 'by another process' and 'by the same process' in a few places. Right now, the try methods say "Returns false if the file is locked.", but then go on to say it might deadlock if it's already locked. I assume the former should be "locked by another process" and the latter should be "locked by this process". |
The unlock method should document whether it's okay to call it if no locks are held. If calling unlock() is only acceptable when a lock is actually held, this should probably be a Guard style of API. If it's always okay to call unlock(), the current design makes sense to me. |
I'm checking my box with the assumption that these are just small docs changes that we'll do during/before stabilization. |
🔔 This is now entering its final comment period, as per the review above. 🔔 |
I've submitted #136288 which should address all the documentation requests. @m-ou-se wrote:
Done.
"process" isn't the granularity here, but I've added clear distinctions about locks acquired via the same handle/descriptor (may deadlock) vs locks acquired via a different handle/descriptor (will block the blocking methods or make the
It's always safe to call (in the Rust sense). I've documented that it'll either return an error or return without doing anything. It'll never explode.
It's always OK (unlike a mutex or similar). It'll never explode. |
…ith-some-locks--would-you-could-you-in-some-docs, r=m-ou-se Improve documentation for file locking Add notes to each method stating that locks get dropped on close. Clarify the return values of the try methods: they're only defined if the lock is held via a *different* file handle/descriptor. That goes along with the documentation that calling them while holding a lock via the *same* file handle/descriptor may deadlock. Document the behavior of unlock if no lock is held. r? `@m-ou-se` (Documentation changes requested in rust-lang#130994 .)
Rollup merge of rust-lang#136288 - joshtriplett:would-you-could-you-with-some-locks--would-you-could-you-in-some-docs, r=m-ou-se Improve documentation for file locking Add notes to each method stating that locks get dropped on close. Clarify the return values of the try methods: they're only defined if the lock is held via a *different* file handle/descriptor. That goes along with the documentation that calling them while holding a lock via the *same* file handle/descriptor may deadlock. Document the behavior of unlock if no lock is held. r? `@m-ou-se` (Documentation changes requested in rust-lang#130994 .)
…locks--would-you-could-you-in-some-docs, r=m-ou-se Improve documentation for file locking Add notes to each method stating that locks get dropped on close. Clarify the return values of the try methods: they're only defined if the lock is held via a *different* file handle/descriptor. That goes along with the documentation that calling them while holding a lock via the *same* file handle/descriptor may deadlock. Document the behavior of unlock if no lock is held. r? `@m-ou-se` (Documentation changes requested in rust-lang/rust#130994 .)
The final comment period, with a disposition to merge, as per the review above, is now complete. As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed. This will be merged soon. |
I think this API needs more warnings for Windows, as Finally, i used share mode instead of file lock, which is similar to the open options api mentioned by #130994 (comment). |
@quininer I don't think share mode is close enough to things available on other platforms that we'd be able to build a common portable API around it, and it doesn't allow keeping a file open and only occasionally locking it. The issue with append-only files would be worth some documentation on the The rest of the "remarks" section on LockFileEx doesn't seem to have any caveats that we should consider a blocker. |
@joshtriplett We already have share_mode for Windows, which is good. :D
This means that the windows file lock is different from unix file lock in that it is not a advisory lock and it blocks file access. This is rather different from what std document implies
I actually think the windows file lock is different enough from unix file lock that it should be in |
@quininer the std documentation currently says That's meant to say that the lock may be mandatory, depending on the platform (i.e. Windows). How would you make it more clear? |
@cberner Ha, that's good enough. but I didn't realize it at first. :( |
I've clarified the documentation in #136876 to address all of these issues. |
|
@ChrisDenton That's exactly what I've written in #136876. |
Feature gate:
#![feature(file_lock)]
This is a tracking issue for rust-lang/libs-team#412
This feature exposes advisory file locks on
File
. They allow a file handle to acquire an exclusive or shared file lock, which blocks other file handles to the same file from acquiring a conflicting lock. Some semantics are platform dependent, and these are documented in the API documentation.Public API
Steps / History
Unresolved Questions
Footnotes
https://std-dev-guide.rust-lang.org/feature-lifecycle/stabilization.html ↩
The text was updated successfully, but these errors were encountered: