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 } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy