in alibabacloud_credentials/provider/refreshable.py [0:0]
def _handle_fetched_success(self, value: RefreshResult[T]) -> RefreshResult[T]:
log.debug(f'Refresh credentials successfully, retrieved value is {value}, cached value is {self._cached_value}')
self._consecutive_refresh_failures = 0
now = int(time.mktime(time.localtime()))
# 过期时间大于15分钟,不用管
if now < value.stale_time():
log.debug(
f'Retrieved value stale time is {datetime.fromtimestamp(value.stale_time())}. Using staleTime of {datetime.fromtimestamp(value.stale_time())}')
return value
# 不足或等于15分钟,但未过期,下次会再次刷新
if now < value.stale_time() + RefreshCachedSupplier.STALE_TIME:
log.warning(
f'Retrieved value stale time is in the past ({datetime.fromtimestamp(value.stale_time())}). Using staleTime of {datetime.fromtimestamp(now)}')
return RefreshResult(value=value.value(), stale_time=now, prefetch_time=value.prefetch_time())
log.warning(
f'Retrieved value expiration time of the credential is in the past ({datetime.fromtimestamp(value.stale_time() + RefreshCachedSupplier.STALE_TIME)}). Trying use the cached value.')
# 已过期,看缓存,缓存若大于15分钟,返回缓存,若小于15分钟,则根据策略判断是立刻重试还是稍后重试
if self._cached_value is None:
raise CredentialException('No cached value was found.')
elif now < self._cached_value.stale_time():
log.warning(
f'Cached value staleTime is {datetime.fromtimestamp(self._cached_value.stale_time())}. Using staleTime of {datetime.fromtimestamp(self._cached_value.stale_time())}')
return self._cached_value
elif self._stale_value_behavior == StaleValueBehavior.STRICT:
log.warning(
f'Cached value expiration is in the past ({datetime.fromtimestamp(self._cached_value.stale_time())}). Using expiration of {datetime.fromtimestamp(now + 1)}')
return RefreshResult(value=self._cached_value.value(), stale_time=now + 1,
prefetch_time=self._cached_value.prefetch_time())
else: # ALLOW
extended_stale_time = now + int((50 * 1000 + random.randint(0, 20 * 1000 + 1)) / 1000)
log.warning(
f'Cached value expiration has been extended to {datetime.fromtimestamp(extended_stale_time)} because the downstream service returned a time in the past: {datetime.fromtimestamp(self._cached_value.stale_time())}')
return RefreshResult(value=self._cached_value.value(), stale_time=extended_stale_time,
prefetch_time=self._cached_value.prefetch_time())