log.debug(e)
return False
+ def safe_hard_reboot(self):
+ """
+ Attempts to sync, remount RO, then trigger a hard reboot via SysRq.
+ This bypasses possible hangs during the standard 'shutdown -r now' process.
+ """
+ log.info(f"Triggering safe hard reboot via SysRq on {self.shortname}")
+ # s = sync, u = remount read-only, b = reboot
+ # We use a multi-command string to ensure they execute even if the connection drops
+ args = [
+ 'sudo', 'bash', '-c',
+ """
+ echo pci > /sys/kernel/reboot/type && \
+ echo 1 > /sys/kernel/reboot/force && \
+ sync && echo s > /proc/sysrq-trigger && \
+ echo u > /proc/sysrq-trigger && \
+ sleep 2 && \
+ echo b > /proc/sysrq-trigger
+ """
+ ]
+ return self.run(args=args, wait=False)
+
@property
def ip_address(self):
return self.ssh.get_transport().getpeername()[0]
for remote in ctx.cluster.remotes.keys():
p.spawn(update_rh_kernel, remote)
-
def update_rh_kernel(remote):
package_type = remote.os.package_type
remote.run(args=['uname', '-a'])
if not update_log.find("Installed") == -1:
log.info("Kernel updated to latest z stream on %s", remote.shortname)
log.info("Rebooting %s", remote.shortname)
- remote.run(args=['sudo', 'shutdown', '-r', 'now'], wait=False)
+ remote.safe_hard_reboot()
time.sleep(40)
log.info("Reconnecting after reboot")
remote.reconnect(timeout=300)
if kernel_title.endswith("-highbank"):
_no_grub_link('vmlinuz', role_remote, kernel_title)
_no_grub_link('initrd.img', role_remote, kernel_title)
- proc = role_remote.run(
- args=[
- 'sudo',
- 'shutdown',
- '-r',
- 'now',
- ],
- wait=False,
- )
- procs[role_remote.name] = proc
+ procs[role_remote.name] = role_remote.safe_hard_reboot()
continue
# look for menuentry for our kernel, and collect any
log.info('submenu_title:{}'.format(submenu_title))
log.info('default_title:{}'.format(default_title))
- proc = role_remote.run(
+ procs[role_remote.name] = role_remote.run(
args=[
# use the title(s) to construct the content of
# the grub menu entry, so we can default to it.
run.Raw('&&'),
'rm',
remote_pkg_path(role_remote),
- run.Raw('&&'),
- # work around a systemd issue, where network gets shut down
- # before ssh can close its session
- run.Raw('('),
- 'sleep',
- '1',
- run.Raw('&&'),
- 'sudo',
- 'shutdown',
- '-r',
- 'now',
- run.Raw('&'),
- run.Raw(')'),
],
- wait=False,
+ wait=False,
)
- procs[role_remote.name] = proc
for name, proc in procs.items():
log.debug('Waiting for install on %s to complete...', name)
proc.wait()
+ proc.remote.safe_hard_reboot()
def enable_disable_kdb(ctx, config):
elif not version or version == 'distro':
version = get_latest_image_version_rpm(remote)
update_grub_rpm(remote, version)
- remote.run( args=['sudo', 'shutdown', '-r', 'now'], wait=False )
+ remote.safe_hard_reboot()
return
if package_type == 'deb':
teuthology.sudo_write_file(remote, '/etc/grub.d/01_ceph_kernel', StringIO(grubfile), '755')
log.info('Distro Kernel Version: {version}'.format(version=newversion))
remote.run(args=['sudo', 'update-grub'])
- remote.run(args=['sudo', 'shutdown', '-r', 'now'], wait=False )
+ remote.safe_hard_reboot()
return
if 'debian' in dist_release:
grub2_kernel_select_generic(remote, newversion, 'deb')
log.info('Distro Kernel Version: {version}'.format(version=newversion))
- remote.run( args=['sudo', 'shutdown', '-r', 'now'], wait=False )
+ remote.safe_hard_reboot()
return