diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0ff1c6951c7..486da5bb906 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -84,7 +84,7 @@ variables: GIT_SUBMODULE_STRATEGY: "none" GET_SOURCES_ATTEMPTS: "3" DEBIAN_VERSION: "bullseye" - CHROME_VERSION: "101" + CHROME_VERSION: "103" DOCKER_VERSION: "20.10.14" RUBY_VERSION: "2.7" diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml index 4ee080343a9..a71aac4225e 100644 --- a/.gitlab/ci/qa.gitlab-ci.yml +++ b/.gitlab/ci/qa.gitlab-ci.yml @@ -1,5 +1,5 @@ .qa-job-base: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-chrome-${CHROME_VERSION} + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-chrome-103-docker-20.10.14 extends: - .default-retry - .qa-cache diff --git a/.gitlab/issue_templates/Implementation.md b/.gitlab/issue_templates/Implementation.md index f57bfae4da3..e09f807d3d9 100644 --- a/.gitlab/issue_templates/Implementation.md +++ b/.gitlab/issue_templates/Implementation.md @@ -37,13 +37,20 @@ Add details for required items and delete others. ## Implementation plan diff --git a/Gemfile b/Gemfile index 3736df605cf..b047dc4e54d 100644 --- a/Gemfile +++ b/Gemfile @@ -168,7 +168,7 @@ gem 'asciidoctor', '~> 2.0.10' gem 'asciidoctor-include-ext', '~> 0.4.0', require: false gem 'asciidoctor-plantuml', '~> 0.0.12' gem 'asciidoctor-kroki', '~> 0.5.0', require: false -gem 'rouge', '~> 3.29.0' +gem 'rouge', '~> 3.30.0' gem 'truncato', '~> 0.7.11' gem 'bootstrap_form', '~> 4.2.0' gem 'nokogiri', '~> 1.13.6' diff --git a/Gemfile.lock b/Gemfile.lock index 99f9828cb0d..6af20938e38 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1126,7 +1126,7 @@ GEM rexml (3.2.5) rinku (2.0.0) rotp (6.2.0) - rouge (3.29.0) + rouge (3.30.0) rqrcode (0.7.0) chunky_png rqrcode-rails3 (0.1.7) @@ -1699,7 +1699,7 @@ DEPENDENCIES responders (~> 3.0) retriable (~> 3.1.2) rexml (~> 3.2.5) - rouge (~> 3.29.0) + rouge (~> 3.30.0) rqrcode-rails3 (~> 0.1.7) rspec-benchmark (~> 0.6.0) rspec-parameterized diff --git a/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue b/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue index 1eb383a1904..1cd098d6713 100644 --- a/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue +++ b/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue @@ -59,7 +59,11 @@ export default { {{ description }} - + {{ __('IP Address') }} {{ ipAddress }} diff --git a/app/events/projects/project_archived_event.rb b/app/events/projects/project_archived_event.rb new file mode 100644 index 00000000000..9ac83fd791b --- /dev/null +++ b/app/events/projects/project_archived_event.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Projects + class ProjectArchivedEvent < ::Gitlab::EventStore::Event + def schema + { + 'type' => 'object', + 'properties' => { + 'project_id' => { 'type' => 'integer' }, + 'namespace_id' => { 'type' => 'integer' }, + 'root_namespace_id' => { 'type' => 'integer' } + }, + 'required' => %w[project_id namespace_id root_namespace_id] + } + end + end +end diff --git a/app/models/lfs_object.rb b/app/models/lfs_object.rb index caeffae7bda..8aa48561e60 100644 --- a/app/models/lfs_object.rb +++ b/app/models/lfs_object.rb @@ -15,7 +15,7 @@ class LfsObject < ApplicationRecord scope :for_oids, -> (oids) { where(oid: oids) } scope :for_oid_and_size, -> (oid, size) { find_by(oid: oid, size: size) } - validates :oid, presence: true, uniqueness: true + validates :oid, presence: true, uniqueness: true, format: { with: /\A\h{64}\z/ } mount_file_store_uploader LfsObjectUploader diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb index 5708421014a..d757b0700b9 100644 --- a/app/services/projects/update_service.rb +++ b/app/services/projects/update_service.rb @@ -121,6 +121,8 @@ module Projects end update_pending_builds if runners_settings_toggled? + + publish_event end def after_rename_service(project) @@ -209,6 +211,18 @@ module Projects [] end end + + def publish_event + return unless project.archived_previously_changed? + + event = Projects::ProjectArchivedEvent.new(data: { + project_id: @project.id, + namespace_id: @project.namespace_id, + root_namespace_id: @project.root_namespace.id + }) + + Gitlab::EventStore.publish(event) + end end end diff --git a/config/feature_flags/development/archive_rate_limit.yml b/config/feature_flags/development/archive_rate_limit.yml index 3318d7fa939..e5840c1dab3 100644 --- a/config/feature_flags/development/archive_rate_limit.yml +++ b/config/feature_flags/development/archive_rate_limit.yml @@ -1,7 +1,7 @@ --- name: archive_rate_limit introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25750 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369432 milestone: '12.9' type: development group: group::source code diff --git a/config/feature_flags/development/async_commit_diff_files.yml b/config/feature_flags/development/async_commit_diff_files.yml index a4519835fa1..0cadf592cc1 100644 --- a/config/feature_flags/development/async_commit_diff_files.yml +++ b/config/feature_flags/development/async_commit_diff_files.yml @@ -1,7 +1,7 @@ --- name: async_commit_diff_files introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38450 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369439 milestone: '13.3' type: development group: group::source code diff --git a/config/feature_flags/development/branch_list_keyset_pagination.yml b/config/feature_flags/development/branch_list_keyset_pagination.yml index 12200292058..7e8e437fa96 100644 --- a/config/feature_flags/development/branch_list_keyset_pagination.yml +++ b/config/feature_flags/development/branch_list_keyset_pagination.yml @@ -1,7 +1,7 @@ --- name: branch_list_keyset_pagination introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35819 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369435 milestone: '13.2' type: development group: group::source code diff --git a/config/feature_flags/development/increase_page_size_exponentially.yml b/config/feature_flags/development/increase_page_size_exponentially.yml index 88f05d1e850..8297a4078fa 100644 --- a/config/feature_flags/development/increase_page_size_exponentially.yml +++ b/config/feature_flags/development/increase_page_size_exponentially.yml @@ -1,7 +1,7 @@ --- name: increase_page_size_exponentially introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66174 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369434 milestone: '14.1' type: development group: group::source code diff --git a/config/feature_flags/development/json_wrapper_legacy_mode.yml b/config/feature_flags/development/json_wrapper_legacy_mode.yml index 13a4bb30d09..071f5ef7022 100644 --- a/config/feature_flags/development/json_wrapper_legacy_mode.yml +++ b/config/feature_flags/development/json_wrapper_legacy_mode.yml @@ -1,7 +1,7 @@ --- name: json_wrapper_legacy_mode introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30849 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369436 milestone: '13.0' type: development group: group::source code diff --git a/config/feature_flags/development/repository_archive_hotlinking_interception.yml b/config/feature_flags/development/repository_archive_hotlinking_interception.yml index 56943627231..dbdde4993f8 100644 --- a/config/feature_flags/development/repository_archive_hotlinking_interception.yml +++ b/config/feature_flags/development/repository_archive_hotlinking_interception.yml @@ -1,7 +1,7 @@ --- name: repository_archive_hotlinking_interception introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/50c11f278d18fe1f3fb12eb595067216bb58ade2 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369433 milestone: '12.10' type: development group: group::source code diff --git a/config/feature_flags/development/unlink_fork_network_upon_visibility_decrease.yml b/config/feature_flags/development/unlink_fork_network_upon_visibility_decrease.yml index c94b48d8329..e7e220c310b 100644 --- a/config/feature_flags/development/unlink_fork_network_upon_visibility_decrease.yml +++ b/config/feature_flags/development/unlink_fork_network_upon_visibility_decrease.yml @@ -1,7 +1,7 @@ --- name: unlink_fork_network_upon_visibility_decrease introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20466 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369438 milestone: '12.6' type: development group: group::source code diff --git a/config/feature_flags/development/workhorse_archive_cache_disabled.yml b/config/feature_flags/development/workhorse_archive_cache_disabled.yml index e40741863d4..fb171616dc5 100644 --- a/config/feature_flags/development/workhorse_archive_cache_disabled.yml +++ b/config/feature_flags/development/workhorse_archive_cache_disabled.yml @@ -1,7 +1,7 @@ --- name: workhorse_archive_cache_disabled introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/16325 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369437 milestone: '10.5' type: development group: group::source code diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md index 3263ba6458e..9a4f4e52241 100644 --- a/doc/development/service_ping/implement.md +++ b/doc/development/service_ping/implement.md @@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w Service Ping consists of two kinds of data: - **Counters**: Track how often a certain event happened over time, such as how many CI/CD pipelines have run. - They are monotonic and always trend up. + They are monotonic and usually trend up. - **Observations**: Facts collected from one or more GitLab instances and can carry arbitrary data. There are no general guidelines for how to collect those, due to the individual nature of that data. diff --git a/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md b/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md index 6daf671a751..c4c30dbdab4 100644 --- a/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md +++ b/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md @@ -32,6 +32,7 @@ for the most popular hosting services: +- [123-reg](https://www.123-reg.co.uk/support/domains/domain-name-server-dns-management-guide/) - [Amazon](https://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html) - [Bluehost](https://www.bluehost.com/help/article/dns-management-add-edit-or-delete-dns-entries) - [Cloudflare](https://support.cloudflare.com/hc/en-us/articles/201720164-Creating-a-Cloudflare-account-and-adding-a-website) diff --git a/lib/gitlab/memory/jemalloc.rb b/lib/gitlab/memory/jemalloc.rb index fbe5ae656b9..7163a70a5cb 100644 --- a/lib/gitlab/memory/jemalloc.rb +++ b/lib/gitlab/memory/jemalloc.rb @@ -29,16 +29,20 @@ module Gitlab # @param [String] path Directory path the dump will be put into # @param [String] format `json` or `txt` # @param [String] filename_label Optional custom string that will be injected into the file name, e.g. `worker_0` - # @return [void] + # @return [String] Full path to the resulting dump file def dump_stats(path:, format: STATS_DEFAULT_FORMAT, filename_label: nil) verify_format!(format) + format_settings = STATS_FORMATS[format] + file_path = File.join(path, file_name(format_settings[:extension], filename_label)) + with_malloc_stats_print do |stats_print| - format_settings = STATS_FORMATS[format] - File.open(File.join(path, file_name(format_settings[:extension], filename_label)), 'wb') do |io| + File.open(file_path, 'wb') do |io| write_stats(stats_print, io, format_settings) end end + + file_path end private diff --git a/lib/gitlab/memory/reports/jemalloc_stats.rb b/lib/gitlab/memory/reports/jemalloc_stats.rb index b3848d40770..b99bec4ac3e 100644 --- a/lib/gitlab/memory/reports/jemalloc_stats.rb +++ b/lib/gitlab/memory/reports/jemalloc_stats.rb @@ -23,8 +23,7 @@ module Gitlab def run return unless active? - Gitlab::Memory::Jemalloc.dump_stats(path: reports_path, filename_label: worker_id) - cleanup + Gitlab::Memory::Jemalloc.dump_stats(path: reports_path, filename_label: worker_id).tap { cleanup } end def active? diff --git a/lib/gitlab/memory/reports_daemon.rb b/lib/gitlab/memory/reports_daemon.rb index 8788bee27a6..ed1da8baab5 100644 --- a/lib/gitlab/memory/reports_daemon.rb +++ b/lib/gitlab/memory/reports_daemon.rb @@ -39,12 +39,12 @@ module Gitlab start_monotonic_time = Gitlab::Metrics::System.monotonic_time start_thread_cpu_time = Gitlab::Metrics::System.thread_cpu_time - report.run + file_path = report.run cpu_s = Gitlab::Metrics::System.thread_cpu_duration(start_thread_cpu_time) duration_s = Gitlab::Metrics::System.monotonic_time - start_monotonic_time - log_report(label: report_label(report), cpu_s: cpu_s, duration_s: duration_s) + log_report(label: report_label(report), cpu_s: cpu_s, duration_s: duration_s, size: file_size(file_path)) @report_duration_counter.increment({ report: report_label(report) }, duration_s) sleep sleep_between_reports_s @@ -62,14 +62,15 @@ module Gitlab sleep_s + rand(sleep_max_delta_s) end - def log_report(label:, duration_s:, cpu_s:) + def log_report(label:, duration_s:, cpu_s:, size:) Gitlab::AppLogger.info( message: 'finished', pid: $$, worker_id: worker_id, perf_report: label, duration_s: duration_s.round(2), - cpu_s: cpu_s.round(2) + cpu_s: cpu_s.round(2), + perf_report_size_bytes: size ) end @@ -94,6 +95,12 @@ module Gitlab default_labels ) end + + def file_size(file_path) + File.size(file_path.to_s) + rescue Errno::ENOENT + 0 + end end end end diff --git a/package.json b/package.json index 4719011a6b8..9bb0cb98a05 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "codesandbox-api": "0.0.23", "compression-webpack-plugin": "^5.0.2", "copy-webpack-plugin": "^6.4.1", - "core-js": "^3.24.0", + "core-js": "^3.24.1", "cron-validator": "^1.1.1", "cronstrue": "^1.122.0", "cropper": "^2.3.0", diff --git a/qa/Dockerfile b/qa/Dockerfile index 9611b3653eb..341732ab56f 100644 --- a/qa/Dockerfile +++ b/qa/Dockerfile @@ -1,5 +1,5 @@ ARG DOCKER_VERSION=20.10.14 -ARG CHROME_VERSION=101 +ARG CHROME_VERSION=103 ARG QA_BUILD_TARGET=qa FROM registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23 AS qa diff --git a/spec/events/projects/project_archived_event_spec.rb b/spec/events/projects/project_archived_event_spec.rb new file mode 100644 index 00000000000..c68c9b5e114 --- /dev/null +++ b/spec/events/projects/project_archived_event_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::ProjectArchivedEvent do + subject(:constructor) { described_class.new(data: data) } + + where(:data, :valid) do + valid_event = { + project_id: 1, + namespace_id: 2, + root_namespace_id: 3 + } + + # All combinations of missing keys + with_missing_keys = 0.upto(valid_event.size - 1) + .flat_map { |size| valid_event.keys.combination(size).to_a } + .map { |keys| [valid_event.slice(*keys), false] } + + [ + [valid_event, true], + *with_missing_keys, + [{ project_id: 'foo', namespace_id: 2 }, false], + [{ project_id: 1, namespace_id: 'foo' }, false], + [{ project_id: [], namespace_id: 2 }, false], + [{ project_id: 1, namespace_id: [] }, false], + [{ project_id: {}, namespace_id: 2 }, false], + [{ project_id: 1, namespace_id: {} }, false], + ['foo', false], + [123, false], + [[], false] + ] + end + + with_them do + it 'validates data' do + if valid + expect { constructor }.not_to raise_error + else + expect { constructor }.to raise_error(Gitlab::EventStore::InvalidEvent) + end + end + end +end diff --git a/spec/frontend/runner/components/cells/runner_summary_cell_spec.js b/spec/frontend/runner/components/cells/runner_summary_cell_spec.js index b2e8c5a3ad9..b06ab652212 100644 --- a/spec/frontend/runner/components/cells/runner_summary_cell_spec.js +++ b/spec/frontend/runner/components/cells/runner_summary_cell_spec.js @@ -1,3 +1,4 @@ +import { __ } from '~/locale'; import { mountExtended } from 'helpers/vue_test_utils_helper'; import RunnerSummaryCell from '~/runner/components/cells/runner_summary_cell.vue'; import { INSTANCE_TYPE, PROJECT_TYPE } from '~/runner/constants'; @@ -61,8 +62,16 @@ describe('RunnerTypeCell', () => { expect(wrapper.text()).toContain(mockDescription); }); - it('Displays the runner ip address', () => { - expect(wrapper.text()).toContain(mockIpAddress); + it('Displays ip address', () => { + expect(wrapper.text()).toContain(`${__('IP Address')} ${mockIpAddress}`); + }); + + it('Displays no ip address', () => { + createComponent({ + ipAddress: null, + }); + + expect(wrapper.text()).not.toContain(__('IP Address')); }); it('Displays a custom slot', () => { diff --git a/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb b/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb index 6dfd4424342..251829b83a0 100644 --- a/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb +++ b/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb @@ -10,7 +10,7 @@ RSpec.describe Gitlab::GithubImport::Importer::LfsObjectsImporter do let(:lfs_attributes) do { - oid: 'oid', + oid: 'a' * 64, size: 1, link: 'http://www.gitlab.com/lfs_objects/oid' } diff --git a/spec/lib/gitlab/memory/jemalloc_spec.rb b/spec/lib/gitlab/memory/jemalloc_spec.rb index cd7218330c2..482ac6e5802 100644 --- a/spec/lib/gitlab/memory/jemalloc_spec.rb +++ b/spec/lib/gitlab/memory/jemalloc_spec.rb @@ -28,11 +28,12 @@ RSpec.describe Gitlab::Memory::Jemalloc do describe '.dump_stats' do it 'writes stats JSON file' do - described_class.dump_stats(path: outdir, format: format) + file_path = described_class.dump_stats(path: outdir, format: format) file = Dir.entries(outdir).find { |e| e.match(/jemalloc_stats\.#{$$}\.\d+\.json$/) } expect(file).not_to be_nil - expect(File.read(File.join(outdir, file))).to eq(output) + expect(file_path).to eq(File.join(outdir, file)) + expect(File.read(file_path)).to eq(output) end end end diff --git a/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb b/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb index 1b056b87bf9..81bf5ce119f 100644 --- a/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb +++ b/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb @@ -3,34 +3,24 @@ require 'spec_helper' RSpec.describe Gitlab::Memory::Reports::JemallocStats do - let(:jemalloc_stats) { described_class.new(reports_path: '/empty-dir') } + let(:reports_dir) {'/empty-dir'} + let(:jemalloc_stats) { described_class.new(reports_path: reports_dir) } describe '.run' do context 'when :report_jemalloc_stats ops FF is enabled' do - let(:worker_id) { 'puma_1' } + let(:worker_id) {'puma_1'} + let(:report_name) {'report.json'} + let(:report_path) { File.join(reports_dir, report_name) } before do allow(Prometheus::PidProvider).to receive(:worker_id).and_return(worker_id) end - context 'when GITLAB_DIAGNOSTIC_REPORTS_PATH env var is set' do - let(:reports_dir) { '/empty-dir' } + it 'invokes Jemalloc.dump_stats and returns file path' do + expect(Gitlab::Memory::Jemalloc) + .to receive(:dump_stats).with(path: reports_dir, filename_label: worker_id).and_return(report_path) - before do - stub_env('GITLAB_DIAGNOSTIC_REPORTS_PATH', reports_dir) - end - - it 'writes reports into custom dir while enabled' do - expect(Gitlab::Memory::Jemalloc).to receive(:dump_stats).with(path: reports_dir, filename_label: worker_id) - - jemalloc_stats.run - end - end - - it 'writes reports into default dir while enabled' do - expect(Gitlab::Memory::Jemalloc).to receive(:dump_stats).with(path: '/empty-dir', filename_label: worker_id) - - jemalloc_stats.run + expect(jemalloc_stats.run).to eq(report_path) end describe 'reports cleanup' do @@ -108,10 +98,10 @@ RSpec.describe Gitlab::Memory::Reports::JemallocStats do stub_feature_flags(report_jemalloc_stats: false) end - it 'does not run the report' do + it 'does not run the report and returns nil' do expect(Gitlab::Memory::Jemalloc).not_to receive(:dump_stats) - jemalloc_stats.run + expect(jemalloc_stats.run).to be_nil end end end diff --git a/spec/lib/gitlab/memory/reports_daemon_spec.rb b/spec/lib/gitlab/memory/reports_daemon_spec.rb index 6af317f2771..c9562470971 100644 --- a/spec/lib/gitlab/memory/reports_daemon_spec.rb +++ b/spec/lib/gitlab/memory/reports_daemon_spec.rb @@ -7,6 +7,7 @@ RSpec.describe Gitlab::Memory::ReportsDaemon do describe '#run_thread' do let(:report_duration_counter) { instance_double(::Prometheus::Client::Counter) } + let(:file_size) { 1_000_000 } before do allow(Gitlab::Metrics).to receive(:counter).and_return(report_duration_counter) @@ -17,10 +18,12 @@ RSpec.describe Gitlab::Memory::ReportsDaemon do # let alive return 3 times: true, true, false allow(daemon).to receive(:alive).and_return(true, true, false) + + allow(File).to receive(:size).with(/#{daemon.reports_path}.*\.json/).and_return(file_size) end it 'runs reports' do - expect(daemon.send(:reports)).to all(receive(:run).twice) + expect(daemon.send(:reports)).to all(receive(:run).twice.and_call_original) daemon.send(:run_thread) end @@ -32,6 +35,7 @@ RSpec.describe Gitlab::Memory::ReportsDaemon do hash_including( :duration_s, :cpu_s, + perf_report_size_bytes: file_size, message: 'finished', pid: Process.pid, worker_id: 'worker_1', @@ -41,6 +45,18 @@ RSpec.describe Gitlab::Memory::ReportsDaemon do daemon.send(:run_thread) end + context 'when the report object returns invalid file path' do + before do + allow(File).to receive(:size).with(/#{daemon.reports_path}.*\.json/).and_raise(Errno::ENOENT) + end + + it 'logs `0` as `perf_report_size_bytes`' do + expect(Gitlab::AppLogger).to receive(:info).with(hash_including(perf_report_size_bytes: 0)).twice + + daemon.send(:run_thread) + end + end + it 'sets real time duration gauge' do expect(report_duration_counter).to receive(:increment).with({ report: 'jemalloc_stats' }, an_instance_of(Float)) @@ -58,8 +74,8 @@ RSpec.describe Gitlab::Memory::ReportsDaemon do allow(daemon).to receive(:reports).and_return([active_report_1, inactive_report, active_report_2]) - expect(active_report_1).to receive(:run).twice - expect(active_report_2).to receive(:run).twice + expect(active_report_1).to receive(:run).and_return('/tmp/report_1.json').twice + expect(active_report_2).to receive(:run).and_return('/tmp/report_2.json').twice expect(inactive_report).not_to receive(:run) daemon.send(:run_thread) diff --git a/spec/models/lfs_object_spec.rb b/spec/models/lfs_object_spec.rb index 5210709a468..c25d0451f18 100644 --- a/spec/models/lfs_object_spec.rb +++ b/spec/models/lfs_object_spec.rb @@ -193,9 +193,9 @@ RSpec.describe LfsObject do end describe '.unreferenced_in_batches' do - let!(:unreferenced_lfs_object1) { create(:lfs_object, oid: '1') } + let!(:unreferenced_lfs_object1) { create(:lfs_object, oid: '1' * 64) } let!(:referenced_lfs_object) { create(:lfs_objects_project).lfs_object } - let!(:unreferenced_lfs_object2) { create(:lfs_object, oid: '2') } + let!(:unreferenced_lfs_object2) { create(:lfs_object, oid: '2' * 64) } it 'returns lfs objects in batches' do stub_const('LfsObject::BATCH_SIZE', 1) diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index ca838be0fa8..85d3e99109d 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -348,6 +348,18 @@ RSpec.describe Projects::UpdateService do end end + context 'when archiving a project' do + it 'publishes a ProjectTransferedEvent' do + expect { update_project(project, user, archived: true) } + .to publish_event(Projects::ProjectArchivedEvent) + .with( + project_id: project.id, + namespace_id: project.namespace_id, + root_namespace_id: project.root_namespace.id + ) + end + end + context 'when changing operations feature visibility' do let(:feature_params) { { operations_access_level: ProjectFeature::DISABLED } } diff --git a/spec/workers/remove_unreferenced_lfs_objects_worker_spec.rb b/spec/workers/remove_unreferenced_lfs_objects_worker_spec.rb index 6007d3b34f8..2562a7bc6fe 100644 --- a/spec/workers/remove_unreferenced_lfs_objects_worker_spec.rb +++ b/spec/workers/remove_unreferenced_lfs_objects_worker_spec.rb @@ -6,12 +6,12 @@ RSpec.describe RemoveUnreferencedLfsObjectsWorker do let(:worker) { described_class.new } describe '#perform' do - let!(:unreferenced_lfs_object1) { create(:lfs_object, oid: '1') } - let!(:unreferenced_lfs_object2) { create(:lfs_object, oid: '2') } + let!(:unreferenced_lfs_object1) { create(:lfs_object, oid: '1' * 64) } + let!(:unreferenced_lfs_object2) { create(:lfs_object, oid: '2' * 64) } let!(:project1) { create(:project, lfs_enabled: true) } let!(:project2) { create(:project, lfs_enabled: true) } - let!(:referenced_lfs_object1) { create(:lfs_object, oid: '3') } - let!(:referenced_lfs_object2) { create(:lfs_object, oid: '4') } + let!(:referenced_lfs_object1) { create(:lfs_object, oid: '3' * 64) } + let!(:referenced_lfs_object2) { create(:lfs_object, oid: '4' * 64) } let!(:lfs_objects_project1_1) do create(:lfs_objects_project, project: project1, diff --git a/yarn.lock b/yarn.lock index 06d41e82dda..834d04a4bcb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3729,10 +3729,10 @@ core-js-pure@^3.0.0: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== -core-js@^3.24.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.0.tgz#4928d4e99c593a234eb1a1f9abd3122b04d3ac57" - integrity sha512-IeOyT8A6iK37Ep4kZDD423mpi6JfPRoPUdQwEWYiGolvn4o6j2diaRzNfDfpTdu3a5qMbrGUzKUpYpRY8jXCkQ== +core-js@^3.24.1: + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f" + integrity sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg== core-js@~2.3.0: version "2.3.0"