Skip to content
Snippets Groups Projects
Commit e4eac1ff authored by Douwe Maan's avatar Douwe Maan
Browse files

Don’t schedule workers from inside transactions

parent a9dbda86
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -47,8 +47,8 @@ module Ci
before_destroy { unscoped_project }
 
after_create :execute_hooks
after_save :update_project_statistics, if: :artifacts_size_changed?
after_destroy :update_project_statistics
after_commit :update_project_statistics_after_save, on: [:create, :update]
after_commit :update_project_statistics, on: :destroy
 
class << self
# This is needed for url_for to work,
Loading
Loading
@@ -491,5 +491,11 @@ module Ci
 
ProjectCacheWorker.perform_async(project_id, [], [:build_artifacts_size])
end
def update_project_statistics_after_save
if previous_changes.include?('artifacts_size')
update_project_statistics
end
end
end
end
Loading
Loading
@@ -18,7 +18,7 @@ class CommitStatus < ActiveRecord::Base
validates :name, presence: true
 
alias_attribute :author, :user
scope :failed_but_allowed, -> do
where(allow_failure: true, status: [:failed, :canceled])
end
Loading
Loading
@@ -83,14 +83,15 @@ class CommitStatus < ActiveRecord::Base
next if transition.loopback?
 
commit_status.run_after_commit do
pipeline.try do |pipeline|
if pipeline
if complete? || manual?
PipelineProcessWorker.perform_async(pipeline.id)
else
PipelineUpdateWorker.perform_async(pipeline.id)
end
ExpireJobCacheWorker.perform_async(commit_status.id)
end
ExpireJobCacheWorker.perform_async(commit_status.id)
end
end
 
Loading
Loading
require 'digest/md5'
 
class Key < ActiveRecord::Base
include AfterCommitQueue
include Sortable
 
LAST_USED_AT_REFRESH_TIME = 1.day.to_i
Loading
Loading
@@ -25,10 +24,10 @@ class Key < ActiveRecord::Base
 
delegate :name, :email, to: :user, prefix: true
 
after_create :add_to_shell
after_create :notify_user
after_commit :add_to_shell, on: :create
after_commit :notify_user, on: :create
after_create :post_create_hook
after_destroy :remove_from_shell
after_commit :remove_from_shell, on: :destroy
after_destroy :post_destroy_hook
 
def key=(value)
Loading
Loading
@@ -93,6 +92,6 @@ class Key < ActiveRecord::Base
end
 
def notify_user
run_after_commit { NotificationService.new.new_key(self) }
NotificationService.new.new_key(self)
end
end
Loading
Loading
@@ -6,8 +6,7 @@ class LfsObjectsProject < ActiveRecord::Base
validates :lfs_object_id, uniqueness: { scope: [:project_id], message: "already exists in project" }
validates :project_id, presence: true
 
after_create :update_project_statistics
after_destroy :update_project_statistics
after_commit :update_project_statistics, on: [:create, :destroy]
 
private
 
Loading
Loading
Loading
Loading
@@ -6,6 +6,7 @@ class Namespace < ActiveRecord::Base
include Gitlab::ShellAdapter
include Gitlab::CurrentSettings
include Routable
include AfterCommitQueue
 
# Prevent users from creating unreasonably deep level of nesting.
# The number 20 was taken based on maximum nesting level of
Loading
Loading
@@ -242,7 +243,9 @@ class Namespace < ActiveRecord::Base
 
# Remove namespace directroy async with delay so
# GitLab has time to remove all projects first
GitlabShellWorker.perform_in(5.minutes, :rm_namespace, repository_storage_path, new_path)
run_after_commit do
GitlabShellWorker.perform_in(5.minutes, :rm_namespace, repository_storage_path, new_path)
end
end
end
 
Loading
Loading
Loading
Loading
@@ -471,7 +471,9 @@ class Project < ActiveRecord::Base
end
 
def reset_cache_and_import_attrs
ProjectCacheWorker.perform_async(self.id)
run_after_commit do
ProjectCacheWorker.perform_async(self.id)
end
 
self.import_data&.destroy
end
Loading
Loading
Loading
Loading
@@ -7,11 +7,9 @@ module Projects
DELETED_FLAG = '+deleted'.freeze
 
def async_execute
project.transaction do
project.update_attribute(:pending_delete, true)
job_id = ProjectDestroyWorker.perform_async(project.id, current_user.id, params)
Rails.logger.info("User #{current_user.id} scheduled destruction of project #{project.path_with_namespace} with job ID #{job_id}")
end
project.update_attribute(:pending_delete, true)
job_id = ProjectDestroyWorker.perform_async(project.id, current_user.id, params)
Rails.logger.info("User #{current_user.id} scheduled destruction of project #{project.path_with_namespace} with job ID #{job_id}")
end
 
def execute
Loading
Loading
@@ -62,7 +60,11 @@ module Projects
 
if gitlab_shell.mv_repository(project.repository_storage_path, path, new_path)
log_info("Repository \"#{path}\" moved to \"#{new_path}\"")
GitlabShellWorker.perform_in(5.minutes, :remove_repository, project.repository_storage_path, new_path)
project.run_after_commit do
# self is now project
GitlabShellWorker.perform_in(5.minutes, :remove_repository, self.repository_storage_path, new_path)
end
else
false
end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment