Unary模式下客户端从开始连接到发送接收数据的主要流程

时间:2023-12-30 17:00:50

(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient

grpc Unary模式下客户端从开始连接到发送数据的主要流程

graph TD;
001(grpc_connector_connect #connector.cc:36 准备开始连接)-->002(chttp2_connector_connect #chttp2_connector.cc:225)

002(chttp2_connector_connect #chttp2_connector.cc:225)-->003(tcp_connect #tcp_client_posix.cc:350)

003(tcp_connect #tcp_client_posix.cc:350)-->004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)

004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)-->005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)

005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)-->006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)

006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)-->007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)

007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)-->008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)

008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)-->009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)

009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)-->010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)

010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)-->011(DoHandshake #handshaker.cc:249 开始执行握手)

011(DoHandshake #handshaker.cc:249 开始执行握手)-->012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)

012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)-->013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)

013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)-->014(on_handshake_done #chttp2_connector.cc:119 握手完了开始http2写)

014(on_handshake_done #chttp2_connector.cc:119 握手完了开始http2写)-->015(grpc_create_chttp2_transport #chttp2_transport.cc:3195 创建chttp2_transport)

015(grpc_create_chttp2_transport #chttp2_transport.cc:3195 创建chttp2_transport)-->016(grpc_chttp2_transport #chttp2_transport.cc:538 chttp2_transport的构造函数)

016(grpc_chttp2_transport #chttp2_transport.cc:538 chttp2_transport的构造函数)-->017(grpc_chttp2_act_on_flowctl_action #chttp2_transport.cc:2439 流量控制)

017(grpc_chttp2_act_on_flowctl_action #chttp2_transport.cc:2439 流量控制)-->018(WithUrgency #chttp2_transport.cc:2425 流量控制中对chttp2_transport的动作)

018(WithUrgency #chttp2_transport.cc:2425 流量控制中对chttp2_transport的动作)-->019(grpc_chttp2_initiate_write #chttp2_transport.cc:932 chttp2_transport写的初始化并调用真正的write_action_begin_locked写操作)

019(grpc_chttp2_initiate_write #chttp2_transport.cc:932 chttp2_transport写的初始化并调用真正的write_action_begin_locked写操作)-->020(write_action_begin_locked #chttp2_transport.cc:981 开始写)

020(write_action_begin_locked #chttp2_transport.cc:981 开始写)-->021(write_action #chttp2_transport.cc:1007 准备参数调用grpc_endpoint_write)

021(write_action #chttp2_transport.cc:1007 准备参数调用grpc_endpoint_write)-->022(grpc_endpoint_write #endpoint.cc:33 调用grpc_endpoint中的函数指针write指向tcp_write)

022(grpc_endpoint_write #endpoint.cc:33 调用grpc_endpoint中的函数指针write指向tcp_write)-->023(tcp_write #tcp_posix.cc:1093 调用tcp_flush #tcp_posix.cc:972 tcp_flush调用tcp_send #tcp_posix.cc:660并最终调用sendmsg, 发送的数据结构是struct msghdr)

grpc Unary模式下客户端从开始连接到接收数据的主要流程

graph TD;
001(grpc_connector_connect #connector.cc:36 准备开始连接)-->002(chttp2_connector_connect #chttp2_connector.cc:225)

002(chttp2_connector_connect #chttp2_connector.cc:225)-->003(tcp_connect #tcp_client_posix.cc:350)

003(tcp_connect #tcp_client_posix.cc:350)-->004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)

004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)-->005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)

005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)-->006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)

006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)-->007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)

007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)-->008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)

008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)-->009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)

009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)-->010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)

010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)-->011(DoHandshake #handshaker.cc:249 开始执行握手)

011(DoHandshake #handshaker.cc:249 开始执行握手)-->012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)

012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)-->013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)

