diff --git a/lib/ansible/modules/cloud/amazon/rds.py b/lib/ansible/modules/cloud/amazon/rds.py index f29942168f2..e3edeccf1dc 100644 --- a/lib/ansible/modules/cloud/amazon/rds.py +++ b/lib/ansible/modules/cloud/amazon/rds.py @@ -313,6 +313,8 @@ EXAMPLES = ''' import sys import time +from ansible.module_utils.ec2 import AWSRetry + try: import boto.rds HAS_BOTO = True @@ -650,23 +652,31 @@ class RDS2Snapshot: def await_resource(conn, resource, status, module): - wait_timeout = module.params.get('wait_timeout') + time.time() + start_time = time.time() + wait_timeout = module.params.get('wait_timeout') + start_time + check_interval = 5 while wait_timeout > time.time() and resource.status != status: - time.sleep(5) + time.sleep(check_interval) if wait_timeout <= time.time(): module.fail_json(msg="Timeout waiting for RDS resource %s" % resource.name) if module.params.get('command') == 'snapshot': # Temporary until all the rds2 commands have their responses parsed if resource.name is None: module.fail_json(msg="There was a problem waiting for RDS snapshot %s" % resource.snapshot) - resource = conn.get_db_snapshot(resource.name) + # Back off if we're getting throttled, since we're just waiting anyway + resource = AWSRetry.backoff(tries=5, delay=20, backoff=1.5)(conn.get_db_snapshot)(resource.name) else: # Temporary until all the rds2 commands have their responses parsed if resource.name is None: module.fail_json(msg="There was a problem waiting for RDS instance %s" % resource.instance) - resource = conn.get_db_instance(resource.name) + # Back off if we're getting throttled, since we're just waiting anyway + resource = AWSRetry.backoff(tries=5, delay=20, backoff=1.5)(conn.get_db_instance)(resource.name) if resource is None: break + # Some RDS resources take much longer than others to be ready. Check + # less aggressively for slow ones to avoid throttling. + if time.time() > start_time + 90: + check_interval = 20 return resource