镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content
This repository was archived by the owner on Mar 6, 2026. It is now read-only.
This repository was archived by the owner on Mar 6, 2026. It is now read-only.

AuthMetadataPlugin: gRPC requires it to not block; causes timeouts to not be respected #351

Closed

Description

@evanj

The gRPC documentation for AuthMetadataPlugin.__call__ states: "Implementations of this method must not block." Unfortunately, google.auth.transport.grpc.AuthMetadataPlugin violates this requirement. I believe this causes all gRPC calls using one instance of AuthMetadataPlugin to be blocked as long as token refreshing is happening. This may be causing occasional errors where the timeout we pass to Google Cloud API calls is not being respected, since the calls are all blocked waiting on the OAuth token to be refreshed.

Possible fix

It seems likely this plugin needs to do OAuth token refreshing using a thread pool, like the grpc._auth.GoogleCallCredentials implementation does. This will have the side benefit of not having multiple threads "race" to refresh the credentials quite as much.

A quick-and-dirty "fix" that would reduce the impact of this error would be to add a timeout on the token refreshing requests. This is probably a good idea anyway. However, this would at least ensure the "impact" of slow/blocked token refreshes is minimized. On our case, we have seen processes that may have been "stuck" for ~15 minutes due to this issue.

Blocking call path

When using google.api_core.grpc_helpers.create_channel, which seems to be what is used by Google's generated GAPIC clients:

  1. gRPC calls google.auth.transport.grpc.AuthMetadataPlugin.__call__(...)
  2. Calls google.auth.transport.grpc.AuthMetadataPlugin._get_authorization_headers(...)
  3. Calls self._credentials.before_request(...) which is google.auth.credentials.Credentials.before_request
  4. If the credentials have expired, it calls self.refresh(...). In the case of service accounts, this is a google.oauth2.service_account.Credentials object.
  5. Calls _client.jwt_grant(...) which calls _token_endpoint_request(...)
  6. Calls request(...) which is an instance of google.auth.transport.requests.Request
  7. This calls in to the requests API, which eventually makes a blocking HTTP request.

Activity

  1. changed the title [-]AuthMetadataPlugin: gRPC requires it to not blocks; causes timeouts to not be respected[/-] [+]AuthMetadataPlugin: gRPC requires it to not block; causes timeouts to not be respected[/+] on Jul 15, 2019
  2. self-assigned this
    on Jul 15, 2019
  3. added
    priority: p2Moderately-important priority. Fix may not be included in next release.
    type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.
    on Aug 6, 2019
  4. self-assigned this
    on Nov 20, 2019
  5. michaelawyu commented on Nov 20, 2019

    @michaelawyu
    Contributor

    Thanks, @evanj!

    A PR has been sent (#389).

  6. added a commit that references this issue on Nov 25, 2019
    0c33e9c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

🚨This issue needs some love.priority: p2Moderately-important priority. Fix may not be included in next release.type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions