Subject: Re: bug#47115: Redundant library grafts leads to breakage

From: Ludovic Courtès <[email-masked]>
Date: Sat, 20 Mar 2021 12:01:24 +0100

Hi Mark,

Mark H Weaver <[email-masked]> skribis:

> I think that my last hypothesis was on the right track, but not quite
> right:
>
> * Instead of 'libcairo' being loaded twice, I now suspect that
>   "libguile-cairo.so" is being loaded twice.
>
> * Instead of the original and replacement libraries being loaded, I now
>   suspect that two different variants of the replacement "guile-cairo"
>   are being loaded.
>
> * Instead of libcairo type tags being duplicated, I now suspect that
>   duplicated smob tags are being allocated.
>
> However, *if* deduplication is enabled, two redundant replacements
> created by grafting _should_ occupy the same inodes, assuming that the
> replacement mappings are the same (modulo ordering), and assuming that
> /gnu/store/.links doesn't hit a directory size limit (which can happen
> on ext3/4, leading to missed deduplication opportunities).

Woow, thanks for the investigation!  You wouldn’t think that
deduplication can have an effect on this kind of bug.

> I've known about these redundant replacements in Guix for many years,
> but was not aware of any significant practical problems arising from
> them until now.

Do you know why the two guile-cairo grafts differ in this case?

I’m aware of one case that can lead to that: the grafting code can
create grafts for just one output of the original derivation, or for all
of them (commit 482fda2729c3e76999892cb8f9a0391a7bd37119).  Maybe that’s
what’s happening here?

Thank you!

Ludo’.