| Bryan Schumaker | 114a0a0 | 2011-11-01 13:35:23 -0400 | [diff] [blame] | 1 |  | 
|  | 2 | Fault Injection | 
|  | 3 | =============== | 
|  | 4 | Fault injection is a method for forcing errors that may not normally occur, or | 
|  | 5 | may be difficult to reproduce.  Forcing these errors in a controlled environment | 
|  | 6 | can help the developer find and fix bugs before their code is shipped in a | 
|  | 7 | production system.  Injecting an error on the Linux NFS server will allow us to | 
|  | 8 | observe how the client reacts and if it manages to recover its state correctly. | 
|  | 9 |  | 
|  | 10 | NFSD_FAULT_INJECTION must be selected when configuring the kernel to use this | 
|  | 11 | feature. | 
|  | 12 |  | 
|  | 13 |  | 
|  | 14 | Using Fault Injection | 
|  | 15 | ===================== | 
|  | 16 | On the client, mount the fault injection server through NFS v4.0+ and do some | 
|  | 17 | work over NFS (open files, take locks, ...). | 
|  | 18 |  | 
|  | 19 | On the server, mount the debugfs filesystem to <debug_dir> and ls | 
|  | 20 | <debug_dir>/nfsd.  This will show a list of files that will be used for | 
|  | 21 | injecting faults on the NFS server.  As root, write a number n to the file | 
|  | 22 | corresponding to the action you want the server to take.  The server will then | 
|  | 23 | process the first n items it finds.  So if you want to forget 5 locks, echo '5' | 
|  | 24 | to <debug_dir>/nfsd/forget_locks.  A value of 0 will tell the server to forget | 
|  | 25 | all corresponding items.  A log message will be created containing the number | 
|  | 26 | of items forgotten (check dmesg). | 
|  | 27 |  | 
|  | 28 | Go back to work on the client and check if the client recovered from the error | 
|  | 29 | correctly. | 
|  | 30 |  | 
|  | 31 |  | 
|  | 32 | Available Faults | 
|  | 33 | ================ | 
|  | 34 | forget_clients: | 
|  | 35 | The NFS server keeps a list of clients that have placed a mount call.  If | 
|  | 36 | this list is cleared, the server will have no knowledge of who the client | 
|  | 37 | is, forcing the client to reauthenticate with the server. | 
|  | 38 |  | 
|  | 39 | forget_openowners: | 
|  | 40 | The NFS server keeps a list of what files are currently opened and who | 
|  | 41 | they were opened by.  Clearing this list will force the client to reopen | 
|  | 42 | its files. | 
|  | 43 |  | 
|  | 44 | forget_locks: | 
|  | 45 | The NFS server keeps a list of what files are currently locked in the VFS. | 
|  | 46 | Clearing this list will force the client to reclaim its locks (files are | 
|  | 47 | unlocked through the VFS as they are cleared from this list). | 
|  | 48 |  | 
|  | 49 | forget_delegations: | 
|  | 50 | A delegation is used to assure the client that a file, or part of a file, | 
|  | 51 | has not changed since the delegation was awarded.  Clearing this list will | 
|  | 52 | force the client to reaquire its delegation before accessing the file | 
|  | 53 | again. | 
|  | 54 |  | 
|  | 55 | recall_delegations: | 
|  | 56 | Delegations can be recalled by the server when another client attempts to | 
|  | 57 | access a file.  This test will notify the client that its delegation has | 
|  | 58 | been revoked, forcing the client to reaquire the delegation before using | 
|  | 59 | the file again. | 
|  | 60 |  | 
|  | 61 |  | 
|  | 62 | tools/nfs/inject_faults.sh script | 
|  | 63 | ================================= | 
|  | 64 | This script has been created to ease the fault injection process.  This script | 
|  | 65 | will detect the mounted debugfs directory and write to the files located there | 
|  | 66 | based on the arguments passed by the user.  For example, running | 
|  | 67 | `inject_faults.sh forget_locks 1` as root will instruct the server to forget | 
|  | 68 | one lock.  Running `inject_faults forget_locks` will instruct the server to | 
|  | 69 | forgetall locks. |