qos_profile loaded, but not applied

5 posts / 0 new
Last post
Offline
Last seen: 2 years 10 months ago
Joined: 04/24/2020
Posts: 9
qos_profile loaded, but not applied

Hi,

 

I am using NetBeans 11.1.  RTI Connext DDS Pro 5.3.1

 

I have a USER_QOS_PROFILES.xml with 6 qos_profiles (1 is BestEffort, 5 are Generic.StrictReliable.LargeData.FastFlow). All pubs and subs work well. I've added a 7th profile that requires DurableReliable. When this is added, it creates the publisher, but there is a mismatch in QoS - durability = VOLATILE_DURABILITY_QOS, instead of TRANSIENT_LOCAL_DURABILITY_QOS. This is the main question - why it isn't using TRANSIENT_LOCAL_DURABILITY_QOS? I have turned on the verbose RTI logging and see no errors.

 

If I modify the 7th new profile to contain is_default_qos="true", it works (durability = TRANSIENT_LOCAL_DURABILITY_QOS publisher publishes well), but makes the users of Generic.StrictReliable.LargeData.FastFlow mismatched in QoS (and all fail to pub / sub). This is secondary question - why would having a default_qos mess up other qos_profiles that have differing names?

 

I have attempted to maintain my USER_QOS_PROFILES.xml and point the new publisher to another file (e.g. DomainParticipantFactory.TheParticipantFactory.set_default_library("D:/folder/folder/file.xml");). This does not seem to work for me: DDS_QosProvider_set_default_library:ERROR: Profile library 'D:/folder/folder/file.xml' not found. I am not certain if this is a good approach to fixing it as I will need to register later pubs / subs using a modified USER_QOS_PROFILES.xml.

 

I tried loading the 6 good profiles and later modifying USER_QOS_PROFILES.xml to add the 7th under a newly added qos_library (named different that the one the 6 are in), but it fails to find the libraryName::profileName. Is there a way to force DDS to reload the USER_QOS_PROFILES.xml?

 

Any suggestions wecomed, thanks!

Offline
Last seen: 2 years 10 months ago
Joined: 04/24/2020
Posts: 9

I have figured out a (kludge) solution for my issue. I figured out that I am already triggering a reload USER_QOS_PROFILES.xml by doing this code:

            DomainParticipantFactoryQos factoryQos = new DomainParticipantFactoryQos();
            DomainParticipantFactory.TheParticipantFactory.get_qos(factoryQos);
            factoryQos.resource_limits.max_objects_per_thread = 4098;
            DomainParticipantFactory.TheParticipantFactory.set_qos(factoryQos);

            DomainParticipantFactory factory = DomainParticipantFactory.get_instance();
            DomainParticipantQos defaultQos = new DomainParticipantQos();
            factory.get_default_participant_qos(defaultQos);

To be more specific, in my current code, my 6 existing qos_profiles are housed within a qos_library. If the user of my app adds more stations, then I create a new batch of 6 qos_profiles within a qos_library with a unique name. When I created this code, I expected it to fail as I am modifying my USER_QOS_PROFILES.xml "on the fly". But it didn't fail and it is beacuse I am doing the first 4 lines of code (somehow forces a reload), when my intent was to do this only once.

If I add this code to my 7th publishers init, it forces a reload of the USER_QOS_PROFILES.xml, and I don't break my other 5 publishers.

I have no idea if this "causes unknown DDS config issues" or is in general a terrible solution... so if anyone has a better solution, please advise.

Tim McGuire's picture
Offline
Last seen: 1 year 10 months ago
Joined: 09/25/2019
Posts: 5

Hello.

Why are you creating a new qos library everytime a new application is created? Can you reuse the existing qos library or is there something unique about each qos library?

When a user adds more stations in your app, do you create a new participant within the same app for each station? Or do you just create new data reader/writer under the same participant, publisher and subscriber?

Have you seen the Connext 5.3.0 example https://github.com/rticommunity/rticonnextdds-examples/tree/release/5.3.0/examples/using_qos_profiles/java?

Regards,

Tim

Offline
Last seen: 2 years 10 months ago
Joined: 04/24/2020
Posts: 9

My use case is a bit unique. I am isolating PCs by placing them on their own subnet. The PCs contain a set of applications that exchange DDS messages. When the PCs are on the same subnet, the applications act as "multiple terminals on one vehicle". However I want them to act as "each being a unique vehicle". My appication communicates with N PCs via DDS by having multiple network interfaces. So N net interfaces, N PCs, and N unique qos_library. Each qos_library has the network interface IP set for "dds.transport.UDPv4.builtin.parent.allow_interfaces" (for each qos_profile within the qos_library). For each PC my applications has 11 publishers and subscribers in total (and I've just added one more publisher... which made everything break!).

 

Ideally a user would configure the N network interfaces in my application and then start the DDS coms. This would allow me to setup my USER_QOS_PROFILES.xml once and then start DDS. However, I'm currently allowing them to add/remove PCs on the fly after startup, so I am modifying USER_QOS_PROFILES.xml, adding and removing qos_library's in response to user action.

Tim McGuire's picture
Offline
Last seen: 1 year 10 months ago
Joined: 09/25/2019
Posts: 5

Hello.

I wonder if you can accomplish the same thing using keys and partitions. Your topic could have a vehicleId attribute that is a key. This would create a topic instance for each vehicle. You can control which vehicles discover each other with partitions which can be modified at runtime. Using this you would only need one qos library which will never change. 

Regards,

Tim