"make check-system" fails to report record-abi-mismatch-error

  • Done
  • quality assurance status badge
Details
2 participants
  • Chris Marusich
  • Ludovic Courtès
Owner
unassigned
Submitted by
Chris Marusich
Severity
normal
C
C
Chris Marusich wrote on 6 Oct 2018 09:19
(address . bug-guix@gnu.org)
875zyfv8y7.fsf@gmail.com
Hi Guix,

On commit d71078bc75d149c70dc573a259986f1731145693, "make check-system"
failed for me with the following error message:

Toggle snippet (29 lines)
[2] [env] marusich@garuda.local:~/guix
$ make check-system
Compiling Scheme modules...
warning: failed to load '(gnu tests install)':
Backtrace:
9 (apply-smob/1 #<catch-closure d998a0>)
In ice-9/boot-9.scm:
705:2 8 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
In ice-9/eval.scm:
619:8 7 (_ #(#(#<directory (guile-user) e24140>)))
619:8 6 (_ #(#(#(#<directory (run-system-tests) e47aa0>) (#)) #))
626:19 5 (_ #(#(#(#<directory (run-system-tests) e47aa0>) (#)) #))
In gnu/tests.scm:
277:11 4 (all-system-tests)
273:32 3 (fold-system-tests _ _)
In srfi/srfi-1.scm:
697:23 2 (filter-map #<procedure 2e9da80 at guix/discovery.sc…> . #)
In guix/discovery.scm:
113:22 1 (_ . _)
In unknown file:
0 (display-error #f #<output: file /dev/pts/0> #<record-t…>)

ERROR: In procedure display-error:
Wrong number of arguments to #<procedure display-error (_ _ _ _ _ _)>
make: *** [Makefile:5454: check-system] Error 1
[2] [env] marusich@garuda.local:~/guix
$

Although it wasn't obvious, this problem was actually caused by a
record-abi-mismatch-error. When I deleted my $HOME/.cache/guile/ccache
directory, this error went away, and I was able to run the system tests.
However, it took some work to figure this out, since the error reporting
mechanism itself suffered an error.

To figure this out, I added some debug statements (see attached patch).
After I did that, "make check-system" failed with some more information:

Toggle snippet (42 lines)
[2] [env] marusich@garuda.local:~/guix
$ make check-system
Compiling Scheme modules...
XXX before

;;; (#<procedure warn-about-load-error (file args)>)

;;; ((gnu tests install))

;;; ((record-abi-mismatch-error #<record-type <openssh-configuration>>))

;;; ((record-abi-mismatch-error #<record-type <openssh-configuration>>))
warning: failed to load '(gnu tests install)':

;;; (#<output: file /dev/pts/0>)

;;; ((#<record-type <openssh-configuration>>))
Backtrace:
9 (apply-smob/1 #<catch-closure cdc8a0>)
In ice-9/boot-9.scm:
705:2 8 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
In ice-9/eval.scm:
619:8 7 (_ #(#(#<directory (guile-user) d67140>)))
619:8 6 (_ #(#(#(#<directory (run-system-tests) d8aaa0>) (#)) #))
626:19 5 (_ #(#(#(#<directory (run-system-tests) d8aaa0>) (#)) #))
In gnu/tests.scm:
277:11 4 (all-system-tests)
273:32 3 (fold-system-tests _ _)
In srfi/srfi-1.scm:
697:23 2 (filter-map #<procedure 2dd9a80 at guix/discovery.sc…> . #)
In guix/discovery.scm:
114:22 1 (_ record-abi-mismatch-error #<record-type <openssh-con…>)
In unknown file:
0 (display-error #f #<output: file /dev/pts/0> #<record-t…>)

ERROR: In procedure display-error:
Wrong number of arguments to #<procedure display-error (_ _ _ _ _ _)>
make: *** [Makefile:5454: check-system] Error 1
[2] [env] marusich@garuda.local:~/guix
$

This output shows two problems. The first problem is that an ABI
mismatch error was thrown. The second problem is that display-error
encountered a problem while trying to display that error.

It's the second problem that I can't figure out. Why does display-error
fail in this case? For context, note that fold-system-tests in
gnu/tests.scm calls test-modules (in the same file), and that
test-modules calls scheme-modules with #:warn set to
warn-about-load-error.

The procedure warn-about-load-error is defined in guix/ui.scm. It calls
display-error. That seems to be where the problem occurs. Based on the
debug output I added, we can see that in warn-about-load-error, the args
variable refers to the following list:

(record-abi-mismatch-error #<record-type <openssh-configuration>>)

This is strange, since the only place that throws
record-abi-mismatch-error is in guix/records.scm...

Toggle snippet (12 lines)
(define (abi-check type cookie)
"Return syntax that checks that the current \"application binary
interface\" (ABI) for TYPE is equal to COOKIE."
(with-syntax ((current-abi (current-abi-identifier type)))
#`(unless (eq? current-abi #,cookie)
;; The source file where this exception is thrown must be
;; recompiled.
(throw 'record-abi-mismatch-error 'abi-check
"~a: record ABI mismatch; recompilation needed"
(list #,type) '()))))

...and based on that code, I expected the args variable to contain many
more elements. I expected it to look more like this:

Toggle snippet (9 lines)
scheme@(guile-user)> (throw 'record-abi-mismatch-error 'abi-check
"~a: record ABI mismatch; recompilation needed"
(list 'some-type) '())
Throw to key `record-abi-mismatch-error' with args `(abi-check "~a: record ABI mismatch; recompilation needed" (some-type) ())'.

Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]>

I don't understand what happened to all the other arguments. It looks
like the throw invocation in guix/records.scm was written carefully so
that it would throw exactly the arguments that display-error expects to
receive, but some of the arguments apparently went missing (e.g., the
"~a: record ABI mismatch; recompilation needed" message). I can't
figure out why those arguments are missing.

How can I debug this further? I'd like to fix this if possible so that
"make check-system" can reliably report errors like this.

Thank you in advance for your help!

--
Chris
From ac550495740ba4f8c87a9577145f6760a0ff00cd Mon Sep 17 00:00:00 2001
From: Chris Marusich <cmmarusich@gmail.com>
Date: Fri, 5 Oct 2018 23:39:57 -0700
Subject: [PATCH] Add some debug statements

---
guix/discovery.scm | 4 +++-
guix/ui.scm | 4 ++--
2 files changed, 5 insertions(+), 3 deletions(-)

Toggle diff (39 lines)
diff --git a/guix/discovery.scm b/guix/discovery.scm
index 3fc6e2c9e..af428825e 100644
--- a/guix/discovery.scm
+++ b/guix/discovery.scm
@@ -110,7 +110,9 @@ name and the exception key and arguments."
(resolve-interface module))
(lambda args
;; Report the error, but keep going.
- (warn module args)
+ (display "XXX before\n")
+ ((pk warn) (pk module) (pk args))
+ (display "XXX after\n")
#f))))
(scheme-files (if sub-directory
(string-append directory "/" sub-directory)
diff --git a/guix/ui.scm b/guix/ui.scm
index 96f403acf..f28f80d4b 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -381,7 +381,7 @@ ARGS is the list of arguments received by the 'throw' handler."
(define (warn-about-load-error file args) ;FIXME: factorize with ↑
"Report the failure to load FILE, a user-provided Scheme file, without
exiting. ARGS is the list of arguments received by the 'throw' handler."
- (match args
+ (match (pk args)
(('system-error . rest)
(let ((err (system-error-errno args)))
(warning (G_ "failed to load '~a': ~a~%") file (strerror err))))
@@ -398,7 +398,7 @@ exiting. ARGS is the list of arguments received by the 'throw' handler."
file obj)))
((error args ...)
(warning (G_ "failed to load '~a':~%") file)
- (apply display-error #f (current-error-port) args))))
+ (apply display-error #f (pk (current-error-port)) (pk args)))))
(define (call-with-unbound-variable-handling thunk)
(define tag
--
2.18.0
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEy/WXVcvn5+/vGD+x3UCaFdgiRp0FAlu4YfAACgkQ3UCaFdgi
Rp2uXBAAwW6XRO+ZIbXzZDEr8kainGH+DGVPpl0YIlEZpLXjyOjNCNJ7Crzmck03
v9MibuaFagolohPmZ2v2BrgXa1J9qBAv2xGzeFULN8PnvqsSZgjbocC3wJG6bLb8
aj1pIreR0QLB35a+mSC450yZDsPTc7uwqfqe11H3xBM81BonjR8JTXR0dGDAQjDz
8u2RgPfDP8FuO4sRJbTLYaG/OV/b1pJR84IyEWXMh9ByUFeqtqu6+0lmF2UqdEyF
MenZobXXUPKt7aJ0SN/OjAuJzP6K27an38yRXWEasOtkClorfVdMDzvaPoGfzHn+
o1lWi3jxO54u4A+9ZPhtLcu2lMORvKgNiwjcR3caQhCsqoPLRfNWVSo7voG0IEem
l4piZ++S4huNQrrZ+k3ijmcxxpya2uD/O2AqLQHdHsPHDppsGqxNs4q/4ifYiTtf
eFSzaPkLH0EtU+oIgZA53VC6HjvFIT1rvyvWrT3u5Tt6GSX2f3gSoMB9qPafR5mH
ji7XU2BDMRCgy731YVu3WVN8sjsZJ85UDY1D5sCFkVja+u9TlE+yoEw2gYaD8MAs
C3BmvcMFS+Irj1BcnbIoqksFBcW8ieKiVTDfIDV0H6WrW/cmJ8qdnUXHGpZVDN5Q
NXHmsDyJjmo9nWo5KNDzPSVyiZmN0jnfSvXUK0eRI1x+xUGq+ew=
=ooNo
-----END PGP SIGNATURE-----

L
L
Ludovic Courtès wrote on 8 Oct 2018 15:12
(name . Chris Marusich)(address . cmmarusich@gmail.com)(address . 32952@debbugs.gnu.org)
87woqsziod.fsf@gnu.org
Hi Chris,

Chris Marusich <cmmarusich@gmail.com> skribis:

Toggle quote (40 lines)
> The procedure warn-about-load-error is defined in guix/ui.scm. It calls
> display-error. That seems to be where the problem occurs. Based on the
> debug output I added, we can see that in warn-about-load-error, the args
> variable refers to the following list:
>
> (record-abi-mismatch-error #<record-type <openssh-configuration>>)
>
> This is strange, since the only place that throws
> record-abi-mismatch-error is in guix/records.scm...
>
> (define (abi-check type cookie)
> "Return syntax that checks that the current \"application binary
> interface\" (ABI) for TYPE is equal to COOKIE."
> (with-syntax ((current-abi (current-abi-identifier type)))
> #`(unless (eq? current-abi #,cookie)
> ;; The source file where this exception is thrown must be
> ;; recompiled.
> (throw 'record-abi-mismatch-error 'abi-check
> "~a: record ABI mismatch; recompilation needed"
> (list #,type) '()))))
>
>
> ...and based on that code, I expected the args variable to contain many
> more elements. I expected it to look more like this:
>
> scheme@(guile-user)> (throw 'record-abi-mismatch-error 'abi-check
> "~a: record ABI mismatch; recompilation needed"
> (list 'some-type) '())
> Throw to key `record-abi-mismatch-error' with args `(abi-check "~a: record ABI mismatch; recompilation needed" (some-type) ())'.
>
> Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
> scheme@(guile-user) [1]>
>
> I don't understand what happened to all the other arguments. It looks
> like the throw invocation in guix/records.scm was written carefully so
> that it would throw exactly the arguments that display-error expects to
> receive, but some of the arguments apparently went missing (e.g., the
> "~a: record ABI mismatch; recompilation needed" message). I can't
> figure out why those arguments are missing.

Commit de5cbd4a38a33e0412f1c481fe8e01a871dc13e5 changed the arguments
passed along ‘record-abi-mismatch-error’ exceptions precisely to fix the
problem you report I believe. :-)

What’s probably happening here is that you have a .go file built before
this commit, which is why it’s passing only on argument (the record
type) along the ‘record-abi-mismatch-error’ exception.

Does that make sense?

Thanks,
Ludo’.
L
L
Ludovic Courtès wrote on 27 Oct 2018 17:18
control message for bug #32952
(address . control@debbugs.gnu.org)
87bm7f7705.fsf@gnu.org
tags 32952 notabug
close 32952
C
C
Chris Marusich wrote on 27 Oct 2018 21:18
Re: bug#32952: "make check-system" fails to report record-abi-mismatch-error
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 32952@debbugs.gnu.org)
87tvl7w64l.fsf@gmail.com
ludo@gnu.org (Ludovic Courtès) writes:

Toggle quote (10 lines)
> Commit de5cbd4a38a33e0412f1c481fe8e01a871dc13e5 changed the arguments
> passed along ‘record-abi-mismatch-error’ exceptions precisely to fix the
> problem you report I believe. :-)
>
> What’s probably happening here is that you have a .go file built before
> this commit, which is why it’s passing only on argument (the record
> type) along the ‘record-abi-mismatch-error’ exception.
>
> Does that make sense?

Yes, this makes sense! You were right: this was the problem.

I forgot about this bug report, but I can confirm that it is now
resolved. Thank you for closing it, and for your help!

--
Chris
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEy/WXVcvn5+/vGD+x3UCaFdgiRp0FAlvUufoACgkQ3UCaFdgi
Rp1Bdg//d62tK2F+XZhq/MLp9vHX3n1eRFs9MueSfu4FIQbzckxOxdWuA1BT3PB3
cua6gSAMS2H5okbY58ecPVXahSW0XTIyVicud73+3mkYZzlu5p+4rd643g9e9WB5
GpSS942aOFLpuLufA+Wmq7UlhHa1uFvvDnNq6n/pa6AMNB6XgHPtlcZ/TsBWi/59
11LEY2uNWLeIHCPXxlEmq456Z0zomLY+YYY+aFnCqvtQHEpv6eYnATG89JacqSfI
/aNb4hEi0F3lesxY+rjFZ091M/scP7Q7RU81IMsHATuQwbKwVlr/yMGqeYISpNI/
Ohguon76sLccWxwDhGXO3rYTE63/BvyeNUfF3MB8tOzdI+Lf974xYzxL0jm09ZSq
mDyi4NMWYrGmh4Uq2ZJFFfty3wLTQ+Wfy/u8TTlwB57qY8tnXckrO2m2olOB5ZCe
5Pa2vh0tAEaYlJbm2eXfbriV8dc5G2j8PHWBX6mvhSkQrASoIEJHpo+FUKYde9o1
e3K6V3k+vtRoF68O/cH9Jg38nh7tGE0tBAe7T1VvNZZYdosNtATAhkVQlROcVASP
THsBoiMlPnx1BHuPvmI2M29gMgO8/hlg2ik2emcll9iKXHe8PChP5Klth7aRVfgc
D841dfmsAmEct6Iqeg3roYIeTAKpF7tpA+kYoi9BcEf3/BQ8HzY=
=qhNw
-----END PGP SIGNATURE-----

?