diff --git a/.changelog/3311.txt b/.changelog/3311.txt new file mode 100644 index 0000000000..8cc2c558e6 --- /dev/null +++ b/.changelog/3311.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_cos_bucket: Optimize multi zone deletion +``` \ No newline at end of file diff --git a/tencentcloud/services/cos/service_tencentcloud_cos.go b/tencentcloud/services/cos/service_tencentcloud_cos.go index 5e05f7e737..0827151e78 100644 --- a/tencentcloud/services/cos/service_tencentcloud_cos.go +++ b/tencentcloud/services/cos/service_tencentcloud_cos.go @@ -397,17 +397,26 @@ func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versi return fmt.Errorf("cos force clean object error: the list of objects is truncated and the bucket[%s] needs to be deleted manually!!!", bucket) } + // Get all object list + listObjects, err := me.ListObjects(ctx, bucket) + if err != nil { + log.Printf("[CRITAL]%s api[%s] fail, resp body [%s], reason[%s]\n", + logId, "ListObjects", resp.Body, err.Error()) + return fmt.Errorf("cos force clean object error: %s, bucket: %s", err.Error(), bucket) + } + verCnt := len(objList.Version) markerCnt := len(objList.DeleteMarker) - log.Printf("[DEBUG][ForceCleanObject]%s api[%s] success, get [%v] versions of object, get [%v] deleteMarker, versioned[%v].\n", logId, "GetObjectVersions", verCnt, markerCnt, versioned) + listObjCnt := len(listObjects) + log.Printf("[DEBUG][ForceCleanObject]%s api[%s] success, get [%v] versions of object, get [%v] deleteMarker, get [%v] listObjects. versioned[%v], multiAzed[%v].\n", logId, "GetObjectVersions", verCnt, markerCnt, listObjCnt, versioned, multiAz) - delCnt := verCnt + markerCnt + delCnt := verCnt + markerCnt + listObjCnt if delCnt == 0 { return nil } delObjs := make([]cos.Object, 0, delCnt) - if versioned || multiAz { + if versioned { //add the versions for _, v := range objList.Version { delObjs = append(delObjs, cos.Object{ @@ -430,8 +439,19 @@ func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versi } } + if multiAz { + // add obj list + for _, v := range listObjects { + if v.Key != nil { + delObjs = append(delObjs, cos.Object{ + Key: *v.Key, + }) + } + } + } + opt := cos.ObjectDeleteMultiOptions{ - Quiet: true, + Quiet: false, Objects: delObjs, } @@ -482,6 +502,34 @@ func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versi log.Printf("[DEBUG][ForceCleanObject]%s api[%s] success, [%v] objects have been cleaned.\n", logId, "ForceCleanObject", len(result.DeletedObjects)) + + // wait + fmt.Println(11111111111) + fmt.Println(11111111111) + fmt.Println(11111111111) + fmt.Println(11111111111) + fmt.Println(11111111111) + err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + listObjects, e := me.ListObjects(ctx, bucket) + if e != nil { + log.Printf("[CRITAL]%s api[%s] fail, resp body [%s], reason[%s]\n", + logId, "ListObjects", resp.Body, e.Error()) + return tccommon.RetryError(e) + } + + listObjCount := len(listObjects) + if listObjCount == 0 { + return nil + } + + return resource.RetryableError(fmt.Errorf("waiting objects deleting. still has %d item. retry...", listObjCount)) + }) + + if err != nil { + log.Printf("[CRITAL]%s get COS objects failed, reason:%+v", logId, err) + return err + } + return nil }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: