|
|
@ -2,32 +2,53 @@ |
|
|
|
|
|
|
|
## Error Handling |
|
|
|
|
|
|
|
POSIX filesystem functions offer a single return code meaning that |
|
|
|
there is some complication regarding the handling of multiple branches |
|
|
|
as mergerfs does. It tries to handle errors in a way that would |
|
|
|
generally return meaningful values for that particular function. |
|
|
|
POSIX filesystem functions typically work on singular items and return |
|
|
|
singular errors. This means that there is some complication when |
|
|
|
dealing with multiple files or behaviors that are required in mergerfs. |
|
|
|
|
|
|
|
### chmod, chown, removexattr, setxattr, truncate, utimens |
|
|
|
mergerfs tries to handle errors in a way that would generally return |
|
|
|
meaningful values for that particular function. |
|
|
|
|
|
|
|
1. if no error: return 0 (success) |
|
|
|
### Filesystem Functions |
|
|
|
|
|
|
|
#### chmod, chown, removexattr, setxattr, truncate, utimens |
|
|
|
|
|
|
|
1. if no errors: return 0 (success) |
|
|
|
2. if no successes: return first error |
|
|
|
3. if one of the files acted on was the same as the related search function: return its value |
|
|
|
3. if one of the files acted on was the same as the related search |
|
|
|
function: return its value |
|
|
|
4. return 0 (success) |
|
|
|
|
|
|
|
While doing this increases the complexity and cost of error handling, |
|
|
|
particularly step 3, this provides probably the most reasonable return |
|
|
|
value. |
|
|
|
|
|
|
|
### unlink, rmdir |
|
|
|
|
|
|
|
#### unlink, rmdir |
|
|
|
|
|
|
|
1. if no errors: return 0 (success) |
|
|
|
2. return first error |
|
|
|
|
|
|
|
Older versions of mergerfs would return success if any success occurred |
|
|
|
but for unlink and rmdir there are downstream assumptions that, while |
|
|
|
not impossible to occur, can confuse some software. |
|
|
|
Older versions of mergerfs would return success if any success |
|
|
|
occurred but for unlink and rmdir there are downstream assumptions |
|
|
|
that, while not impossible to occur in more traditional situation, can |
|
|
|
confuse some software. |
|
|
|
|
|
|
|
#### open, create |
|
|
|
|
|
|
|
For `create` and `open` where a single file is targeted the return |
|
|
|
value of the equivalent final call is returned. |
|
|
|
|
|
|
|
If the error returned is `EROFS`, indicating the filesystem is in fact |
|
|
|
read-only, mergerfs will mark the branch `RO` and rerun the |
|
|
|
policy. This typically will only happen with `ext4` when the |
|
|
|
filesystem is found to have corruption and the OS remounts the |
|
|
|
filesystem as read-only to protect it. In that situation the |
|
|
|
filesystem does not otherwise indicate that it is read-only as it |
|
|
|
would if mounted with `ro`. |
|
|
|
|
|
|
|
|
|
|
|
### others |
|
|
|
#### others |
|
|
|
|
|
|
|
For search functions, there is always a single thing acted on and as |
|
|
|
such whatever return value that comes from the single function call is |
|
|
@ -39,12 +60,38 @@ policies it will return success if any of the calls succeed and an |
|
|
|
error otherwise. |
|
|
|
|
|
|
|
|
|
|
|
## Branches disappearing / reappearing |
|
|
|
|
|
|
|
This is not an error condition. mergerfs works on paths. Not |
|
|
|
mounts. There is currently no assumption or active inspection of the |
|
|
|
branch path provided at runtime. Nor does it keep its own open file |
|
|
|
descriptors that would prevent an unused filesystem from being |
|
|
|
unmounted. If a filesystem disappears for any reason mergerfs will |
|
|
|
simply continue on behaving as it would normally. As if you never |
|
|
|
mounted that filesystem into that location. If a branch path no longer |
|
|
|
exists the branch is simply skipped by policies. |
|
|
|
|
|
|
|
If you wish to keep the branch path from being used when a branch |
|
|
|
path's intended filesystem disappears then make the directory |
|
|
|
difficult or impossible to use. |
|
|
|
|
|
|
|
``` |
|
|
|
chown root:root /mnt/mountpoint/ |
|
|
|
chmod 0000 /mnt/mountpoint/ |
|
|
|
chattr +i /mnt/mountpoint/ |
|
|
|
``` |
|
|
|
|
|
|
|
You can still mount to that directory but you will not be able to |
|
|
|
write to it. Even as root. Note that `chattr` works on limited |
|
|
|
filesystems. Mainly `ext4`. |
|
|
|
|
|
|
|
|
|
|
|
## Logging |
|
|
|
|
|
|
|
Filesystems, and therefore mergerfs, are doing lots of small actions |
|
|
|
at high speed. It simply isn't reasonable to log all the actions of |
|
|
|
the system. That said: certain details are logged at startup and when |
|
|
|
performing mainance tasks. These are logged via `syslog` and on |
|
|
|
performing maintenance tasks. These are logged via `syslog` and on |
|
|
|
`systemd` based systems can be viewed by running |
|
|
|
|
|
|
|
``` |
|
|
|