From 8d64dd4f29e1b0af51e7938d1aa363e4ff710154 Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Thu, 13 Apr 2017 23:49:50 +0200 Subject: [PATCH] ceph-disk: enable directory backed OSD at boot time https://github.com/ceph/ceph/commit/539385b143feee3905dceaf7a8faaced42f2d3c6 introduced a regression preventing directory backed OSD from starting at boot time. For device backed OSD the boot sequence starts with ceph-disk@.service and proceeds to systemctl enable --runtime ceph-osd@.service where the --runtime ensure ceph-osd@12 is removed when the machine reboots so that it does not compete with the ceph-disk@/dev/sdb1 unit at boot time. However directory backed OSD solely rely on the ceph-osd@.service unit to start at boot time and will therefore fail to boot. The --runtime flag is selectively set for device backed OSD only. Fixes: http://tracker.ceph.com/issues/19628 Signed-off-by: Loic Dachary (cherry picked from commit f425a127b7487d2093c8c943f0bcdec3d673d601) --- src/ceph-disk/ceph_disk/main.py | 101 ++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 38 deletions(-) diff --git a/src/ceph-disk/ceph_disk/main.py b/src/ceph-disk/ceph_disk/main.py index 770d6aede796b..28da12f37a8a9 100755 --- a/src/ceph-disk/ceph_disk/main.py +++ b/src/ceph-disk/ceph_disk/main.py @@ -3044,6 +3044,67 @@ def move_mount( ) +# +# For upgrade purposes, to make sure there are no competing units, +# both --runtime unit and the default should be disabled. There can be +# two units at the same time: one with --runtime and another without +# it. If, for any reason (manual or ceph-disk) the two units co-exist +# they will compete with each other. +# +def systemd_disable( + path, + osd_id, +): + # ensure there is no duplicate ceph-osd@.service + for style in ([], ['--runtime']): + command_check_call( + [ + 'systemctl', + 'disable', + 'ceph-osd@{osd_id}'.format(osd_id=osd_id), + ] + style, + ) + + +def systemd_start( + path, + osd_id, +): + systemd_disable(path, osd_id) + if is_mounted(path): + style = ['--runtime'] + else: + style = [] + command_check_call( + [ + 'systemctl', + 'enable', + 'ceph-osd@{osd_id}'.format(osd_id=osd_id), + ] + style, + ) + command_check_call( + [ + 'systemctl', + 'start', + 'ceph-osd@{osd_id}'.format(osd_id=osd_id), + ], + ) + + +def systemd_stop( + path, + osd_id, +): + systemd_disable(path, osd_id) + command_check_call( + [ + 'systemctl', + 'stop', + 'ceph-osd@{osd_id}'.format(osd_id=osd_id), + ], + ) + + def start_daemon( cluster, osd_id, @@ -3087,29 +3148,7 @@ def start_daemon( ], ) elif os.path.exists(os.path.join(path, 'systemd')): - # ensure there is no duplicate ceph-osd@.service - command_check_call( - [ - 'systemctl', - 'disable', - 'ceph-osd@{osd_id}'.format(osd_id=osd_id), - ], - ) - command_check_call( - [ - 'systemctl', - 'enable', - '--runtime', - 'ceph-osd@{osd_id}'.format(osd_id=osd_id), - ], - ) - command_check_call( - [ - 'systemctl', - 'start', - 'ceph-osd@{osd_id}'.format(osd_id=osd_id), - ], - ) + systemd_start(path, osd_id) elif os.path.exists(os.path.join(path, 'openrc')): base_script = '/etc/init.d/ceph-osd' osd_script = '{base}.{osd_id}'.format( @@ -3167,21 +3206,7 @@ def stop_daemon( ], ) elif os.path.exists(os.path.join(path, 'systemd')): - command_check_call( - [ - 'systemctl', - 'disable', - '--runtime', - 'ceph-osd@{osd_id}'.format(osd_id=osd_id), - ], - ) - command_check_call( - [ - 'systemctl', - 'stop', - 'ceph-osd@{osd_id}'.format(osd_id=osd_id), - ], - ) + systemd_stop(path, osd_id) elif os.path.exists(os.path.join(path, 'openrc')): command_check_call( [ -- 2.39.5