Skip to content

Commit e2412ac

Browse files
committed
fix
1 parent 0a9a3b5 commit e2412ac

File tree

7 files changed

+134
-90
lines changed

7 files changed

+134
-90
lines changed

include/cos_sys_config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ class CosSysConfig {
159159
/// \brief 获取dns cache大小
160160
static unsigned GetDnsCacheSize();
161161

162+
static void SetRetryChangeDomain(bool retry_change_domain);
163+
164+
static bool GetRetryChangeDomain();
165+
162166
private:
163167
// 打印日志:0,不打印,1:打印到屏幕,2:打印到syslog
164168
static LOG_OUT_TYPE m_log_outtype;
@@ -209,6 +213,8 @@ class CosSysConfig {
209213
static unsigned m_dns_cache_expire_seconds;
210214
// dns cache大小
211215
static unsigned m_dns_cache_size;
216+
217+
static bool m_retry_change_domain;
212218
};
213219

214220
} // namespace qcloud_cos

include/util/retry_util.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef RETRT_UTIL_H
2+
#define RETRT_UTIL_H
3+
#include "op/cos_result.h"
4+
5+
namespace qcloud_cos {
6+
7+
class RetryUtil {
8+
public:
9+
static bool ShouldRetryWithChangeDomain(CosResult result);
10+
};
11+
} // namespace qcloud_cos
12+
13+
#endif

src/cos_api.cpp

Lines changed: 75 additions & 75 deletions
Large diffs are not rendered by default.

src/cos_sys_config.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ unsigned CosSysConfig::m_dns_cache_expire_seconds = 600;
5757
// dns cache大小
5858
unsigned CosSysConfig::m_dns_cache_size = 1000;
5959

60+
bool CosSysConfig::m_retry_change_domain = true;
61+
6062
std::mutex m_intranet_addr_lock;
6163
std::mutex m_dest_domain_lock;
6264

@@ -298,4 +300,11 @@ void CosSysConfig::SetDnsCacheSize(unsigned cache_size) {
298300

299301
unsigned CosSysConfig::GetDnsCacheSize() { return m_dns_cache_size; }
300302

303+
void CosSysConfig::SetRetryChangeDomain(bool retry_change_domain){
304+
m_retry_change_domain = retry_change_domain;
305+
}
306+
307+
bool CosSysConfig::GetRetryChangeDomain(){
308+
return m_retry_change_domain;
309+
}
301310
} // namespace qcloud_cos

src/op/bucket_op.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "op/bucket_op.h"
99
#include "cos_defines.h"
1010
#include "util/codec_util.h"
11+
#include "util/retry_util.h"
1112

