cuirass doesn’t build i686 things

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Ricardo Wurmus
Owner
unassigned
Submitted by
Ricardo Wurmus
Severity
normal
R
R
Ricardo Wurmus wrote on 15 Aug 2017 09:43
(address . bug-guix@gnu.org)
877ey5gtsc.fsf@elephly.net
Hi Guix,

it looks like Cuirass refuses to build i686 things because that would
violate a UNIQUE constraint:

Toggle snippet (30 lines)
@ build-started /gnu/store/2qpglj9ylcb72c51m1qr8qfmdi20aa16-grub-2.02.drv - i686-linux /var/log/guix/drvs/2q//pglj9ylcb72c51m1qr8qfmdi20aa16-grub-2.02.drv.bz2
In ice-9/boot-9.scm:
230:29 19 (map1 (((#:eval-id . 5) (#:duration . 102000.0) # # ?) ?))
230:29 18 (map1 (((#:eval-id . 5) (#:duration . 69000.0) # # ?) ?))
230:29 17 (map1 (((#:eval-id . 5) (#:duration . 86000.0) # # ?) ?))
230:29 16 (map1 (((#:eval-id . 5) (#:duration . 81000.0) # # ?) ?))
230:29 15 (map1 (((#:eval-id . 5) (#:duration . 82000.0) # # ?) ?))
230:29 14 (map1 (((#:eval-id . 5) (#:duration . 68000.0) # # ?) ?))
230:29 13 (map1 (((#:eval-id . 5) (#:duration . 74000.0) # # ?) ?))
230:29 12 (map1 (((#:eval-id . 5) (#:duration . 77000.0) # # ?) ?))
230:29 11 (map1 (((#:eval-id . 5) (#:duration . 98000.0) # # ?) ?))
230:29 10 (map1 (((#:eval-id . 5) (#:duration . 103000.0) # # ?) ?))
230:29 9 (map1 (((#:eval-id . 5) (#:duration . 75000.0) # # ?) ?))
230:29 8 (map1 (((#:eval-id . 5) (#:duration . 74000.0) # # ?) ?))
230:29 7 (map1 (((#:eval-id . 5) (#:duration . 75000.0) # # ?) ?))
230:29 6 (map1 (((#:eval-id . 5) (#:duration . 64000.0) # # ?) ?))
230:17 5 (map1 (((#:eval-id . 5) (#:duration . 147000.0) # # ?) ?))
In cuirass/base.scm:
145:6 4 (register _)
In ice-9/boot-9.scm:
268:13 3 (for-each #<procedure 4a51ae0 at cuirass/base.scm:145:?> ?)
In cuirass/database.scm:
186:2 2 (db-add-build #<<sqlite-db> pointer: #<pointer 0x23455?> ?)
54:28 1 (sqlite-exec _ _ . _)
In ice-9/eval.scm:
619:8 0 (_ #(#(#(#(#<directory (sqlite3) 23c0a00> #<?>) #) #) #))
ice-9/eval.scm:619:8: ice-9/eval.scm:619:8: Throw to key `sqlite-error' with args `(#f 1555 "UNIQUE const
raint failed: Builds.derivation, Builds.evaluation, Builds.output")'.

https://berlin.guixsd.orgis configured to provide substitutes for
x86_64 and i686 yet it has barely built any i686 packages so far.

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC
R
R
Ricardo Wurmus wrote on 16 Aug 2017 09:32
(address . 28094@debbugs.gnu.org)
87378sklwe.fsf@elephly.net
Ricardo Wurmus <rekado@elephly.net> writes:

Toggle quote (3 lines)
> it looks like Cuirass refuses to build i686 things because that would
> violate a UNIQUE constraint:

I’ve seen this repeatedly for other derivations; all seem to be i686.
The error reporting is bad, so I don’t know exactly why this happens,
but one guess is that this is when a previously failed build process
succeeded.

It’s bad that this seems to crash cuirass, so there are no more builds
once this happens.

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC
R
R
Ricardo Wurmus wrote on 23 Aug 2017 18:58
(address . 28094@debbugs.gnu.org)
87o9r6ql0i.fsf@elephly.net
Ricardo Wurmus <rekado@elephly.net> writes:

Toggle quote (10 lines)
> Ricardo Wurmus <rekado@elephly.net> writes:
>
>> it looks like Cuirass refuses to build i686 things because that would
>> violate a UNIQUE constraint:
>
> I’ve seen this repeatedly for other derivations; all seem to be i686.
> The error reporting is bad, so I don’t know exactly why this happens,
> but one guess is that this is when a previously failed build process
> succeeded.

I’ve changed Cuirass locally to print a more detailed error message when
this happens. Here’s a recent error:

Toggle snippet (29 lines)
Database error with INSERT INTO Builds (derivation, evaluation, log, output) VALUES ('~A', '~A', '~A', '~A'); and (/gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv 2 #f /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc)
In ice-9/boot-9.scm:
230:29 19 (map1 (((#:eval-id . 2) (#:duration . 81000.0) # # …) …))
230:29 18 (map1 (((#:eval-id . 2) (#:duration . 70000.0) # # …) …))
230:29 17 (map1 (((#:eval-id . 2) (#:duration . 83000.0) # # …) …))
230:29 16 (map1 (((#:eval-id . 2) (#:duration . 89000.0) # # …) …))
230:29 15 (map1 (((#:eval-id . 2) (#:duration . 81000.0) # # …) …))
230:29 14 (map1 (((#:eval-id . 2) (#:duration . 131000.0) # # …) …))
230:29 13 (map1 (((#:eval-id . 2) (#:duration . 128000.0) # # …) …))
230:29 12 (map1 (((#:eval-id . 2) (#:duration . 100000.0) # # …) …))
230:29 11 (map1 (((#:eval-id . 2) (#:duration . 193000.0) # # …) …))
230:29 10 (map1 (((#:eval-id . 2) (#:duration . 113000.0) # # …) …))
230:29 9 (map1 (((#:eval-id . 2) (#:duration . 122000.0) # # …) …))
230:29 8 (map1 (((#:eval-id . 2) (#:duration . 91000.0) # # …) …))
230:29 7 (map1 (((#:eval-id . 2) (#:duration . 101000.0) # # …) …))
230:29 6 (map1 (((#:eval-id . 2) (#:duration . 87000.0) # # …) …))
230:29 5 (map1 (((#:eval-id . 2) (#:duration . 67000.0) # # …) …))
230:29 4 (map1 (((#:eval-id . 2) (#:duration . 75000.0) # # …) …))
230:17 3 (map1 (((#:eval-id . 2) (#:duration . 71000.0) # # …) …))
In cuirass/base.scm:
145:6 2 (register _)
In ice-9/boot-9.scm:
268:13 1 (for-each #<procedure 3dc0750 at cuirass/base.scm:145:…> …)
In cuirass/database.scm:
192:2 0 (db-add-build #<<sqlite-db> pointer: #<pointer 0x19d9e…> …)
cuirass/database.scm:192:2: In procedure db-add-build:
cuirass/database.scm:192:2: Throw to key `sqlite-error' with args `(#f 1555 "UNIQUE constraint failed: Builds.derivation, Builds.evaluation, Builds.output")'.

The directory /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc exists.

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC
R
R
Ricardo Wurmus wrote on 24 Aug 2017 09:21
(address . 28094@debbugs.gnu.org)
87lgm9qvlr.fsf@elephly.net
Ricardo Wurmus <rekado@elephly.net> writes:

Toggle quote (47 lines)
> Ricardo Wurmus <rekado@elephly.net> writes:
>
>> Ricardo Wurmus <rekado@elephly.net> writes:
>>
>>> it looks like Cuirass refuses to build i686 things because that would
>>> violate a UNIQUE constraint:
>>
>> I’ve seen this repeatedly for other derivations; all seem to be i686.
>> The error reporting is bad, so I don’t know exactly why this happens,
>> but one guess is that this is when a previously failed build process
>> succeeded.
>
> I’ve changed Cuirass locally to print a more detailed error message when
> this happens. Here’s a recent error:
>
> --8<---------------cut here---------------start------------->8---
> Database error with INSERT INTO Builds (derivation, evaluation, log, output) VALUES ('~A', '~A', '~A', '~A'); and (/gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv 2 #f /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc)
> In ice-9/boot-9.scm:
> 230:29 19 (map1 (((#:eval-id . 2) (#:duration . 81000.0) # # …) …))
> 230:29 18 (map1 (((#:eval-id . 2) (#:duration . 70000.0) # # …) …))
> 230:29 17 (map1 (((#:eval-id . 2) (#:duration . 83000.0) # # …) …))
> 230:29 16 (map1 (((#:eval-id . 2) (#:duration . 89000.0) # # …) …))
> 230:29 15 (map1 (((#:eval-id . 2) (#:duration . 81000.0) # # …) …))
> 230:29 14 (map1 (((#:eval-id . 2) (#:duration . 131000.0) # # …) …))
> 230:29 13 (map1 (((#:eval-id . 2) (#:duration . 128000.0) # # …) …))
> 230:29 12 (map1 (((#:eval-id . 2) (#:duration . 100000.0) # # …) …))
> 230:29 11 (map1 (((#:eval-id . 2) (#:duration . 193000.0) # # …) …))
> 230:29 10 (map1 (((#:eval-id . 2) (#:duration . 113000.0) # # …) …))
> 230:29 9 (map1 (((#:eval-id . 2) (#:duration . 122000.0) # # …) …))
> 230:29 8 (map1 (((#:eval-id . 2) (#:duration . 91000.0) # # …) …))
> 230:29 7 (map1 (((#:eval-id . 2) (#:duration . 101000.0) # # …) …))
> 230:29 6 (map1 (((#:eval-id . 2) (#:duration . 87000.0) # # …) …))
> 230:29 5 (map1 (((#:eval-id . 2) (#:duration . 67000.0) # # …) …))
> 230:29 4 (map1 (((#:eval-id . 2) (#:duration . 75000.0) # # …) …))
> 230:17 3 (map1 (((#:eval-id . 2) (#:duration . 71000.0) # # …) …))
> In cuirass/base.scm:
> 145:6 2 (register _)
> In ice-9/boot-9.scm:
> 268:13 1 (for-each #<procedure 3dc0750 at cuirass/base.scm:145:…> …)
> In cuirass/database.scm:
> 192:2 0 (db-add-build #<<sqlite-db> pointer: #<pointer 0x19d9e…> …)
> cuirass/database.scm:192:2: In procedure db-add-build:
> cuirass/database.scm:192:2: Throw to key `sqlite-error' with args `(#f 1555 "UNIQUE constraint failed: Builds.derivation, Builds.evaluation, Builds.output")'.
> --8<---------------cut here---------------end--------------->8---
>
> The directory /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc exists.

After restarting Cuirass I got this error again:

Toggle snippet (40 lines)
evaluate 'mips64el-linux-gnu.mpc-1.0.3.i686-linux': 104000.000 seconds
evaluate 'mips64el-linux-gnu.coreutils-8.27.i686-linux': -608068998.000 seconds
evaluate 'mips64el-linux-gnu.findutils-4.6.0.i686-linux': 141217000.000 seconds
evaluate 'mips64el-linux-gnu.diffutils-3.5.i686-linux': 119447000.000 seconds
evaluate 'mips64el-linux-gnu.patch-2.7.5.i686-linux': -853410998.000 seconds
/gnu/store/1bil0xyhpim3cfyaifdpb2jsjdni2hif-hplip-3.17.7
/gnu/store/n7mf8hk262rnlhrjqmacnkp1yn518ks4-cups-minimal-2.2.1
/gnu/store/lvfymniwbz33an5a2hakf4b1c57lrdwr-cups-filters-1.13.1
/gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc /gnu/store/nmfwf4fkvb4mfyi7m5sn1daklkjsz9mn-curl-7.55.0
/gnu/store/53vb094sihb819hk124qvfjq8vz78252-curl-7.53.0-doc /gnu/store/9ihxpf7al0znb19lx0bk6ymjp6nxhn9y-curl-7.53.0
Database error with INSERT INTO Builds (derivation, evaluation, log, output) VALUES ('~A', '~A', '~A', '~A'); and (/gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv 3 #f /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc)
In ice-9/boot-9.scm:
230:29 19 (map1 (((#:eval-id . 3) (#:duration . 76000.0) # # …) …))
230:29 18 (map1 (((#:eval-id . 3) (#:duration . 110000.0) # # …) …))
230:29 17 (map1 (((#:eval-id . 3) (#:duration . 115000.0) # # …) …))
230:29 16 (map1 (((#:eval-id . 3) (#:duration . 82000.0) # # …) …))
230:29 15 (map1 (((#:eval-id . 3) (#:duration . 98000.0) # # …) …))
230:29 14 (map1 (((#:eval-id . 3) (#:duration . 97000.0) # # …) …))
230:29 13 (map1 (((#:eval-id . 3) (#:duration . 90000.0) # # …) …))
230:29 12 (map1 (((#:eval-id . 3) (#:duration . 75000.0) # # …) …))
230:29 11 (map1 (((#:eval-id . 3) (#:duration . 86000.0) # # …) …))
230:29 10 (map1 (((#:eval-id . 3) (#:duration . 87000.0) # # …) …))
230:29 9 (map1 (((#:eval-id . 3) (#:duration . 93000.0) # # …) …))
230:29 8 (map1 (((#:eval-id . 3) (#:duration . 173000.0) # # …) …))
230:29 7 (map1 (((#:eval-id . 3) (#:duration . 88000.0) # # …) …))
230:29 6 (map1 (((#:eval-id . 3) (#:duration . 118000.0) # # …) …))
230:29 5 (map1 (((#:eval-id . 3) (#:duration . 94000.0) # # …) …))
230:29 4 (map1 (((#:eval-id . 3) (#:duration . 85000.0) # # …) …))
230:17 3 (map1 (((#:eval-id . 3) (#:duration . 75000.0) # # …) …))
In cuirass/base.scm:
145:6 2 (register _)
In ice-9/boot-9.scm:
268:13 1 (for-each #<procedure 8d1ae10 at cuirass/base.scm:145:…> …)
In cuirass/database.scm:
192:2 0 (db-add-build #<<sqlite-db> pointer: #<pointer 0x24cde…> …)
cuirass/database.scm:192:2: In procedure db-add-build:
cuirass/database.scm:192:2: Throw to key `sqlite-error' with args `(#f 1555 "UNIQUE constraint failed: Builds.derivation, Builds.evaluation, Builds.output")'.

Note that this is the same derivation and the same output as before.
Also note that I started with a fresh database before either of these
errors. I did not remove the database after restarting Cuirass, though.

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC
L
L
Ludovic Courtès wrote on 26 Aug 2017 01:08
(name . Ricardo Wurmus)(address . rekado@elephly.net)(address . 28094@debbugs.gnu.org)
87fucfdz3v.fsf@gnu.org
Heya!

Ricardo Wurmus <rekado@elephly.net> skribis:

Toggle quote (45 lines)
> After restarting Cuirass I got this error again:
>
> …
> evaluate 'mips64el-linux-gnu.mpc-1.0.3.i686-linux': 104000.000 seconds
> evaluate 'mips64el-linux-gnu.coreutils-8.27.i686-linux': -608068998.000 seconds
> evaluate 'mips64el-linux-gnu.findutils-4.6.0.i686-linux': 141217000.000 seconds
> evaluate 'mips64el-linux-gnu.diffutils-3.5.i686-linux': 119447000.000 seconds
> evaluate 'mips64el-linux-gnu.patch-2.7.5.i686-linux': -853410998.000 seconds
> /gnu/store/1bil0xyhpim3cfyaifdpb2jsjdni2hif-hplip-3.17.7
> /gnu/store/n7mf8hk262rnlhrjqmacnkp1yn518ks4-cups-minimal-2.2.1
> /gnu/store/lvfymniwbz33an5a2hakf4b1c57lrdwr-cups-filters-1.13.1
> /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc /gnu/store/nmfwf4fkvb4mfyi7m5sn1daklkjsz9mn-curl-7.55.0
> /gnu/store/53vb094sihb819hk124qvfjq8vz78252-curl-7.53.0-doc /gnu/store/9ihxpf7al0znb19lx0bk6ymjp6nxhn9y-curl-7.53.0
> Database error with INSERT INTO Builds (derivation, evaluation, log, output) VALUES ('~A', '~A', '~A', '~A'); and (/gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv 3 #f /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc)
> In ice-9/boot-9.scm:
> 230:29 19 (map1 (((#:eval-id . 3) (#:duration . 76000.0) # # …) …))
> 230:29 18 (map1 (((#:eval-id . 3) (#:duration . 110000.0) # # …) …))
> 230:29 17 (map1 (((#:eval-id . 3) (#:duration . 115000.0) # # …) …))
> 230:29 16 (map1 (((#:eval-id . 3) (#:duration . 82000.0) # # …) …))
> 230:29 15 (map1 (((#:eval-id . 3) (#:duration . 98000.0) # # …) …))
> 230:29 14 (map1 (((#:eval-id . 3) (#:duration . 97000.0) # # …) …))
> 230:29 13 (map1 (((#:eval-id . 3) (#:duration . 90000.0) # # …) …))
> 230:29 12 (map1 (((#:eval-id . 3) (#:duration . 75000.0) # # …) …))
> 230:29 11 (map1 (((#:eval-id . 3) (#:duration . 86000.0) # # …) …))
> 230:29 10 (map1 (((#:eval-id . 3) (#:duration . 87000.0) # # …) …))
> 230:29 9 (map1 (((#:eval-id . 3) (#:duration . 93000.0) # # …) …))
> 230:29 8 (map1 (((#:eval-id . 3) (#:duration . 173000.0) # # …) …))
> 230:29 7 (map1 (((#:eval-id . 3) (#:duration . 88000.0) # # …) …))
> 230:29 6 (map1 (((#:eval-id . 3) (#:duration . 118000.0) # # …) …))
> 230:29 5 (map1 (((#:eval-id . 3) (#:duration . 94000.0) # # …) …))
> 230:29 4 (map1 (((#:eval-id . 3) (#:duration . 85000.0) # # …) …))
> 230:17 3 (map1 (((#:eval-id . 3) (#:duration . 75000.0) # # …) …))
> In cuirass/base.scm:
> 145:6 2 (register _)
> In ice-9/boot-9.scm:
> 268:13 1 (for-each #<procedure 8d1ae10 at cuirass/base.scm:145:…> …)
> In cuirass/database.scm:
> 192:2 0 (db-add-build #<<sqlite-db> pointer: #<pointer 0x24cde…> …)
> cuirass/database.scm:192:2: In procedure db-add-build:
> cuirass/database.scm:192:2: Throw to key `sqlite-error' with args `(#f 1555 "UNIQUE constraint failed: Builds.derivation, Builds.evaluation, Builds.output")'.
>
> Note that this is the same derivation and the same output as before.
> Also note that I started with a fresh database before either of these
> errors. I did not remove the database after restarting Cuirass, though.

This is the tail of the Builds table on that machine:

Toggle snippet (10 lines)
/gnu/store/jcdfzvb3ca4n5jzh7ajc3yb47akg30c4-hplip-3.17.7.drv|4|#f|/gnu/store/1bil0xyhpim3cfyaifdpb2jsjdni2hif-hplip-3.17.7
/gnu/store/lndp48wl3jcqjysjdrxgh0nm5cghc38v-cups-filters-1.13.1.drv|4|#f|/gnu/store/lvfymniwbz33an5a2hakf4b1c57lrdwr-cups-filters-1.13.1
/gnu/store/9zzp62b9l2b85dbdqiq17avbqw3h0xkz-cups-2.2.1.drv|4|#f|/gnu/store/a403mrmm7jd2vxygfjszrsycpa75w6cy-cups-2.2.1
/gnu/store/2isifzc6i42bxpb5rwm3wq2qvpyw158g-cups-minimal-2.2.1.drv|4|#f|/gnu/store/n7mf8hk262rnlhrjqmacnkp1yn518ks4-cups-minimal-2.2.1
/gnu/store/5aysbn4y15hzjyj6ixw16rl223c8bv12-curl-7.53.0.drv|4|#f|/gnu/store/53vb094sihb819hk124qvfjq8vz78252-curl-7.53.0-doc
/gnu/store/5aysbn4y15hzjyj6ixw16rl223c8bv12-curl-7.53.0.drv|4|#f|/gnu/store/9ihxpf7al0znb19lx0bk6ymjp6nxhn9y-curl-7.53.0
/gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv|4|#f|/gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc
/gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv|4|#f|/gnu/store/nmfwf4fkvb4mfyi7m5sn1daklkjsz9mn-curl-7.55.0

So the problem is that we’re trying to insert one of these again, which
fails because we already have it under this primary key.

This is because the curl-7.55.0 package ends up twice in the list of
jobs: once as a replacement for curl-7.53.0, and once because the
curl-7.55.0 is itself a public variable.

Commit 7d4d6c13f46f2a307883226789d6aa503e2d7081 in guix-maintenance.git
works around that.

The proper fix in Cuirass might be to ignore the primary key error (for
future reference, 1555 in the ‘sqlite-error’ exception above is
(logior 19 (ash 6 8)), which is SQLITE_CONSTRAINT_PRIMARYKEY in
<sqlite3.h>), as in the attached patch. Thoughts? I’ll push it if
there are no objections.

Ludo’.
Toggle diff (41 lines)
diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm
index 91133c2..9c7e69a 100644
--- a/src/cuirass/database.scm
+++ b/src/cuirass/database.scm
@@ -181,15 +181,30 @@ string."
((char=? char #\') (loop (cons* char char chars)))
(else (loop (cons char chars)))))))
+;; Extended error codes (see <sqlite3.h>).
+;; XXX: This should be defined by (sqlite3).
+(define SQLITE_CONSTRAINT 19)
+(define SQLITE_CONSTRAINT_PRIMARYKEY
+ (logior SQLITE_CONSTRAINT (ash 6 8)))
+
(define (db-add-build db build)
- "Store BUILD in database DB."
- (sqlite-exec db "\
+ "Store BUILD in database DB. This is idempotent."
+ (catch 'sqlite-error
+ (lambda ()
+ (sqlite-exec db "\
INSERT INTO Builds (derivation, evaluation, log, output)\
VALUES ('~A', '~A', '~A', '~A');"
- (assq-ref build #:derivation)
- (assq-ref build #:eval-id)
- (assq-ref build #:log)
- (assq-ref build #:output))
+ (assq-ref build #:derivation)
+ (assq-ref build #:eval-id)
+ (assq-ref build #:log)
+ (assq-ref build #:output)))
+ (lambda (key who code . rest)
+ ;; If we get a primary-key-constraint-violated error, that means we have
+ ;; already inserted the same (derivation,eval-id,log) tuple, which we
+ ;; can safely ignore.
+ (unless (= code SQLITE_CONSTRAINT_PRIMARYKEY)
+ (apply throw key who code rest))))
+
(last-insert-rowid db))
(define (db-get-stamp db spec)
R
R
Ricardo Wurmus wrote on 26 Aug 2017 08:48
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 28094@debbugs.gnu.org)
87bmn2vn8f.fsf@elephly.net
Hi Ludo,

[…]
Toggle quote (3 lines)
>> /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc /gnu/store/nmfwf4fkvb4mfyi7m5sn1daklkjsz9mn-curl-7.55.0
>> /gnu/store/53vb094sihb819hk124qvfjq8vz78252-curl-7.53.0-doc /gnu/store/9ihxpf7al0znb19lx0bk6ymjp6nxhn9y-curl-7.53.0
>> Database error with INSERT INTO Builds (derivation, evaluation, log, output) VALUES ('~A', '~A', '~A', '~A'); and (/gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv 3 #f /gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc)
[…]
Toggle quote (4 lines)
>> In cuirass/database.scm:
>> 192:2 0 (db-add-build #<<sqlite-db> pointer: #<pointer 0x24cde…> …)
>> cuirass/database.scm:192:2: In procedure db-add-build:
>> cuirass/database.scm:192:2: Throw to key `sqlite-error' with args `(#f 1555 "UNIQUE constraint failed: Builds.derivation, Builds.evaluation, Builds.output")'.
[…]
Toggle quote (23 lines)
> This is the tail of the Builds table on that machine:
>
> --8<---------------cut here---------------start------------->8---
> /gnu/store/jcdfzvb3ca4n5jzh7ajc3yb47akg30c4-hplip-3.17.7.drv|4|#f|/gnu/store/1bil0xyhpim3cfyaifdpb2jsjdni2hif-hplip-3.17.7
> /gnu/store/lndp48wl3jcqjysjdrxgh0nm5cghc38v-cups-filters-1.13.1.drv|4|#f|/gnu/store/lvfymniwbz33an5a2hakf4b1c57lrdwr-cups-filters-1.13.1
> /gnu/store/9zzp62b9l2b85dbdqiq17avbqw3h0xkz-cups-2.2.1.drv|4|#f|/gnu/store/a403mrmm7jd2vxygfjszrsycpa75w6cy-cups-2.2.1
> /gnu/store/2isifzc6i42bxpb5rwm3wq2qvpyw158g-cups-minimal-2.2.1.drv|4|#f|/gnu/store/n7mf8hk262rnlhrjqmacnkp1yn518ks4-cups-minimal-2.2.1
> /gnu/store/5aysbn4y15hzjyj6ixw16rl223c8bv12-curl-7.53.0.drv|4|#f|/gnu/store/53vb094sihb819hk124qvfjq8vz78252-curl-7.53.0-doc
> /gnu/store/5aysbn4y15hzjyj6ixw16rl223c8bv12-curl-7.53.0.drv|4|#f|/gnu/store/9ihxpf7al0znb19lx0bk6ymjp6nxhn9y-curl-7.53.0
> /gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv|4|#f|/gnu/store/60671wa0i1fljll26fx7lxfl27fb27si-curl-7.55.0-doc
> /gnu/store/zg0zpndricjwwbjv5087zw9hmdcd708y-curl-7.55.0.drv|4|#f|/gnu/store/nmfwf4fkvb4mfyi7m5sn1daklkjsz9mn-curl-7.55.0
> --8<---------------cut here---------------end--------------->8---
>
> So the problem is that we’re trying to insert one of these again, which
> fails because we already have it under this primary key.
>
> This is because the curl-7.55.0 package ends up twice in the list of
> jobs: once as a replacement for curl-7.53.0, and once because the
> curl-7.55.0 is itself a public variable.
>
> Commit 7d4d6c13f46f2a307883226789d6aa503e2d7081 in guix-maintenance.git
> works around that.

Thank you!

Toggle quote (6 lines)
> The proper fix in Cuirass might be to ignore the primary key error (for
> future reference, 1555 in the ‘sqlite-error’ exception above is
> (logior 19 (ash 6 8)), which is SQLITE_CONSTRAINT_PRIMARYKEY in
> <sqlite3.h>), as in the attached patch. Thoughts? I’ll push it if
> there are no objections.

This looks good to me.

Toggle quote (39 lines)
> diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm
> index 91133c2..9c7e69a 100644
> --- a/src/cuirass/database.scm
> +++ b/src/cuirass/database.scm
> @@ -181,15 +181,30 @@ string."
> ((char=? char #\') (loop (cons* char char chars)))
> (else (loop (cons char chars)))))))
>
> +;; Extended error codes (see <sqlite3.h>).
> +;; XXX: This should be defined by (sqlite3).
> +(define SQLITE_CONSTRAINT 19)
> +(define SQLITE_CONSTRAINT_PRIMARYKEY
> + (logior SQLITE_CONSTRAINT (ash 6 8)))
> +
> (define (db-add-build db build)
> - "Store BUILD in database DB."
> - (sqlite-exec db "\
> + "Store BUILD in database DB. This is idempotent."
> + (catch 'sqlite-error
> + (lambda ()
> + (sqlite-exec db "\
> INSERT INTO Builds (derivation, evaluation, log, output)\
> VALUES ('~A', '~A', '~A', '~A');"
> - (assq-ref build #:derivation)
> - (assq-ref build #:eval-id)
> - (assq-ref build #:log)
> - (assq-ref build #:output))
> + (assq-ref build #:derivation)
> + (assq-ref build #:eval-id)
> + (assq-ref build #:log)
> + (assq-ref build #:output)))
> + (lambda (key who code . rest)
> + ;; If we get a primary-key-constraint-violated error, that means we have
> + ;; already inserted the same (derivation,eval-id,log) tuple, which we
> + ;; can safely ignore.
> + (unless (= code SQLITE_CONSTRAINT_PRIMARYKEY)
> + (apply throw key who code rest))))
> +

Unfortunately, re-throwing the error doesn’t print any meaningful error
message. To get the error message that I showed above I caught any
sqlite errors and re-threw the exception only after printing the
arguments to sqlite-exec:

(format (current-error-port) "Database error with ~a and ~a~%" msg args)

I think it would be good to include a line like this right after
“(unless (= code SQLITE_CONSTRAINT_PRIMARYKEY)”.

Thank you for debugging this!

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC
L
L
Ludovic Courtès wrote on 26 Aug 2017 10:51
(name . Ricardo Wurmus)(address . rekado@elephly.net)(address . 28094-done@debbugs.gnu.org)
87r2vyd85a.fsf@gnu.org
Hello!

Ricardo Wurmus <rekado@elephly.net> skribis:

Toggle quote (49 lines)
>> diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm
>> index 91133c2..9c7e69a 100644
>> --- a/src/cuirass/database.scm
>> +++ b/src/cuirass/database.scm
>> @@ -181,15 +181,30 @@ string."
>> ((char=? char #\') (loop (cons* char char chars)))
>> (else (loop (cons char chars)))))))
>>
>> +;; Extended error codes (see <sqlite3.h>).
>> +;; XXX: This should be defined by (sqlite3).
>> +(define SQLITE_CONSTRAINT 19)
>> +(define SQLITE_CONSTRAINT_PRIMARYKEY
>> + (logior SQLITE_CONSTRAINT (ash 6 8)))
>> +
>> (define (db-add-build db build)
>> - "Store BUILD in database DB."
>> - (sqlite-exec db "\
>> + "Store BUILD in database DB. This is idempotent."
>> + (catch 'sqlite-error
>> + (lambda ()
>> + (sqlite-exec db "\
>> INSERT INTO Builds (derivation, evaluation, log, output)\
>> VALUES ('~A', '~A', '~A', '~A');"
>> - (assq-ref build #:derivation)
>> - (assq-ref build #:eval-id)
>> - (assq-ref build #:log)
>> - (assq-ref build #:output))
>> + (assq-ref build #:derivation)
>> + (assq-ref build #:eval-id)
>> + (assq-ref build #:log)
>> + (assq-ref build #:output)))
>> + (lambda (key who code . rest)
>> + ;; If we get a primary-key-constraint-violated error, that means we have
>> + ;; already inserted the same (derivation,eval-id,log) tuple, which we
>> + ;; can safely ignore.
>> + (unless (= code SQLITE_CONSTRAINT_PRIMARYKEY)
>> + (apply throw key who code rest))))
>> +
>
> Unfortunately, re-throwing the error doesn’t print any meaningful error
> message. To get the error message that I showed above I caught any
> sqlite errors and re-threw the exception only after printing the
> arguments to sqlite-exec:
>
> (format (current-error-port) "Database error with ~a and ~a~%" msg args)
>
> I think it would be good to include a line like this right after
> “(unless (= code SQLITE_CONSTRAINT_PRIMARYKEY)”.

Good idea. Pushed with a test case as
72f2b6b77cc4e3d7629bdf34e6daee05398b8de1.

Thanks,
Ludo’.
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 28094@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 28094
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch