15.4. What’s Fixed in 7.6.0
This section describes bugs fixed in Routing Service 7.6.0. These are fixes since 7.5.0.
RTI® Connext® 7.6.0 is an early access releases. See the Connext Versions and Lifecycle page for more information on RTI’s software release model.
For what’s fixed in other products in the Connext suite, see those products’ release notes on the RTI Community Portal or in your installation.
[Critical]: System-stopping issue, such as a crash or data loss.
[Major]: Significant issue with no easy workaround.
[Minor]: Issue that usually has a workaround.
[Trivial]: Small issue, such as a typo in a log.
15.4.1. Serialization and Deserialization
15.4.1.1. [Critical] Unexpected error messages when Routing Service disposed of an instance while using batching and setting serialize_key_with_dispose to TRUE
Consider the following Routing Service writer QoS:
<datawriter_qos>
<batch>
<enable>true</enable>
</batch>
<protocol>
<serialize_key_with_dispose>true</serialize_key_with_dispose>
</protocol>
</datawriter_qos>
The data type is keyed, and the serialized key is not aligned to a 4-byte boundary.
Imagine that Routing Service successfully sends one batch with a data sample of a given instance and then attempts to send another batch whose first sample is a dispose message for that same instance.
When using release libraries, Routing Service would have successfully sent the second batch, but the DataReader that was reading the batch from Routing Service would have experienced this error:
ERROR MIGInterpreter_parse:submessage not aligned to 4
When using debug libraries, Routing Service would have failed to send the batch and generated this error:
mig.2.0/srcC/generator/Generator.c:1216:RTI0x200003a:!precondition: "!(sample != ((void *)0) && (((sample)->serializedData[encapsulationIndex].serializedData.pointer == ((void *)0) || ((sample)->serializedData[encapsulationIndex].serializedData.length & 0x3) == 0)) && (((sample)->protocolParameters.pointer == ((void *)0) || ((sample)->protocolParameters.length & 0x3) == 0)))
This problem only affected 7.3.0 and above. Routing Service now successfully sends the batch, and the DataReader successfully receives the batch when using either release or debug libraries.
[RTI Issue ID ROUTING-1288]
15.4.2. Memory Leaks/Growth
15.4.2.1. [Minor] Memory leak if malformed configuration file prevents Routing Service creation
Suppose Routing Service attempts to use an XML configuration file that
is malformed because of a missing closing quote in the xmlns
attribute. For example:
xmlns=<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance>
Routing Service creation correctly fails with an error message
containing RTIXMLUTILSParser_parseFile. However, in releases 6.0.0
and above, Routing Service also incorrectly leaked memory in the same
function, RTIXMLUTILSParser_parseFile.
[RTI Issue ID ROUTING-1324]
15.4.3. Crashes
15.4.3.1. [Critical] Possible crash if custom transformation on input returned the provided input samples or sample infos as output
Note
In the 7.5.0. release, the release note “Possible crash if custom transformation returned the provided input samples or sample infos as output” (ROUTING-1236) was incomplete. The following release note adds additional context.
Routing Service could have crashed or had a memory corruption when using a
custom Transformation on an input that returned the same array of samples
or sample infos provided to it as outputs within its transform() method.
For example, the following code returned the collection of info objects,
inInfoList, as the output list, outInfoLst.
void MyCustomTransformation_transform(
RTI_RoutingServiceTransformation transformation,
RTI_RoutingServiceSample **outSampleList,
RTI_RoutingServiceSampleInfo **outInfoList,
int *outCount,
RTI_RoutingServiceSample *inSampleList,
RTI_RoutingServiceSampleInfo *inInfoList,
int inCount,
RTI_RoutingServiceEnvironment * env)
{
// ...
*outCount = inCount;
*outInfoList = inInfoList;
// ...
}
This could have resulted in a memory corruption, crash, or just failure to route the samples. Routing Service now prints the following error messages when this condition is detected:
[/routing_services/RsTransformation/domain_routes/DomainRoute1/sessions/Session/routes/MyData/inputs/Input1] ROUTERStreamReader_readOrTakeI:!sample info list: transformation cannot return input sample info list as output; stream name=Example MyData
(...)
Implementers of the Transformation API should manage their own memory in
their code, including the allocation and freeing of returned output arrays.
The return_loan() function will be called to signal that any allocated
memory provided as outputs can be freed.
[RTI Issue ID ROUTING-1236]
15.4.4. Other
15.4.4.1. [Critical] Routing Service didn’t allow configuration of its internal clock
Routing Service lacked the ability to configure its internal clock,
causing it to malfunction in jump-time scenarios. To address this, a new
XML tag, <internal_clock>, has been introduced, allowing you to
specify a comma-delimited list of preferred clock sources: “realtime,”
“system,” or “monotonic.” Clock configuration is also available via the
command-line option -internalClock and within Service Properties,
with these methods taking precedence over the XML tag.
[RTI Issue ID ROUTING-1299]
15.4.4.2. [Minor] Routing Service user library required inclusion in correct environment variable to be loaded
Previously, it was necessary for the Routing Service user library to be added to the LD_LIBRARY_PATH on Linux systems, DYLD_LIBRARY_PATH on macOS systems, or PATH on Windows systems. Additionally, it was necessary to ensure that the XML configuration specified only the library’s name, not its full DLL path. This issue has been addressed, and the user library no longer requires an environment variable to load correctly.
[RTI Issue ID ROUTING-1314]