1213
namespace qcloud_cos {
1314

@@ -18,7 +19,7 @@ bool BucketOp::IsBucketExist(const std::string& bucket_name) {
1819

1920
if (result.IsSucc()) {
2021
return true;
21-
}else if (UseDefaultDomain()){
22+
}else if (UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
2223
result = HeadBucket(req, &resp, COS_CHANGE_BACKUP_DOMAIN);
2324
if (result.IsSucc()) {
2425
return true;
@@ -604,7 +605,7 @@ CosResult BucketOp::ProcessReq(const BucketReq& req, BaseResp* resp,
604605
additional_headers.insert(std::make_pair("Content-MD5", raw_md5));
605606
CosResult result = NormalAction(host, path, req, additional_headers, additional_params,
606607
req_body, false, resp, is_ci_req);
607-
if(UseDefaultDomain() && (!result.IsSucc())){
608+
if(UseDefaultDomain() && (RetryUtil::ShouldRetryWithChangeDomain(result))){
608609
host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(),
609610
req.GetBucketName(),COS_CHANGE_BACKUP_DOMAIN);
610611
return NormalAction(host, path, req, additional_headers, additional_params,
@@ -613,7 +614,7 @@ CosResult BucketOp::ProcessReq(const BucketReq& req, BaseResp* resp,
613614
return result;
614615
} else {
615616
CosResult result = NormalAction(host, path, req, "", false, resp, is_ci_req);
616-
if(UseDefaultDomain() && (!result.IsSucc())){
617+
if(UseDefaultDomain() && (RetryUtil::ShouldRetryWithChangeDomain(result))){
617618
host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(),
618619
req.GetBucketName(),COS_CHANGE_BACKUP_DOMAIN);
619620
return NormalAction(host, path, req, "", false, resp, is_ci_req);

src/op/object_op.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#include "util/file_util.h"
4040
#include "util/http_sender.h"
4141
#include "util/string_util.h"
42-
42+
#include "util/retry_util.h"
4343
namespace qcloud_cos {
4444

4545
bool ObjectOp::IsObjectExist(const std::string& bucket_name,
@@ -49,7 +49,7 @@ bool ObjectOp::IsObjectExist(const std::string& bucket_name,
4949
CosResult result = HeadObject(req, &resp);
5050
if (result.IsSucc()) {
5151
return true;
52-
}else if (UseDefaultDomain()){
52+
}else if (UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
5353
result = HeadObject(req, &resp, COS_CHANGE_BACKUP_DOMAIN);
5454
if (result.IsSucc()) {
5555
return true;
@@ -372,7 +372,7 @@ CosResult ObjectOp::GetObject(const GetObjectByFileReq& req,
372372
handler->UpdateStatus(TransferStatus::COMPLETED, result, resp->GetHeaders(),
373373
resp->GetBody());
374374
} else if (handler) {
375-
if(!change_backup_domain && UseDefaultDomain()){
375+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
376376
handler->UpdateStatus(TransferStatus::RETRY, result);
377377
}else{
378378
handler->UpdateStatus(TransferStatus::FAILED, result);
@@ -384,7 +384,7 @@ CosResult ObjectOp::GetObject(const GetObjectByFileReq& req,
384384
CosResult ObjectOp::MultiGetObject(const GetObjectByFileReq& req,
385385
GetObjectByFileResp* resp) {
386386
CosResult result = MultiThreadDownload(req, resp);
387-
if(UseDefaultDomain() && (!result.IsSucc())){
387+
if(UseDefaultDomain() && (RetryUtil::ShouldRetryWithChangeDomain(result))){
388388
result = MultiThreadDownload(req, resp, nullptr , COS_CHANGE_BACKUP_DOMAIN);
389389
}
390390
return result;
@@ -444,7 +444,7 @@ CosResult ObjectOp::PutObject(const PutObjectByStreamReq& req,
444444
handler->UpdateStatus(TransferStatus::COMPLETED, result, resp->GetHeaders(),
445445
resp->GetBody());
446446
} else if(handler) {
447-
if(!change_backup_domain && UseDefaultDomain()){
447+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
448448
handler->UpdateStatus(TransferStatus::RETRY, result);
449449
}else{
450450
handler->UpdateStatus(TransferStatus::FAILED, result);
@@ -516,7 +516,7 @@ CosResult ObjectOp::PutObject(const PutObjectByFileReq& req,
516516
handler->UpdateStatus(TransferStatus::COMPLETED, result, resp->GetHeaders(),
517517
resp->GetBody());
518518
} else if (handler) {
519-
if(!change_backup_domain && UseDefaultDomain()){
519+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
520520
handler->UpdateStatus(TransferStatus::RETRY, result);
521521
}else{
522522
handler->UpdateStatus(TransferStatus::FAILED, result);
@@ -620,7 +620,7 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req,
620620
std::string err_msg = "Init multipart upload failed";
621621
SetResultAndLogError(init_result, err_msg);
622622
if (handler) {
623-
if(!change_backup_domain && UseDefaultDomain()){
623+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(init_result)){
624624
handler->UpdateStatus(TransferStatus::RETRY, init_result);
625625
}else{
626626
handler->UpdateStatus(TransferStatus::FAILED, init_result);
@@ -678,7 +678,7 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req,
678678
// return abort_result;
679679
// }
680680
if (handler) {
681-
if(!change_backup_domain && UseDefaultDomain()){
681+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(upload_result)){
682682
handler->UpdateStatus(TransferStatus::RETRY, upload_result);
683683
}else{
684684
handler->UpdateStatus(TransferStatus::FAILED, upload_result);
@@ -731,7 +731,7 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req,
731731
}
732732
} else {
733733
if (handler) {
734-
if(!change_backup_domain && UseDefaultDomain()){
734+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(comp_result)){
735735
handler->UpdateStatus(TransferStatus::RETRY);
736736
}else{
737737
handler->UpdateStatus(TransferStatus::FAILED);
@@ -1187,7 +1187,7 @@ ObjectOp::MultiThreadDownload(const GetObjectByFileReq& req,
11871187
SetResultAndLogError(
11881188
head_result, "failed to get object length before downloading object.");
11891189
if (handler) {
1190-
if(!change_backup_domain && UseDefaultDomain()){
1190+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
11911191
handler->UpdateStatus(TransferStatus::RETRY, head_result);
11921192
}else{
11931193
handler->UpdateStatus(TransferStatus::FAILED, head_result);
@@ -1809,7 +1809,7 @@ CosResult ObjectOp::AppendObject(const AppendObjectReq& req,
18091809
AppendObjectResp* resp) {
18101810
CosResult result = PutObject(static_cast<PutObjectByStreamReq>(req),
18111811
static_cast<PutObjectByStreamResp*>(resp));
1812-
if (UseDefaultDomain() && !result.IsSucc()){
1812+
if (UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
18131813
result = PutObject(static_cast<PutObjectByStreamReq>(req),
18141814
static_cast<PutObjectByStreamResp*>(resp),
18151815
nullptr,
@@ -1937,7 +1937,7 @@ CosResult ObjectOp::ResumableGetObject(const GetObjectByFileReq& req,
19371937
SetResultAndLogError(
19381938
head_result, "failed to get object length before downloading object.");
19391939
if (handler) {
1940-
if(!change_backup_domain && UseDefaultDomain()){
1940+
if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){
19411941
handler->UpdateStatus(TransferStatus::RETRY, head_result);
19421942
}else{
19431943
handler->UpdateStatus(TransferStatus::FAILED, head_result);

src/util/retry_util.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "util/retry_util.h"
2+
#include "cos_sys_config.h"
3+
4+
namespace qcloud_cos {
5+
6+
7+
bool RetryUtil::ShouldRetryWithChangeDomain(CosResult result) {
8+
if ((result.GetHttpStatus() != 200 && result.GetXCosRequestId().empty()) && CosSysConfig::GetRetryChangeDomain())
9+
{
10+
return true;
11+
}
12+
return false;
13+
}
14+
15+
} // namespace qcloud_cos

0 commit comments

Comments
 (0)