Report daemon OOM better
When copying a large path causes the daemon to run out of memory, you now get: error: Nix daemon out of memory instead of: error: writing to file: Broken pipe
This commit is contained in:
		
							parent
							
								
									829af22759
								
							
						
					
					
						commit
						b1beed97a0
					
				
					 2 changed files with 19 additions and 9 deletions
				
			
		|  | @ -402,11 +402,23 @@ Path RemoteStore::addToStore(const Path & _srcPath, | ||||||
|     writeInt((hashAlgo == htSHA256 && recursive) ? 0 : 1, to); |     writeInt((hashAlgo == htSHA256 && recursive) ? 0 : 1, to); | ||||||
|     writeInt(recursive ? 1 : 0, to); |     writeInt(recursive ? 1 : 0, to); | ||||||
|     writeString(printHashType(hashAlgo), to); |     writeString(printHashType(hashAlgo), to); | ||||||
|     to.written = 0; | 
 | ||||||
|     to.warn = true; |     try { | ||||||
|     dumpPath(srcPath, to, filter); |         to.written = 0; | ||||||
|     to.warn = false; |         to.warn = true; | ||||||
|     processStderr(); |         dumpPath(srcPath, to, filter); | ||||||
|  |         to.warn = false; | ||||||
|  |         processStderr(); | ||||||
|  |     } catch (SysError & e) { | ||||||
|  |         /* Daemon closed while we were sending the path. Probably OOM
 | ||||||
|  |            or I/O error. */ | ||||||
|  |         if (e.errNo == EPIPE) | ||||||
|  |             try { | ||||||
|  |                 processStderr(); | ||||||
|  |             } catch (EndOfFile & e) { } | ||||||
|  |         throw; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     return readStorePath(from); |     return readStorePath(from); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -735,12 +735,10 @@ static void processConnection(bool trusted) | ||||||
|                during addTextToStore() / importPath().  If that |                during addTextToStore() / importPath().  If that | ||||||
|                happens, just send the error message and exit. */ |                happens, just send the error message and exit. */ | ||||||
|             bool errorAllowed = canSendStderr; |             bool errorAllowed = canSendStderr; | ||||||
|             if (!errorAllowed) printMsg(lvlError, format("error processing client input: %1%") % e.msg()); |  | ||||||
|             stopWork(false, e.msg(), GET_PROTOCOL_MINOR(clientVersion) >= 8 ? e.status : 0); |             stopWork(false, e.msg(), GET_PROTOCOL_MINOR(clientVersion) >= 8 ? e.status : 0); | ||||||
|             if (!errorAllowed) break; |             if (!errorAllowed) throw; | ||||||
|         } catch (std::bad_alloc & e) { |         } catch (std::bad_alloc & e) { | ||||||
|             if (canSendStderr) |             stopWork(false, "Nix daemon out of memory", GET_PROTOCOL_MINOR(clientVersion) >= 8 ? 1 : 0); | ||||||
|                 stopWork(false, "Nix daemon out of memory", GET_PROTOCOL_MINOR(clientVersion) >= 8 ? 1 : 0); |  | ||||||
|             throw; |             throw; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue