Commit dbc1a472 authored by Kamil Trzciński's avatar Kamil Trzciński

Merge branch 'backup_wrap_concurrency' into 'master'

Fix race condition in concurrent backups

Closes #238847

See merge request gitlab-org/gitlab!39894
parents e6a58a0e 86527290
---
title: Fix race condition in concurrent backups
merge_request: 39894
author:
type: fixed
...@@ -26,13 +26,17 @@ module Backup ...@@ -26,13 +26,17 @@ module Backup
threads = Gitlab.config.repositories.storages.keys.map do |storage| threads = Gitlab.config.repositories.storages.keys.map do |storage|
Thread.new do Thread.new do
dump_storage(storage, semaphore, max_storage_concurrency: max_storage_concurrency) Rails.application.executor.wrap do
rescue => e dump_storage(storage, semaphore, max_storage_concurrency: max_storage_concurrency)
errors << e rescue => e
errors << e
end
end end
end end
threads.each(&:join) ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
threads.each(&:join)
end
raise errors.pop unless errors.empty? raise errors.pop unless errors.empty?
end end
...@@ -155,16 +159,18 @@ module Backup ...@@ -155,16 +159,18 @@ module Backup
threads = Array.new(max_storage_concurrency) do threads = Array.new(max_storage_concurrency) do
Thread.new do Thread.new do
while project = queue.pop Rails.application.executor.wrap do
semaphore.acquire while project = queue.pop
semaphore.acquire
begin
dump_project(project) begin
rescue => e dump_project(project)
errors << e rescue => e
break errors << e
ensure break
semaphore.release ensure
semaphore.release
end
end end
end end
end end
...@@ -177,7 +183,9 @@ module Backup ...@@ -177,7 +183,9 @@ module Backup
end end
queue.close queue.close
threads.each(&:join) ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
threads.each(&:join)
end
raise errors.pop unless errors.empty? raise errors.pop unless errors.empty?
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment