-
Notifications
You must be signed in to change notification settings - Fork 119
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
Persists Function results in an error #245
Comments
that also shouldnt result in any error from the examples from the actix project |
I'd take a closer look at that error message in your first post. You need to convert the error from this library into the appropriate error for your application. |
the final error is this one: |
I assume you're writing the temporary file in |
nope in the current working directy (in a subfolder of the home directory) |
|
results in the same error if i specify my home directory |
but only on my manjaro system (using a btfrs formated partition), on a mac it just works fine the same code |
Unfortunately, this is an OS error so there's not much I can do but help debug. At this point, I'd recommend printing out the |
This PR fix the "invalid cross-device link" error occurred in linux when trying to write the settings file atomically, like when click the "Enable vim mode" checkbox at first start. ```plain [2024-02-26T22:59:25+08:00 ERROR util] .../zed/crates/settings/src/settings_file.rs:135: Failed to write settings to file "/home/$USER/.config/zed/settings.json" Caused by: 0: failed to persist temporary file: Invalid cross-device link (os error 18) 1: Invalid cross-device link (os error 18) ``` Currently the `fs::RealFs::atomic_write()` method write to a temp file created with `NamedTempFile::new()` and then call `persist()` method to write to the config file path, which actually do a `rename` syscall under the hood. As the [issue](Stebalien/tempfile#245) said > `NamedTempFile::new()` will create a temporary file in your system's temporary file directory. You need `NamedTempFile::new_in()`. The temporary file directory in linux is in `/tmp`, which is mounted to `tmpfs` filesystem, and in most case(all case I guess) `$HOME/.config/zed` is mounted to a different filesystem. And the `rename` syscall between different filesystems will return a `EXDEV` errno, as described in the man page [rename(2)](https://man7.org/linux/man-pages/man2/renameat2.2.html): ```plain EXDEV oldpath and newpath are not on the same mounted filesystem. (Linux permits a filesystem to be mounted at multiple points, but rename() does not work across different mount points, even if the same filesystem is mounted on both.) ``` And as the issue above said, use a different temp dir with `NamedTempFile::new_in()` for linux platform might be a solution, since the `rename` syscall provides atomicity. Release Notes: - Fix `settings.json` save failed with invalid cross-device link error in linux
when using the code example from the documentation:
this is my whole method
The text was updated successfully, but these errors were encountered: