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

View file

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