* Test case to show that parallel builds of different fixed-output

derivations that produce the same output path don't work properly
  wrt locking.  This happens a lot in the build farm when fetchurl
  derivations downloading the same file on different platforms are
  executed in parallel and then copied back to the main machine.
This commit is contained in:
Eelco Dolstra 2007-08-28 09:21:47 +00:00
parent 7d5836b34d
commit 455a7b9577
3 changed files with 28 additions and 1 deletions

View file

@ -1,3 +1,5 @@
echo dummy: $dummy
if test -n "$dummy"; then sleep 2; fi
mkdir $out mkdir $out
mkdir $out/bla mkdir $out/bla
echo "Hello World!" > $out/foo echo "Hello World!" > $out/foo

View file

@ -1,6 +1,6 @@
rec { rec {
f = builder: mode: algo: hash: derivation { f2 = dummy: builder: mode: algo: hash: derivation {
name = "fixed"; name = "fixed";
system = "@system@"; system = "@system@";
builder = "@shell@"; builder = "@shell@";
@ -9,8 +9,11 @@ rec {
outputHashAlgo = algo; outputHashAlgo = algo;
outputHash = hash; outputHash = hash;
PATH = "@testPath@"; PATH = "@testPath@";
inherit dummy;
}; };
f = f2 "";
good = [ good = [
(f ./fixed.builder1.sh "flat" "md5" "8ddd8be4b179a529afa5f2ffae4b9858") (f ./fixed.builder1.sh "flat" "md5" "8ddd8be4b179a529afa5f2ffae4b9858")
(f ./fixed.builder1.sh "flat" "sha1" "a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b") (f ./fixed.builder1.sh "flat" "sha1" "a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b")
@ -35,4 +38,11 @@ rec {
(f ./fixed.builder1.sh "flat" "md5" "ddd8be4b179a529afa5f2ffae4b9858") (f ./fixed.builder1.sh "flat" "md5" "ddd8be4b179a529afa5f2ffae4b9858")
]; ];
# Test for building two derivations in parallel that produce the
# same output path because they're fixed-output derivations.
parallelSame = [
(f2 "foo" ./fixed.builder2.sh "flat" "md5" "3670af73070fa14077ad74e0f5ea4e42")
(f2 "bar" ./fixed.builder2.sh "flat" "md5" "3670af73070fa14077ad74e0f5ea4e42")
];
} }

View file

@ -1,18 +1,33 @@
source common.sh source common.sh
clearStore
echo 'testing good...'
drvs=$($nixinstantiate fixed.nix -A good) drvs=$($nixinstantiate fixed.nix -A good)
echo $drvs echo $drvs
$nixstore -r $drvs $nixstore -r $drvs
echo 'testing good2...'
drvs=$($nixinstantiate fixed.nix -A good2) drvs=$($nixinstantiate fixed.nix -A good2)
echo $drvs echo $drvs
$nixstore -r $drvs $nixstore -r $drvs
echo 'testing bad...'
drvs=$($nixinstantiate fixed.nix -A bad) drvs=$($nixinstantiate fixed.nix -A bad)
echo $drvs echo $drvs
if $nixstore -r $drvs; then false; fi if $nixstore -r $drvs; then false; fi
echo 'testing reallyBad...'
if $nixinstantiate fixed.nix -A reallyBad; then false; fi if $nixinstantiate fixed.nix -A reallyBad; then false; fi
# While we're at it, check attribute selection a bit more. # While we're at it, check attribute selection a bit more.
echo 'testing attribute selection...'
test $($nixinstantiate fixed.nix -A good.1 | wc -l) = 1 test $($nixinstantiate fixed.nix -A good.1 | wc -l) = 1
# Test parallel builds of derivations that produce the same output.
# Only one should run at the same time.
echo 'testing parallelSame...'
clearStore
drvs=$($nixinstantiate fixed.nix -A parallelSame)
echo $drvs
$nixstore -r $drvs -j2