if daemon_type == 'osd':
self.osd_service.create_from_spec(cast(DriveGroupSpec, spec))
# TODO: return True would result in a busy loop
+ # can't know if daemon count changed; create_from_spec doesn't
+ # return a solid indication
return False
daemons = self.cache.get_daemons_by_service(service_name)
hosts: List[HostPlacementSpec] = ha.place()
self.log.debug('Usable hosts: %s' % hosts)
- r = False
+ r = None
# sanity check
if daemon_type in ['mon', 'mgr'] and len(hosts) < 1:
self.log.debug('Placing %s.%s on host %s' % (
daemon_type, daemon_id, host))
- daemon_spec = self.cephadm_services[daemon_type].prepare_create(daemon_spec)
-
- self._create_daemon(daemon_spec)
+ try:
+ daemon_spec = self.cephadm_services[daemon_type].prepare_create(daemon_spec)
+ self._create_daemon(daemon_spec)
+ r = True
+ except (RuntimeError, OrchestratorError) as e:
+ self.events.for_service(spec, 'ERROR',
+ f"Failed while placing {daemon_type}.{daemon_id}"
+ "on {host}: {e}")
+ # only return "no change" if no one else has already succeeded.
+ # later successes will also change to True
+ if r is None:
+ r = False
+ continue
# add to daemon list so next name(s) will also be unique
sd = orchestrator.DaemonDescription(
daemon_id=daemon_id,
)
daemons.append(sd)
- r = True
# remove any?
def _ok_to_stop(remove_daemon_hosts: Set[orchestrator.DaemonDescription]) -> bool:
# let's find a subset that is ok-to-stop
remove_daemon_hosts.pop()
for d in remove_daemon_hosts:
+ r = True
# NOTE: we are passing the 'force' flag here, which means
# we can delete a mon instances data.
self._remove_daemon(d.name(), d.hostname)
- r = True
+ if r is None:
+ r = False
return r
def _apply_all_services(self):