| |
| Fault Injection |
| =============== |
| Fault injection is a method for forcing errors that may not normally occur, or |
| may be difficult to reproduce. Forcing these errors in a controlled environment |
| can help the developer find and fix bugs before their code is shipped in a |
| production system. Injecting an error on the Linux NFS server will allow us to |
| observe how the client reacts and if it manages to recover its state correctly. |
| |
| NFSD_FAULT_INJECTION must be selected when configuring the kernel to use this |
| feature. |
| |
| |
| Using Fault Injection |
| ===================== |
| On the client, mount the fault injection server through NFS v4.0+ and do some |
| work over NFS (open files, take locks, ...). |
| |
| On the server, mount the debugfs filesystem to <debug_dir> and ls |
| <debug_dir>/nfsd. This will show a list of files that will be used for |
| injecting faults on the NFS server. As root, write a number n to the file |
| corresponding to the action you want the server to take. The server will then |
| process the first n items it finds. So if you want to forget 5 locks, echo '5' |
| to <debug_dir>/nfsd/forget_locks. A value of 0 will tell the server to forget |
| all corresponding items. A log message will be created containing the number |
| of items forgotten (check dmesg). |
| |
| Go back to work on the client and check if the client recovered from the error |
| correctly. |
| |
| |
| Available Faults |
| ================ |
| forget_clients: |
| The NFS server keeps a list of clients that have placed a mount call. If |
| this list is cleared, the server will have no knowledge of who the client |
| is, forcing the client to reauthenticate with the server. |
| |
| forget_openowners: |
| The NFS server keeps a list of what files are currently opened and who |
| they were opened by. Clearing this list will force the client to reopen |
| its files. |
| |
| forget_locks: |
| The NFS server keeps a list of what files are currently locked in the VFS. |
| Clearing this list will force the client to reclaim its locks (files are |
| unlocked through the VFS as they are cleared from this list). |
| |
| forget_delegations: |
| A delegation is used to assure the client that a file, or part of a file, |
| has not changed since the delegation was awarded. Clearing this list will |
| force the client to reaquire its delegation before accessing the file |
| again. |
| |
| recall_delegations: |
| Delegations can be recalled by the server when another client attempts to |
| access a file. This test will notify the client that its delegation has |
| been revoked, forcing the client to reaquire the delegation before using |
| the file again. |
| |
| |
| tools/nfs/inject_faults.sh script |
| ================================= |
| This script has been created to ease the fault injection process. This script |
| will detect the mounted debugfs directory and write to the files located there |
| based on the arguments passed by the user. For example, running |
| `inject_faults.sh forget_locks 1` as root will instruct the server to forget |
| one lock. Running `inject_faults forget_locks` will instruct the server to |
| forgetall locks. |