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 }