brpc client 开启dummy server 程序core掉
Describe the bug (描述bug) 程序使用brpc client 访问 server端,当访问contention时
会导致程序出core 。gdb查看是这里的问题
To Reproduce (复现方法) 只要有下载请求 访问contention必现
Versions (各种版本) OS: centos 7.9 gcc:11 Compiler: brpc:v1.0.0
可以给一个能复现的demo吗
可以给一个能复现的demo吗
感谢回复 具体场景是客户端http请求下载文件 我们服务接收请求后 调用存储端的sdk读文件并做处理
ctx->AsyncCallWithAttachment([req, callback = std::move(callback), ctx = std::move(ctx)]() mutable
{
### // brpc回调:
auto lambda = [ctx](char *data, size_t length) -> size_t
{
if (ctx == nullptr || length == 0) {
return 0;
}
if(!ctx->readed){
ctx->readed = true;
if (ctx->ret_val!=0){
LOG_ERROR << "AsyncCall failed";
return 0;
}
}
size_t bytesToWrite = std::min(length, ctx->object_size);
if (ctx->offset + bytesToWrite > ctx->object_size)
{
bytesToWrite = ctx->object_size - ctx->offset;
}
### //看gdb是当访问contention这里出core
ctx->buf.cutn(data, bytesToWrite);
ctx->offset += bytesToWrite;
return bytesToWrite;
};
auto resp = HttpResponse::newStreamResponse(lambda, "", CT_APPLICATION_OCTET_STREAM, "", req);
resp->addHeader("Content-Length", std::to_string(ctx->object_size));
callback(resp); });
然后配置一个dummy_server.port 访问flags ,status ,vars这些没问题 但是访问contention这些就出问题,当然 进程不承接流量 不会有问题
看起来有点像执行到 ctx->buf.cutn() 这句的时候,ctx已经被析构了,
看起来有点像执行到 ctx->buf.cutn() 这句的时候,ctx已经被析构了,
ctx是一个智能指针 auto ctx = std::make_shared<DataServerContext>(object_size); 并且 如果不用brpc的异步回调处理数据 用同步的方式 也是上述的core的位置
有可以运行的例子吗
有可以运行的例子吗
您的意思是说 要一个源码示例嘛
有可以运行的例子吗
您的意思是说 要一个源码示例嘛
对的
有可以运行的例子吗
您的意思是说 要一个源码示例嘛
对的
代码没有上传到公共仓库 但是与brpc核心的流程就是上面的例子了 还有就是 ctx是一个 sdk的实例 AsyncCallWithAttachment方法内部
> pb::Closure* done = brpc::NewCallback(&ReadObjectWithAttachmentCb, serv_addr,, request, response, cntl, closure, buf);
> stub.Read(serv_addr, request.get(), response.get(), cntl.get(), done, &options);
```通过这种实例与server端交互 看着主流程也没啥问题 不通过dummy server监控 也能跑出不错的业务带宽