You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Charles E. Rolke (Jira)" <ji...@apache.org> on 2021/07/19 21:10:00 UTC

[jira] [Commented] (DISPATCH-2166) Race accessing several message content flags and values

    [ 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: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org