from ceph.utils import datetime_now
from ceph.deployment.inventory import Devices
from ceph.deployment.service_spec import ServiceSpec, PlacementSpec
+from orchestrator import DaemonDescriptionStatus
from datetime import datetime, timedelta
from OpenSSL import crypto
# update timestamp of most recent agent update
self.mgr.cache.agent_timestamp[host] = datetime_now()
+
+ error_daemons_old = set([dd.name() for dd in self.mgr.cache.get_error_daemons()])
+
agents_down = []
for h in self.mgr.cache.get_hosts():
if self.mgr.agent_helpers._agent_down(h):
ret = Devices.from_json(json.loads(data['volume']))
self.mgr.cache.update_host_devices(host, ret.devices)
+ if error_daemons_old != set([dd.name() for dd in self.mgr.cache.get_error_daemons()]):
+ self.mgr.log.info(
+ f'Change detected in daemons in error state from {host} agent metadata. Kicking serve loop')
+ self.mgr._kick_serve_loop()
+
if up_to_date:
was_out_of_date = not self.mgr.cache.all_host_metadata_up_to_date()
self.mgr.cache.metadata_up_to_date[host] = True
detail.append((f'Cephadm agent on host {agent} has not reported in '
f'{2.5 * self.mgr.agent_refresh_rate} seconds. Agent is assumed '
'down and host may be offline.'))
+ for dd in [d for d in self.mgr.cache.get_daemons_by_type('agent') if d.hostname in down_agent_hosts]:
+ dd.status = DaemonDescriptionStatus.error
self.mgr.set_health_warning(
'CEPHADM_AGENT_DOWN',
summary='%d Cephadm Agent(s) are not reporting. Hosts may be offline' % (
r.append(dd)
return r
+ def get_error_daemons(self):
+ # type: () -> List[orchestrator.DaemonDescription]
+ r = []
+ for host, dm in self.daemons.items():
+ for name, dd in dm.items():
+ if dd.status is not None and dd.status == orchestrator.DaemonDescriptionStatus.error:
+ r.append(dd)
+ return r
+
def get_daemons_by_host(self, host: str) -> List[orchestrator.DaemonDescription]:
return list(self.daemons.get(host, {}).values())
def update_failed_daemon_health_check(self) -> None:
self.remove_health_warning('CEPHADM_FAILED_DAEMON')
failed_daemons = []
- for dd in self.cache.get_daemons():
- if dd.status is not None and dd.status == DaemonDescriptionStatus.error:
- failed_daemons.append('daemon %s on %s is in %s state' % (
- dd.name(), dd.hostname, dd.status_desc
- ))
+ for dd in self.cache.get_error_daemons():
+ failed_daemons.append('daemon %s on %s is in %s state' % (
+ dd.name(), dd.hostname, dd.status_desc
+ ))
if failed_daemons:
self.set_health_warning('CEPHADM_FAILED_DAEMON', f'{len(failed_daemons)} failed cephadm daemon(s)', len(
failed_daemons), failed_daemons)