diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-26 00:16:20 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-26 00:16:20 +0300 |
commit | 190734a48c1030f2059035775589ee60f26bc7ca (patch) | |
tree | 59766e0eea48c75f169098bc7142194d8960f209 /app/services/packages | |
parent | 1e3f5ab634699e9d50779f05d2ae8dfc8a3ab9b3 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/packages')
-rw-r--r-- | app/services/packages/npm/create_package_service.rb | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/app/services/packages/npm/create_package_service.rb b/app/services/packages/npm/create_package_service.rb index 33a7736dc95..b5a0a22a24e 100644 --- a/app/services/packages/npm/create_package_service.rb +++ b/app/services/packages/npm/create_package_service.rb @@ -35,11 +35,21 @@ module Packages ::Packages::CreateDependencyService.new(package, package_dependencies).execute ::Packages::Npm::CreateTagService.new(package, dist_tag).execute - package.create_npm_metadatum!(package_json: package_json) + create_npm_metadatum!(package) package end + def create_npm_metadatum!(package) + package.create_npm_metadatum!(package_json: package_json) + rescue ActiveRecord::RecordInvalid => e + if package.npm_metadatum && package.npm_metadatum.errors.added?(:package_json, 'structure is too large') + Gitlab::ErrorTracking.track_exception(e, field_sizes: field_sizes_for_error_tracking) + end + + raise + end + def current_package_exists? project.packages .npm @@ -125,6 +135,35 @@ module Packages def lease_timeout DEFAULT_LEASE_TIMEOUT end + + def field_sizes + strong_memoize(:field_sizes) do + package_json.transform_values do |value| + value.to_s.size + end + end + end + + def filtered_field_sizes + strong_memoize(:filtered_field_sizes) do + field_sizes.select do |_, size| + size >= ::Packages::Npm::Metadatum::MIN_PACKAGE_JSON_FIELD_SIZE_FOR_ERROR_TRACKING + end + end + end + + def largest_fields + strong_memoize(:largest_fields) do + field_sizes + .sort_by { |a| a[1] } + .reverse[0..::Packages::Npm::Metadatum::NUM_FIELDS_FOR_ERROR_TRACKING - 1] + .to_h + end + end + + def field_sizes_for_error_tracking + filtered_field_sizes.empty? ? largest_fields : filtered_field_sizes + end end end end |