Subject: [bug#28399] [PATCH 1/2] services: mysql: Fix missing modules on activation.

From: Christopher Baines <[email-masked]>
Date: Sat, 16 Sep 2017 11:38:11 +0100

On Sat, 16 Sep 2017 00:02:08 +0200
[email-masked] (Ludovic Courtès) wrote:

> Heya,
> 
> Christopher Baines <[email-masked]> skribis:
> 
> > On Mon, 11 Sep 2017 09:50:46 +0200
> > [email-masked] (Ludovic Courtès) wrote:
> >  
> >> Hi Chris,
> >> 
> >> Christopher Baines <[email-masked]> skribis:
> >>   
> >> > Some systems using the MySQL service would fail to boot, giving
> >> > the error:
> >> >
> >> >   ERROR: no code for module (ice-9 popen)  
> 
> [...]
> 
> >> The ‘use-modules’ form should be enough.  Does the test you sent
> >> reproduce the original problem?  
> >
> > It does for me. If you just revert the commit adding in the
> > with-imported-modules bit, running the mysql system test then fails:
> >
> > ERROR: In procedure scm-error:
> > ERROR: no code for module (ice-9 popen)  
> 
> The activation script is run by the “boot” script before it spawns
> shepherd.  The boot script runs over the initrd’s Guile, which is
> statically linked.
> 
> However, (ice-9 popen) starts by dynamically loading libguile and
> calling a function therein:
> 
>   (eval-when (expand load eval)
>     (load-extension (string-append "libguile-" (effective-version))
>                     "scm_init_popen"))
> 
> Dynamic loading is not supposed to work in the statically-linked
> Guile, but apparently it does work sometimes:
> 
> --8<---------------cut here---------------start------------->8---
> $ sudo
> chroot /gnu/store/3ir873f4dsdl3aaj48iqykn6437ilk0p-guile-static-stripped-2.2.2 /bin/guile
> guile: warning: failed to install locale GC Warning:
> pthread_getattr_np or pthread_attr_getstack failed for main thread GC
> Warning: Couldn't read /proc/stat warning: failed to install locale:
> Invalid argument GNU Guile 2.2.2
> Copyright (C) 1995-2017 Free Software Foundation, Inc.
> 
> Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
> This program is free software, and you are welcome to redistribute it
> under certain conditions; type `,show c' for details.
> 
> Enter `,help' for help.
> scheme@(guile-user)> ,use(ice-9 popen)
> scheme@(guile-user)> open-pipe*
> $1 = #<procedure open-pipe* (mode command . args)>
> --8<---------------cut here---------------end--------------->8---
> 
> Perhaps it’s due to the libtool/ltdl preload feature.
> 
> What’s more puzzling though, is that it works in some cases (like
> above) and not in others (in the test VM).
> 
> Needs more thought…

Interesting, thanks for looking in to this Ludo. I've just thought that
this could be the cause of my problems in booting one of my GuixSD
machines, as I am using the mysql service (with MariaDB).

When you say dynamic loading is supposed not to work with a statically
linked guile, does this mean that activation scripts should avoid using
(ice-9 popen)? Or, given that it works some of the time, it could be
made to work reliably...?