From: Wong Hoi Sing Edison Date: Tue, 25 Aug 2020 04:16:54 +0000 (+0800) Subject: systemd: Support Graceful Reboot for AIO Node X-Git-Tag: v14.2.12~6^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ed34cf29cfe8b42c17cf334455c1491700f60504;p=ceph.git systemd: Support Graceful Reboot for AIO Node Ceph AIO installation with single/multiple node is not friendly for loopback mount, especially always get deadlock issue during graceful system reboot. We already have `rbdmap.service` with graceful system reboot friendly as below: [Unit] After=network-online.target Before=remote-fs-pre.target Wants=network-online.target remote-fs-pre.target [Service] ExecStart=/usr/bin/rbdmap map ExecReload=/usr/bin/rbdmap map ExecStop=/usr/bin/rbdmap unmap-all This PR introduce: - `ceph-mon.target`: Ensure startup after `network-online.target` and before `remote-fs-pre.target` - `ceph-*.target`: Ensure startup after `ceph-mon.target` and before `remote-fs-pre.target` - `rbdmap.service`: Once all `_netdev` get unmount by `remote-fs.target`, ensure unmap all RBD BEFORE any Ceph components under `ceph.target` get stopped during shutdown The logic is concept proof by ; also works as expected with Ceph + Kubernetes deployment by . No more deadlock happened during graceful system reboot, both AIO single/multiple no de with loopback mount. Also see: - - - - Fixes: https://tracker.ceph.com/issues/47528 Signed-off-by: Wong Hoi Sing Edison (cherry picked from commit d88c834ea44bd67cfde0bd11ec4ded079b76d11a) Conflicts: systemd/ceph-immutable-object-cache.target - only exists in branch octopus and master, not exists in branch nautilus systemd/ceph-mgr@.service.in systemd/ceph-mon@.service.in - reorder lines due to original branch different, no logical changes --- diff --git a/systemd/ceph-fuse.target b/systemd/ceph-fuse.target index 70f5cb6e16b63..c31fdfa8dce7a 100644 --- a/systemd/ceph-fuse.target +++ b/systemd/ceph-fuse.target @@ -2,5 +2,6 @@ Description=ceph target allowing to start/stop all ceph-fuse@.service instances at once PartOf=ceph.target Before=ceph.target + [Install] WantedBy=remote-fs.target ceph.target diff --git a/systemd/ceph-mds.target b/systemd/ceph-mds.target index 238f3ab90c73e..1101f21f699cd 100644 --- a/systemd/ceph-mds.target +++ b/systemd/ceph-mds.target @@ -1,6 +1,9 @@ [Unit] Description=ceph target allowing to start/stop all ceph-mds@.service instances at once PartOf=ceph.target +After=ceph-mon.target Before=ceph.target +Wants=ceph.target ceph-mon.target + [Install] WantedBy=multi-user.target ceph.target diff --git a/systemd/ceph-mds@.service.in b/systemd/ceph-mds@.service.in index 39a2e63105b06..e47738a274a67 100644 --- a/systemd/ceph-mds@.service.in +++ b/systemd/ceph-mds@.service.in @@ -1,8 +1,9 @@ [Unit] Description=Ceph metadata server daemon -After=network-online.target local-fs.target time-sync.target -Wants=network-online.target local-fs.target time-sync.target PartOf=ceph-mds.target +After=network-online.target local-fs.target time-sync.target +Before=remote-fs-pre.target ceph-mds.target +Wants=network-online.target local-fs.target time-sync.target remote-fs-pre.target ceph-mds.target [Service] LimitNOFILE=1048576 diff --git a/systemd/ceph-mgr.target b/systemd/ceph-mgr.target index f25e494b1d382..288888b0d8d51 100644 --- a/systemd/ceph-mgr.target +++ b/systemd/ceph-mgr.target @@ -1,6 +1,9 @@ [Unit] Description=ceph target allowing to start/stop all ceph-mgr@.service instances at once PartOf=ceph.target +After=ceph-mon.target Before=ceph.target +Wants=ceph.target ceph-mon.target + [Install] WantedBy=multi-user.target ceph.target diff --git a/systemd/ceph-mgr@.service.in b/systemd/ceph-mgr@.service.in index c98f6378b9725..0ff9db237a443 100644 --- a/systemd/ceph-mgr@.service.in +++ b/systemd/ceph-mgr@.service.in @@ -1,8 +1,9 @@ [Unit] Description=Ceph cluster manager daemon -After=network-online.target local-fs.target time-sync.target -Wants=network-online.target local-fs.target time-sync.target PartOf=ceph-mgr.target +After=network-online.target local-fs.target time-sync.target +Before=remote-fs-pre.target ceph-mgr.target +Wants=network-online.target local-fs.target time-sync.target remote-fs-pre.target ceph-mgr.target [Service] LimitNOFILE=1048576 @@ -12,11 +13,9 @@ Environment=CLUSTER=ceph ExecStart=/usr/bin/ceph-mgr -f --cluster ${CLUSTER} --id %i --setuser ceph --setgroup ceph ExecReload=/bin/kill -HUP $MAINPID LockPersonality=true - # We need to disable this protection as some python libraries generate # dynamic code, like python-cffi, and require mmap calls to succeed MemoryDenyWriteExecute=false - NoNewPrivileges=true PrivateDevices=yes ProtectControlGroups=true diff --git a/systemd/ceph-mon.target b/systemd/ceph-mon.target index 097c83ba3be83..4325bac7afeb6 100644 --- a/systemd/ceph-mon.target +++ b/systemd/ceph-mon.target @@ -2,5 +2,7 @@ Description=ceph target allowing to start/stop all ceph-mon@.service instances at once PartOf=ceph.target Before=ceph.target +Wants=ceph.target + [Install] WantedBy=multi-user.target ceph.target diff --git a/systemd/ceph-mon@.service.in b/systemd/ceph-mon@.service.in index c95fcabb26d6c..d3121d59dcf06 100644 --- a/systemd/ceph-mon@.service.in +++ b/systemd/ceph-mon@.service.in @@ -1,14 +1,13 @@ [Unit] Description=Ceph cluster monitor daemon - +PartOf=ceph-mon.target # According to: # http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget # these can be removed once ceph-mon will dynamically change network # configuration. After=network-online.target local-fs.target time-sync.target -Wants=network-online.target local-fs.target time-sync.target - -PartOf=ceph-mon.target +Before=remote-fs-pre.target ceph-mon.target +Wants=network-online.target local-fs.target time-sync.target remote-fs-pre.target ceph-mon.target [Service] LimitNOFILE=1048576 diff --git a/systemd/ceph-osd.target b/systemd/ceph-osd.target index 7f677f54d5ece..e4d1b9f07fc6a 100644 --- a/systemd/ceph-osd.target +++ b/systemd/ceph-osd.target @@ -1,6 +1,9 @@ [Unit] Description=ceph target allowing to start/stop all ceph-osd@.service instances at once PartOf=ceph.target +After=ceph-mon.target Before=ceph.target +Wants=ceph.target ceph-mon.target + [Install] WantedBy=multi-user.target ceph.target diff --git a/systemd/ceph-osd@.service.in b/systemd/ceph-osd@.service.in index 1b5c9c82b8668..2e5ea6ae45016 100644 --- a/systemd/ceph-osd@.service.in +++ b/systemd/ceph-osd@.service.in @@ -1,8 +1,9 @@ [Unit] Description=Ceph object storage daemon osd.%i -After=network-online.target local-fs.target time-sync.target ceph-mon.target -Wants=network-online.target local-fs.target time-sync.target PartOf=ceph-osd.target +After=network-online.target local-fs.target time-sync.target +Before=remote-fs-pre.target ceph-osd.target +Wants=network-online.target local-fs.target time-sync.target remote-fs-pre.target ceph-osd.target [Service] LimitNOFILE=1048576 diff --git a/systemd/ceph-radosgw.target b/systemd/ceph-radosgw.target index 1799e29e84d74..8ea707a0bbdf6 100644 --- a/systemd/ceph-radosgw.target +++ b/systemd/ceph-radosgw.target @@ -1,6 +1,9 @@ [Unit] Description=ceph target allowing to start/stop all ceph-radosgw@.service instances at once PartOf=ceph.target +After=ceph-mon.target Before=ceph.target +Wants=ceph.target ceph-mon.target + [Install] WantedBy=multi-user.target ceph.target diff --git a/systemd/ceph-radosgw@.service.in b/systemd/ceph-radosgw@.service.in index 7e3ddf6c04731..dee501b4771c7 100644 --- a/systemd/ceph-radosgw@.service.in +++ b/systemd/ceph-radosgw@.service.in @@ -1,8 +1,9 @@ [Unit] Description=Ceph rados gateway -After=network-online.target local-fs.target time-sync.target -Wants=network-online.target local-fs.target time-sync.target PartOf=ceph-radosgw.target +After=network-online.target local-fs.target time-sync.target +Before=remote-fs-pre.target ceph-radosgw.target +Wants=network-online.target local-fs.target time-sync.target remote-fs-pre.target ceph-radosgw.target [Service] LimitNOFILE=1048576 diff --git a/systemd/ceph-rbd-mirror.target b/systemd/ceph-rbd-mirror.target index 43e9a4c816478..57ea09f1dc510 100644 --- a/systemd/ceph-rbd-mirror.target +++ b/systemd/ceph-rbd-mirror.target @@ -2,5 +2,6 @@ Description=ceph target allowing to start/stop all ceph-rbd-mirror@.service instances at once PartOf=ceph.target Before=ceph.target + [Install] WantedBy=multi-user.target ceph.target diff --git a/systemd/ceph.target b/systemd/ceph.target index 60734baff689d..67a982c5b446a 100644 --- a/systemd/ceph.target +++ b/systemd/ceph.target @@ -1,4 +1,5 @@ [Unit] Description=ceph target allowing to start/stop all ceph*@.service instances at once + [Install] WantedBy=multi-user.target diff --git a/systemd/rbdmap.service.in b/systemd/rbdmap.service.in index 4757ee6ccb29d..6644508cf0dea 100644 --- a/systemd/rbdmap.service.in +++ b/systemd/rbdmap.service.in @@ -1,9 +1,8 @@ [Unit] Description=Map RBD devices - -After=network-online.target +After=network-online.target ceph.target Before=remote-fs-pre.target -Wants=network-online.target remote-fs-pre.target +Wants=network-online.target remote-fs-pre.target ceph.target [Service] EnvironmentFile=-@SYSTEMD_ENV_FILE@