Subject: --check, --rounds and --keep-failed used together produce empty store items

From: Maxim Cournoyer <[email-masked]>
Date: Mon, 25 Oct 2021 22:18:16 -0400

Hello,

While debugging while guix substitution would fail with a "corrupt input
while restoring ..."  error message, I saw in the guix-substitute strace
output that it was attempting to substitute a nonexistent store item.

I then narrowed the production of such broken store item to using the
following guix build options together:

--8<---------------cut here---------------start------------->8---
$ guix build hello --check --rounds=2 --keep-failed
[...]
successfully built /gnu/store/260bk0ch4np4h2yz5yqhf8hjbsyhwpmr-hello-2.10.drv
successfully built /gnu/store/260bk0ch4np4h2yz5yqhf8hjbsyhwpmr-hello-2.10.drv
/gnu/store/81bdcd5x4v50i28h98bfkvvkx9cky63w-hello-2.10

stat /gnu/store/81bdcd5x4v50i28h98bfkvvkx9cky63w-hello-2.10
stat: cannot statx '/gnu/store/81bdcd5x4v50i28h98bfkvvkx9cky63w-hello-2.10': No such file or directory
--8<---------------cut here---------------end--------------->8---

That's bad, especially since a subsequent 'guix build hello' doesn't fix
it (it keeps the corrupted cached item, even with --check!).

One needs to run

$ guix gc -D /gnu/store/81bdcd5x4v50i28h98bfkvvkx9cky63w-hello-2.10
$ guix build hello

to recover :-/.

This bug was probably exposed via
0fa0e8df60b0b005a8d9499562464c5a66218a5b, which enabled using --check
along with --rounds.

Thanks,

Maxim