brpc icon indicating copy to clipboard operation
brpc copied to clipboard

server中brpc::StreamWait卡在了thread::TaskGroup::sched_to

Open GreateCode opened this issue 1 year ago • 2 comments

Describe the bug (描述bug) server给client端发送几十个G的数据,期间client挂。 StreamWait的due_time设置的是100ms(是错的,应该是时间点),但也不应该卡住吧。 client挂和StreamWait卡住先后顺序不确定。 栈信息如图,请大佬帮忙看看是什么原因。

`

while(1) { int ec = brpc::StreamWrite(xxxx); if (ec == EINVAL) { return; }

 if (ec == EAGAIN) {
      auto ret = brpc::StreamWait(stream_id, &due_time);
      if (ret == EINVAL) { return; }
 }

}

`

To Reproduce (复现方法) 极难复现。

Expected behavior (期望行为)

Versions (各种版本) OS:ubuntu 20.04 Compiler:clang brpc: 1.8.0 protobuf:3.15

Additional context/screenshots (更多上下文/截图)

image

GreateCode avatar Jul 04 '24 09:07 GreateCode

@chenBright @wwbmmm 大佬~

GreateCode avatar Jul 04 '24 11:07 GreateCode

@jamesge

GreateCode avatar Jul 05 '24 09:07 GreateCode

StreamWrite没有返回网络错误,一直返回EAGAIN的话,应该是client挂了,但是server并没有感知到tcp连接断开,发送的数据没有收到client的ack,随后写不进去内核缓冲区后,就一直返回EAGAIN。

chenBright avatar Jul 06 '24 14:07 chenBright

有道理,这样的话,一定时期内都是EAGAIN,while里就可以判定连接断开,然后return结束,避免hang在这里。 但是server的连接资源怎么释放?如果sever配置了ServerOptions.idle_timeout_sec=100, 那么超过100s后,server会把该连接释放吗?

GreateCode avatar Jul 07 '24 03:07 GreateCode

idle机制不能解决这个问题。

可能需要借助tcp_user_timeout(#1154)来断开连接。

chenBright avatar Jul 08 '24 10:07 chenBright

tcp_user_timeout

brpc目前还没支持tcp_user_timeout吧。 另外brpc::StreamClose也释放不了,对吧。

GreateCode avatar Jul 08 '24 12:07 GreateCode

另外brpc::StreamClose也释放不了,对吧。

可以释放的。

brpc目前还没支持tcp_user_timeout吧

后续提个PR支持tcp_user_timeout。

chenBright avatar Jul 09 '24 06:07 chenBright

另外brpc::StreamClose也释放不了,对吧。

可以释放的。

brpc目前还没支持tcp_user_timeout吧

后续提个PR支持tcp_user_timeout。

👍🏻

GreateCode avatar Jul 09 '24 08:07 GreateCode