What error: Reliable large data requires asynchronous write
Note: Applies to RTI Connext 7.3.0 and below. Starting in release 7.4.0, asynchronous publishing is no longer a requirement for reliable, large data.
The error "COMMENDSrWriterService_on_Submessage:!write resend. Reliable large data requires asynchronous write
" is due to having a data type that is greater than the transport's message_size_max and the reliability QoS is set to RELIABLE_RELIABILITY_QOS.
Reliable samples larger than the transport's message_size_max require asynchronous publication. See the 'ASYNCHRONOUS_PUBLISHER QosPolicy' section of the RTI Connext Core Libraries and Utilities User's Manual for details.
You can send large data (.> message_size_max) with DDSDataWriter using the SYNCHRONOUS publish_mode but it can only be sent using BEST_EFFORT reliability QOS. To send large data with RELIABLE reliability QOS, you must use a DataWriter that uses the ASYNCHRONOUS publish_mode.
One common issue is that the current default transport buffers are 8K. To get larger sizes you need to increase the transport buffers. Here are some sample settings:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | < datawriter_qos > < publish_mode > < kind >ASYNCHRONOUS_PUBLISH_MODE_QOS</ kind > </ publish_mode > < datawriter_qos > < participant_qos > < receiver_pool > < buffer_size >65530</ buffer_size > </ receiver_pool > < property > < value > <!-- UDP transport --> < element > < name >dds.transport.UDPv4.builtin.parent.message_size_max</ name > < value >65530</ value > < propagate >false</ propagate > </ element > < element > < name >dds.transport.UDPv4.builtin.recv_socket_buffer_size</ name > < value >65530</ value > < propagate >false</ propagate > </ element > < element > < name >dds.transport.UDPv4.builtin.send_socket_buffer_size</ name > < value >65530</ value > < propagate >false</ propagate > </ element > <!-- Shared memory --> < element > < name >dds.transport.shmem.builtin.parent.message_size_max</ name > < value >65530</ value > < propagate >false</ propagate > </ element > < element > < name >dds.transport.shmem.builtin.receive_buffer_size</ name > < value >65530</ value > < propagate >false</ propagate > </ element > < element > < name >dds.transport.shmem.builtin.received_message_count_max</ name > < value >32</ value > < propagate >false</ propagate > </ element > </ value > </ property > </ participant_qos > |
Note: Due to the layered architecture of Connext, messages are sized to the smallest transport, so be sure to adjust all the transports you are using (typically UDPv4 & shared memory).