Subject: bug#19512: Failed substitution yields incomplete store item

From: [email-masked] (Ludovic Courtès)
Date: Mon, 05 Jan 2015 16:28:41 +0100

David Thompson <[email-masked]> skribis:

> While working on 'guix publish', I managed to mess up the store.  :(
>
> Here's the first substitution that failed due to an invalid eof marker
> for some reason:
>
>   dave@labrys ~$ sudo _NIX_OPTIONS="substitute-urls=http://192.168.1.157:8080" guix substitute-binary --substitute /gnu/store/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0 /tmp/guile-toxcore
>   
>   found valid signature for '/gnu/store/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0', from 'http://192.168.1.157:8080/nar/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0'
>   sha256:xl35awxl6kgl5b2eum7kfgqlnap7a7itczpyxptf4kq25pasafka
>   downloading `/gnu/store/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0' (0.1 MiB installed)...
>   http://192.168.1.157/.../iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0     100.0% of 127.5 KiBguix substitute-binary: error: invalid nar end-of-file marker
>
>
> When the same command is run again, there's a new error:
>
>   dave@labrys ~$ sudo _NIX_OPTIONS="substitute-urls=http://192.168.1.157:8080" guix substitute-binary --substitute /gnu/store/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0 /tmp/guile-toxcore
>   
>   found valid signature for '/gnu/store/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0', from 'http://192.168.1.157:8080/nar/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0'
>   sha256:xl35awxl6kgl5b2eum7kfgqlnap7a7itczpyxptf4kq25pasafka
>   downloading `/gnu/store/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0' (0.1 MiB installed)...
>   http://192.168.1.157/.../iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0       6.3% of 127.5 KiBguix substitute-binary: error: mkdir: File exists
>
> Any idea what could be going wrong?

Nothing!  :-)

The store item that substitute-binary created on the first run is
actually invalid.  You can see that from the fact that you get an error
if you run, say:

  guix gc --references /gnu/store/iw3jn6a1avv78pp5v2cv42vyh0d8zi0g-guile-toxcore-0.1-6a9fbe0

So you can either “rm -rf” it (use with care!), or, better, run ‘guix
gc’, which will automatically remove it and other invalid items.

(A store item is considered valid iff guix-daemon or guix-register has
added it to db.sqlite.  guix-daemon does that upon successful
substitution or build.)

HTH,
Ludo’.