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

eval delete: move batching of deletes into RPC handler and state #15117

Merged
merged 7 commits into from
Nov 14, 2022

Commits on Nov 7, 2022

  1. eval delete: move batching of deletes into RPC handler and state

    During unusual outage recovery scenarios on large clusters, a backlog of
    millions of evaluatons can appear. In these cases, the `eval delete` command can
    put excessive load on the cluster by listing large sets of evals to extract the
    IDs and then sending larges batches of IDs. Although the command's batch size
    was carefully tuned, we still need to be JSON deserialize, reserialize to
    messagepack, send the log entries through raft, and get the FSM applied.
    
    To improve performance of this recovery case, move the batching process into the
    RPC handler and the state store. The design here is a little weird, so let's
    look a the failed options first:
    
    * A naive solution here would be to just send the filter as the raft request and
      let the FSM apply delete the whole set in a single operation. Benchmarking with
      1M evals on a 3 node cluster demonstrated this can block the FSM apply for
      several minutes, which puts the cluster at risk if there's a leadership
      failover (the barrier write can't be made while this apply is in-flight).
    
    * A less naive but still bad solution would be to have the RPC handler filter
      and paginate, and then hand a list of IDs to the existing raft log
      entry. Benchmarks showed this blocked the FSM apply for 20-30s at a time and
      took roughly an hour to complete.
    
    Instead, we're filtering and paginating in the RPC handler to find a page token,
    and then passing both the filter and page token in the raft log. The FSM apply
    recreates the paginator using the filter and page token to get roughly the same
    page of evaluations, which it then deletes. The pagination process is fairly
    cheap (only abut 5% of the total FSM apply time), so counter-intuitively this
    rework ends up being much faster. A benchmark of 1M evaluations showed this
    blocked the FSM apply for 20-30ms at a time (typical for normal operations) and
    completes in less than 4 minutes.
    
    Note that, as with the existing design, this delete is not consistent: a new
    evaluation inserted "behind" the cursor of the pagination will fail to be
    deleted.
    tgross committed Nov 7, 2022
    Configuration menu
    Copy the full SHA
    285d39f View commit details
    Browse the repository at this point in the history

Commits on Nov 9, 2022

  1. updated CLI to use Eval.Count

    tgross committed Nov 9, 2022
    Configuration menu
    Copy the full SHA
    58e426b View commit details
    Browse the repository at this point in the history
  2. minimum version check

    tgross committed Nov 9, 2022
    Configuration menu
    Copy the full SHA
    d71c26e View commit details
    Browse the repository at this point in the history

Commits on Nov 14, 2022

  1. Update nomad/eval_endpoint.go

    Co-authored-by: Michael Schurter <mschurter@hashicorp.com>
    tgross and schmichael committed Nov 14, 2022
    Configuration menu
    Copy the full SHA
    a93dbf4 View commit details
    Browse the repository at this point in the history
  2. remove unused flag

    tgross committed Nov 14, 2022
    Configuration menu
    Copy the full SHA
    12cb7ca View commit details
    Browse the repository at this point in the history
  3. docs update

    tgross committed Nov 14, 2022
    Configuration menu
    Copy the full SHA
    aa7239a View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    b71440a View commit details
    Browse the repository at this point in the history