Skip to content

h2传输大文件概率崩溃 #619

@lzk90s

Description

@lzk90s

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions