New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: enable pre-emptive async oauth token refreshes #646
Merged
igorbernstein2
merged 21 commits into
googleapis:master
from
igorbernstein2:async-refresh
May 20, 2021
Merged
feat: enable pre-emptive async oauth token refreshes #646
igorbernstein2
merged 21 commits into
googleapis:master
from
igorbernstein2:async-refresh
May 20, 2021
Commits on Apr 29, 2021
-
feat: add pre-emptive async oauth token refreshes
This is currently a rough sketch and should not be merged. I just wanted to get some feedback here. The current implementation of oauth refresh offloads the IO to a separate executor, however when a token expires, all calls to getRequestMetadata would hang until the token is refreshed. This PR is a rough sketch to improve the situation by adding a stale state to token. If a token is within a minute of expiration, the first request to notice this, will spawn a refresh on the executor and immediately return with the existing token. This avoids hourly latency spikes for grpc. The implementation uses guava's ListenableFutures to manage the async refresh state. Although the apis are marked BetaApi in guava 19, they are GA in guava 30 * The class introduces 3 distinct states: * Expired - the token is not usable * Stale - the token is useable, but its time to refresh * Fresh - token can be used without any extra effort * All of the funtionality of getRequestMetadata has been extracted to asyncFetch. The new function will check if the token is unfresh and schedule a refresh using the executor * asyncFetch uses ListenableFutures to wrap state: if the token is not expired, an immediate future is returned. If the token is expired the future of the refresh task is returned * A helper refreshAsync & finishRefreshAsync are also introduced. They schedule the actual refresh and propagate the side effects * To handle blocking invocation: the async functionality is re-used but a DirectExecutor is used. All ExecutionErrors are unwrapped. In most cases the stack trace will be preserved because of the DirectExecutor. However if the async & sync methods are interleaved, it's possible that a sync call will await an async refresh task. In this case the callers stacktrace will not be present.
-
Commits on Apr 30, 2021
Commits on May 3, 2021
-
prep for merging with master: The initial async refresh feature was i…
…mplemented on top of 0.8, so now I'm backporting features to minimize the merge conflicts
-
-
in blocking mode, when a token is stale, only block the first caller …
…and allow subsequent callers to use the stale token
-
-
-
-
Commits on May 4, 2021
Commits on May 5, 2021
Commits on May 10, 2021
Commits on May 12, 2021
Commits on May 13, 2021
Commits on May 19, 2021
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.