nfs-common won't restart all services after upgrade

Andreas Hasenack andreas at canonical.com
Thu May 13 12:33:38 UTC 2021


Hi,

tl;dr

I filed https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1928259
found while testing
https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1927745 and
verifying that rpc.gssd was not restarted after a package upgrade. Which
means the fix wasn't available until the service was restarted manually.


# Troubleshooting story

I was testing
https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1927745, and while
the fix is correct, it didn't always "stick" after I upgraded the packages.

Further troubleshooting showed that some of the NFS services are not
restarted after a package upgrade, under a specific condition which took a
while to figure out.

Many services make up a NFS server or client, so sometime ago debian
decided to wrap them all around a systemd service called nfs-utils.service,
which is a bit fake, used just to coordinate all the real services. Its
header explains it:
$ systemctl cat nfs-utils.service
# /lib/systemd/system/nfs-utils.service
[Unit]
Description=NFS server and client services
# This service should never be stopped, only restarted.
# When it is re-started, all other services which declare
# themselves to be "PartOf" this service will also be
# restarted. Thus
#   systemctl restart nfs-utils
# will restart all daemons which are part of nfs-utils
# and which are running.  This is useful after a software
# update.

# This is a "service" rather than "target" so that we
# don't need to say "systemctl restart nfs-utils.target".
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true

d/rules has these, and we can see it does not enable nfs-utils.service, but
asks for it to be restarted on upgrade:
    dh_systemd_enable -p nfs-common nfs-client.target

    dh_systemd_enable -p nfs-kernel-server nfs-server.service

    dh_installinit -pnfs-common -R

    dh_systemd_start -p nfs-common --restart-after-upgrade
nfs-utils.service
    dh_systemd_start -p nfs-kernel-server --restart-after-upgrade
nfs-server.service

And this "fake" service really can't be enabled:
$ sudo systemctl enable nfs-utils.service
The unit files have no installation config (WantedBy, RequiredBy, Also,
Alias
settings in the [Install] section, and DefaultInstance for template units).
(...long explanation follows this output ...)

We get this during package install:
Setting up nfs-common (1:1.3.4-2.1ubuntu5.3) ...
nfs-utils.service is a disabled or a static unit not running, not starting
it.

Even when upgrading:
Setting up nfs-common (1:1.3.4-2.1ubuntu5.4) ...
nfs-utils.service is a disabled or a static unit not running, not starting
it.

This is because the service is not enabled.

Critically for the bug I'm fixing, rpc.gssd is not restarted, so the fix
isn't applied :/
Before upgrade:
  442 ?        Ss     0:00 /usr/sbin/blkmapd
 7146 ?        Ss     0:00 /usr/sbin/rpc.gssd
 7399 ?        Ss     0:00 /usr/sbin/rpc.idmapd
 7406 ?        Ss     0:00 /usr/sbin/rpc.mountd --manage-gids
 7400 ?        Ss     0:00 /usr/sbin/rpc.svcgssd
After pkg upgrade:
  442 ?        Ss     0:00 /usr/sbin/blkmapd
 7146 ?        Ss     0:00 /usr/sbin/rpc.gssd
 8421 ?        Ss     0:00 /usr/sbin/rpc.idmapd
 8422 ?        Ss     0:00 /usr/sbin/rpc.mountd --manage-gids
 8420 ?        Ss     0:00 /usr/sbin/rpc.svcgssd

If I do a manual "sudo systemctl start nfs-utils.service" (or restart)
before upgrading the package, then all these processes are restarted after
the package upgrade, because deb-systemd-invoke sees nfs-utils.service as
"started". From its code:
# If the job is disabled and is not currently running, the job is not
started or restarted.
# However, if the job is disabled but has been forced into the running
state, we *do* stop
# and restart it since this is expected behaviour for the admin who forced
the start.
# We don't autostart static units either.

I filed https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1928259
and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=988430.

Some ideas I'm considering:
a) just do a systemctl start before the #DEBHELPER# marker, like this:
--- a/debian/nfs-common.postinst
+++ b/debian/nfs-common.postinst
@@ -43,6 +43,10 @@ case "$1" in
        if [ -f /lib/init/rw/sendsigs.omit.d/statd ]; then
            mv /lib/init/rw/sendsigs.omit.d/statd /run/sendsigs.omit.d/statd
        fi
+
+    # always "start" nfs-utils.service, so package upgrades will restart
it,
+    # see LP: #1928259
+    systemctl start nfs-utils.service > /dev/null || true
     ;;
 esac


b) Don't use dh_systemd_* in d/rules for nfs-utils.service, and do my own
handling in d/nfs-common.postinst using systemctl directly, instead of
deb-systemd-invoke, i.e., something like (also untested):
diff --git a/debian/nfs-common.postinst b/debian/nfs-common.postinst
index f709d53..feb375a 100644
--- a/debian/nfs-common.postinst
+++ b/debian/nfs-common.postinst
@@ -43,11 +43,19 @@ case "$1" in
        if [ -f /lib/init/rw/sendsigs.omit.d/statd ]; then
            mv /lib/init/rw/sendsigs.omit.d/statd /run/sendsigs.omit.d/statd
        fi
-
-    # always "start" nfs-utils.service, so package upgrades will restart
it,
-    # see LP: #1928259
-    systemctl start nfs-utils.service > /dev/null || true
     ;;
 esac

+if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" =
"abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
+    if [ -d /run/systemd/system ]; then
+        systemctl --system daemon-reload >/dev/null || true
+        if [ -n "$2" ]; then
+            _dh_action=restart
+        else
+            _dh_action=start
+        fi
+        systemctl $_dh_action 'nfs-utils.service' >/dev/null || true
+    fi
+fi
+
 #DEBHELPER#
diff --git a/debian/rules b/debian/rules
index 8bb2f25..3259d3b 100755
--- a/debian/rules
+++ b/debian/rules
@@ -57,7 +57,6 @@ binary-arch: build
        dh_systemd_enable -p nfs-common nfs-client.target
        dh_systemd_enable -p nfs-kernel-server nfs-server.service
        dh_installinit -pnfs-common -R
-       dh_systemd_start -p nfs-common --restart-after-upgrade
nfs-utils.service
        dh_systemd_start -p nfs-kernel-server --restart-after-upgrade
nfs-server.service
        install -m 0755 debian/nfs-kernel-server.init
debian/nfs-kernel-server/etc/init.d/nfs-kernel-server
        install -m 0644 debian/nfs-common.bugcontrol
debian/nfs-common/usr/share/bug/nfs-common/control

I just grabbed the bits that debhelper added for the dh_systemd_start line
I removed, and replaced deb-systemd-invoke with systemctl



Any other ideas?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/ubuntu-devel/attachments/20210513/8698a19e/attachment.html>


More information about the ubuntu-devel mailing list