RemoteStore::addToStore(): Send NAR rather than string containing NAR
This allows the NAR to be streamed in the future (though we're not doing that yet).
This commit is contained in:
		
							parent
							
								
									374908726b
								
							
						
					
					
						commit
						f61f67ddee
					
				
					 5 changed files with 21 additions and 37 deletions
				
			
		|  | @ -61,27 +61,6 @@ void Store::exportPath(const Path & path, Sink & sink) | ||||||
|     hashAndWriteSink << exportMagic << path << info->references << info->deriver << 0; |     hashAndWriteSink << exportMagic << path << info->references << info->deriver << 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct TeeSource : Source |  | ||||||
| { |  | ||||||
|     Source & readSource; |  | ||||||
|     ref<std::string> data; |  | ||||||
|     TeeSource(Source & readSource) |  | ||||||
|         : readSource(readSource) |  | ||||||
|         , data(make_ref<std::string>()) |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
|     size_t read(unsigned char * data, size_t len) |  | ||||||
|     { |  | ||||||
|         size_t n = readSource.read(data, len); |  | ||||||
|         this->data->append((char *) data, n); |  | ||||||
|         return n; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| struct NopSink : ParseSink |  | ||||||
| { |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor, bool dontCheckSigs) | Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor, bool dontCheckSigs) | ||||||
| { | { | ||||||
|     Paths res; |     Paths res; | ||||||
|  | @ -92,7 +71,7 @@ Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor, | ||||||
| 
 | 
 | ||||||
|         /* Extract the NAR from the source. */ |         /* Extract the NAR from the source. */ | ||||||
|         TeeSource tee(source); |         TeeSource tee(source); | ||||||
|         NopSink sink; |         ParseSink sink; | ||||||
|         parseDump(sink, tee); |         parseDump(sink, tee); | ||||||
| 
 | 
 | ||||||
|         uint32_t magic = readInt(source); |         uint32_t magic = readInt(source); | ||||||
|  |  | ||||||
|  | @ -169,9 +169,9 @@ struct LegacySSHStore : public Store | ||||||
| 
 | 
 | ||||||
|         /* FIXME: inefficient. */ |         /* FIXME: inefficient. */ | ||||||
|         ParseSink parseSink; /* null sink; just parse the NAR */ |         ParseSink parseSink; /* null sink; just parse the NAR */ | ||||||
|         SavingSourceAdapter savedNAR(conn->from); |         TeeSource savedNAR(conn->from); | ||||||
|         parseDump(parseSink, savedNAR); |         parseDump(parseSink, savedNAR); | ||||||
|         sink(savedNAR.s); |         sink(*savedNAR.data); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Unsupported methods. */ |     /* Unsupported methods. */ | ||||||
|  |  | ||||||
|  | @ -378,8 +378,9 @@ void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string> | ||||||
|         conn->to << wopAddToStoreNar |         conn->to << wopAddToStoreNar | ||||||
|                  << info.path << info.deriver << printHash(info.narHash) |                  << info.path << info.deriver << printHash(info.narHash) | ||||||
|                  << info.references << info.registrationTime << info.narSize |                  << info.references << info.registrationTime << info.narSize | ||||||
|                  << info.ultimate << info.sigs << info.ca << *nar << repair << dontCheckSigs; |                  << info.ultimate << info.sigs << info.ca | ||||||
|         // FIXME: don't send nar as a string
 |                  << repair << dontCheckSigs; | ||||||
|  |         conn->to(*nar); | ||||||
|         conn->processStderr(); |         conn->processStderr(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -140,15 +140,16 @@ struct StringSource : Source | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Adapter class of a Source that saves all data read to `s'. */ | /* Adapter class of a Source that saves all data read to `s'. */ | ||||||
| struct SavingSourceAdapter : Source | struct TeeSource : Source | ||||||
| { | { | ||||||
|     Source & orig; |     Source & orig; | ||||||
|     string s; |     ref<std::string> data; | ||||||
|     SavingSourceAdapter(Source & orig) : orig(orig) { } |     TeeSource(Source & orig) | ||||||
|  |         : orig(orig), data(make_ref<std::string>()) { } | ||||||
|     size_t read(unsigned char * data, size_t len) |     size_t read(unsigned char * data, size_t len) | ||||||
|     { |     { | ||||||
|         size_t n = orig.read(data, len); |         size_t n = orig.read(data, len); | ||||||
|         s.append((const char *) data, n); |         this->data->append((const char *) data, n); | ||||||
|         return n; |         return n; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -283,7 +283,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe | ||||||
|         } |         } | ||||||
|         HashType hashAlgo = parseHashType(s); |         HashType hashAlgo = parseHashType(s); | ||||||
| 
 | 
 | ||||||
|         SavingSourceAdapter savedNAR(from); |         TeeSource savedNAR(from); | ||||||
|         RetrieveRegularNARSink savedRegular; |         RetrieveRegularNARSink savedRegular; | ||||||
| 
 | 
 | ||||||
|         if (recursive) { |         if (recursive) { | ||||||
|  | @ -297,7 +297,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe | ||||||
| 
 | 
 | ||||||
|         startWork(); |         startWork(); | ||||||
|         if (!savedRegular.regular) throw Error("regular file expected"); |         if (!savedRegular.regular) throw Error("regular file expected"); | ||||||
|         Path path = store->addToStoreFromDump(recursive ? savedNAR.s : savedRegular.s, baseName, recursive, hashAlgo); |         Path path = store->addToStoreFromDump(recursive ? *savedNAR.data : savedRegular.s, baseName, recursive, hashAlgo); | ||||||
|         stopWork(); |         stopWork(); | ||||||
| 
 | 
 | ||||||
|         to << path; |         to << path; | ||||||
|  | @ -569,6 +569,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     case wopAddToStoreNar: { |     case wopAddToStoreNar: { | ||||||
|  |         bool repair, dontCheckSigs; | ||||||
|         ValidPathInfo info; |         ValidPathInfo info; | ||||||
|         info.path = readStorePath(*store, from); |         info.path = readStorePath(*store, from); | ||||||
|         from >> info.deriver; |         from >> info.deriver; | ||||||
|  | @ -578,14 +579,16 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe | ||||||
|         info.references = readStorePaths<PathSet>(*store, from); |         info.references = readStorePaths<PathSet>(*store, from); | ||||||
|         from >> info.registrationTime >> info.narSize >> info.ultimate; |         from >> info.registrationTime >> info.narSize >> info.ultimate; | ||||||
|         info.sigs = readStrings<StringSet>(from); |         info.sigs = readStrings<StringSet>(from); | ||||||
|         from >> info.ca; |         from >> info.ca >> repair >> dontCheckSigs; | ||||||
|         auto nar = make_ref<std::string>(readString(from)); |  | ||||||
|         bool repair, dontCheckSigs; |  | ||||||
|         from >> repair >> dontCheckSigs; |  | ||||||
|         if (!trusted && dontCheckSigs) |         if (!trusted && dontCheckSigs) | ||||||
|             dontCheckSigs = false; |             dontCheckSigs = false; | ||||||
|  | 
 | ||||||
|  |         TeeSource tee(from); | ||||||
|  |         ParseSink sink; | ||||||
|  |         parseDump(sink, tee); | ||||||
|  | 
 | ||||||
|         startWork(); |         startWork(); | ||||||
|         store->addToStore(info, nar, repair, dontCheckSigs, nullptr); |         store->addToStore(info, tee.data, repair, dontCheckSigs, nullptr); | ||||||
|         stopWork(); |         stopWork(); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue