* Sync with the trunk.
This commit is contained in:
commit
254b3399ba
9 changed files with 70 additions and 30 deletions
|
@ -1,5 +1,5 @@
|
||||||
{ nixpkgs ? <nixpkgs>, nixos ? <nixos>
|
{ nixpkgs ? <nixpkgs>, nixos ? <nixos>
|
||||||
, nix ? { outPath = ../nix-export; rev = 1234; }
|
, nix ? { outPath = ./.; rev = 1234; }
|
||||||
, officialRelease ? false
|
, officialRelease ? false
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ let
|
||||||
];
|
];
|
||||||
|
|
||||||
configureFlags = ''
|
configureFlags = ''
|
||||||
--disable-init-state --disable-shared
|
--disable-init-state
|
||||||
--with-bzip2=${bzip2} --with-sqlite=${sqlite}
|
--with-bzip2=${bzip2} --with-sqlite=${sqlite}
|
||||||
--with-dbi=${perlPackages.DBI}/lib/perl5/site_perl
|
--with-dbi=${perlPackages.DBI}/lib/perl5/site_perl
|
||||||
--with-dbd-sqlite=${perlPackages.DBDSQLite}/lib/perl5/site_perl
|
--with-dbd-sqlite=${perlPackages.DBDSQLite}/lib/perl5/site_perl
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#! @perl@ -w @perlFlags@
|
#! @perl@ -w @perlFlags@
|
||||||
|
|
||||||
use Fcntl ':flock';
|
use Fcntl qw(:DEFAULT :flock);
|
||||||
use English '-no_match_vars';
|
use English '-no_match_vars';
|
||||||
use IO::Handle;
|
use IO::Handle;
|
||||||
use Nix::Config;
|
use Nix::Config;
|
||||||
|
@ -56,7 +56,7 @@ sub openSlotLock {
|
||||||
my ($machine, $slot) = @_;
|
my ($machine, $slot) = @_;
|
||||||
my $slotLockFn = "$currentLoad/" . (join '+', @{$machine->{systemTypes}}) . "-" . $machine->{hostName} . "-$slot";
|
my $slotLockFn = "$currentLoad/" . (join '+', @{$machine->{systemTypes}}) . "-" . $machine->{hostName} . "-$slot";
|
||||||
my $slotLock = new IO::Handle;
|
my $slotLock = new IO::Handle;
|
||||||
open $slotLock, ">>$slotLockFn" or die;
|
sysopen $slotLock, "$slotLockFn", O_RDWR|O_CREAT, 0600 or die;
|
||||||
return $slotLock;
|
return $slotLock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ sub openSlotLock {
|
||||||
# Read the list of machines.
|
# Read the list of machines.
|
||||||
my @machines;
|
my @machines;
|
||||||
if (defined $conf && -e $conf) {
|
if (defined $conf && -e $conf) {
|
||||||
open CONF, "< $conf" or die;
|
open CONF, "<$conf" or die;
|
||||||
while (<CONF>) {
|
while (<CONF>) {
|
||||||
chomp;
|
chomp;
|
||||||
s/\#.*$//g;
|
s/\#.*$//g;
|
||||||
|
@ -104,7 +104,7 @@ REQ: while (1) {
|
||||||
# Acquire the exclusive lock on $currentLoad/main-lock.
|
# Acquire the exclusive lock on $currentLoad/main-lock.
|
||||||
mkdir $currentLoad, 0777 or die unless -d $currentLoad;
|
mkdir $currentLoad, 0777 or die unless -d $currentLoad;
|
||||||
my $mainLock = "$currentLoad/main-lock";
|
my $mainLock = "$currentLoad/main-lock";
|
||||||
open MAINLOCK, ">>$mainLock" or die;
|
sysopen MAINLOCK, "$mainLock", O_RDWR|O_CREAT, 0600 or die;
|
||||||
flock(MAINLOCK, LOCK_EX) or die;
|
flock(MAINLOCK, LOCK_EX) or die;
|
||||||
|
|
||||||
|
|
||||||
|
@ -225,8 +225,17 @@ sub removeRoots {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Copy the derivation and its dependencies to the build machine.
|
# Copy the derivation and its dependencies to the build machine. This
|
||||||
|
# is guarded by an exclusive lock per machine to prevent multiple
|
||||||
|
# build-remote instances from copying to a machine simultaneously.
|
||||||
|
# That's undesirable because we may end up with N instances uploading
|
||||||
|
# the same missing path simultaneously, causing the effective network
|
||||||
|
# bandwidth and target disk speed to be divided by N.
|
||||||
|
my $uploadLock = "$currentLoad/$hostName.upload-lock";
|
||||||
|
sysopen MAINLOCK, "$uploadLock", O_RDWR|O_CREAT, 0600 or die;
|
||||||
|
flock(MAINLOCK, LOCK_EX) or die;
|
||||||
Nix::CopyClosure::copyTo($hostName, [ @sshOpts ], [ $drvPath, @inputs ], "", "", 0, 0, $maybeSign ne "");
|
Nix::CopyClosure::copyTo($hostName, [ @sshOpts ], [ $drvPath, @inputs ], "", "", 0, 0, $maybeSign ne "");
|
||||||
|
close MAINLOCK;
|
||||||
|
|
||||||
|
|
||||||
# Perform the build.
|
# Perform the build.
|
||||||
|
|
|
@ -1300,6 +1300,13 @@ void DerivationGoal::buildDone()
|
||||||
being valid. */
|
being valid. */
|
||||||
computeClosure();
|
computeClosure();
|
||||||
|
|
||||||
|
/* It is now safe to delete the lock files, since all future
|
||||||
|
lockers will see that the output paths are valid; they will
|
||||||
|
not create new lock files with the same names as the old
|
||||||
|
(unlinked) lock files. */
|
||||||
|
outputLocks.setDeletion(true);
|
||||||
|
outputLocks.unlock();
|
||||||
|
|
||||||
} catch (BuildError & e) {
|
} catch (BuildError & e) {
|
||||||
printMsg(lvlError, e.msg());
|
printMsg(lvlError, e.msg());
|
||||||
outputLocks.unlock();
|
outputLocks.unlock();
|
||||||
|
@ -1987,13 +1994,6 @@ void DerivationGoal::computeClosure()
|
||||||
infos.push_back(info);
|
infos.push_back(info);
|
||||||
}
|
}
|
||||||
worker.store.registerValidPaths(infos);
|
worker.store.registerValidPaths(infos);
|
||||||
|
|
||||||
/* It is now safe to delete the lock files, since all future
|
|
||||||
lockers will see that the output paths are valid; they will not
|
|
||||||
create new lock files with the same names as the old (unlinked)
|
|
||||||
lock files. */
|
|
||||||
outputLocks.setDeletion(true);
|
|
||||||
outputLocks.unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -617,24 +617,48 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
printMsg(lvlError, format("reading the Nix store..."));
|
|
||||||
Paths entries = readDirectory(nixStore);
|
|
||||||
|
|
||||||
/* Randomise the order in which we delete entries to make the
|
|
||||||
collector less biased towards deleting paths that come
|
|
||||||
alphabetically first (e.g. /nix/store/000...). This
|
|
||||||
matters when using --max-freed etc. */
|
|
||||||
vector<Path> entries_(entries.begin(), entries.end());
|
|
||||||
random_shuffle(entries_.begin(), entries_.end());
|
|
||||||
|
|
||||||
if (shouldDelete(state.options.action))
|
if (shouldDelete(state.options.action))
|
||||||
printMsg(lvlError, format("deleting garbage..."));
|
printMsg(lvlError, format("deleting garbage..."));
|
||||||
else
|
else
|
||||||
printMsg(lvlError, format("determining live/dead paths..."));
|
printMsg(lvlError, format("determining live/dead paths..."));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
AutoCloseDir dir = opendir(nixStore.c_str());
|
||||||
|
if (!dir) throw SysError(format("opening directory `%1%'") % nixStore);
|
||||||
|
|
||||||
|
/* Read the store and immediately delete all paths that
|
||||||
|
aren't valid. When using --max-freed etc., deleting
|
||||||
|
invalid paths is preferred over deleting unreachable
|
||||||
|
paths, since unreachable paths could become reachable
|
||||||
|
again. We don't use readDirectory() here so that GCing
|
||||||
|
can start faster. */
|
||||||
|
Paths entries;
|
||||||
|
struct dirent * dirent;
|
||||||
|
while (errno = 0, dirent = readdir(dir)) {
|
||||||
|
checkInterrupt();
|
||||||
|
string name = dirent->d_name;
|
||||||
|
if (name == "." || name == "..") continue;
|
||||||
|
Path path = nixStore + "/" + name;
|
||||||
|
if (isValidPath(path))
|
||||||
|
entries.push_back(path);
|
||||||
|
else
|
||||||
|
tryToDelete(state, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
dir.close();
|
||||||
|
|
||||||
|
/* Now delete the unreachable valid paths. Randomise the
|
||||||
|
order in which we delete entries to make the collector
|
||||||
|
less biased towards deleting paths that come
|
||||||
|
alphabetically first (e.g. /nix/store/000...). This
|
||||||
|
matters when using --max-freed etc. */
|
||||||
|
vector<Path> entries_(entries.begin(), entries.end());
|
||||||
|
random_shuffle(entries_.begin(), entries_.end());
|
||||||
|
|
||||||
foreach (vector<Path>::iterator, i, entries_)
|
foreach (vector<Path>::iterator, i, entries_)
|
||||||
tryToDelete(state, canonPath(nixStore + "/" + *i));
|
tryToDelete(state, *i);
|
||||||
|
|
||||||
} catch (GCLimitReached & e) {
|
} catch (GCLimitReached & e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ int openLockFile(const Path & path, bool create)
|
||||||
{
|
{
|
||||||
AutoCloseFD fd;
|
AutoCloseFD fd;
|
||||||
|
|
||||||
fd = open(path.c_str(), O_RDWR | (create ? O_CREAT : 0), 0666);
|
fd = open(path.c_str(), O_RDWR | (create ? O_CREAT : 0), 0600);
|
||||||
if (fd == -1 && (create || errno != ENOENT))
|
if (fd == -1 && (create || errno != ENOENT))
|
||||||
throw SysError(format("opening lock file `%1%'") % path);
|
throw SysError(format("opening lock file `%1%'") % path);
|
||||||
|
|
||||||
|
|
|
@ -701,7 +701,7 @@ AutoCloseDir::AutoCloseDir(DIR * dir)
|
||||||
|
|
||||||
AutoCloseDir::~AutoCloseDir()
|
AutoCloseDir::~AutoCloseDir()
|
||||||
{
|
{
|
||||||
if (dir) closedir(dir);
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -717,6 +717,14 @@ AutoCloseDir::operator DIR *()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AutoCloseDir::close()
|
||||||
|
{
|
||||||
|
if (dir) {
|
||||||
|
closedir(dir);
|
||||||
|
dir = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
|
@ -223,6 +223,7 @@ public:
|
||||||
~AutoCloseDir();
|
~AutoCloseDir();
|
||||||
void operator =(DIR * dir);
|
void operator =(DIR * dir);
|
||||||
operator DIR *();
|
operator DIR *();
|
||||||
|
void close();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
(import <a.nix>)
|
|
|
@ -1 +0,0 @@
|
||||||
"abcc"
|
|
Loading…
Reference in a new issue