HomePhabricator

Improve performance when marking commits as unreachable after multiple ref…

Description

Improve performance when marking commits as unreachable after multiple ref deletions

Summary:
See PHI1688. If many refs with a large amount of shared ancestry are deleted from a repository, we can spend much longer than necessary marking their mutual ancestors as unreachable over and over again.

For example, if refs A, B and C all point near the head of an obsolete "develop" branch and have about 1K shared commits reachable from no other refs, deleting all three refs will lead to us performing 3,000 mark-as-unreachable operations (once for each "<ref, commit>" pair).

Instead, we can stop exploring history once we reach an already-unreachable commit.

Test Plan:

  • Destroyed 7 similar refs simultaneously.
  • Ran bin/repository refs, saw 7 entries appear in the oldref table.
  • Ran bin/repository discover with some debugging statements added, saw sensible-seeming behavior which didn't double-mark any newly-unreachable refs.

Differential Revision: https://secure.phabricator.com/D21056

Details

Provenance
epriestleyAuthored on Apr 3 2020, 8:18 PM
epriestleyPushed on Apr 3 2020, 8:29 PM
Differential Revision
D21056: Improve performance when marking commits as unreachable after multiple ref deletions
Parents
rPff6f24db2bc0: (stable) Promote 2020 Week 6
Branches
Unknown
Tags
Unknown
Build Status
Buildable 23985
Build 33009: Run Core Tests