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

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

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…

Ludo’.