* 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
|
@ -1036,8 +1036,6 @@ void LocalStore::exportPath(const Path & path, bool sign,
|
||||||
writeInt(1, hashAndWriteSink);
|
writeInt(1, hashAndWriteSink);
|
||||||
|
|
||||||
Path tmpDir = createTempDir();
|
Path tmpDir = createTempDir();
|
||||||
PathLocks tmpDirLock(singleton<PathSet, Path>(tmpDir));
|
|
||||||
tmpDirLock.setDeletion(true);
|
|
||||||
AutoDelete delTmp(tmpDir);
|
AutoDelete delTmp(tmpDir);
|
||||||
Path hashFile = tmpDir + "/hash";
|
Path hashFile = tmpDir + "/hash";
|
||||||
writeFile(hashFile, printHash(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)
|
Path LocalStore::importPath(bool requireSignature, Source & source)
|
||||||
{
|
{
|
||||||
HashAndReadSource hashAndReadSource(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
|
/* We don't yet know what store path this archive contains (the
|
||||||
store path follows the archive data proper), and besides, we
|
store path follows the archive data proper), and besides, we
|
||||||
don't know yet whether the signature is valid. */
|
don't know yet whether the signature is valid. */
|
||||||
Path tmpDir = createTempDir(nixStore);
|
Path tmpDir = createTempDirInStore();
|
||||||
PathLocks tmpDirLock(singleton<PathSet, Path>(tmpDir));
|
AutoDelete delTmp(tmpDir);
|
||||||
tmpDirLock.setDeletion(true);
|
|
||||||
AutoDelete delTmp(tmpDir); /* !!! could be GC'ed! */
|
|
||||||
Path unpacked = tmpDir + "/unpacked";
|
Path unpacked = tmpDir + "/unpacked";
|
||||||
|
|
||||||
restorePath(unpacked, hashAndReadSource);
|
restorePath(unpacked, hashAndReadSource);
|
||||||
|
|
|
@ -246,6 +246,8 @@ private:
|
||||||
|
|
||||||
void startSubstituter(const Path & substituter,
|
void startSubstituter(const Path & substituter,
|
||||||
RunningSubstituter & runningSubstituter);
|
RunningSubstituter & runningSubstituter);
|
||||||
|
|
||||||
|
Path createTempDirInStore();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue