[
https://issues.apache.org/jira/browse/DISPATCH-2166?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17383587#comment-17383587
]
Charles E. Rolke commented on DISPATCH-2166:
--------------------------------------------
The send_complete flags is one of several flags that get shared among threads.
Some of the flags can be reimplemented directly as sys_atomics, others can be
kept as normal booleans or structures but read and written only while holding
the content lock, and another may simply be deleted.
{code:java}
This flag can be eliminated:
bool priority_present; //
The following flags shall be implemented as sys_atomic variables:
bool ma_stream; // indicates whether
this message is streaming
bool ma_parsed; // have parsed
annotations in incoming message
bool discard; // Should this message
be discarded?
bool receive_complete; // true if the message
has been completely received, false otherwise
bool oversize; // policy oversize
handling in effect
bool no_body; // Used for http2
messages. If no_body is true, the HTTP request had no body
These variables can be implemented as sys_atomics:
bool priority_parsed; //
uint8_t priority; // The priority of
this message
These flags and variables shall be read and written only while holding the
content lock.
Handler code is largely implemented holding the lock and just needs a few extra
lock/unlocks to be complete:
size_t protected_buffers; // count of permanent
buffers that hold the message headers
qd_message_q2_unblocker_t q2_unblocker; // callback and
context to signal Q2 unblocked to receiver
bool q2_input_holdoff; // hold off calling
pn_link_recv
bool disable_q2_holdoff; // Disable the Q2 flow
control
{code}
> Race accessing several message content flags and values
> -------------------------------------------------------
>
> Key: DISPATCH-2166
> URL: https://issues.apache.org/jira/browse/DISPATCH-2166
> Project: Qpid Dispatch
> Issue Type: Bug
> Reporter: Charles E. Rolke
> Assignee: Charles E. Rolke
> Priority: Major
>
> Asynchronous read/write of the send_complete flag in the message content:
> {code:java}
> 71: E WARNING: ThreadSanitizer: data race (pid=3184)
> 71: E Write of size 1 at 0x7b4800014551 by thread T4:
> 71: E #0 qd_message_set_send_complete
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/message.c:1321
> (libqpid-dispatch.so+0x82975)
> 71: E #1 read_message_body
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:534
> (libqpid-dispatch.so+0x561d2)
> 71: E #2 handle_outgoing
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:627
> (libqpid-dispatch.so+0x561d2)
> 71: E #3 qdr_tcp_deliver
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:1541
> (libqpid-dispatch.so+0x59a74)
> 71: E #4 qdr_link_process_deliveries
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/router_core/transfer.c:178
> (libqpid-dispatch.so+0xd4daf)
> 71: E #5 qdr_tcp_push
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:1479
> (libqpid-dispatch.so+0x5741f)
> 71: E #6 qdr_connection_process
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/router_core/connections.c:414
> (libqpid-dispatch.so+0xa86fd)
> 71: E #7 handle_connection_event
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:850
> (libqpid-dispatch.so+0x57881)
> 71: E #8 handle_event_with_context
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:802
> (libqpid-dispatch.so+0xf206d)
> 71: E #9 do_handle_raw_connection_event
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:808
> (libqpid-dispatch.so+0xf206d)
> 71: E #10 handle
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1089
> (libqpid-dispatch.so+0xf206d)
> 71: E #11 thread_run
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1121
> (libqpid-dispatch.so+0xf64d5)
> 71: E #12 _thread_init
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/posix/threading.c:172
> (libqpid-dispatch.so+0x96d52)
> 71: E
> 71: E Previous read of size 1 at 0x7b4800014551 by thread T3
> (mutexes: write M410):
> 71: E #0 qd_message_send_complete
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/message.c:1313
> (libqpid-dispatch.so+0x82923)
> 71: E #1 qdr_delivery_send_complete
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/router_core/delivery.c:64
> (libqpid-dispatch.so+0xb442c)
> 71: E #2 qdr_link_process_deliveries
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/router_core/transfer.c:186
> (libqpid-dispatch.so+0xd4ddc)
> 71: E #3 qdr_tcp_push
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:1479
> (libqpid-dispatch.so+0x5741f)
> 71: E #4 qdr_connection_process
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/router_core/connections.c:414
> (libqpid-dispatch.so+0xa86fd)
> 71: E #5 on_activate
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:185
> (libqpid-dispatch.so+0x5a209)
> 71: E #6 qd_timer_visit
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/timer.c:317
> (libqpid-dispatch.so+0xf7fad)
> 71: E #7 handle
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1006
> (libqpid-dispatch.so+0xf1fbe)
> 71: E #8 thread_run
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1121
> (libqpid-dispatch.so+0xf64d5)
> 71: E #9 _thread_init
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/posix/threading.c:172
> (libqpid-dispatch.so+0x96d52)
> 71: E
> 71: E Location is heap block of size 384 at 0x7b4800014400
> allocated by thread T2:
> 71: E #0 posix_memalign <null> (libtsan.so.0+0x32a23)
> 71: E #1 qd_alloc
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/alloc_pool.c:396
> (libqpid-dispatch.so+0x5cca3)
> 71: E #2 new_qd_message_t
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/message.c:95
> (libqpid-dispatch.so+0x81d31)
> 71: E #3 qd_message
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/message.c:995
> (libqpid-dispatch.so+0x82238)
> 71: E #4 qd_message_receive
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/message.c:1463
> (libqpid-dispatch.so+0x88e53)
> 71: E #5 AMQP_rx_handler
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/router_node.c:466
> (libqpid-dispatch.so+0xeaf87)
> 71: E #6 do_receive
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/container.c:227
> (libqpid-dispatch.so+0x751dc)
> 71: E #7 qd_container_handle_event
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/container.c:737
> (libqpid-dispatch.so+0x751dc)
> 71: E #8 handle
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1096
> (libqpid-dispatch.so+0xf2021)
> 71: E #9 thread_run
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1121
> (libqpid-dispatch.so+0xf6460)
> 71: E #10 _thread_init
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/posix/threading.c:172
> (libqpid-dispatch.so+0x96d52)
> 71: E
> 71: E Mutex M410 (0x7b10000022c0) created at:
> 71: E #0 pthread_mutex_init <null> (libtsan.so.0+0x49603)
> 71: E #1 sys_mutex
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/posix/threading.c:43
> (libqpid-dispatch.so+0x96dac)
> 71: E #2 qdr_connection_opened
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/router_core/connections.c:111
> (libqpid-dispatch.so+0xa7516)
> 71: E #3 qdr_tcp_open_server_side_connection
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:966
> (libqpid-dispatch.so+0x53031)
> 71: E #4 qdr_tcp_connection_egress
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:1050
> (libqpid-dispatch.so+0x59704)
> 71: E #5 qd_dispatch_configure_tcp_connector
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/adaptors/tcp_adaptor.c:1287
> (libqpid-dispatch.so+0x5b917)
> 71: E #6 ffi_call_unix64 <null> (libffi.so.6+0x6c03)
> 71: E #7 main_process
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:97
> (qdrouterd+0x40281c)
> 71: E #8 main
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:369
> (qdrouterd+0x4024fc)
> 71: E
> 71: E Thread T4 (tid=3189, running) created by main thread at:
> 71: E #0 pthread_create <null> (libtsan.so.0+0x5bf45)
> 71: E #1 sys_thread
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/posix/threading.c:181
> (libqpid-dispatch.so+0x971ee)
> 71: E #2 qd_server_run
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1499
> (libqpid-dispatch.so+0xf6712)
> 71: E #3 main_process
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:115
> (qdrouterd+0x40287c)
> 71: E #4 main
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:369
> (qdrouterd+0x4024fc)
> 71: E
> 71: E Thread T3 (tid=3188, running) created by main thread at:
> 71: E #0 pthread_create <null> (libtsan.so.0+0x5bf45)
> 71: E #1 sys_thread
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/posix/threading.c:181
> (libqpid-dispatch.so+0x971ee)
> 71: E #2 qd_server_run
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1499
> (libqpid-dispatch.so+0xf6712)
> 71: E #3 main_process
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:115
> (qdrouterd+0x40287c)
> 71: E #4 main
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:369
> (qdrouterd+0x4024fc)
> 71: E
> 71: E Thread T2 (tid=3187, running) created by main thread at:
> 71: E #0 pthread_create <null> (libtsan.so.0+0x5bf45)
> 71: E #1 sys_thread
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/posix/threading.c:181
> (libqpid-dispatch.so+0x971ee)
> 71: E #2 qd_server_run
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/server.c:1499
> (libqpid-dispatch.so+0xf6712)
> 71: E #3 main_process
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:115
> (qdrouterd+0x40287c)
> 71: E #4 main
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/router/src/main.c:369
> (qdrouterd+0x4024fc)
> 71: E
> 71: E SUMMARY: ThreadSanitizer: data race
> /home/runner/work/qpid-dispatch/qpid-dispatch/qpid-dispatch/src/message.c:1321
> in qd_message_set_send_complete
> 71: E ==================
> 71: E ThreadSanitizer: reported 1 warnings
> {code}
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]