Hello
In our system where we use KeepLastReliable.TransientLocal data writers, we've observed the DDS write calls sometimes block for several seconds even though we have configured max_blocking_time to zero.
Trying to get the stack trace of thread that is blocking, I've seen two different variations:
#0 0x76d4a334 in __lll_lock_wait (futex=futex@entry=0x40bf9a4, private=0) at .../lowlevellock.c:46 #1 0x76d428bc in __GI___pthread_mutex_lock (mutex=0x40bf9a4) at .../pthread_mutex_lock.c:80 #2 0x7648b618 in RTIOsapiSemaphore_take () from .../libnddscore.so #3 0x764651c0 in REDAWorker_enterExclusiveArea () from .../libnddscore.so #4 0x7646871c in REDACursor_modifyReadWriteArea () from .../libnddscore.so #5 0x76107e0c in PRESPsWriter_writeInternal () from .../libnddscore.so #6 0x767eea14 in DDS_DataWriter_write_untyped_generalI () from .../libnddsc.so #7 0x76bfb0d8 in DDSDataWriter_impl::write_untypedI(void const*, PRESInstanceHandle const&) () from .../libnddscpp.so
and
#0 0x76dc4d40 in __libc_sendmsg (fd=35, msg=0x7e9d542c, flags=0) at .../sendmsg.c:28 #1 0x763c707c in NDDS_Transport_UDP_sendToMultipleSockets () from .../libnddscore.so #2 0x763c97bc in NDDS_Transport_UDP_send () from .../libnddscore.so #3 0x763b32e8 in RTINetioSender_send () from .../libnddscore.so #4 0x76397c38 in MIGGeneratorContext_flush () from .../libnddscore.so #5 0x763a2a0c in MIGGenerator_finishMessage () from .../libnddscore.so #6 0x76369a44 in COMMENDSrWriterService_write () from .../libnddscore.so #7 0x76168f38 in PRESPsWriter_writeCommend () from .../libnddscore.so #8 0x761842e0 in PRESPsWriter_writeInternal () from .../libnddscore.so #9 0x76867a14 in DDS_DataWriter_write_untyped_generalI () from .../libnddsc.so #10 0x76c740d8 in DDSDataWriter_impl::write_untypedI(void const*, PRESInstanceHandle const&) () from .../libnddscpp.so
What is causing this blocking behavior, and is there any way to avoid it for example through using some Qos parameters? We are using RTI DDS 5.3.0.