aliyun / aliyun-oss-cpp-sdk

Aliyun OSS SDK for C++
Other
184 stars 88 forks source link

多线程上传多个mp4 崩溃 std::map find #90

Open yondu202 opened 3 years ago

yondu202 commented 3 years ago

SDK 外部使用多线程上传多个 mp4 文件,有一定概率崩溃,崩溃在 std::map find 中

1、SDK 版本 1.9.0; 2、VS2013 3、每个线程一个 OssClient 4、调用栈信息 STACK_TEXT:
1249d094 5fd799b5 1249e4a4 1249e4a4 1249e4a4 alibabacloud_oss_cpp_sdk!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,std::less<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > >,0> >::_Lbound+0xe 1249d0d4 5fd6b4a3 1249d154 1249e4a4 1444c519 alibabacloud_oss_cpp_sdk!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,std::less<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > >,0> >::find+0x15 1249e4cc 5fd24fe6 1249f928 1444c489 1c30b318 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::LookupMimeType+0x11b3 1249e55c 5fcc2d93 1249e584 1444c401 00000000 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::InitiateMultipartUploadRequest::specialHeaders+0xd6 1249e5d4 5fcb9dee 1249e5e4 1444c6c1 1444c675 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::OssRequest::Headers+0x43 1249e714 5fcc6091 1249e750 196166c0 1249f8b0 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::OssClientImpl::buildHttpRequest+0x11e 1249e820 5fcc5be8 1249e8a4 196166c0 1249f8b0 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::Client::AttemptOnceRequest+0x171 1249e8fc 5fcba99d 1249eafc 196166c0 1249f8b0 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::Client::AttemptRequest+0x68 1249eb54 5fcb4353 1249ee34 1249f8b0 00000002 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::OssClientImpl::MakeRequest+0x28d 1249ef08 5fc61ac9 1249f480 1249f8b0 196165a0 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::OssClientImpl::InitiateMultipartUpload+0x53 1249ef24 0054de32 1249f480 1249f8b0 f1074ad3 alibabacloud_oss_cpp_sdk!AlibabaCloud::OSS::OssClient::InitiateMultipartUpload+0x29

FAULTING_SOURCE_CODE:
2085: } 2086: 2087: _Nodeptr _Lbound(const key_type& _Keyval) const 2088: { // find leftmost node not less than _Keyval 2089: _Nodeptr _Pnode = _Root(); 《======= 此处为崩溃位置 2090: _Nodeptr _Wherenode = this->_Myhead; // end() if search fails 2091: 2092: while (!this->_Isnil(_Pnode)) 2093: if (_DEBUG_LT_PRED(this->_Getcomp(), this->_Key(_Pnode), _Keyval)) 2094: _Pnode = this->_Right(_Pnode); // descend right subtree

huiguangjun commented 3 years ago

写了个测试代码,在 2013上没有复现 这个问题。 static void runSingleTask() { ClientConfiguration conf; auto client = new OssClient("endpoint", "accessKeyId", "accessKeySecret", conf); while (true) { auto request = InitiateMultipartUploadRequest("test-bucket-name", "test.mp4"); auto outcome = client->InitiateMultipartUpload(request); if (outcome.isSuccess()) { client->AbortMultipartUpload(AbortMultipartUploadRequest("test-bucket", "test.mp4",outcome.result().UploadId())); } //std::this_thread::sleep_for(std::chrono::microseconds(100)); } }

{ ... std::vector<std::future> taskVec; for (int i = 0; i < 10; i++) { auto task = std::async(std::launch::async, runSingleTask); taskVec.emplace_back(std::move(task)); }

for (int i = 0; i < 10; i++) {
    taskVec[i].get();
}
...

}

huiguangjun commented 3 years ago

能否在你的环境上帮忙做个测试: 把 aliyun-oss-cpp-sdk/sdk/src/utils/Utils.cc::LookupMimeType 里的 mimeType 移到函数外定义?

类似如下: const static std::map<std::string, std::string> mimeType = { ... }; const std::string& AlibabaCloud::OSS::LookupMimeType(const std::string &name) { const static std::string defaultType("application/octet-stream"); ... }