* addToStore() in nix-worker: don't write the NAR dump received from
the client to a temporary directory, as that is highly inefficient.
This commit is contained in:
		
							parent
							
								
									5eaf644c99
								
							
						
					
					
						commit
						82ae85de27
					
				
					 3 changed files with 85 additions and 25 deletions
				
			
		| 
						 | 
				
			
			@ -223,6 +223,43 @@ struct TunnelSource : Source
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* If the NAR archive contains a single file at top-level, then save
 | 
			
		||||
   the contents of the file to `s'.  Otherwise barf. */
 | 
			
		||||
struct RetrieveRegularNARSink : ParseSink
 | 
			
		||||
{
 | 
			
		||||
    string s;
 | 
			
		||||
 | 
			
		||||
    void createDirectory(const Path & path)
 | 
			
		||||
    {
 | 
			
		||||
        throw Error("regular file expected");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void receiveContents(unsigned char * data, unsigned int len)
 | 
			
		||||
    {
 | 
			
		||||
        s.append((const char *) data, len);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void createSymlink(const Path & path, const string & target)
 | 
			
		||||
    {
 | 
			
		||||
        throw Error("regular file expected");
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Adapter class of a Source that saves all data read to `s'. */
 | 
			
		||||
struct SavingSourceAdapter : Source
 | 
			
		||||
{
 | 
			
		||||
    Source & orig;
 | 
			
		||||
    string s;
 | 
			
		||||
    SavingSourceAdapter(Source & orig) : orig(orig) { }
 | 
			
		||||
    void operator () (unsigned char * data, unsigned int len)
 | 
			
		||||
    {
 | 
			
		||||
        orig(data, len);
 | 
			
		||||
        s.append((const char *) data, len);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void performOp(unsigned int clientVersion,
 | 
			
		||||
    Source & from, Sink & to, unsigned int op)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -299,13 +336,22 @@ static void performOp(unsigned int clientVersion,
 | 
			
		|||
        }
 | 
			
		||||
        HashType hashAlgo = parseHashType(s);
 | 
			
		||||
 | 
			
		||||
        Path tmp = createTempDir();
 | 
			
		||||
        AutoDelete delTmp(tmp);
 | 
			
		||||
        Path tmp2 = tmp + "/" + baseName;
 | 
			
		||||
        restorePath(tmp2, from);
 | 
			
		||||
 | 
			
		||||
        SavingSourceAdapter savedNAR(from);
 | 
			
		||||
        RetrieveRegularNARSink savedRegular;
 | 
			
		||||
        
 | 
			
		||||
        if (recursive) {
 | 
			
		||||
            /* Get the entire NAR dump from the client and save it to
 | 
			
		||||
               a string so that we can pass it to
 | 
			
		||||
               addToStoreFromDump(). */
 | 
			
		||||
            ParseSink sink; /* null sink; just parse the NAR */
 | 
			
		||||
            parseDump(sink, savedNAR);
 | 
			
		||||
        } else {
 | 
			
		||||
            parseDump(savedRegular, from);
 | 
			
		||||
        }
 | 
			
		||||
            
 | 
			
		||||
        startWork();
 | 
			
		||||
        Path path = store->addToStore(tmp2, recursive, hashAlgo);
 | 
			
		||||
        Path path = dynamic_cast<LocalStore *>(store.get())
 | 
			
		||||
            ->addToStoreFromDump(recursive ? savedNAR.s : savedRegular.s, baseName, recursive, hashAlgo);
 | 
			
		||||
        stopWork();
 | 
			
		||||
        
 | 
			
		||||
        writeString(path, to);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue