[ 
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]

Reply via email to