watched_hosts.insert(host->get_cname());
XBT_DEBUG("Push host %s to watched_hosts because state == SURF_RESOURCE_OFF", host->get_cname());
}
- XBT_DEBUG("Adding Process %s to the auto-restart list of Host %s", arg->name.c_str(), arg->host->get_cname());
- host->pimpl_->auto_restart_processes_.push_back(arg);
+ if (host->pimpl_->actors_at_boot_.find(actor->get_name()) == host->pimpl_->actors_at_boot_.end()) {
+ XBT_DEBUG("Adding Process %s to the actors_at_boot_ list of Host %s", arg->name.c_str(), arg->host->get_cname());
+ host->pimpl_->actors_at_boot_.insert({arg->name, arg});
+ }
}
/** @brief Restart the list of processes that have been registered to the host */
void SIMIX_host_autorestart(sg_host_t host)
{
- std::vector<simgrid::kernel::actor::ProcessArg*> process_list = host->pimpl_->auto_restart_processes_;
+ std::map<std::string, simgrid::kernel::actor::ProcessArg*> process_list = host->pimpl_->actors_at_boot_;
- for (auto const& arg : process_list) {
+ for (auto const& elm : process_list) {
+ simgrid::kernel::actor::ProcessArg* arg = elm.second;
XBT_DEBUG("Restarting Process %s@%s right now", arg->name.c_str(), arg->host->get_cname());
smx_actor_t actor = simix_global->create_process_function(arg->name.c_str(), arg->code, nullptr, arg->host,
arg->properties.get(), nullptr);
SIMIX_display_process_status();
THROWF(arg_error, 0, "%s", msg.c_str());
}
- for (auto const& arg : auto_restart_processes_)
- delete arg;
- auto_restart_processes_.clear();
for (auto const& arg : actors_at_boot_)
delete arg.second;
actors_at_boot_.clear();
SIMIX_process_kill(&actor, SIMIX_process_self());
}
}
+ // When a host is turned off, we want to keep only the actors that should restart for when it will boot again.
+ // Then get rid of the others.
+ auto elm = actors_at_boot_.begin();
+ while (elm != actors_at_boot_.end()) {
+ if (not elm->second->auto_restart) {
+ delete elm->second;
+ actors_at_boot_.erase(elm);
+ } else
+ ++elm;
+ }
}
std::vector<s4u::ActorPtr> HostImpl::get_all_actors()