-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Closed
Description
Describe the bug (描述bug)
http传输大文件时,概率性析构崩溃,出现过2次,崩溃调用栈相同
(gdb) bt
#0 0x00000000004d4d13 in brpc::SharedObject::RemoveRefManually (this=0x7f5e90041940) at /usr/local/include/brpc/shared_object.h:50
#1 0x00000000004d4d55 in brpc::intrusive_ptr_release (obj=0x7f5e90041940) at /usr/local/include/brpc/shared_object.h:65
#2 0x00000000004efbcd in butil::intrusive_ptr<brpc::ProgressiveAttachment>::~intrusive_ptr (this=0x7f5d38ff7a90, __in_chrg=<optimized out>) at /usr/local/include/butil/intrusive_ptr.hpp:89
#3 0x00000000004e274b in sdkproxy::VodServiceImpl::DownloadByTime(google::protobuf::RpcController*, sdkproxy::HttpRequest const*, sdkproxy::HttpResponse*, google::protobuf::Closure*)::{lambda()#2}::operator()() const (__closure=0x7f5e900419e8) at ../server/service/vod_service.h:122
#4 0x0000000000531cf6 in std::_Bind_simple<sdkproxy::VodServiceImpl::DownloadByTime(google::protobuf::RpcController*, sdkproxy::HttpRequest const*, sdkproxy::HttpResponse*, google::protobuf::Closure*)::{lambda()#2} ()>::_M_invoke<>(std::_Index_tuple<>) (this=0x7f5e900419e8) at /usr/include/c++/5/functional:1531
#5 0x00000000005315e4 in std::_Bind_simple<sdkproxy::VodServiceImpl::DownloadByTime(google::protobuf::RpcController*, sdkproxy::HttpRequest const*, sdkproxy::HttpResponse*, google::protobuf::Closure*)::{lambda()#2} ()>::operator()() (this=0x7f5e900419e8) at /usr/include/c++/5/functional:1520
#6 0x0000000000530e02 in std::thread::_Impl<std::_Bind_simple<sdkproxy::VodServiceImpl::DownloadByTime(google::protobuf::RpcController*, sdkproxy::HttpRequest const*, sdkproxy::HttpResponse*, google::protobuf::Closure*)::{lambda()#2} ()> >::_M_run() (this=0x7f5e900419d0) at /usr/include/c++/5/thread:115
#7 0x00007f5ee36c1c80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8 0x00007f5ee3b966ba in start_thread (arg=0x7f5d38ff9700) at pthread_create.c:333
#9 0x00007f5ee2e2741d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
(gdb) p this
$6 = (brpc::SharedObject * const) 0x7f5e90041940
(gdb) p *this
$7 = {
_vptr.SharedObject = 0x0,
_nref = {
<std::atomic<int>> = {
<std::__atomic_base<int>> = {
static _S_alignment = 4,
_M_i = 0
}, <No data fields>}, <No data fields>}
}
代码:
brpc::ClosureGuard done_guard(done);
brpc::Controller* cntl = static_cast<brpc::Controller*>(controller);
........................
auto ppa = cntl->CreateProgressiveAttachment();
//start thread for transport
std::thread t([=]() {
butil::intrusive_ptr<brpc::ProgressiveAttachment> pa(ppa);
//non block I/O
fcntl(fd[0], F_SETFL, O_NONBLOCK);
fd_set rfdset;
while (true) {
FD_ZERO(&rfdset);
FD_SET(fd[0], &rfdset);
struct timeval tv;
tv.tv_sec = 30;
tv.tv_usec = 0;
int r = select(fd[0] + 1, &rfdset, nullptr, nullptr, &tv);
if (-1 == r && errno == EINTR) {
continue;
} else if (-1 == r) {
//error
LOG_ERROR("Wait for data error");
break;
} else if (0 == r) {
//timeout, no sdk data
LOG_ERROR("Wait for data timeout");
break;
} else {
//read data from pipe
char buf[4096];
int len = read(fd[0], buf, sizeof(buf));
if ((len < 0 && errno != EAGAIN) || (len == 0) || (len > 0 && pa->Write(buf, len) < 0)) {
break;
}
}
}
//finished
close(fd[1]);
close(fd[0]);
intptr_t jid = jobId;
sdk->StopDownloadRecord(jid);
LOG_INFO("The download is completed, dev {}, from {} to {}", devId, startTime, endTime);
});
t.detach()
To Reproduce (复现方法)
概率出现,不好复现
Expected behavior (期望行为)
大文件下载不会崩溃
Versions (各种版本)
OS: Linux 6c195b05683c 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Compiler: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)
brpc: commit b2cdefd
protobuf: libprotoc 3.2.0
Additional context/screenshots (更多上下文/截图)
Metadata
Metadata
Assignees
Labels
No labels