* 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:
Eelco Dolstra 2010-06-21 11:08:09 +00:00
parent bf87cc44b4
commit 3e5e0faf9c
2 changed files with 20 additions and 6 deletions

View file

@ -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);

View file

@ -246,6 +246,8 @@ private:
void startSubstituter(const Path & substituter,
RunningSubstituter & runningSubstituter);
Path createTempDirInStore();
};