[19942] Make remove unused entities compatible with the discovery trigger#83
[19942] Make remove unused entities compatible with the discovery trigger#83
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #83 +/- ##
==========================================
+ Coverage 34.10% 34.12% +0.01%
==========================================
Files 154 155 +1
Lines 7861 7881 +20
Branches 3515 3518 +3
==========================================
+ Hits 2681 2689 +8
- Misses 3267 3287 +20
+ Partials 1913 1905 -8 ☔ View full report in Codecov by Sentry. |
fd5c1bb to
4428faa
Compare
4428faa to
6abb4d6
Compare
| { | ||
| writer_it.second->disable(); | ||
| } | ||
| // Don't disable writers, as they may be used by other tracks |
There was a problem hiding this comment.
Although I agree this might make more sense, note that I believe this would imply a delayed abortion when stopping the pipe or blocking a topic (would keep looping through writers map until done). Also, I don't like the fact that this would make enable-disable asymmetrical.
There was a problem hiding this comment.
Not disabling the writers wasn't an aesthetic choice. If you disable the writers there are many scenarios that don't work or segfault with discovery-trigger and remove-unused-entities. If you propose another solution I may consider it.
There was a problem hiding this comment.
My comment was wrong, not disabling writers has no effect in how soon Track::transmit_ is aborted. After thinking about it, I prefer to leave it as it is: having "atomic" write operations for every taken data.
However, I still don't like the asymmetry. I propose:
- Leave it as it is but with a nice comment for future developers to consider.
- Do not enable writers in tracks' enable, create them always enabled and never disable, or handle enable/disable somewhere else (in DdsBridge for example, as long as we decide to keep the
writers_attribute).
6abb4d6 to
1cf2453
Compare
| std::map<types::ParticipantId, std::unique_ptr<Track>> tracks_; | ||
|
|
||
| //! The writers of the bridge index by their participant_id. | ||
| std::map<types::ParticipantId, std::shared_ptr<IWriter>> writers_; |
There was a problem hiding this comment.
Design comment: up to now bridges contain tracks, and tracks the only ones holding reference to endpoints. Analyze implications (such as object lifespan) and try to maintain this principle if makes sense.
| { | ||
| // The bridge already exists. Create a writer in the participant who discovered it. | ||
| it_bridge->second->create_writer(topic->topic_discoverer()); | ||
| it_bridge->second->create_endpoint(topic->topic_discoverer(), endpoint_kind); |
There was a problem hiding this comment.
Design comment: call to endpoint creation method is done both from pipe and bridge. Analyze if it would be possible to further isolate their functionality so it's only done from one of them.
There was a problem hiding this comment.
Related: scope of remove_unused_endpoint (used both in pipe and bridge).
There was a problem hiding this comment.
Piggyback: please add a comment explaining that comparison with DEFAULT_PARTICIPANT_ID is used to determine whether topics are builtin.
| { | ||
| writer_it.second->disable(); | ||
| } | ||
| // Don't disable writers, as they may be used by other tracks |
There was a problem hiding this comment.
My comment was wrong, not disabling writers has no effect in how soon Track::transmit_ is aborted. After thinking about it, I prefer to leave it as it is: having "atomic" write operations for every taken data.
However, I still don't like the asymmetry. I propose:
- Leave it as it is but with a nice comment for future developers to consider.
- Do not enable writers in tracks' enable, create them always enabled and never disable, or handle enable/disable somewhere else (in DdsBridge for example, as long as we decide to keep the
writers_attribute).
juanlofer-eprosima
left a comment
There was a problem hiding this comment.
Piggyback request:
Please add to the participant's discovery traces the participant id (missing in endpoint removed/ignored/changed qos cases), I believe this is quite helpful for debugging.
| * @param routes_config: Configuration of the routes of the Bridge | ||
| * @param remove_unused_entities: Whether the Bridge should remove unused entities | ||
| * @param manual_topics: Topics that explicitally set a QoS attribute for this participant | ||
| * @param endpoint_kind: Kind of the endpoint that discovered the topic |
There was a problem hiding this comment.
NIT: I believe DdsBridge should be agnostic (or at least has been until now) to discovery events. So instead of passing the kind of the endpoint that discovered the topic or was discovered, I would pass the kind of the endpoint that should be created.
| void DdsPipe::activate_topic_nts_( | ||
| const utils::Heritable<DistributedTopic>& topic) noexcept | ||
| const utils::Heritable<DistributedTopic>& topic, | ||
| const EndpointKind& endpoint_kind /*= EndpointKind::reader*/) noexcept |
There was a problem hiding this comment.
Be careful with the following case: an endpoint is discovered while its topic is blocked, then it is only added to current_topics_ hence losing the kind information. So if the topic is then allowed, a bridge is wrongly created with the default kind value.
There was a problem hiding this comment.
Related scenario: subsequent relevant discovered endpoints would not be taken into account, but only the first one (used in DdsBridge constructor).
There was a problem hiding this comment.
Potential solution: create an EndpointsManager that would keep track of all created endpoints, and also the ones that should be created once enabled (so DdsBridges will always be created even if the topic is disabled). This new object would then contain all references of entities, so the creation of a track would require passing a reference to this object as well as a map of ids.
| // Add the writer to the tracks it has routes for. | ||
| add_writer_to_tracks_nts_(participant_id, writer); | ||
| // Create the track | ||
| create_track_nts_(participant_id, reader, writers_); |
There was a problem hiding this comment.
Shouldn't you be passing only the IWriters in the route?
| assert(participant_id != DEFAULT_PARTICIPANT_ID); | ||
|
|
||
| // Create the writer | ||
| auto writer = create_writer_nts_(participant_id); |
There was a problem hiding this comment.
Another corner case: shouldn't we avoid creating writers if not present in any route?
There was a problem hiding this comment.
Related: should we also avoid creating a reader if there is a "blockage" route? I'd say yes.
Signed-off-by: tempate <danieldiaz@eprosima.com>
Signed-off-by: tempate <danieldiaz@eprosima.com>
Signed-off-by: tempate <danieldiaz@eprosima.com>
Signed-off-by: tempate <danieldiaz@eprosima.com>
Signed-off-by: tempate <danieldiaz@eprosima.com>
1cf2453 to
0789d95
Compare
| RoutesConfiguration::RoutesMap RoutesConfiguration::routes_of_readers( | ||
| const std::map<types::ParticipantId, bool>& participant_ids) const noexcept | ||
| { | ||
| static RoutesConfiguration::RoutesMap readers_routes; |
No description provided.