Skip to content

Commit 6b9c4f0

Browse files
authored
Merge pull request #670 from atlanhq/APP-7350
APP-7350: Fixed auto `401` token refresh (lets use `ContextVar` for bool flag to avoid race condition)
2 parents f7ae057 + f9f31b0 commit 6b9c4f0

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

pyatlan/client/atlan.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class AtlanClient(BaseSettings):
143143
connect_timeout: float = 30.0 # 30 secs
144144
read_timeout: float = 900.0 # 15 mins
145145
retry: Retry = DEFAULT_RETRY
146-
_401_has_retried: bool = PrivateAttr(default=False)
146+
_401_has_retried: bool = ContextVar("_401_has_retried", default=False)
147147
_session: requests.Session = PrivateAttr(default_factory=get_session)
148148
_request_params: dict = PrivateAttr()
149149
_user_id: Optional[str] = PrivateAttr(default=None)
@@ -188,7 +188,7 @@ def __init__(self, **data):
188188
adapter = HTTPAdapter(max_retries=self.retry)
189189
session.mount(HTTPS_PREFIX, adapter)
190190
session.mount(HTTP_PREFIX, adapter)
191-
self._401_has_retried = False
191+
self._401_has_retried.set(False)
192192

193193
@property
194194
def admin(self) -> AdminClient:
@@ -411,11 +411,11 @@ def _call_api_internal(
411411
# - But if the next response is != 401 (e.g. 403), and `has_retried = True`,
412412
# then we should reset `has_retried = False` so that future 401s can trigger a new token refresh.
413413
if (
414-
self._401_has_retried
414+
self._401_has_retried.get()
415415
and response.status_code
416416
!= ErrorCode.AUTHENTICATION_PASSTHROUGH.http_error_code
417417
):
418-
self._401_has_retried = False
418+
self._401_has_retried.set(False)
419419

420420
if response.status_code == api.expected_status:
421421
try:
@@ -511,7 +511,7 @@ def _call_api_internal(
511511
# on authentication failure (token may have expired)
512512
if (
513513
self._user_id
514-
and not self._401_has_retried
514+
and not self._401_has_retried.get()
515515
and response.status_code
516516
== ErrorCode.AUTHENTICATION_PASSTHROUGH.http_error_code
517517
):
@@ -673,7 +673,7 @@ def _handle_401_token_refresh(
673673
)
674674
raise
675675
self.api_key = new_token
676-
self._401_has_retried = True
676+
self._401_has_retried.set(True)
677677
params["headers"]["authorization"] = f"Bearer {self.api_key}"
678678
self._request_params["headers"]["authorization"] = f"Bearer {self.api_key}"
679679
LOGGER.debug("Successfully completed 401 automatic token refresh.")

0 commit comments

Comments
 (0)