70 lines
		
	
	
	
		
			3 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			70 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.
							 |