Skip to content
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

parser: limit maximum number of tokens #3702

Merged
merged 1 commit into from
Aug 16, 2022

Commits on Aug 16, 2022

  1. parser: limit maximum number of tokens

    Backport of graphql#3684
    Motivation: Parser CPU and memory usage is linear to the number of tokens in a
    document however in extreme cases it becomes quadratic due to memory exhaustion.
    On my mashine it happens on queries with 2k tokens.
    For example:
    ```
    { a a <repeat 2k times> a }
    ```
    It takes 741ms on my machine.
    But if we create document of the same size but smaller number of
    tokens it would be a lot faster.
    Example:
    ```
    { a(arg: "a <repeat 2k times> a" }
    ```
    Now it takes only 17ms to process, which is 43 time faster.
    
    That mean if we limit document size we should make this limit small
    since it take only two bytes to create a token, e.g. ` a`.
    But that will hart legit documents that have long tokens in them
    (comments, describtions, strings, long names, etc.).
    
    That's why this PR adds a mechanism to limit number of token in
    parsed document.
    Also exact same mechanism implemented in graphql-java, see:
    graphql-java/graphql-java#2549
    
    I also tried alternative approach of counting nodes and it gives
    slightly better approximation of how many resources would be consumed.
    However comparing to the tokens, AST nodes is implementation detail of graphql-js
    so it's imposible to replicate in other implementation (e.g. to count
    this number on a client).
    
    * Apply suggestions from code review
    
    Co-authored-by: Yaacov Rydzinski  <yaacovCR@gmail.com>
    
    Co-authored-by: Yaacov Rydzinski  <yaacovCR@gmail.com>
    IvanGoncharov and yaacovCR committed Aug 16, 2022
    Configuration menu
    Copy the full SHA
    d582854 View commit details
    Browse the repository at this point in the history