Delete non-directory valid paths right away
It's unlikely that rename() is faster than unlink() on a regular file or symlink, so don't bother.
This commit is contained in:
		
							parent
							
								
									117670be57
								
							
						
					
					
						commit
						480dda0e42
					
				
					 1 changed files with 27 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -434,7 +434,12 @@ bool LocalStore::tryToDelete(GCState & state, const Path & path)
 | 
			
		|||
{
 | 
			
		||||
    checkInterrupt();
 | 
			
		||||
 | 
			
		||||
    if (!pathExists(path)) return true;
 | 
			
		||||
    struct stat st;
 | 
			
		||||
    if (lstat(path.c_str(), &st)) {
 | 
			
		||||
        if (errno == ENOENT) return true;
 | 
			
		||||
        throw SysError(format("getting status of %1%") % path);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (state.deleted.find(path) != state.deleted.end()) return true;
 | 
			
		||||
    if (state.live.find(path) != state.live.end()) return false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -514,21 +519,27 @@ bool LocalStore::tryToDelete(GCState & state, const Path & path)
 | 
			
		|||
    /* The path is garbage, so delete it. */
 | 
			
		||||
    if (shouldDelete(state.options.action)) {
 | 
			
		||||
 | 
			
		||||
        /* If it's a valid path that's not a regular file or symlink,
 | 
			
		||||
           invalidate it, rename it, and schedule it for deletion.
 | 
			
		||||
           The renaming is to ensure that later (when we're not
 | 
			
		||||
           holding the global GC lock) we can delete the path without
 | 
			
		||||
           being afraid that the path has become alive again.
 | 
			
		||||
           Otherwise delete it right away. */
 | 
			
		||||
        if (isValidPath(path)) {
 | 
			
		||||
            /* If it's a valid path, invalidate it, rename it, and
 | 
			
		||||
               schedule it for deletion.  The renaming is to ensure
 | 
			
		||||
               that later (when we're not holding the global GC lock)
 | 
			
		||||
               we can delete the path without being afraid that the
 | 
			
		||||
               path has become alive again. */
 | 
			
		||||
            if (S_ISDIR(st.st_mode)) {
 | 
			
		||||
                printMsg(lvlInfo, format("invalidating `%1%'") % path);
 | 
			
		||||
                // Estimate the amount freed using the narSize field.
 | 
			
		||||
                state.bytesInvalidated += queryPathInfo(path).narSize;
 | 
			
		||||
                invalidatePathChecked(path);
 | 
			
		||||
            Path tmp = (format("%1%-gc-%2%") % path % getpid()).str();
 | 
			
		||||
                makeMutable(path.c_str());
 | 
			
		||||
                Path tmp = (format("%1%-gc-%2%") % path % getpid()).str();
 | 
			
		||||
                if (rename(path.c_str(), tmp.c_str()))
 | 
			
		||||
                    throw SysError(format("unable to rename `%1%' to `%2%'") % path % tmp);
 | 
			
		||||
                state.invalidated.insert(tmp);
 | 
			
		||||
            } else {
 | 
			
		||||
                invalidatePathChecked(path);
 | 
			
		||||
                deleteGarbage(state, path);
 | 
			
		||||
            }
 | 
			
		||||
        } else
 | 
			
		||||
            deleteGarbage(state, path);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue