From a1d2f31131d79d7c551dbac4fc1e9c4d177d2df5 Mon Sep 17 00:00:00 2001
From: Tim Burke <tim.burke@gmail.com>
Date: Wed, 17 Aug 2022 16:58:36 -0700
Subject: [PATCH] Enable retry_on_ratelimit by default

UpgradeImpact
=============
The Connection class now enables retry_on_ratelimit by default.
If you need to return to the old behavior, explicitly pass
retry_on_ratelimit=False as a keyword arg.

The SwiftService class will now enables the retry_on_ratelimit option by
default. If you need to return to the old behavior, explicitly set it to
false in your options dict.

Change-Id: I3221fda84f0b8031c50128aa600e2c19deb5b102
---
 swiftclient/client.py         | 8 ++++----
 swiftclient/service.py        | 3 +++
 test/unit/test_swiftclient.py | 3 ++-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/swiftclient/client.py b/swiftclient/client.py
index a9130ab5..8415db22 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -1654,7 +1654,7 @@ class Connection:
                  starting_backoff=1, max_backoff=64, tenant_name=None,
                  os_options=None, auth_version="1", cacert=None,
                  insecure=False, cert=None, cert_key=None,
-                 ssl_compression=True, retry_on_ratelimit=False,
+                 ssl_compression=True, retry_on_ratelimit=True,
                  timeout=None, session=None, force_auth_retry=False):
         """
         :param authurl: authentication URL
@@ -1686,9 +1686,9 @@ class Connection:
                                 will be made. This may provide a performance
                                 increase for https upload/download operations.
         :param retry_on_ratelimit: by default, a ratelimited connection will
-                                   raise an exception to the caller. Setting
-                                   this parameter to True will cause a retry
-                                   after a backoff.
+                                   retry after a backoff. Setting this
+                                   parameter to False will cause an exception
+                                   to be raised to the caller.
         :param timeout: The connect timeout for the HTTP connection.
         :param session: A keystoneauth session object.
         :param force_auth_retry: reset auth info even if client got unexpected
diff --git a/swiftclient/service.py b/swiftclient/service.py
index 9d9fc594..545ea47f 100644
--- a/swiftclient/service.py
+++ b/swiftclient/service.py
@@ -155,6 +155,7 @@ def _build_default_global_options():
         "user": environ.get('ST_USER'),
         "key": environ.get('ST_KEY'),
         "retries": 5,
+        "retry_on_ratelimit": True,
         "force_auth_retry": False,
         "os_username": environ.get('OS_USERNAME'),
         "os_user_id": environ.get('OS_USER_ID'),
@@ -270,10 +271,12 @@ def get_conn(options):
     """
     Return a connection building it from the options.
     """
+    options = dict(_default_global_options, **options)
     return Connection(options['auth'],
                       options['user'],
                       options['key'],
                       timeout=options.get('timeout'),
+                      retry_on_ratelimit=options['retry_on_ratelimit'],
                       retries=options['retries'],
                       auth_version=options['auth_version'],
                       os_options=options['os_options'],
diff --git a/test/unit/test_swiftclient.py b/test/unit/test_swiftclient.py
index ad2af50c..436245d8 100644
--- a/test/unit/test_swiftclient.py
+++ b/test/unit/test_swiftclient.py
@@ -2149,7 +2149,8 @@ class TestConnection(MockHttpTest):
         c.http_connection = self.fake_http_connection(
             200, 498,
             headers=auth_resp_headers)
-        conn = c.Connection('http://www.test.com/auth/v1.0', 'asdf', 'asdf')
+        conn = c.Connection('http://www.test.com/auth/v1.0', 'asdf', 'asdf',
+                            retry_on_ratelimit=False)
         with self.assertRaises(c.ClientException) as exc_context:
             conn.head_account()
         self.assertIn('Account HEAD failed', str(exc_context.exception))