25namespace service_discovery {
27TopologyManager::TopologyManager()
29 node_manager_(nullptr),
30 channel_manager_(nullptr),
31 service_manager_(nullptr),
32 participant_(nullptr),
33 participant_listener_(nullptr) {
37TopologyManager::~TopologyManager() { Shutdown(); }
39void TopologyManager::Shutdown() {
40 ADEBUG <<
"topology shutdown.";
42 if (!init_.exchange(
false)) {
46 node_manager_->Shutdown();
47 channel_manager_->Shutdown();
48 service_manager_->Shutdown();
49 participant_->Shutdown();
51 delete participant_listener_;
52 participant_listener_ =
nullptr;
54 change_signal_.DisconnectAllSlots();
59 return change_signal_.Connect(func);
63 auto local_conn = conn;
67bool TopologyManager::Init() {
68 if (init_.exchange(
true)) {
72 node_manager_ = std::make_shared<NodeManager>();
73 channel_manager_ = std::make_shared<ChannelManager>();
74 service_manager_ = std::make_shared<ServiceManager>();
79 InitNodeManager() && InitChannelManager() && InitServiceManager();
81 AERROR <<
"init manager failed.";
82 participant_ =
nullptr;
83 delete participant_listener_;
84 participant_listener_ =
nullptr;
85 node_manager_ =
nullptr;
86 channel_manager_ =
nullptr;
87 service_manager_ =
nullptr;
95bool TopologyManager::InitNodeManager() {
96 return node_manager_->StartDiscovery(participant_->fastrtps_participant());
99bool TopologyManager::InitChannelManager() {
100 return channel_manager_->StartDiscovery(participant_->fastrtps_participant());
103bool TopologyManager::InitServiceManager() {
104 return service_manager_->StartDiscovery(participant_->fastrtps_participant());
107bool TopologyManager::CreateParticipant() {
108 std::string participant_name =
109 common::GlobalData::Instance()->HostName() +
'+' +
110 std::to_string(common::GlobalData::Instance()->ProcessId());
111 participant_listener_ =
new ParticipantListener(std::bind(
112 &TopologyManager::OnParticipantChange,
this, std::placeholders::_1));
113 participant_ = std::make_shared<transport::Participant>(
114 participant_name, 11511, participant_listener_);
118void TopologyManager::OnParticipantChange(
const PartInfo& info) {
120 if (!Convert(info, &msg)) {
128 if (msg.operate_type() == OperateType::OPT_LEAVE) {
129 auto& host_name = msg.role_attr().host_name();
130 int process_id = msg.role_attr().process_id();
131 node_manager_->OnTopoModuleLeave(host_name, process_id);
132 channel_manager_->OnTopoModuleLeave(host_name, process_id);
133 service_manager_->OnTopoModuleLeave(host_name, process_id);
138bool TopologyManager::Convert(
const PartInfo& info, ChangeMsg* msg) {
139 auto guid = info.rtps.m_guid;
140 auto status = info.rtps.m_status;
141 std::string participant_name(
"");
145 case eprosima::fastrtps::rtps::DISCOVERY_STATUS::DISCOVERED_RTPSPARTICIPANT:
146 participant_name = info.rtps.m_RTPSParticipantName;
147 participant_names_[guid] = participant_name;
148 opt_type = OperateType::OPT_JOIN;
151 case eprosima::fastrtps::rtps::DISCOVERY_STATUS::REMOVED_RTPSPARTICIPANT:
152 case eprosima::fastrtps::rtps::DISCOVERY_STATUS::DROPPED_RTPSPARTICIPANT:
153 if (participant_names_.find(guid) != participant_names_.end()) {
154 participant_name = participant_names_[guid];
155 participant_names_.erase(guid);
157 opt_type = OperateType::OPT_LEAVE;
164 std::string host_name(
"");
166 if (!ParseParticipantName(participant_name, &host_name, &process_id)) {
171 msg->set_change_type(ChangeType::CHANGE_PARTICIPANT);
172 msg->set_operate_type(opt_type);
173 msg->set_role_type(RoleType::ROLE_PARTICIPANT);
174 auto role_attr = msg->mutable_role_attr();
175 role_attr->set_host_name(host_name);
176 role_attr->set_process_id(process_id);
180bool TopologyManager::ParseParticipantName(
const std::string& participant_name,
181 std::string* host_name,
184 auto pos = participant_name.find(
'+');
185 if (pos == std::string::npos) {
186 ADEBUG <<
"participant_name [" << participant_name <<
"] format mismatch.";
189 *host_name = participant_name.substr(0, pos);
190 std::string pid_str = participant_name.substr(pos + 1);
192 *process_id = std::stoi(pid_str);
193 }
catch (
const std::exception& e) {
194 AERROR <<
"invalid process_id:" << e.what();
static Time Now()
get the current time.
std::function< void(const ChangeMsg &)> ChangeFunc
bool Init(const char *binary_name, const std::string &dag_info)