mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-10 08:16:15 +02:00
* Okay, putting a lock on the temporary directory used by importPath()
doesn't work because the garbage collector doesn't actually look at locks. So r22253 was stupid. Use addTempRoot() instead. Also, locking the temporary directory in exportPath() was silly because it isn't even in the store.
This commit is contained in:
parent
bf87cc44b4
commit
3e5e0faf9c
2 changed files with 20 additions and 6 deletions
|
@ -1036,8 +1036,6 @@ void LocalStore::exportPath(const Path & path, bool sign,
|
|||
writeInt(1, hashAndWriteSink);
|
||||
|
||||
Path tmpDir = createTempDir();
|
||||
PathLocks tmpDirLock(singleton<PathSet, Path>(tmpDir));
|
||||
tmpDirLock.setDeletion(true);
|
||||
AutoDelete delTmp(tmpDir);
|
||||
Path hashFile = tmpDir + "/hash";
|
||||
writeFile(hashFile, printHash(hash));
|
||||
|
@ -1079,6 +1077,22 @@ struct HashAndReadSource : Source
|
|||
};
|
||||
|
||||
|
||||
/* Create a temporary directory in the store that won't be
|
||||
garbage-collected. */
|
||||
Path LocalStore::createTempDirInStore()
|
||||
{
|
||||
Path tmpDir;
|
||||
do {
|
||||
/* There is a slight possibility that `tmpDir' gets deleted by
|
||||
the GC between createTempDir() and addTempRoot(), so repeat
|
||||
until `tmpDir' exists. */
|
||||
tmpDir = createTempDir(nixStore);
|
||||
addTempRoot(tmpDir);
|
||||
} while (!pathExists(tmpDir));
|
||||
return tmpDir;
|
||||
}
|
||||
|
||||
|
||||
Path LocalStore::importPath(bool requireSignature, Source & source)
|
||||
{
|
||||
HashAndReadSource hashAndReadSource(source);
|
||||
|
@ -1086,10 +1100,8 @@ Path LocalStore::importPath(bool requireSignature, Source & source)
|
|||
/* We don't yet know what store path this archive contains (the
|
||||
store path follows the archive data proper), and besides, we
|
||||
don't know yet whether the signature is valid. */
|
||||
Path tmpDir = createTempDir(nixStore);
|
||||
PathLocks tmpDirLock(singleton<PathSet, Path>(tmpDir));
|
||||
tmpDirLock.setDeletion(true);
|
||||
AutoDelete delTmp(tmpDir); /* !!! could be GC'ed! */
|
||||
Path tmpDir = createTempDirInStore();
|
||||
AutoDelete delTmp(tmpDir);
|
||||
Path unpacked = tmpDir + "/unpacked";
|
||||
|
||||
restorePath(unpacked, hashAndReadSource);
|
||||
|
|
|
@ -246,6 +246,8 @@ private:
|
|||
|
||||
void startSubstituter(const Path & substituter,
|
||||
RunningSubstituter & runningSubstituter);
|
||||
|
||||
Path createTempDirInStore();
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue