From 959405f7ab01f7f2027d37c2eb278815cac9b10b Mon Sep 17 00:00:00 2001 From: James Liu Date: Wed, 14 May 2025 12:09:49 +1000 Subject: [PATCH 1/2] chore: Update gitaly gem to 17.11.2 The RepositoryInfo RPC was modified to include new response fields. The gitaly gem must be updated to include the protobuf updates. The bot is supposed to be responsible for updating the gem, but it hasn't done so for the past few months: https://gitlab.com/gitlab-org/gitlab/-/commit/7d9f2c6fc0d6b291a74e40bd35d95cce4a78e100 --- Gemfile | 2 +- Gemfile.checksum | 4 ++-- Gemfile.lock | 6 +++--- Gemfile.next.checksum | 4 ++-- Gemfile.next.lock | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Gemfile b/Gemfile index c0eadbe75fa18d..16094fe3f0e6de 100644 --- a/Gemfile +++ b/Gemfile @@ -642,7 +642,7 @@ gem 'ssh_data', '~> 1.3', feature_category: :shared gem 'spamcheck', '~> 1.3.0', feature_category: :insider_threat # Gitaly GRPC protocol definitions -gem 'gitaly', '~> 17.8.0', feature_category: :gitaly +gem 'gitaly', '~> 17.11.2', feature_category: :gitaly # KAS GRPC protocol definitions gem 'gitlab-kas-grpc', '~> 17.11.0', feature_category: :deployment_management diff --git a/Gemfile.checksum b/Gemfile.checksum index 726518d2051618..1c6670ef760fb1 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -215,7 +215,7 @@ {"name":"gettext","version":"3.5.1","platform":"ruby","checksum":"03ec7f71ea7e2cf1fdcd5e08682e98b81601922fdbee890b7bc6f63b0e1a512a"}, {"name":"gettext_i18n_rails","version":"1.13.0","platform":"ruby","checksum":"d4a4739d928b6ce52a2d694d33a831dcb06c7c8e197b3172fc73dfaa20ac8ee6"}, {"name":"git","version":"1.19.1","platform":"ruby","checksum":"b0a422d9f6517353c48a330d6114de4db9e0c82dbe7202964a1d9f1fbc827d70"}, -{"name":"gitaly","version":"17.8.4","platform":"ruby","checksum":"196d9735a83f8a7d396baa216b979eb0c801622d8b7573f90010338d5b0c7b4f"}, +{"name":"gitaly","version":"17.11.2","platform":"ruby","checksum":"32266469296345187d16ab3cfa3da849338817987b722a46eed4309ee18f996e"}, {"name":"gitlab","version":"4.19.0","platform":"ruby","checksum":"3f645e3e195dbc24f0834fbf83e8ccfb2056d8e9712b01a640aad418a6949679"}, {"name":"gitlab-chronic","version":"0.10.6","platform":"ruby","checksum":"a244d11a1396d2aac6ae9b2f326adf1605ec1ad20c29f06e8b672047d415a9ac"}, {"name":"gitlab-cloud-connector","version":"1.12.0","platform":"ruby","checksum":"b1eb7b0f5cb6633929681904d92771b387ec126b02319cd6cb62dd04bd5750af"}, @@ -282,7 +282,7 @@ {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-darwin","checksum":"9dd1a8fde13e2b2f399cd9df95bc72851e28a71a70211145f02ec32f0569cd1c"}, {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-linux","checksum":"f4bf387f7aa782377ca3ac6ef3ff612867dfe8d061fd31f756082038f37df727"}, {"name":"googleapis-common-protos","version":"1.4.0","platform":"ruby","checksum":"da2380fb5ab1563580816c74e8d684ac17512c3654c829a3ee84f6d6139de382"}, -{"name":"googleapis-common-protos-types","version":"1.19.0","platform":"ruby","checksum":"aecb76ca5326f8bcc47ab083259bbc4971d07e87f56808af7e210669d9765694"}, +{"name":"googleapis-common-protos-types","version":"1.20.0","platform":"ruby","checksum":"5e374b06bcfc7e13556e7c0d87b99f1fa3d42de6396a1de3d8fc13aefb4dd07f"}, {"name":"googleauth","version":"1.8.1","platform":"ruby","checksum":"814adadaaa1221dce72a67131e3ecbd6d23491a161ec84fb15fd353b87d8c9e7"}, {"name":"gpgme","version":"2.0.24","platform":"ruby","checksum":"53eccd7042abb4fd5c78f30bc9ed075b1325e6450eab207f2f6a1e7e28ae3b64"}, {"name":"grape","version":"2.0.0","platform":"ruby","checksum":"3aeff94c17e84ccead4ff98833df691e7da0c108878cc128ca31f80c1047494a"}, diff --git a/Gemfile.lock b/Gemfile.lock index e8a5be430fbec6..976e87685bf94b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -743,7 +743,7 @@ GEM git (1.19.1) addressable (~> 2.8) rchardet (~> 1.8) - gitaly (17.8.4) + gitaly (17.11.2) grpc (~> 1.0) gitlab (4.19.0) httparty (~> 0.20) @@ -924,7 +924,7 @@ GEM google-protobuf (~> 3.14) googleapis-common-protos-types (~> 1.2) grpc (~> 1.27) - googleapis-common-protos-types (1.19.0) + googleapis-common-protos-types (1.20.0) google-protobuf (>= 3.18, < 5.a) googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) @@ -2159,7 +2159,7 @@ DEPENDENCIES gettext (~> 3.5, >= 3.5.1) gettext_i18n_rails (~> 1.13.0) git (~> 1.8) - gitaly (~> 17.8.0) + gitaly (~> 17.11.2) gitlab-active-context! gitlab-backup-cli! gitlab-chronic (~> 0.10.5) diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum index 726518d2051618..1c6670ef760fb1 100644 --- a/Gemfile.next.checksum +++ b/Gemfile.next.checksum @@ -215,7 +215,7 @@ {"name":"gettext","version":"3.5.1","platform":"ruby","checksum":"03ec7f71ea7e2cf1fdcd5e08682e98b81601922fdbee890b7bc6f63b0e1a512a"}, {"name":"gettext_i18n_rails","version":"1.13.0","platform":"ruby","checksum":"d4a4739d928b6ce52a2d694d33a831dcb06c7c8e197b3172fc73dfaa20ac8ee6"}, {"name":"git","version":"1.19.1","platform":"ruby","checksum":"b0a422d9f6517353c48a330d6114de4db9e0c82dbe7202964a1d9f1fbc827d70"}, -{"name":"gitaly","version":"17.8.4","platform":"ruby","checksum":"196d9735a83f8a7d396baa216b979eb0c801622d8b7573f90010338d5b0c7b4f"}, +{"name":"gitaly","version":"17.11.2","platform":"ruby","checksum":"32266469296345187d16ab3cfa3da849338817987b722a46eed4309ee18f996e"}, {"name":"gitlab","version":"4.19.0","platform":"ruby","checksum":"3f645e3e195dbc24f0834fbf83e8ccfb2056d8e9712b01a640aad418a6949679"}, {"name":"gitlab-chronic","version":"0.10.6","platform":"ruby","checksum":"a244d11a1396d2aac6ae9b2f326adf1605ec1ad20c29f06e8b672047d415a9ac"}, {"name":"gitlab-cloud-connector","version":"1.12.0","platform":"ruby","checksum":"b1eb7b0f5cb6633929681904d92771b387ec126b02319cd6cb62dd04bd5750af"}, @@ -282,7 +282,7 @@ {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-darwin","checksum":"9dd1a8fde13e2b2f399cd9df95bc72851e28a71a70211145f02ec32f0569cd1c"}, {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-linux","checksum":"f4bf387f7aa782377ca3ac6ef3ff612867dfe8d061fd31f756082038f37df727"}, {"name":"googleapis-common-protos","version":"1.4.0","platform":"ruby","checksum":"da2380fb5ab1563580816c74e8d684ac17512c3654c829a3ee84f6d6139de382"}, -{"name":"googleapis-common-protos-types","version":"1.19.0","platform":"ruby","checksum":"aecb76ca5326f8bcc47ab083259bbc4971d07e87f56808af7e210669d9765694"}, +{"name":"googleapis-common-protos-types","version":"1.20.0","platform":"ruby","checksum":"5e374b06bcfc7e13556e7c0d87b99f1fa3d42de6396a1de3d8fc13aefb4dd07f"}, {"name":"googleauth","version":"1.8.1","platform":"ruby","checksum":"814adadaaa1221dce72a67131e3ecbd6d23491a161ec84fb15fd353b87d8c9e7"}, {"name":"gpgme","version":"2.0.24","platform":"ruby","checksum":"53eccd7042abb4fd5c78f30bc9ed075b1325e6450eab207f2f6a1e7e28ae3b64"}, {"name":"grape","version":"2.0.0","platform":"ruby","checksum":"3aeff94c17e84ccead4ff98833df691e7da0c108878cc128ca31f80c1047494a"}, diff --git a/Gemfile.next.lock b/Gemfile.next.lock index e8a5be430fbec6..976e87685bf94b 100644 --- a/Gemfile.next.lock +++ b/Gemfile.next.lock @@ -743,7 +743,7 @@ GEM git (1.19.1) addressable (~> 2.8) rchardet (~> 1.8) - gitaly (17.8.4) + gitaly (17.11.2) grpc (~> 1.0) gitlab (4.19.0) httparty (~> 0.20) @@ -924,7 +924,7 @@ GEM google-protobuf (~> 3.14) googleapis-common-protos-types (~> 1.2) grpc (~> 1.27) - googleapis-common-protos-types (1.19.0) + googleapis-common-protos-types (1.20.0) google-protobuf (>= 3.18, < 5.a) googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) @@ -2159,7 +2159,7 @@ DEPENDENCIES gettext (~> 3.5, >= 3.5.1) gettext_i18n_rails (~> 1.13.0) git (~> 1.8) - gitaly (~> 17.8.0) + gitaly (~> 17.11.2) gitlab-active-context! gitlab-backup-cli! gitlab-chronic (~> 0.10.5) -- GitLab From c5c05c5e473409f7a539f467d1fbc2e61091c940 Mon Sep 17 00:00:00 2001 From: James Liu Date: Wed, 14 May 2025 12:34:08 +1000 Subject: [PATCH 2/2] api: Extend the Repository Health endpoint New fields were added to the RepositoryInfo RPC response in Gitaly. Update the corresponding Repository Health API endpoint to include these fields. Remove the "desc" fields from the Grape definitions, as the fields are extensively documented within the protobuf itself. --- doc/api/openapi/openapi_v2.yaml | 86 +++++++++++++++++++++++---- doc/api/repositories.md | 50 +++++++++++++--- lib/api/entities/repository_health.rb | 83 ++++++++++++++++++++++---- 3 files changed, 187 insertions(+), 32 deletions(-) diff --git a/doc/api/openapi/openapi_v2.yaml b/doc/api/openapi/openapi_v2.yaml index 09d4499a81a2af..909644728c2ec0 100644 --- a/doc/api/openapi/openapi_v2.yaml +++ b/doc/api/openapi/openapi_v2.yaml @@ -62110,11 +62110,24 @@ definitions: size: type: integer format: int32 - description: Repository size in bytes. references: "$ref": "#/definitions/API_Entities_RepositoryHealth_References" objects: "$ref": "#/definitions/API_Entities_RepositoryHealth_Objects" + commit_graph: + "$ref": "#/definitions/API_Entities_RepositoryHealth_CommitGraph" + bitmap: + "$ref": "#/definitions/API_Entities_RepositoryHealth_Bitmap" + multi_pack_index: + "$ref": "#/definitions/API_Entities_RepositoryHealth_MultiPackIndex" + multi_pack_index_bitmap: + "$ref": "#/definitions/API_Entities_RepositoryHealth_Bitmap" + alternates: + type: object + is_object_pool: + type: boolean + last_full_repack: + "$ref": "#/definitions/API_Entities_RepositoryHealth_LastFullRepack" updated_at: type: string format: date-time @@ -62126,36 +62139,87 @@ definitions: loose_count: type: integer format: int32 - description: Number of loose references in the repository. packed_size: type: integer format: int32 - description: Size in bytes of packed references in the repository. reference_backend: type: string - description: Type of backend used to store references. Either 'REFERENCE_BACKEND_REFTABLE' - or 'REFERENCE_BACKEND_FILES'. API_Entities_RepositoryHealth_Objects: type: object properties: size: type: integer format: int32 - description: Size in bytes of all objects in the repository. recent_size: type: integer format: int32 - description: Size in bytes of all recent objects in the repository. Recent - objects are those which are reachable. stale_size: type: integer format: int32 - description: Size in bytes of all stale objects in the repository. Stale objects - are those which are unreachable and may be deleted during housekeeping. keep_size: type: integer format: int32 - description: Size in bytes of all packfiles with the .keep extension. + packfile_count: + type: integer + format: int32 + reverse_index_count: + type: integer + format: int32 + cruft_count: + type: integer + format: int32 + keep_count: + type: integer + format: int32 + loose_objects_count: + type: integer + format: int32 + stale_loose_objects_count: + type: integer + format: int32 + loose_objects_garbage_count: + type: integer + format: int32 + API_Entities_RepositoryHealth_CommitGraph: + type: object + properties: + commit_graph_chain_length: + type: integer + format: int32 + has_bloom_filters: + type: boolean + has_generation_data: + type: boolean + has_generation_data_overflow: + type: boolean + API_Entities_RepositoryHealth_Bitmap: + type: object + properties: + has_hash_cache: + type: boolean + has_lookup_table: + type: boolean + version: + type: integer + format: int32 + API_Entities_RepositoryHealth_MultiPackIndex: + type: object + properties: + packfile_count: + type: integer + format: int32 + version: + type: integer + format: int32 + API_Entities_RepositoryHealth_LastFullRepack: + type: object + properties: + seconds: + type: integer + format: int32 + nanos: + type: integer + format: int32 API_Entities_Contributor: type: object properties: diff --git a/doc/api/repositories.md b/doc/api/repositories.md index 3aab7b60001059..426aea15ad0e8c 100644 --- a/doc/api/repositories.md +++ b/doc/api/repositories.md @@ -534,6 +534,7 @@ Example response, with line breaks added for readability: - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/182220) in GitLab 17.10. Guarded behind the [project_repositories_health](https://gitlab.com/gitlab-org/gitlab/-/issues/521115) feature flag. +- New fields [added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/191263) in GitLab 18.1. {{< /history >}} @@ -560,22 +561,55 @@ Example response: ```json { - "size": 42002816, + "size": 2619748827, "references": { - "loose_count": 3, - "packed_size": 315703, + "loose_count": 13, + "packed_size": 333978, "reference_backend": "REFERENCE_BACKEND_FILES" }, "objects": { - "size": 39651458, - "recent_size": 39461265, - "stale_size": 190193, - "keep_size": 0 + "size": 2180475409, + "recent_size": 2180453999, + "stale_size": 21410, + "keep_size": 0, + "packfile_count": 1, + "reverse_index_count": 1, + "cruft_count": 0, + "keep_count": 0, + "loose_objects_count": 36, + "stale_loose_objects_count": 36, + "loose_objects_garbage_count": 0 }, - "updated_at": "2025-02-26T03:42:13.015Z" + "commit_graph": { + "commit_graph_chain_length": 1, + "has_bloom_filters": true, + "has_generation_data": true, + "has_generation_data_overflow": false + }, + "bitmap": null, + "multi_pack_index": { + "packfile_count": 1, + "version": 1 + }, + "multi_pack_index_bitmap": { + "has_hash_cache": true, + "has_lookup_table": true, + "version": 1 + }, + "alternates": null, + "is_object_pool": false, + "last_full_repack": { + "seconds": 1745892013, + "nanos": 0 + }, + "updated_at": "2025-05-14T02:31:08.022Z" } ``` +For a description of each field in the response, see the +[`RepositoryInfoResponse`](https://gitlab.com/gitlab-org/gitaly/blob/fcb986a6482f82b088488db3ed7ca35adfa42fdc/proto/repository.proto#L444) +protobuf message. + ## Related topics - User documentation for [changelogs](../user/project/changelogs.md) diff --git a/lib/api/entities/repository_health.rb b/lib/api/entities/repository_health.rb index c3c738a510c719..465dc2eb1364b9 100644 --- a/lib/api/entities/repository_health.rb +++ b/lib/api/entities/repository_health.rb @@ -2,36 +2,93 @@ module API module Entities - # rubocop:disable Layout/LineLength -- `desc` is too long class RepositoryHealth < Grape::Entity class References < Grape::Entity expose :loose_count, - documentation: { type: 'integer', desc: 'Number of loose references in the repository.' } + documentation: { type: 'integer' } expose :packed_size, - documentation: { type: 'integer', desc: 'Size in bytes of packed references in the repository.' } + documentation: { type: 'integer' } expose :reference_backend, - documentation: { type: 'string', - desc: "Type of backend used to store references. Either 'REFERENCE_BACKEND_REFTABLE' or 'REFERENCE_BACKEND_FILES'." } + documentation: { type: 'string' } end class Objects < Grape::Entity expose :size, - documentation: { type: 'integer', desc: 'Size in bytes of all objects in the repository.' } + documentation: { type: 'integer' } expose :recent_size, - documentation: { type: 'integer', - desc: 'Size in bytes of all recent objects in the repository. Recent objects are those which are reachable.' } + documentation: { type: 'integer' } expose :stale_size, - documentation: { type: 'integer', - desc: 'Size in bytes of all stale objects in the repository. Stale objects are those which are unreachable and may be deleted during housekeeping.' } + documentation: { type: 'integer' } expose :keep_size, - documentation: { type: 'integer', desc: 'Size in bytes of all packfiles with the .keep extension.' } + documentation: { type: 'integer' } + expose :packfile_count, + documentation: { type: 'integer' } + expose :reverse_index_count, + documentation: { type: 'integer' } + expose :cruft_count, + documentation: { type: 'integer' } + expose :keep_count, + documentation: { type: 'integer' } + expose :loose_objects_count, + documentation: { type: 'integer' } + expose :stale_loose_objects_count, + documentation: { type: 'integer' } + expose :loose_objects_garbage_count, + documentation: { type: 'integer' } end - expose :size, documentation: { type: 'integer', desc: 'Repository size in bytes.' } + class CommitGraph < Grape::Entity + expose :commit_graph_chain_length, + documentation: { type: 'integer' } + expose :has_bloom_filters, + documentation: { type: 'boolean' } + expose :has_generation_data, + documentation: { type: 'boolean' } + expose :has_generation_data_overflow, + documentation: { type: 'boolean' } + end + + class MultiPackIndex < Grape::Entity + expose :packfile_count, + documentation: { type: 'integer' } + expose :version, + documentation: { type: 'integer' } + end + + class Bitmap < Grape::Entity + expose :has_hash_cache, + documentation: { type: 'boolean' } + expose :has_lookup_table, + documentation: { type: 'boolean' } + expose :version, + documentation: { type: 'integer' } + end + + class AlternatesInfo < Grape::Entity + expose :object_directories, + documentation: { type: 'array', items: { type: 'string' } } + expose :last_modified, + documentation: { type: 'dateTime', example: '2025-02-24T09:05:50.355Z' } + end + + class LastFullRepack < Grape::Entity + expose :seconds, + documentation: { type: 'integer' } + expose :nanos, + documentation: { type: 'integer' } + end + + expose :size, documentation: { type: 'integer' } expose :references, using: References expose :objects, using: Objects + expose :commit_graph, using: CommitGraph + expose :bitmap, using: Bitmap + expose :multi_pack_index, using: MultiPackIndex + expose :multi_pack_index_bitmap, using: Bitmap + expose :alternates, documentation: { type: 'object', example: nil } + expose :is_object_pool, documentation: { type: 'boolean' } + expose :last_full_repack, using: LastFullRepack expose :updated_at, documentation: { type: 'dateTime', example: '2025-02-24T09:05:50.355Z' } end - # rubocop:enable Layout/LineLength end end -- GitLab