013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)-->014(on_handshake_done #chttp2_connector.cc:147 握手完了开始http2读)

014(on_handshake_done #chttp2_connector.cc:147 握手完了开始http2读)-->015(grpc_chttp2_transport_start_reading #chttp2_transport.cc:3212 通过GRPC_CLOSURE_SCHED调用read_action_locked)

015(grpc_chttp2_transport_start_reading #chttp2_transport.cc:3212 通过GRPC_CLOSURE_SCHED调用read_action_locked)-->016(read_action_locked #chttp2_transport.cc:2568 调用continue_read_action_locked)

016(read_action_locked #chttp2_transport.cc:2568 调用continue_read_action_locked)-->017(continue_read_action_locked #chttp2_transport.cc:2579 调用grpc_endpoint_read)

017(continue_read_action_locked #chttp2_transport.cc:2579 调用grpc_endpoint_read)-->018(grpc_endpoint_read #endpoint.cc:28 调用grpc_endpoint中的read指针函数tcp_read)

018(grpc_endpoint_read #endpoint.cc:28 调用grpc_endpoint中的read指针函数tcp_read)-->019(tcp_read #tcp_posix.cc:636 调用notify_on_read把read_closure的变量state_设置为tcp->read_done_closure)

019(tcp_read #tcp_posix.cc:636 调用notify_on_read把read_closure的变量state_设置为tcp->read_done_closure)-->020(tcp_handle_read #tcp_posix.cc:619 epollin事件触发tcp_handle_read, epollin事件触发tcp_handle_read, 调用tcp_continue_read调用tcp_continue_read)

020(tcp_handle_read #tcp_posix.cc:619 epollin事件触发tcp_handle_read, epollin事件触发tcp_handle_read, 调用tcp_continue_read调用tcp_continue_read)-->021(tcp_continue_read #tcp_posix.cc:594 申请存放读内容的内存或者执行读操作, 此处申请内存)

021(tcp_continue_read #tcp_posix.cc:594 申请存放读内容的内存或者执行读操作, 此处申请内存)-->022(grpc_resource_user_alloc_slices #resource_quota.cc:1010 申请tcp->incoming_buffer内存)

022(grpc_resource_user_alloc_slices #resource_quota.cc:1010 申请tcp->incoming_buffer内存)-->023(grpc_resource_user_alloc #resource_quota.cc:939 上锁并调用resource_user_alloc_locked)

023(grpc_resource_user_alloc #resource_quota.cc:939 上锁并调用resource_user_alloc_locked)-->024(resource_user_alloc_locked #resource_quota.cc:905 调用allocate_closure的callback函数ru_allocate)

024(resource_user_alloc_locked #resource_quota.cc:905 调用allocate_closure的callback函数ru_allocate)-->025(ru_allocate #resource_quota.cc:485 调用rq_step_sched并把resource_user加入GRPC_RULIST_AWAITING_ALLOCATION对应的list)

025(ru_allocate #resource_quota.cc:485 调用rq_step_sched并把resource_user加入GRPC_RULIST_AWAITING_ALLOCATION对应的list)-->026(rq_step_sched #resource_quota.cc:296 调用rq_step_closure的callback函数rq_step)

026(rq_step_sched #resource_quota.cc:296 调用rq_step_closure的callback函数rq_step)-->027(rq_step #resource_quota.cc:281 调用rq_alloc)

027(rq_step #resource_quota.cc:281 调用rq_alloc)-->028(rq_alloc #resource_quota.cc:361 调用on_allocated这个list上所有的callback函数, 通过堆栈可以找到一个函数ru_allocated_slices)

028(rq_alloc #resource_quota.cc:361 调用on_allocated这个list上所有的callback函数, 通过堆栈可以找到一个函数ru_allocated_slices)-->029(ru_allocated_slices #resource_quota.cc:599 调用了ru_alloc_slices申请内存, 然后调用on_done的callback函数tcp_read_allocation_done, tcp_read_allocation_done在grpc_tcp_create设置)

029(ru_allocated_slices #resource_quota.cc:599 调用了ru_alloc_slices申请内存, 然后调用on_done的callback函数tcp_read_allocation_done, tcp_read_allocation_done在grpc_tcp_create设置)-->030(tcp_read_allocation_done #tcp_posix.cc:582 调用真正的读函数tcp_do_read, 在tcp_do_read中调用recvmsg 第二个参数结构是struct msghdr)