diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 14:10:13 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 14:10:13 +0300 |
commit | 0ea3fcec397b69815975647f5e2aa5fe944a8486 (patch) | |
tree | 7979381b89d26011bcf9bdc989a40fcc2f1ed4ff /app/workers/projects | |
parent | 72123183a20411a36d607d70b12d57c484394c8e (diff) |
Add latest changes from gitlab-org/gitlab@15-1-stable-eev15.1.0-rc42
Diffstat (limited to 'app/workers/projects')
-rw-r--r-- | app/workers/projects/inactive_projects_deletion_cron_worker.rb | 67 | ||||
-rw-r--r-- | app/workers/projects/process_sync_events_worker.rb | 4 |
2 files changed, 56 insertions, 15 deletions
diff --git a/app/workers/projects/inactive_projects_deletion_cron_worker.rb b/app/workers/projects/inactive_projects_deletion_cron_worker.rb index 2c3f4191502..a280c9203d6 100644 --- a/app/workers/projects/inactive_projects_deletion_cron_worker.rb +++ b/app/workers/projects/inactive_projects_deletion_cron_worker.rb @@ -9,34 +9,53 @@ module Projects idempotent! data_consistency :always feature_category :compliance_management + urgency :low - INTERVAL = 2.seconds.to_i + # This cron worker is executed at an interval of 10 minutes. + # Maximum run time is kept as 4 minutes to avoid breaching maximum allowed execution latency of 5 minutes. + MAX_RUN_TIME = 4.minutes + LAST_PROCESSED_INACTIVE_PROJECT_REDIS_KEY = 'last_processed_inactive_project_id' + + TimeoutError = Class.new(StandardError) def perform return unless ::Gitlab::CurrentSettings.delete_inactive_projects? + @start_time ||= ::Gitlab::Metrics::System.monotonic_time admin_user = User.admins.active.first return unless admin_user notified_inactive_projects = Gitlab::InactiveProjectsDeletionWarningTracker.notified_projects - Project.inactive.without_deleted.find_each(batch_size: 100).with_index do |project, index| # rubocop: disable CodeReuse/ActiveRecord - next unless Feature.enabled?(:inactive_projects_deletion, project.root_namespace) + project_id = last_processed_project_id + + Project.where('projects.id > ?', project_id).each_batch(of: 100) do |batch| # rubocop: disable CodeReuse/ActiveRecord + inactive_projects = batch.inactive.without_deleted + + inactive_projects.each do |project| + if over_time? + save_last_processed_project_id(project.id) + raise TimeoutError + end - delay = index * INTERVAL + next unless Feature.enabled?(:inactive_projects_deletion, project.root_namespace) - with_context(project: project, user: admin_user) do - deletion_warning_email_sent_on = notified_inactive_projects["project:#{project.id}"] + with_context(project: project, user: admin_user) do + deletion_warning_email_sent_on = notified_inactive_projects["project:#{project.id}"] - if send_deletion_warning_email?(deletion_warning_email_sent_on, project) - send_notification(delay, project, admin_user) - elsif deletion_warning_email_sent_on && delete_due_to_inactivity?(deletion_warning_email_sent_on) - Gitlab::InactiveProjectsDeletionWarningTracker.new(project.id).reset - delete_project(project, admin_user) + if send_deletion_warning_email?(deletion_warning_email_sent_on, project) + send_notification(project, admin_user) + elsif deletion_warning_email_sent_on && delete_due_to_inactivity?(deletion_warning_email_sent_on) + Gitlab::InactiveProjectsDeletionWarningTracker.new(project.id).reset + delete_project(project, admin_user) + end end end end + reset_last_processed_project_id + rescue TimeoutError + # no-op end private @@ -64,8 +83,30 @@ module Projects ::Projects::DestroyService.new(project, user, {}).async_execute end - def send_notification(delay, project, user) - ::Projects::InactiveProjectsDeletionNotificationWorker.perform_in(delay, project.id, deletion_date) + def send_notification(project, user) + ::Projects::InactiveProjectsDeletionNotificationWorker.perform_async(project.id, deletion_date) + end + + def over_time? + (::Gitlab::Metrics::System.monotonic_time - @start_time) > MAX_RUN_TIME + end + + def save_last_processed_project_id(project_id) + Gitlab::Redis::Cache.with do |redis| + redis.set(LAST_PROCESSED_INACTIVE_PROJECT_REDIS_KEY, project_id) + end + end + + def last_processed_project_id + Gitlab::Redis::Cache.with do |redis| + redis.get(LAST_PROCESSED_INACTIVE_PROJECT_REDIS_KEY).to_i + end + end + + def reset_last_processed_project_id + Gitlab::Redis::Cache.with do |redis| + redis.del(LAST_PROCESSED_INACTIVE_PROJECT_REDIS_KEY) + end end end end diff --git a/app/workers/projects/process_sync_events_worker.rb b/app/workers/projects/process_sync_events_worker.rb index 1330ae47a68..92322a9ea99 100644 --- a/app/workers/projects/process_sync_events_worker.rb +++ b/app/workers/projects/process_sync_events_worker.rb @@ -9,11 +9,11 @@ module Projects data_consistency :always - feature_category :sharding + feature_category :pods urgency :high idempotent! - deduplicate :until_executing + deduplicate :until_executed def perform results = ::Ci::ProcessSyncEventsService.new( |