brpc icon indicating copy to clipboard operation
brpc copied to clipboard

stream模式下,stream在没有处理rpc response的时候先关闭,导致cntl报错

Open pavel2003 opened this issue 2 years ago • 2 comments
trafficstars

Describe the bug (描述bug) 1310 void Controller::HandleStreamConnection(Socket *host_socket) { 1311 if (_request_stream == INVALID_STREAM_ID) { 1312 CHECK(!has_remote_stream()); 1313 return; 1314 } 1315 SocketUniquePtr ptr; 1316 if (!FailedInline()) { 1317 if (Socket::Address(_request_stream, &ptr) != 0) { 1318 if (!FailedInline()) { 1319 SetFailed(EREQUEST, "Request stream=%" PRIu64 " was closed before responded", 1320 _request_stream);

由于stream的数据是异步交给queue处理的,所以close的frame如果先处理的话,这里是会走到SetFailed的

stub.XXX(&cntl) if (cntl.Failed())

如果业务这么用的话,cntl.Failed()就会返回真,这个错误可以忽略吗?

从日志看的话,说明作者应该知道这种情况,所以想问下对于使用者来说,cntl.Failed()是否可以不用管,这种情况下继续走下去会有其他隐患吗

pavel2003 avatar Jul 25 '23 03:07 pavel2003

如果用户侧判断stream已经处理完毕,其实可以忽略cntl.Failed的结果。因为cntl的作用就是建立stream,如果stream已经处理完了,后续也不会再使用,那么没必要再关注cntl的状态了。

wwbmmm avatar Aug 17 '23 02:08 wwbmmm

如果server端明确能保证先调用done->Run() 再执行StreamClose,也会遇到这种问题吗?

ghost avatar Dec 07 '23 11:12 ghost