diff --git a/tencentcloud/resource_tc_mongodb_instance.go b/tencentcloud/resource_tc_mongodb_instance.go index c266154d8b..3e597c89d9 100644 --- a/tencentcloud/resource_tc_mongodb_instance.go +++ b/tencentcloud/resource_tc_mongodb_instance.go @@ -506,7 +506,7 @@ func resourceTencentCloudMongodbInstanceDelete(d *schema.ResourceData, meta inte if err != nil { return err } - err = mongodbService.OfflineIsolatedDBInstance(ctx, instanceId) + err = mongodbService.OfflineIsolatedDBInstance(ctx, instanceId, true) if err != nil { log.Printf("[CRITAL]%s mongodb %s fail, reason:%s", logId, "OfflineIsolatedDBInstance", err.Error()) return err diff --git a/tencentcloud/resource_tc_mongodb_instance_test.go b/tencentcloud/resource_tc_mongodb_instance_test.go index 20a40542fd..53ecef7a5b 100644 --- a/tencentcloud/resource_tc_mongodb_instance_test.go +++ b/tencentcloud/resource_tc_mongodb_instance_test.go @@ -50,7 +50,7 @@ func init() { log.Printf("Offline isolated instance %v", isolated) for _, id := range isolated { - err = service.OfflineIsolatedDBInstance(ctx, id) + err = service.OfflineIsolatedDBInstance(ctx, id, true) if err != nil { continue } @@ -89,6 +89,16 @@ func TestAccTencentCloudMongodbInstanceResourcePostPaid(t *testing.T) { ), }, { + ResourceName: "tencentcloud_mongodb_instance.mongodb", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"security_groups", "password", "auto_renew_flag"}, + }, + { + SkipFunc: func() (bool, error) { + log.Printf("[WARN] MongoDB Update Need DealID query available, skip checking.") + return true, nil + }, Config: testAccMongodbInstance_update, Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr("tencentcloud_mongodb_instance.mongodb", "instance_name", "tf-mongodb-update"), @@ -98,12 +108,6 @@ func TestAccTencentCloudMongodbInstanceResourcePostPaid(t *testing.T) { resource.TestCheckResourceAttr("tencentcloud_mongodb_instance.mongodb", "tags.abc", "abc"), ), }, - { - ResourceName: "tencentcloud_mongodb_instance.mongodb", - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"security_groups", "password", "auto_renew_flag"}, - }, }, }) } diff --git a/tencentcloud/resource_tc_mongodb_sharding_instance.go b/tencentcloud/resource_tc_mongodb_sharding_instance.go index 9d8af992c6..c46b9b3f65 100644 --- a/tencentcloud/resource_tc_mongodb_sharding_instance.go +++ b/tencentcloud/resource_tc_mongodb_sharding_instance.go @@ -512,7 +512,7 @@ func resourceMongodbShardingInstanceDelete(d *schema.ResourceData, meta interfac if err != nil { return err } - err = mongodbService.OfflineIsolatedDBInstance(ctx, instanceId) + err = mongodbService.OfflineIsolatedDBInstance(ctx, instanceId, true) if err != nil { log.Printf("[CRITAL]%s mongodb %s fail, reason:%s", logId, "OfflineIsolatedDBInstance", err.Error()) return err diff --git a/tencentcloud/resource_tc_mongodb_standby_instance.go b/tencentcloud/resource_tc_mongodb_standby_instance.go index 1fc4af50bd..ee81f49a87 100644 --- a/tencentcloud/resource_tc_mongodb_standby_instance.go +++ b/tencentcloud/resource_tc_mongodb_standby_instance.go @@ -554,7 +554,7 @@ func resourceTencentCloudMongodbStandbyInstanceDelete(d *schema.ResourceData, me if err != nil { return err } - err = mongodbService.OfflineIsolatedDBInstance(ctx, instanceId) + err = mongodbService.OfflineIsolatedDBInstance(ctx, instanceId, true) if err != nil { log.Printf("[CRITAL]%s mongodb %s fail, reason:%s", logId, "OfflineIsolatedDBInstance", err.Error()) return err diff --git a/tencentcloud/service_tencentcloud_mongodb.go b/tencentcloud/service_tencentcloud_mongodb.go index ef09773a1a..0ebfbdeede 100644 --- a/tencentcloud/service_tencentcloud_mongodb.go +++ b/tencentcloud/service_tencentcloud_mongodb.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "strings" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" @@ -293,7 +294,7 @@ func (me *MongodbService) DescribeAsyncRequestInfo(ctx context.Context, asyncId logId := getLogId(ctx) request := mongodb.NewDescribeAsyncRequestInfoRequest() request.AsyncRequestId = &asyncId - err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + err := resource.Retry(readRetryTimeout*3, func() *resource.RetryError { ratelimit.Check(request.GetAction()) result, e := me.client.UseMongodbClient().DescribeAsyncRequestInfo(request) if e != nil { @@ -315,7 +316,7 @@ func (me *MongodbService) DescribeAsyncRequestInfo(ctx context.Context, asyncId return nil } -func (me *MongodbService) OfflineIsolatedDBInstance(ctx context.Context, instanceId string) (errRet error) { +func (me *MongodbService) OfflineIsolatedDBInstance(ctx context.Context, instanceId string, timeOutTolerant bool) (errRet error) { logId := getLogId(ctx) request := mongodb.NewOfflineIsolatedDBInstanceRequest() request.InstanceId = &instanceId @@ -330,27 +331,26 @@ func (me *MongodbService) OfflineIsolatedDBInstance(ctx context.Context, instanc ratelimit.Check(request.GetAction()) response, err = me.client.UseMongodbClient().OfflineIsolatedDBInstance(request) if err != nil { - if ee, ok := err.(*sdkErrors.TencentCloudSDKError); ok { - if ee.Code == "InvalidParameterValue.LockFailed" { - return resource.RetryableError(err) - } else { - return resource.NonRetryableError(err) - } - } - log.Printf("[CRITAL]%s api[%s] fail, reason:%s", logId, request.GetAction(), err.Error()) - return resource.NonRetryableError(err) + return retryError(err, mongodb.INVALIDPARAMETERVALUE_LOCKFAILED) } return nil }) if err != nil { return err } - if response != nil && response.Response != nil { - if err = me.DescribeAsyncRequestInfo(ctx, *response.Response.AsyncRequestId); err != nil { - return err - } - } log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - return nil + if response == nil || response.Response == nil { + return nil + } + err = me.DescribeAsyncRequestInfo(ctx, *response.Response.AsyncRequestId) + if err == nil { + return nil + } + isTimeout := strings.Contains(err.Error(), "retrying") + if err != nil && isTimeout && timeOutTolerant { + log.Printf("[WARN] Offline Task Timeout but tolerant, process continue.") + return nil + } + return err }