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:

<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).