about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2007-08-28T09·21+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2007-08-28T09·21+0000
commit455a7b95776440a56fd5d545d3b9a01cbae1d8e7 (patch)
treec87976d51fd4b07fb4128585f85407c21550e2b6
parent7d5836b34df363c2b2e7fc1574aaba1dde9a697e (diff)
* 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.

-rw-r--r--tests/fixed.builder2.sh2
-rw-r--r--tests/fixed.nix.in12
-rw-r--r--tests/fixed.sh15
3 files changed, 28 insertions, 1 deletions
diff --git a/tests/fixed.builder2.sh b/tests/fixed.builder2.sh
index bc1a18d6e1d7..31ea1579a514 100644
--- a/tests/fixed.builder2.sh
+++ b/tests/fixed.builder2.sh
@@ -1,3 +1,5 @@
+echo dummy: $dummy
+if test -n "$dummy"; then sleep 2; fi
 mkdir $out
 mkdir $out/bla
 echo "Hello World!" > $out/foo
diff --git a/tests/fixed.nix.in b/tests/fixed.nix.in
index ab2448871dbe..47eff91e059f 100644
--- a/tests/fixed.nix.in
+++ b/tests/fixed.nix.in
@@ -1,6 +1,6 @@
 rec {
 
-  f = builder: mode: algo: hash: derivation {
+  f2 = dummy: builder: mode: algo: hash: derivation {
     name = "fixed";
     system = "@system@";
     builder = "@shell@";
@@ -9,8 +9,11 @@ rec {
     outputHashAlgo = algo;
     outputHash = hash;
     PATH = "@testPath@";
+    inherit dummy;
   };
 
+  f = f2 "";
+
   good = [
     (f ./fixed.builder1.sh "flat" "md5" "8ddd8be4b179a529afa5f2ffae4b9858")
     (f ./fixed.builder1.sh "flat" "sha1" "a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b")
@@ -35,4 +38,11 @@ rec {
     (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")
+  ];
+
 }
\ No newline at end of file
diff --git a/tests/fixed.sh b/tests/fixed.sh
index fc37e40f4210..d0a284af48c4 100644
--- a/tests/fixed.sh
+++ b/tests/fixed.sh
@@ -1,18 +1,33 @@
 source common.sh
 
+clearStore
+
+echo 'testing good...'
 drvs=$($nixinstantiate fixed.nix -A good)
 echo $drvs
 $nixstore -r $drvs
 
+echo 'testing good2...'
 drvs=$($nixinstantiate fixed.nix -A good2)
 echo $drvs
 $nixstore -r $drvs
 
+echo 'testing bad...'
 drvs=$($nixinstantiate fixed.nix -A bad)
 echo $drvs
 if $nixstore -r $drvs; then false; fi
 
+echo 'testing reallyBad...'
 if $nixinstantiate fixed.nix -A reallyBad; then false; fi
 
 # 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 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