diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md index ef4eb262eb82d739bb05f9e2a6b012a6a5022fcf..5b73e4a67fcac6aadd0588b61639c8c7495c2298 100644 --- a/doc/development/gitaly.md +++ b/doc/development/gitaly.md @@ -364,9 +364,18 @@ These standard Git references are used by GitLab (through Gitaly) in any Git rep ### GitLab-specific references +Commit chains that don't have Git references pointing to them can be removed when [housekeeping](../administration/housekeeping.md) +runs. For commit chains that must remain accessible to a GitLab process or the UI, GitLab creates GitLab-specific reference to these +commit chains to stop housekeeping removing them. + +These commit chains remain regardless of what users do to the repository. For example, deleting branches or force pushing. + +### Existing GitLab-specific references + These GitLab-specific references are used exclusively by GitLab (through Gitaly): -- `refs/keep-around/<object-id>`. References to commits that have pipeline jobs or merge requests. The `object-id` points to the commit the pipeline was run on. +- `refs/keep-around/<object-id>`. Refers to commits used in the UI for merge requests, pipelines, and notes. Because `keep-around` references have no + lifecycle, don't use them for any new functionality. - `refs/merge-requests/<merge-request-iid>/`. [Merges](https://git-scm.com/docs/git-merge) merge two histories together. This ref namespace tracks information about a merge using the following refs under it: - `head`. Current `HEAD` of the merge request. @@ -374,4 +383,30 @@ These GitLab-specific references are used exclusively by GitLab (through Gitaly) - If [merge trains are enabled](../ci/pipelines/merge_trains.md): `train`. Commit for the merge train. - `refs/pipelines/<pipeline-iid>`. References to pipelines. Temporarily used to store the pipeline commit object ID. - `refs/environments/<environment-slug>`. References to commits where deployments to environments were performed. -- `refs/heads/revert-<source-commit-short-object-id>`. References to the commit's object ID created when [reverting changes](../user/project/merge_requests/revert_changes.md). + +### Create new GitLab-specific references + +GitLab-specific references are useful to ensure GitLab UI's continue to function but must be carefully managed otherwise they can cause performance +degradation of the Git repositories they are created in. + +When creating new GitLab-specific references: + +1. Ensure Gitaly considers the new references as hidden. Hidden references are not accessible by users when they pull or fetch. Making GitLab-specific + references hidden prevents them from affecting end user Git performance. +1. Ensure there is a defined lifecycle. Similar to PostgreSQL, Git repositories cannot handle an indefinite amount of data. Adding a large number of + references will eventually causes performance problems. Therefore, any created GitLab-specific reference should also be removed again when possible. +1. Ensure the reference is namespaced for the feature it supports. To diagnose performance problems, references must be tied to the specific feature or model + in GitLab. + +### Test changes to GitLab-specific references + +Changing when GitLab-specific references are created can cause the GitLab UI or processes to fail long after the change is deployed because orphaned Git objects have a grace period before they are removed. + +To test changes to GitLab-specific references: + +1. [Locate the test repository on the file system](../administration/repository_storage_paths.md#translate-hashed-storage-paths). +1. Force `git gc` to run on the server-side Gitaly repository: + + ```shell + git gc --prune=now + ```