diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-18 22:00:14 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-18 22:00:14 +0300 |
commit | 05f0ebba3a2c8ddf39e436f412dc2ab5bf1353b2 (patch) | |
tree | 11d0f2a6ec31c7793c184106cedc2ded3d9a2cc5 /app/workers | |
parent | ec73467c23693d0db63a797d10194da9e72a74af (diff) |
Add latest changes from gitlab-org/gitlab@15-8-stable-eev15.8.0-rc42
Diffstat (limited to 'app/workers')
45 files changed, 288 insertions, 151 deletions
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index 652a0021b0f..693afdea43a 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -698,7 +698,7 @@ :tags: [] - :name: cronjob:remove_unreferenced_lfs_objects :worker_name: RemoveUnreferencedLfsObjectsWorker - :feature_category: :git_lfs + :feature_category: :source_code_management :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -725,7 +725,7 @@ :tags: [] - :name: cronjob:schedule_merge_request_cleanup_refs :worker_name: ScheduleMergeRequestCleanupRefsWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -734,7 +734,7 @@ :tags: [] - :name: cronjob:schedule_migrate_external_diffs :worker_name: ScheduleMigrateExternalDiffsWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -779,7 +779,7 @@ :tags: [] - :name: cronjob:stuck_merge_jobs :worker_name: StuckMergeJobsWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -951,11 +951,11 @@ - :name: gcp_cluster:cluster_provision :worker_name: ClusterProvisionWorker :feature_category: :kubernetes_management - :has_external_dependencies: true + :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown :weight: 1 - :idempotent: false + :idempotent: true :tags: [] - :name: gcp_cluster:cluster_update_app :worker_name: ClusterUpdateAppWorker @@ -1059,11 +1059,11 @@ - :name: gcp_cluster:wait_for_cluster_creation :worker_name: WaitForClusterCreationWorker :feature_category: :kubernetes_management - :has_external_dependencies: true + :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown :weight: 1 - :idempotent: false + :idempotent: true :tags: [] - :name: github_gists_importer:github_gists_import_finish_import :worker_name: Gitlab::GithubGistsImport::FinishImportWorker @@ -2282,7 +2282,7 @@ :tags: [] - :name: chat_notification :worker_name: ChatNotificationWorker - :feature_category: :chatops + :feature_category: :integrations :has_external_dependencies: true :urgency: :low :resource_boundary: :unknown @@ -2334,6 +2334,15 @@ :weight: 1 :idempotent: true :tags: [] +- :name: counters_cleanup_refresh + :worker_name: Counters::CleanupRefreshWorker + :feature_category: :not_owned + :has_external_dependencies: false + :urgency: :low + :resource_boundary: :unknown + :weight: 1 + :idempotent: true + :tags: [] - :name: create_commit_signature :worker_name: CreateCommitSignatureWorker :feature_category: :source_code_management @@ -2345,7 +2354,7 @@ :tags: [] - :name: create_note_diff_file :worker_name: CreateNoteDiffFileWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2363,7 +2372,7 @@ :tags: [] - :name: delete_diff_files :worker_name: DeleteDiffFilesWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2750,7 +2759,7 @@ :tags: [] - :name: merge_request_cleanup_refs :worker_name: MergeRequestCleanupRefsWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2759,7 +2768,7 @@ :tags: [] - :name: merge_request_mergeability_check :worker_name: MergeRequestMergeabilityCheckWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2768,7 +2777,7 @@ :tags: [] - :name: merge_requests_close_issue :worker_name: MergeRequests::CloseIssueWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: true :urgency: :low :resource_boundary: :unknown @@ -2777,7 +2786,7 @@ :tags: [] - :name: merge_requests_create_approval_event :worker_name: MergeRequests::CreateApprovalEventWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2786,7 +2795,7 @@ :tags: [] - :name: merge_requests_create_approval_note :worker_name: MergeRequests::CreateApprovalNoteWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2804,7 +2813,7 @@ :tags: [] - :name: merge_requests_execute_approval_hooks :worker_name: MergeRequests::ExecuteApprovalHooksWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: true :urgency: :low :resource_boundary: :unknown @@ -2813,7 +2822,7 @@ :tags: [] - :name: merge_requests_handle_assignees_change :worker_name: MergeRequests::HandleAssigneesChangeWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :high :resource_boundary: :unknown @@ -2822,7 +2831,7 @@ :tags: [] - :name: merge_requests_resolve_todos :worker_name: MergeRequests::ResolveTodosWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :high :resource_boundary: :unknown @@ -2831,7 +2840,7 @@ :tags: [] - :name: merge_requests_resolve_todos_after_approval :worker_name: MergeRequests::ResolveTodosAfterApprovalWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2840,7 +2849,7 @@ :tags: [] - :name: merge_requests_update_head_pipeline :worker_name: MergeRequests::UpdateHeadPipelineWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :high :resource_boundary: :cpu @@ -2867,7 +2876,7 @@ :tags: [] - :name: migrate_external_diffs :worker_name: MigrateExternalDiffsWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2903,7 +2912,7 @@ :tags: [] - :name: new_merge_request :worker_name: NewMergeRequestWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :high :resource_boundary: :cpu @@ -3072,6 +3081,15 @@ :weight: 1 :idempotent: true :tags: [] +- :name: projects_finalize_project_statistics_refresh + :worker_name: Projects::FinalizeProjectStatisticsRefreshWorker + :feature_category: :not_owned + :has_external_dependencies: false + :urgency: :low + :resource_boundary: :unknown + :weight: 1 + :idempotent: true + :tags: [] - :name: projects_git_garbage_collect :worker_name: Projects::GitGarbageCollectWorker :feature_category: :gitaly @@ -3362,7 +3380,7 @@ :tags: [] - :name: update_merge_requests :worker_name: UpdateMergeRequestsWorker - :feature_category: :code_review + :feature_category: :code_review_workflow :has_external_dependencies: false :urgency: :high :resource_boundary: :cpu diff --git a/app/workers/chat_notification_worker.rb b/app/workers/chat_notification_worker.rb index 23d8a1ec29d..4ee32a43808 100644 --- a/app/workers/chat_notification_worker.rb +++ b/app/workers/chat_notification_worker.rb @@ -8,7 +8,7 @@ class ChatNotificationWorker # rubocop:disable Scalability/IdempotentWorker TimeoutExceeded = Class.new(StandardError) sidekiq_options retry: false - feature_category :chatops + feature_category :integrations urgency :low # Can't be high as it has external dependencies weight 2 worker_has_external_dependencies! diff --git a/app/workers/ci/build_finished_worker.rb b/app/workers/ci/build_finished_worker.rb index 7503ea3d800..2113f7ae07b 100644 --- a/app/workers/ci/build_finished_worker.rb +++ b/app/workers/ci/build_finished_worker.rb @@ -40,6 +40,7 @@ module Ci ChatNotificationWorker.perform_async(build.id) if build.pipeline.chat? build.track_deployment_usage build.track_verify_environment_usage + build.remove_token! if build.failed? && !build.auto_retry_expected? ::Ci::MergeRequests::AddTodoWhenBuildFailsWorker.perform_async(build.id) diff --git a/app/workers/ci/initial_pipeline_process_worker.rb b/app/workers/ci/initial_pipeline_process_worker.rb index 8d7a62e5b09..734755f176a 100644 --- a/app/workers/ci/initial_pipeline_process_worker.rb +++ b/app/workers/ci/initial_pipeline_process_worker.rb @@ -17,10 +17,22 @@ module Ci def perform(pipeline_id) Ci::Pipeline.find_by_id(pipeline_id).try do |pipeline| + create_deployments!(pipeline) if Feature.enabled?(:move_create_deployments_to_worker, pipeline.project) + Ci::PipelineCreation::StartPipelineService .new(pipeline) .execute end end + + private + + def create_deployments!(pipeline) + pipeline.stages.flat_map(&:statuses).each { |build| create_deployment(build) } + end + + def create_deployment(build) + ::Deployments::CreateForBuildService.new.execute(build) + end end end diff --git a/app/workers/cluster_provision_worker.rb b/app/workers/cluster_provision_worker.rb index 04c9174347f..6f3615d249c 100644 --- a/app/workers/cluster_provision_worker.rb +++ b/app/workers/cluster_provision_worker.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class ClusterProvisionWorker # rubocop:disable Scalability/IdempotentWorker +class ClusterProvisionWorker include ApplicationWorker data_consistency :always @@ -8,17 +8,7 @@ class ClusterProvisionWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 include ClusterQueue - worker_has_external_dependencies! + idempotent! - def perform(cluster_id) - Clusters::Cluster.find_by_id(cluster_id).try do |cluster| - cluster.provider.try do |provider| - if cluster.gcp? - Clusters::Gcp::ProvisionService.new.execute(provider) - elsif cluster.aws? - Clusters::Aws::ProvisionService.new.execute(provider) - end - end - end - end + def perform(_); end end diff --git a/app/workers/concerns/application_worker.rb b/app/workers/concerns/application_worker.rb index f51c2852da6..222d045b0ba 100644 --- a/app/workers/concerns/application_worker.rb +++ b/app/workers/concerns/application_worker.rb @@ -16,6 +16,7 @@ module ApplicationWorker SAFE_PUSH_BULK_LIMIT = 1000 included do + prefer_calling_context_feature_category false set_queue after_set_class_attribute { set_queue } diff --git a/app/workers/concerns/git_garbage_collect_methods.rb b/app/workers/concerns/git_garbage_collect_methods.rb index 5c0493c9be5..c5f8c9c8464 100644 --- a/app/workers/concerns/git_garbage_collect_methods.rb +++ b/app/workers/concerns/git_garbage_collect_methods.rb @@ -82,28 +82,12 @@ module GitGarbageCollectMethods def gitaly_call(task, resource) repository = resource.repository.raw_repository + client = repository.gitaly_repository_client - if Feature.enabled?(:optimized_housekeeping, container(resource)) - client = repository.gitaly_repository_client - - if task == :prune - client.prune_unreachable_objects - else - client.optimize_repository - end + if task == :prune + client.prune_unreachable_objects else - client = get_gitaly_client(task, repository) - - case task - when :prune, :gc - client.garbage_collect(bitmaps_enabled?, prune: task == :prune) - when :full_repack - client.repack_full(bitmaps_enabled?) - when :incremental_repack - client.repack_incremental - when :pack_refs - client.pack_refs - end + client.optimize_repository end rescue GRPC::NotFound => e Gitlab::GitLogger.error("#{__method__} failed:\nRepository not found") @@ -113,22 +97,6 @@ module GitGarbageCollectMethods raise Gitlab::Git::CommandError, e end - def get_gitaly_client(task, repository) - if task == :pack_refs - Gitlab::GitalyClient::RefService - else - Gitlab::GitalyClient::RepositoryService - end.new(repository) - end - - # The option to enable/disable bitmaps has been removed in https://gitlab.com/gitlab-org/gitlab/-/issues/353777 - # Now the options is always enabled - # This method and all the deprecated RPCs are going to be removed in - # https://gitlab.com/gitlab-org/gitlab/-/issues/353779 - def bitmaps_enabled? - true - end - def flush_ref_caches(resource) resource.repository.expire_branches_cache resource.repository.branch_names @@ -136,8 +104,6 @@ module GitGarbageCollectMethods end def update_repository_statistics(resource, task) - return if task == :pack_refs - resource.repository.expire_statistics_caches return if Gitlab::Database.read_only? # GitGarbageCollectWorker may be run on a Geo secondary diff --git a/app/workers/concerns/update_repository_storage_worker.rb b/app/workers/concerns/update_repository_storage_worker.rb index f46b64895a2..01744d1e57d 100644 --- a/app/workers/concerns/update_repository_storage_worker.rb +++ b/app/workers/concerns/update_repository_storage_worker.rb @@ -5,6 +5,7 @@ module UpdateRepositoryStorageWorker include ApplicationWorker included do + deduplicate :until_executed idempotent! feature_category :gitaly urgency :throttled diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb index 8a135bc1853..1674ed1483a 100644 --- a/app/workers/concerns/worker_attributes.rb +++ b/app/workers/concerns/worker_attributes.rb @@ -38,12 +38,17 @@ module WorkerAttributes set_class_attribute(:feature_category, value) end + def prefer_calling_context_feature_category(preference = false) + set_class_attribute(:prefer_calling_context_feature_category, preference) + end + # Special case: if a worker is not owned, get the feature category # (if present) from the calling context. def get_feature_category feature_category = get_class_attribute(:feature_category) + calling_context_feature_category_preferred = !!get_class_attribute(:prefer_calling_context_feature_category) - return feature_category unless feature_category == :not_owned + return feature_category unless feature_category == :not_owned || calling_context_feature_category_preferred Gitlab::ApplicationContext.current_context_attribute('meta.feature_category') || feature_category end diff --git a/app/workers/counters/cleanup_refresh_worker.rb b/app/workers/counters/cleanup_refresh_worker.rb new file mode 100644 index 00000000000..97e6a56d6e7 --- /dev/null +++ b/app/workers/counters/cleanup_refresh_worker.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Counters + class CleanupRefreshWorker + include ApplicationWorker + + data_consistency :always + + loggable_arguments 0, 2 + + # The counter is owned by several teams depending on the attribute + feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned + + urgency :low + deduplicate :until_executing, including_scheduled: true + + idempotent! + + def perform(model_name, model_id, attribute) + Gitlab::ApplicationContext.push(feature_category: :build_artifacts) if attribute.to_s == 'build_artifacts_size' + + return unless self.class.const_defined?(model_name) + + model_class = model_name.constantize + model = model_class.find_by_id(model_id) + return unless model + + Gitlab::Counters::BufferedCounter.new(model, attribute).cleanup_refresh + end + end +end diff --git a/app/workers/create_note_diff_file_worker.rb b/app/workers/create_note_diff_file_worker.rb index 8481fd0a2ab..c5b5e1cef41 100644 --- a/app/workers/create_note_diff_file_worker.rb +++ b/app/workers/create_note_diff_file_worker.rb @@ -7,7 +7,7 @@ class CreateNoteDiffFileWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow def perform(diff_note_id) return unless diff_note_id.present? diff --git a/app/workers/database/batched_background_migration/single_database_worker.rb b/app/workers/database/batched_background_migration/single_database_worker.rb index e772216e557..b7b46937db2 100644 --- a/app/workers/database/batched_background_migration/single_database_worker.rb +++ b/app/workers/database/batched_background_migration/single_database_worker.rb @@ -16,6 +16,7 @@ module Database included do data_consistency :always feature_category :database + prefer_calling_context_feature_category true idempotent! end diff --git a/app/workers/delete_diff_files_worker.rb b/app/workers/delete_diff_files_worker.rb index 54d8fcb6dfd..f9f5e6ed35b 100644 --- a/app/workers/delete_diff_files_worker.rb +++ b/app/workers/delete_diff_files_worker.rb @@ -7,7 +7,7 @@ class DeleteDiffFilesWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow # rubocop: disable CodeReuse/ActiveRecord def perform(merge_request_diff_id) diff --git a/app/workers/gitlab/github_gists_import/finish_import_worker.rb b/app/workers/gitlab/github_gists_import/finish_import_worker.rb index 1989b6314ea..284e5833f0c 100644 --- a/app/workers/gitlab/github_gists_import/finish_import_worker.rb +++ b/app/workers/gitlab/github_gists_import/finish_import_worker.rb @@ -18,14 +18,15 @@ module Gitlab INTERVAL = 30.seconds.to_i BLOCKING_WAIT_TIME = 5 + GISTS_ERRORS_BY_ID = 'gitlab:github-gists-import:%{user_id}:errors' def perform(user_id, waiter_key, remaining) waiter = wait_for_jobs(waiter_key, remaining) if waiter.nil? Gitlab::GithubGistsImport::Status.new(user_id).finish! - Gitlab::GithubImport::Logger.info(user_id: user_id, message: 'GitHub Gists import finished') + send_email_if_errors(user_id) else self.class.perform_in(INTERVAL, user_id, waiter.key, waiter.jobs_remaining) end @@ -41,6 +42,17 @@ module Gitlab waiter end + + def send_email_if_errors(user_id) + key = format(GISTS_ERRORS_BY_ID, user_id: user_id) + errors = ::Gitlab::Cache::Import::Caching.values_from_hash(key) + + return if errors.blank? + + Notify.github_gists_import_errors_email(user_id, errors).deliver_now + ensure + ::Gitlab::Cache::Import::Caching.expire(key, ::Gitlab::Cache::Import::Caching::SHORTER_TIMEOUT) + end end end end diff --git a/app/workers/gitlab/github_gists_import/import_gist_worker.rb b/app/workers/gitlab/github_gists_import/import_gist_worker.rb index 7e2b3709597..fb7fb661f4c 100644 --- a/app/workers/gitlab/github_gists_import/import_gist_worker.rb +++ b/app/workers/gitlab/github_gists_import/import_gist_worker.rb @@ -6,6 +6,8 @@ module Gitlab include ApplicationWorker include Gitlab::NotifyUponDeath + GISTS_ERRORS_BY_ID = 'gitlab:github-gists-import:%{user_id}:errors' + data_consistency :always queue_namespace :github_gists_importer feature_category :importers @@ -33,16 +35,16 @@ module Gitlab ::Gitlab::GithubGistsImport::Importer::GistImporter end - def with_logging(user_id, gist_id) - info(user_id, 'start importer', gist_id) + def with_logging(user_id, github_identifiers) + info(user_id, 'start importer', github_identifiers) yield - info(user_id, 'importer finished', gist_id) + info(user_id, 'importer finished', github_identifiers) end - def log_and_track_error(user_id, exception, gist_id) - error(user_id, exception.message, gist_id) + def log_and_track_error(user_id, exception, github_identifiers) + error(user_id, exception.message, github_identifiers) Gitlab::ErrorTracking.track_exception(exception, import_type: :github_gists, @@ -50,15 +52,17 @@ module Gitlab ) end - def error(user_id, error_message, gist_id) + def error(user_id, error_message, github_identifiers) attributes = { user_id: user_id, - github_identifiers: gist_id, + github_identifiers: github_identifiers, message: 'importer failed', 'error.message': error_message } Gitlab::GithubImport::Logger.error(structured_payload(attributes)) + + cache_error_for_email(user_id, github_identifiers[:id], error_message) end def info(user_id, message, gist_id) @@ -70,6 +74,12 @@ module Gitlab Gitlab::GithubImport::Logger.info(structured_payload(attributes)) end + + def cache_error_for_email(user_id, gist_id, error_message) + key = format(GISTS_ERRORS_BY_ID, user_id: user_id) + + ::Gitlab::Cache::Import::Caching.hash_add(key, gist_id, error_message) + end end end end diff --git a/app/workers/issues/rebalancing_worker.rb b/app/workers/issues/rebalancing_worker.rb index 8de0588a2a1..14cb97ab0e8 100644 --- a/app/workers/issues/rebalancing_worker.rb +++ b/app/workers/issues/rebalancing_worker.rb @@ -19,7 +19,7 @@ module Issues return if project_id.nil? && root_namespace_id.nil? return if ::Gitlab::Issues::Rebalancing::State.rebalance_recently_finished?(project_id, root_namespace_id) - # pull the projects collection to be rebalanced either the project if namespace is not a group(i.e. user namesapce) + # pull the projects collection to be rebalanced either the project if namespace is not a group(i.e. user namespace) # or the root namespace, this also makes the worker backward compatible with previous version where a project_id was # passed as the param projects_to_rebalance = projects_collection(project_id, root_namespace_id) diff --git a/app/workers/merge_request_cleanup_refs_worker.rb b/app/workers/merge_request_cleanup_refs_worker.rb index db6f4649f47..92dfe8a8cb0 100644 --- a/app/workers/merge_request_cleanup_refs_worker.rb +++ b/app/workers/merge_request_cleanup_refs_worker.rb @@ -9,7 +9,7 @@ class MergeRequestCleanupRefsWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow idempotent! # Hard-coded to 4 for now. Will be configurable later on via application settings. diff --git a/app/workers/merge_request_mergeability_check_worker.rb b/app/workers/merge_request_mergeability_check_worker.rb index 0e1ab505644..2ef4220131a 100644 --- a/app/workers/merge_request_mergeability_check_worker.rb +++ b/app/workers/merge_request_mergeability_check_worker.rb @@ -7,7 +7,7 @@ class MergeRequestMergeabilityCheckWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow idempotent! def logger diff --git a/app/workers/merge_requests/close_issue_worker.rb b/app/workers/merge_requests/close_issue_worker.rb index 86d63e571ac..8c3ba1bc5ab 100644 --- a/app/workers/merge_requests/close_issue_worker.rb +++ b/app/workers/merge_requests/close_issue_worker.rb @@ -5,7 +5,7 @@ module MergeRequests include ApplicationWorker data_consistency :always - feature_category :code_review + feature_category :code_review_workflow urgency :low idempotent! diff --git a/app/workers/merge_requests/create_approval_event_worker.rb b/app/workers/merge_requests/create_approval_event_worker.rb index 9b1a3c262e4..09ae51e943c 100644 --- a/app/workers/merge_requests/create_approval_event_worker.rb +++ b/app/workers/merge_requests/create_approval_event_worker.rb @@ -5,7 +5,7 @@ module MergeRequests include Gitlab::EventStore::Subscriber data_consistency :always - feature_category :code_review + feature_category :code_review_workflow urgency :low idempotent! diff --git a/app/workers/merge_requests/create_approval_note_worker.rb b/app/workers/merge_requests/create_approval_note_worker.rb index 841431f6a9d..18b0533169a 100644 --- a/app/workers/merge_requests/create_approval_note_worker.rb +++ b/app/workers/merge_requests/create_approval_note_worker.rb @@ -5,7 +5,7 @@ module MergeRequests include Gitlab::EventStore::Subscriber data_consistency :always - feature_category :code_review + feature_category :code_review_workflow urgency :low idempotent! diff --git a/app/workers/merge_requests/create_pipeline_worker.rb b/app/workers/merge_requests/create_pipeline_worker.rb index b40408cf647..096f2500019 100644 --- a/app/workers/merge_requests/create_pipeline_worker.rb +++ b/app/workers/merge_requests/create_pipeline_worker.rb @@ -25,11 +25,15 @@ module MergeRequests merge_request = MergeRequest.find_by_id(merge_request_id) return unless merge_request + allow_duplicate = params.with_indifferent_access[:allow_duplicate] push_options = params.with_indifferent_access[:push_options] MergeRequests::CreatePipelineService - .new(project: project, current_user: user, params: { push_options: push_options }) - .execute(merge_request) + .new( + project: project, + current_user: user, + params: { allow_duplicate: allow_duplicate, push_options: push_options } + ).execute(merge_request) merge_request.update_head_pipeline end diff --git a/app/workers/merge_requests/execute_approval_hooks_worker.rb b/app/workers/merge_requests/execute_approval_hooks_worker.rb index 81eca425a38..0a127e16f26 100644 --- a/app/workers/merge_requests/execute_approval_hooks_worker.rb +++ b/app/workers/merge_requests/execute_approval_hooks_worker.rb @@ -5,7 +5,7 @@ module MergeRequests include Gitlab::EventStore::Subscriber data_consistency :always - feature_category :code_review + feature_category :code_review_workflow urgency :low idempotent! diff --git a/app/workers/merge_requests/handle_assignees_change_worker.rb b/app/workers/merge_requests/handle_assignees_change_worker.rb index 7cf1be51d23..05e02905008 100644 --- a/app/workers/merge_requests/handle_assignees_change_worker.rb +++ b/app/workers/merge_requests/handle_assignees_change_worker.rb @@ -7,7 +7,7 @@ class MergeRequests::HandleAssigneesChangeWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow urgency :high deduplicate :until_executed idempotent! diff --git a/app/workers/merge_requests/resolve_todos_after_approval_worker.rb b/app/workers/merge_requests/resolve_todos_after_approval_worker.rb index 7d9c76ea872..ef02e501de1 100644 --- a/app/workers/merge_requests/resolve_todos_after_approval_worker.rb +++ b/app/workers/merge_requests/resolve_todos_after_approval_worker.rb @@ -5,7 +5,7 @@ module MergeRequests include Gitlab::EventStore::Subscriber data_consistency :always - feature_category :code_review + feature_category :code_review_workflow urgency :low idempotent! diff --git a/app/workers/merge_requests/resolve_todos_worker.rb b/app/workers/merge_requests/resolve_todos_worker.rb index 314cdac4414..15bf92c8ae1 100644 --- a/app/workers/merge_requests/resolve_todos_worker.rb +++ b/app/workers/merge_requests/resolve_todos_worker.rb @@ -7,7 +7,7 @@ class MergeRequests::ResolveTodosWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow urgency :high deduplicate :until_executed idempotent! diff --git a/app/workers/merge_requests/update_head_pipeline_worker.rb b/app/workers/merge_requests/update_head_pipeline_worker.rb index bc3a289c1e1..2479bc51cc4 100644 --- a/app/workers/merge_requests/update_head_pipeline_worker.rb +++ b/app/workers/merge_requests/update_head_pipeline_worker.rb @@ -4,7 +4,7 @@ module MergeRequests class UpdateHeadPipelineWorker include Gitlab::EventStore::Subscriber - feature_category :code_review + feature_category :code_review_workflow urgency :high worker_resource_boundary :cpu data_consistency :always diff --git a/app/workers/migrate_external_diffs_worker.rb b/app/workers/migrate_external_diffs_worker.rb index 566797d8b8a..4f1393a631c 100644 --- a/app/workers/migrate_external_diffs_worker.rb +++ b/app/workers/migrate_external_diffs_worker.rb @@ -7,7 +7,7 @@ class MigrateExternalDiffsWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow def perform(merge_request_diff_id) diff = MergeRequestDiff.find_by_id(merge_request_diff_id) diff --git a/app/workers/new_merge_request_worker.rb b/app/workers/new_merge_request_worker.rb index 9694d44e8c1..d6e8d517b5a 100644 --- a/app/workers/new_merge_request_worker.rb +++ b/app/workers/new_merge_request_worker.rb @@ -8,7 +8,7 @@ class NewMergeRequestWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 include NewIssuable - feature_category :code_review + feature_category :code_review_workflow urgency :high worker_resource_boundary :cpu weight 2 diff --git a/app/workers/pages/invalidate_domain_cache_worker.rb b/app/workers/pages/invalidate_domain_cache_worker.rb index 97e8966b342..1700b681b94 100644 --- a/app/workers/pages/invalidate_domain_cache_worker.rb +++ b/app/workers/pages/invalidate_domain_cache_worker.rb @@ -9,9 +9,9 @@ module Pages feature_category :pages def handle_event(event) - if event.data[:project_id] + domain_ids(event).each do |domain_id| ::Gitlab::Pages::CacheControl - .for_project(event.data[:project_id]) + .for_domain(domain_id) .clear_cache end @@ -25,5 +25,13 @@ module Pages .clear_cache end end + + def domain_ids(event) + ids = PagesDomain.ids_for_project(event.data[:project_id]) + + ids << event.data[:domain_id] if event.data[:domain_id] + + ids + end end end diff --git a/app/workers/personal_access_tokens/expired_notification_worker.rb b/app/workers/personal_access_tokens/expired_notification_worker.rb index 2d0ea3d3aa4..b119957fa2c 100644 --- a/app/workers/personal_access_tokens/expired_notification_worker.rb +++ b/app/workers/personal_access_tokens/expired_notification_worker.rb @@ -10,16 +10,28 @@ module PersonalAccessTokens feature_category :authentication_and_authorization + MAX_TOKENS = 100 + def perform(*args) notification_service = NotificationService.new User.with_personal_access_tokens_expired_today.find_each do |user| with_context(user: user) do - Gitlab::AppLogger.info "#{self.class}: Notifying User #{user.id} about an expired token" + expiring_user_tokens = user.personal_access_tokens.without_impersonation.expired_today_and_not_notified + + # rubocop: disable CodeReuse/ActiveRecord + # We never materialise the token instances. We need the names to mention them in the + # email. Later we trigger an update query on the entire relation, not on individual instances. + token_names = expiring_user_tokens.limit(MAX_TOKENS).pluck(:name) + # rubocop: enable CodeReuse/ActiveRecord + + notification_service.access_token_expired(user, token_names) - notification_service.access_token_expired(user) + Gitlab::AppLogger.info "#{self.class}: Notifying User #{user.id} about expired tokens" - user.personal_access_tokens.without_impersonation.expired_today_and_not_notified.update_all(after_expiry_notification_delivered: true) + expiring_user_tokens.each_batch do |expiring_tokens| + expiring_tokens.update_all(after_expiry_notification_delivered: true) + end end end end diff --git a/app/workers/pipeline_schedule_worker.rb b/app/workers/pipeline_schedule_worker.rb index 5a53d53ccf9..fb843bd421c 100644 --- a/app/workers/pipeline_schedule_worker.rb +++ b/app/workers/pipeline_schedule_worker.rb @@ -6,19 +6,52 @@ class PipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker data_consistency :always include CronjobQueue + include ::Gitlab::ExclusiveLeaseHelpers + + LOCK_RETRY = 3 + LOCK_TTL = 5.minutes feature_category :continuous_integration worker_resource_boundary :cpu def perform - Ci::PipelineSchedule.runnable_schedules.preloaded.find_in_batches do |schedules| - schedules.each do |schedule| - next unless schedule.project + if Feature.enabled?(:ci_use_run_pipeline_schedule_worker) + in_lock(lock_key, **lock_params) do + Ci::PipelineSchedule + .select(:id, :owner_id, :project_id) # Minimize the selected columns + .runnable_schedules + .preloaded + .find_in_batches do |schedules| + RunPipelineScheduleWorker.bulk_perform_async_with_contexts( + schedules, + arguments_proc: ->(schedule) { [schedule.id, schedule.owner_id] }, + context_proc: ->(schedule) { { project: schedule.project, user: schedule.owner } } + ) + end + end + else + Ci::PipelineSchedule.runnable_schedules.preloaded.find_in_batches do |schedules| + schedules.each do |schedule| + next unless schedule.project - with_context(project: schedule.project, user: schedule.owner) do - Ci::PipelineScheduleService.new(schedule.project, schedule.owner).execute(schedule) + with_context(project: schedule.project, user: schedule.owner) do + Ci::PipelineScheduleService.new(schedule.project, schedule.owner).execute(schedule) + end end end end end + + private + + def lock_key + self.class.name.underscore + end + + def lock_params + { + ttl: LOCK_TTL, + retries: LOCK_RETRY + } + end end diff --git a/app/workers/projects/delete_branch_worker.rb b/app/workers/projects/delete_branch_worker.rb index 1949fb67e83..339fa478de9 100644 --- a/app/workers/projects/delete_branch_worker.rb +++ b/app/workers/projects/delete_branch_worker.rb @@ -4,6 +4,9 @@ module Projects class DeleteBranchWorker include ApplicationWorker + # Temporary error when Gitaly cannot lock the branch reference. A retry should solve it. + GitReferenceLockedError = Class.new(::Gitlab::SidekiqMiddleware::RetryError) + data_consistency :always feature_category :source_code_management @@ -20,11 +23,10 @@ module Projects delete_service_result = ::Branches::DeleteService.new(project, user) .execute(branch_name) - return unless Feature.enabled?(:track_and_raise_delete_source_errors, project) # Only want to raise on 400 to avoid permission and non existant branch error return unless delete_service_result[:http_status] == 400 - delete_service_result.track_and_raise_exception + delete_service_result.log_and_raise_exception(as: GitReferenceLockedError) end end end diff --git a/app/workers/projects/finalize_project_statistics_refresh_worker.rb b/app/workers/projects/finalize_project_statistics_refresh_worker.rb new file mode 100644 index 00000000000..d8b06f55c38 --- /dev/null +++ b/app/workers/projects/finalize_project_statistics_refresh_worker.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Projects + class FinalizeProjectStatisticsRefreshWorker + include ApplicationWorker + + data_consistency :always + + loggable_arguments 0, 1 + + # The increments in `ProjectStatistics` are owned by several teams depending + # on the counter + feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned + + urgency :low + deduplicate :until_executing, including_scheduled: true + + idempotent! + + def perform(record_class, record_id) + if record_class.demodulize == 'BuildArtifactsSizeRefresh' + Gitlab::ApplicationContext.push(feature_category: :build_artifacts) + end + + return unless self.class.const_defined?(record_class) + + record = record_class.constantize.find_by_id(record_id) + return unless record + + record.finalize! + end + end +end diff --git a/app/workers/projects/git_garbage_collect_worker.rb b/app/workers/projects/git_garbage_collect_worker.rb index 9ac3953e83c..8c0100dd05b 100644 --- a/app/workers/projects/git_garbage_collect_worker.rb +++ b/app/workers/projects/git_garbage_collect_worker.rb @@ -7,12 +7,6 @@ module Projects private - # Used for getting a project/group out of the resource in order to scope a feature flag - # Can be removed within https://gitlab.com/gitlab-org/gitlab/-/issues/353607 - def container(resource) - resource - end - override :find_resource def find_resource(id) Project.find(id) diff --git a/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb b/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb index 705bf0534f7..ec23bde5898 100644 --- a/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb +++ b/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb @@ -11,6 +11,10 @@ module Projects idempotent! + MAX_RUNNING_LOW = 1 + MAX_RUNNING_MEDIUM = 3 + MAX_RUNNING_HIGH = 5 + def perform_work(*args) refresh = Projects::RefreshBuildArtifactsSizeStatisticsService.new.execute return unless refresh @@ -33,8 +37,12 @@ module Projects end def max_running_jobs - if ::Feature.enabled?(:projects_build_artifacts_size_refresh, type: :ops) - 10 + if ::Feature.enabled?(:projects_build_artifacts_size_refresh_high, type: :ops) + MAX_RUNNING_HIGH + elsif ::Feature.enabled?(:projects_build_artifacts_size_refresh_medium, type: :ops) + MAX_RUNNING_MEDIUM + elsif ::Feature.enabled?(:projects_build_artifacts_size_refresh, type: :ops) + MAX_RUNNING_LOW else 0 end diff --git a/app/workers/remove_unreferenced_lfs_objects_worker.rb b/app/workers/remove_unreferenced_lfs_objects_worker.rb index c67ab6e356a..52e17b250c8 100644 --- a/app/workers/remove_unreferenced_lfs_objects_worker.rb +++ b/app/workers/remove_unreferenced_lfs_objects_worker.rb @@ -10,7 +10,7 @@ class RemoveUnreferencedLfsObjectsWorker include CronjobQueue # rubocop:enable Scalability/CronWorkerContext - feature_category :git_lfs + feature_category :source_code_management deduplicate :until_executed idempotent! diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index 5e89b9f3362..f9e12c5135a 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -18,9 +18,8 @@ class RepositoryImportWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options memory_killer_max_memory_growth_kb: ENV.fetch('MEMORY_KILLER_REPOSITORY_IMPORT_WORKER_MAX_MEMORY_GROWTH_KB', 300_000).to_i def perform(project_id) - @project = Project.find(project_id) - - return unless start_import + @project = Project.find_by_id(project_id) + return if project.nil? || !start_import? Gitlab::Metrics.add_event(:import_repository) @@ -42,7 +41,7 @@ class RepositoryImportWorker # rubocop:disable Scalability/IdempotentWorker attr_reader :project - def start_import + def start_import? return true if start(project.import_state) Gitlab::Import::Logger.info( diff --git a/app/workers/run_pipeline_schedule_worker.rb b/app/workers/run_pipeline_schedule_worker.rb index f31f006eec1..db82cf3af91 100644 --- a/app/workers/run_pipeline_schedule_worker.rb +++ b/app/workers/run_pipeline_schedule_worker.rb @@ -13,12 +13,18 @@ class RunPipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker deduplicate :until_executed idempotent! - def perform(schedule_id, user_id) + def perform(schedule_id, user_id, options = {}) schedule = Ci::PipelineSchedule.find_by_id(schedule_id) user = User.find_by_id(user_id) return unless schedule && schedule.project && user + if Feature.enabled?(:ci_use_run_pipeline_schedule_worker) + return if schedule.next_run_at > Time.current + + update_next_run_at_for(schedule) + end + run_pipeline_schedule(schedule, user) end @@ -37,6 +43,12 @@ class RunPipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker private + def update_next_run_at_for(schedule) + # Ensure `next_run_at` is set properly before creating a pipeline. + # Otherwise, multiple pipelines could be created in a short interval. + schedule.schedule_next_run! + end + def error(schedule, error) failed_creation_counter.increment log_error(schedule, error) diff --git a/app/workers/schedule_merge_request_cleanup_refs_worker.rb b/app/workers/schedule_merge_request_cleanup_refs_worker.rb index 8099c3d56b6..ced1f443ea6 100644 --- a/app/workers/schedule_merge_request_cleanup_refs_worker.rb +++ b/app/workers/schedule_merge_request_cleanup_refs_worker.rb @@ -7,7 +7,7 @@ class ScheduleMergeRequestCleanupRefsWorker include CronjobQueue # rubocop:disable Scalability/CronWorkerContext - feature_category :code_review + feature_category :code_review_workflow idempotent! def perform diff --git a/app/workers/schedule_migrate_external_diffs_worker.rb b/app/workers/schedule_migrate_external_diffs_worker.rb index b2dea5083b4..8f643cf7819 100644 --- a/app/workers/schedule_migrate_external_diffs_worker.rb +++ b/app/workers/schedule_migrate_external_diffs_worker.rb @@ -13,7 +13,7 @@ class ScheduleMigrateExternalDiffsWorker # rubocop:disable Scalability/Idempoten include Gitlab::ExclusiveLeaseHelpers - feature_category :code_review + feature_category :code_review_workflow def perform in_lock(self.class.name.underscore, ttl: 2.hours, retries: 0) do diff --git a/app/workers/stuck_merge_jobs_worker.rb b/app/workers/stuck_merge_jobs_worker.rb index 3a650fcb7bf..44f2d5ade58 100644 --- a/app/workers/stuck_merge_jobs_worker.rb +++ b/app/workers/stuck_merge_jobs_worker.rb @@ -7,7 +7,7 @@ class StuckMergeJobsWorker # rubocop:disable Scalability/IdempotentWorker include CronjobQueue # rubocop:disable Scalability/CronWorkerContext - feature_category :code_review + feature_category :code_review_workflow def self.logger Gitlab::AppLogger diff --git a/app/workers/update_merge_requests_worker.rb b/app/workers/update_merge_requests_worker.rb index eb69c0eaba6..caf46c1ac4e 100644 --- a/app/workers/update_merge_requests_worker.rb +++ b/app/workers/update_merge_requests_worker.rb @@ -7,7 +7,7 @@ class UpdateMergeRequestsWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 - feature_category :code_review + feature_category :code_review_workflow urgency :high worker_resource_boundary :cpu weight 3 diff --git a/app/workers/wait_for_cluster_creation_worker.rb b/app/workers/wait_for_cluster_creation_worker.rb index af351c3c207..a34f5386363 100644 --- a/app/workers/wait_for_cluster_creation_worker.rb +++ b/app/workers/wait_for_cluster_creation_worker.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class WaitForClusterCreationWorker # rubocop:disable Scalability/IdempotentWorker +class WaitForClusterCreationWorker include ApplicationWorker data_consistency :always @@ -8,17 +8,7 @@ class WaitForClusterCreationWorker # rubocop:disable Scalability/IdempotentWorke sidekiq_options retry: 3 include ClusterQueue - worker_has_external_dependencies! + idempotent! - def perform(cluster_id) - Clusters::Cluster.find_by_id(cluster_id).try do |cluster| - cluster.provider.try do |provider| - if cluster.gcp? - Clusters::Gcp::VerifyProvisionStatusService.new.execute(provider) - elsif cluster.aws? - Clusters::Aws::VerifyProvisionStatusService.new.execute(provider) - end - end - end - end + def perform(_); end end diff --git a/app/workers/wikis/git_garbage_collect_worker.rb b/app/workers/wikis/git_garbage_collect_worker.rb index 977493834c9..ab702653989 100644 --- a/app/workers/wikis/git_garbage_collect_worker.rb +++ b/app/workers/wikis/git_garbage_collect_worker.rb @@ -7,12 +7,6 @@ module Wikis private - # Used for getting a project/group out of the resource in order to scope a feature flag - # Can be removed within https://gitlab.com/gitlab-org/gitlab/-/issues/353607 - def container(resource) - resource.container - end - override :find_resource def find_resource(id) Project.find(id).wiki |