5.3. What’s New in 7.5.0
This section describes what’s new in the Core Libraries compared to release 7.4.0 (see Previous Releases).
RTI® Connext® 7.5.0 is an early access release. See the Connext Versions and Lifecycle page for more information on RTI’s software release model.
For what’s new and fixed in other products in the Connext suite, see those products’ release notes on the RTI Community Portal or in your installation. Or start with the RTI Connext What’s New for a launchpad to all products.
Note
For backward compatibility information between 7.5.0 and previous releases, see the Migration Guide on the RTI Community Portal.
5.3.1. Python RPC API now fully productized and supported
This release promotes the Python RPC API from experimental to production-ready. It includes several improvements to the RPC and Request-Reply Python APIs that align the API with the future update of the OMG DDS-RPC standard and provide several new features, most notably an enhanced service discovery protocol.
The Python RPC and Request-Reply improvements in this release follow the improvements for Modern C++ in 7.4.0 and bring the RPC/Request-reply APIs in these two languages up to par.
The enhanced service discovery protocol allows a Client (or a Requester) to reliably discover a Service (or a Replier) before making a call:
Clients and Requesters can call a new method,
wait_for_service(), to ensure that a service has been discovered.Clients and Requesters will fail immediately when making a request if no service has been discovered. This behavior can be disabled on the Client or Requester with the new argument
require_matching_service_on_send_requeston the Client and Requester constructor, for interoperability with request-reply APIs in other languages except Modern C++ and previous versions of the Python API.A Service or a Replier will only pass requests to the application layer when it can ensure that the reply can be delivered. This solves a previous race condition that could cause some initial replies for a Client or Requester to be lost.
Other changes include:
Python code generation of interfaces is now supported by
rtiddsgen, together with example generation when an IDL contains an interface and you use-example universal.The translation of service interfaces has changed to topic-types to align with a future update of the OMG RPC-DDS standard.
Allows for the mutability of RPC operations by supporting the @final and @mutable annotations on a per-operation basis.
For example, the following interfaces are compatible. A Foo client can call
my_methodon a Bar service, and the other way around (as long as they use the same service name):@service("DDS") interface Foo { @mutable long my_methodop(in short s, out double d); }; @service("DDS") interface Bar { @mutable void my_method(in short s, out double d, in long l); };
Allows the propagation of built-in exceptions
rti.rpc.RemoteUnsupportedOperationError,rti.rpc.RemoteInvalidArgumentError,rti.rpc.RemoteOutOfResourcesError,rti.rpc.RemoteUnknownOperationError, andrti.rpc.RemoteUnknownExceptionError, in addition to the already-supported user-defined exceptions. These built-in exceptions can be explicitly thrown by the service implementation. Additionally,rti.rpc.RemoteUnknownOperationErrorandrti.rpc.RemoteUnknownExceptionErrorare reported when the client calls an unknown operation in the service or the service implementation throws an unknown exception, respectively.Allows setting wire compatibility with
rti.connextdds.compliance.RpcMaskso that thePID_RELATED_SAMPLE_IDENTITY RTPSparameter is set to its standard value. By default, it continues to be set to a non-standard value for backward compatibility with previous Connext versions.Previously the Python API only allowed “in” parameters; support for “out” and “inout” parameters have been added allowing the modification of these parameters in the service side and propagating these changes to the actual parameters where the client invokes the operation.
Added support for operation parameters of bounded string type.
Added support for operation parameters of sequence type.
Added support for @default, @min, and @max annotations on operation parameters.
Added support for operation extensibility.
Improved internal error management in the server. The server will notify the customer in case of an exception sending the response.
See Request-Reply Exchanges and Remote Procedure Calls (RPC) in the RTI Connext Core Libraries User’s Manual for information on these APIs. Also see the remote_procedure_call and request_reply GitHub examples.
5.3.2. More efficient endpoint discovery for RPC and Request-Reply
This release provides faster discovery for RPC and Request-Reply
entities. The Requester.wait_for_service() (for request-reply) or
Client.wait_for_service() (for RPC) previously returned TRUE once
the DataWriter and DataReader had both matched with a Replier
(for request/reply) or Service (for RPC). However, this did not
indicate that the external Replier or Service had also
discovered the DataWriter and DataReader. This resulted in a need to
send additional retries.
Now, wait_for_service() will not return TRUE until both the
DataWriter and DataReader have matched and the DataReader has
received a heartbeat from the Replier's or Service's
DataWriter. This indicates that the remote DataWriter has completed
endpoint discovery and is ready to write data. This should reduce the
number of retries needed to send a request and have it be received.
This change is an improvement upon the Modern C++ API and is already included in the Python API as part of the new feature Python RPC API now fully productized and supported.
See Request-Reply Endpoint Discovery for more information on endpoint discovery for RPC and Request-Reply.
5.3.3. Improved DataWriter queue sample memory management eliminates required configuration for unbounded types
The way that DataWriters manage the memory that they use to store serialized samples has been improved to prioritize using pre-allocated memory. This enhancement eliminates the need to configure properties out-of-the-box for DataWriters that are using unbounded types.
Previously, DataWriters always tried to allocate buffers to the
maximum serialized sample size of a type. For unbounded types, or even
types with very large maximum serialized sample sizes, DataWriter
creation would fail or consume large amounts of unused memory. To avoid
this, the property
dds.data_writer.history.memory_manager.fast_pool.pool_buffer_max_size
had to be set to a threshold value. Samples with serialized sizes below
this value were stored in pre-allocated buffers and samples with
serialized sizes above this value were stored in dynamically allocated
buffers.
Now, DataWriters allocate buffers that are more closely sized to the sample sizes that are being written and keeps these buffers around so that they can be reused for subsequent samples that are similarly sized. This avoids dynamic memory allocation, which can hurt the performance and determinism of your application. No configuration is required to send large samples out-of-the-box.
As part of this work, the
dds.data_writer.history.memory_manager.fast_pool.pool_buffer_max_size
property has been removed for all use cases except
unbounded key members in Java. Setting it will have no effect, and a
warning will be printed when a DataWriter that is using this property
is created or has its QoS updated.
See Sample Memory Management for DataWriters in the RTI Connext Core Libraries User’s Manual for a detailed explanation of how DataWriters manage the memory for serialized samples.
5.3.4. Enhanced out-of-the-box network performance with updated socket buffer sizes
Several improvements were made to enhance network performance by increasing the default socket buffer sizes and improving the usability of the socket buffer size configuration. These changes provide a better out-of-the-box experience while offering more flexibility in tuning the system for optimal performance.
As part of this update, this release has increased the default UDP
socket buffer size from 131072 bytes to 2097152 bytes. This
significant adjustment allows for more efficient data transmission and
improved network throughput, addressing the demands of high-performance
applications. To take full advantage of this updated default, you should
adjust the kernel settings to match this new default value. See
https://community.rti.com/kb/achieving-low-jitter-performance-connext-pro#Socket-buffer-sizes
for details on how to do that.
In cases where the specified send or receive socket buffer size exceeds the maximum value allowed by the system, Connext will now automatically use the maximum value permitted by the system. A warning message (previously printed at local verbosity) is printed in such scenarios, providing suggestions to help you optimize your configuration and better understand system-level limitations.
To further improve usability, this release introduces new configuration
options: NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_MAX (-2) and
NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_MAX (-2). These options
allow you to configure Connext to use the maximum socket buffer size
allowed by the operating system. If the system does not define a maximum
buffer size, Connext will fail and provide an error message indicating
the issue. The previously available configuration constants,
NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_DEFAULT (-1) and
NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_DEFAULT (-1), remain
unchanged and continue to allow the use of the OS default socket buffer
size.
These enhancements provide greater flexibility and improve the usability of socket buffer size configuration while improving out-of-the-box network performance. By aligning Connext configuration with system-level constraints, these updates enable smoother operation and better overall efficiency.
For more information, see send_socket_buffer_size and
recv_socket_buffer_size in Setting Builtin Transport Properties
with the
PropertyQosPolicy
and Setting Real-Time WAN Transport
Properties
in the RTI Connext Core Libraries User’s Manual.
5.3.5. Improved scalability for applications using writer-side content filtering
This release enhances the scalability of Connext applications by resolving issues related to writer-side content filtering. Previously, when two DataWriters within the same DomainParticipant performed writer-side filtering, they could interfere with each other, even if they were associated with different Topics and Publishers. Now, DataWriters in separate Topics and Publishers can perform writer-side filtering independently, without interference. This update significantly boosts concurrency, especially in multi-core systems.
5.3.6. Initial discovery performance improvements in large systems with participants containing many endpoints
This release has introduced performance improvements in large systems with DomainParticipants containing many endpoints by reducing the CPU required to match a remote endpoint (DataReader and DataWriter) to a local endpoint.
5.3.7. Eliminated requirement to manually clean up thread resources on platforms that support automatic thread-specific storage (TSS) cleanup
Whenever a Connext API is called by a user thread, some resources are
stored in thread-specific storage. In previous Connext releases, the
only way to clean up these resources was to called the
DomainParticipantFactory::unregister_thread API
(ThreadContext::Dispose() in the C# API) before a user-created
thread exited.
This release adds support for automatic TSS cleanup on platforms that allow it.
On platforms that support automatic TSS cleanup, it is no longer
required to call the DomainParticipantFactory::unregister_thread API
before a thread exits, although it is safe to do so.
Refer to the Platform Notes to see if your platform supports automatic TSS cleanup. (It will be mentioned in the “Thread Configuration” sub-section of the platform you are using.)
5.3.8. Improved flow control of fragmented sample repairs
When a DataWriter sends two fragmented samples (that is, their
serialized size exceeds the configured message_size_max for the
transport), and all fragments of the first sample are missed while only
a few fragments of the second sample are missed, the DataReader will
issue a NACK for the first sample and a NACK_FRAG for the second
sample.
In such a scenario, the handling of fragmented sample repairs has been
improved to ensure that the max_bytes_per_nack_response limit
applies collectively to both NACK and NACK_FRAG repairs.
Previously, this limit applied separately to NACKs and
NACK_FRAGs, effectively doubling the configured
max_bytes_per_nack_response limit. This enhancement ensures that
when repairs are delayed using min_nack_response_delay and
max_nack_response_delay, the limit is applied to all queued event
repairs collectively. This allows for more efficient resource management
and makes it easier to specify the maximum allowed size of a repair
response.
Note: If repairs are not delayed, the limit still applies separately.
See DATA_WRITER_PROTOCOL QosPolicy (DDS Extension) in the RTI Connext Core Libraries User’s Manual for more information.
5.3.9. RTPS messages containing a malformed inline Qos now trigger a warning, to avoid deserialization errors downstream
To improve the debuggability of Connext applications, this release introduces improvements to the RTPS Inline Qos parsing. Specifically, Connext can now detect the presence of an Inline Qos field that is located too early in the RTPS message. When this situation is detected, Connext logs a warning similar to the following one:
"COMMEND(Anon/Be/Sr)ReaderService_onSubmessage:skip error: protocol parameters"
This improvement avoids cryptic deserialization errors (for example, but
not limited to, a generic available space error) getting logged
downstream.
5.3.10. Capture periodic DomainParticipant announcements in DISCOVERY logging category to enhance debugging of discovery
The DISCOVERY logging category has been enhanced to include periodic
DomainParticipant announcements. This enhancement allows you to track
the ongoing presence of discovered DomainParticipants, providing
additional insights for debugging unexpected discovery behaviors.
Previously, only the initial and final announcements were logged, while
periodic announcements were not captured. With this enhancement,
periodic announcements are now logged as they are sent.
5.3.11. Print incompatible QoS policies in a discovery snapshot for improved discovery debugging
The discovery snapshot API has been enhanced to print incompatible QoS policies. This enhancement allows you to identify the specific QoS policies responsible for the incompatibility between two entities when they fail to match. This enhancement improves the debugging process by presenting all mismatched QoS policies, enabling you to diagnose and resolve configuration issues more efficiently. See Discovery Snapshots in the RTI Connext Core Libraries User’s Manual for more information.
5.3.12. Updated default value for socket_monitoring_kind to more performant WINDOWS_IOCP value on Windows systems
The default value for the socket_monitoring_kind property has been
updated to WINDOWS_IOCP on Windows systems. This value was always
recommended for better performance and scalability; now it is the
default setting. See TCP/TLS Transport
Properties
in the RTI Connext Core Libraries User’s Manual.
5.3.13. Support for new metadata fields in content filter expressions
This release introduces support for the following new metadata fields in content filter expressions in the SQL filter:
sample_identity.writer_guid.valuesample_identity.sequence_number.lowsample_identity.sequence_number.highsource_guid.value
For example:
@sample_identity.writer_guid.value = &hex(0708090A0B0C0D0E0F10111213141516)
See SQL Filter Expression Notation in the RTI Connext Core Libraries User’s Manual.
5.3.14. InstanceHandle now provides a default constructor
The type dds::core::InstanceHandle was previously expected to be
initialized with the special value dds::core::InstanceHandle::nil()
or with another InstanceHandle. This caused unnecessary complexity,
especially in the initialization of collections of InstanceHandles.
This release adds a default constructor that initializes an
InstanceHandle to nil().
5.3.15. Parameter type change to more convenient/appropriate size_t in pluggable transport’s to_string APIs
The type of the buffer_size_in parameter has been updated from
RTI_INT32 to size_t in the following pluggable transport C APIs:
NDDS_Transport_Address_to_stringNDDS_Transport_Address_to_string_with_class_idNDDS_Transport_Address_to_string_with_protocol_family_format
For example, see NDDS_Transport_Address_to_string().
The behavior of the APIs has not changed, since the buffer_size_in
parameter represents the size of the buffer used to get the address as a
string, which should be positive. However, people using these functions
could find benign warnings as a result of this change.
5.3.16. Deprecations and Removals
This section describes items that are deprecated or removed in 7.5.0, compared to 7.4.0.
Deprecated means that the item is still supported in this release, but will be removed in a future release. Removed means that the item is discontinued or no longer supported.
Any deprecations or removals noted in RTI’s documentation serve as notice under the Real-Time Innovations, Inc., Maintenance Policy #4220 and/or any other agreements by and between RTI and customer regarding maintenance and support of RTI’s software. RTI’s current standard terms and support and maintenance policies are available at https://www.rti.com/terms.
5.3.16.1. “delete” method of DynamicDataTypeSupport deprecated
As a result of the fix for CORE-14359 (see Memory Leaks/Growth), the
delete method of the DynamicDataTypeSupport class in the Java API
has been deprecated. While its use won’t trigger a compiler error, it will
trigger a Deprecation warning and not do anything.
5.3.16.2. dds.data_writer.history.memory_manager.fast_pool.pool_buffer_max_size removed (except for Java)
As part of the
new feature that eliminates required configuration for unbounded types,
the dds.data_writer.history.memory_manager.fast_pool.pool_buffer_max_size
property has been removed for all use cases except unbounded key members in Java.
Setting the property will have no effect, and a warning will be printed when a
DataWriter that is using this property is created or has its QoS updated.
The use of this property by Java is deprecated in this release and will be replaced by automatic behavior in an upcoming release.
5.3.17. Third-Party Software Changes
The following third-party software used by Connext has been upgraded:
Third-Party Software |
Old Version |
New Version |
|---|---|---|
Expat |
2.6.2 |
2.6.3 |
LZ4 |
1.9.3 |
1.9.4 |
For information on third-party software used by Connext products, see the “3rdPartySoftware” documents in your installation: <NDDSHOME>/doc/manuals/connext_dds_professional/release_notes_3rdparty.