GitHub GraphQL ratelimit is not respected
Created by: eseliger
The calls to the GitHub GraphQL API in our GitHub client code don't respect the rate limit imposed on us by them.
Problems this causes:
- The reconciler can run into rate limiting issues
- Listing repos can fail
- Syncing changesets in the background can fail (but we do have a self-imposed rate limit here AFAIK)
What we observed so far:
- We do have two rate limiters in the client, one self imposed
rateLimiter, one based on GitHubs rate limitrateLimitMonitor - The
rateLimitertracks GraphQL and REST calls in the same bucket, although they likely have separate rate limits (to be confirmed) - The
rateLimitMonitoris updated by passing in the response headers, but GraphQL doesn't return those, but exposes the fields through the response - Querying the
rateLimitproperty throughGraphQLseems to be cost neutral, against the docs which state it always at least costs 1 token - The
rateLimiteris global to repo-updater and hence being used in the reconciler -
rateLimitMonitoris not shared globally - Reconciler fails with rate limit errors, making the changeset end up in the errored state, but it will be retried eventually.
Ideas for a solution:
- Make the
rateLimitMonitoralso update from GraphQL results - Use the
rateLimitMonitorin therequestGraphQLmethod on the client, not only explicitly at certain places - Add a function on the monitor to take the suggested rate limit out of the values reported by the monitor PLUS the one of our internal rate limiter
- Make the
rateLimitMonitorglobally shared, so new clients still know about the previous requests limits
Future improvements:
- Merge the monitor and internal rate limiter into a single structure that can account for the combined limitation of both (and split across GraphQL and REST rate limits)
- Do proper timeouts and timeout error handling on the reconciler so these become enqueued back without erroring
cc @mrnugget @ryanslade