 114a0a08d4
			
		
	
	
	114a0a08d4
	
	
	
		
			
			Signed-off-by: Bryan Schumaker <bjschuma@netapp.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			3 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			3 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
 | |
| 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.
 |