• Patrick Steinhardt's avatar
    git_access: Use batched new blobs check · f73f0c7b
    Patrick Steinhardt authored
    The Git access checks support checking the size of pushed objects. If we
    have a quarantine environment (which is always the case when access
    checks are executed via `git receive-pack`'s hooks), then we simply
    derive the size from the quarantined objects. Otherwise, we use
    `get_new_blobs`, which does a `git rev-list $REVISION --not --all`.
    
    Using git-rev-list(1) with `--not --all` can be a very expensive
    operation depending on the repository's shape. Especially when it's a
    biggish monorepo with lots of references, this query can easily take
    tens of seconds. Given that we call the RPC once per change, this thus
    roughly scales `O(len(changes) * len(existing_refs))`.
    
    To improve this situation, Gitaly has implemented a new `list_blobs()`
    RPC which takes a set of revisions. Like this, we can batch all calls
    into a single one and thus avoid some of the overhead if there are
    multiple changes at once. The new code which does that is currently
    implemented behind a feature flag.
    
    Changelog: performance
    f73f0c7b
git_access_snippet_spec.rb 15 KB