Commit 473ddfb4 authored by Michael Kozono's avatar Michael Kozono

Don’t recreate deleted uploads

parent 61a73cad
...@@ -81,13 +81,13 @@ module Gitlab ...@@ -81,13 +81,13 @@ module Gitlab
end end
def model_id def model_id
return @model_id if defined?(@model_id)
matchd = path_relative_to_upload_dir.match(matching_pattern_map[:pattern]) matchd = path_relative_to_upload_dir.match(matching_pattern_map[:pattern])
# If something is captured (matchd[1] is not nil), it is a model_id # If something is captured (matchd[1] is not nil), it is a model_id
return matchd[1] if matchd[1]
# Only the FileUploader pattern will not match an ID # Only the FileUploader pattern will not match an ID
file_uploader_model_id @model_id = matchd[1] ? matchd[1].to_i : file_uploader_model_id
end end
def file_size def file_size
...@@ -122,7 +122,9 @@ module Gitlab ...@@ -122,7 +122,9 @@ module Gitlab
full_path = matchd[1] full_path = matchd[1]
project = Project.find_by_full_path(full_path) project = Project.find_by_full_path(full_path)
project.id.to_s return nil unless project
project.id
end end
def absolute_path def absolute_path
...@@ -165,8 +167,36 @@ module Gitlab ...@@ -165,8 +167,36 @@ module Gitlab
end end
end end
# There are files on disk that are not in the uploads table because their
# model was deleted, and we don't delete the files on disk.
def filter_deleted_models(files) def filter_deleted_models(files)
files # TODO ids = deleted_model_ids(files)
files.reject do |file|
ids[file.model_type].include?(file.model_id)
end
end
def deleted_model_ids(files)
ids = {
'Appearance' => [],
'Namespace' => [],
'Note' => [],
'Project' => [],
'User' => []
}
# group model IDs by model type
files.each do |file|
ids[file.model_type] << file.model_id
end
ids.each do |model_type, model_ids|
found_ids = Object.const_get(model_type).where(id: model_ids.uniq).pluck(:id)
ids[model_type] = ids[model_type] - found_ids # replace with deleted ids
end
ids
end end
def insert(files) def insert(files)
......
...@@ -392,37 +392,37 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do ...@@ -392,37 +392,37 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
context 'for an appearance logo file path' do context 'for an appearance logo file path' do
it 'returns the ID as a string' do it 'returns the ID as a string' do
assert_model_id('/-/system/appearance/logo/1/some_logo.jpg', '1') assert_model_id('/-/system/appearance/logo/1/some_logo.jpg', 1)
end end
end end
context 'for an appearance header_logo file path' do context 'for an appearance header_logo file path' do
it 'returns the ID as a string' do it 'returns the ID as a string' do
assert_model_id('/-/system/appearance/header_logo/1/some_logo.jpg', '1') assert_model_id('/-/system/appearance/header_logo/1/some_logo.jpg', 1)
end end
end end
context 'for a pre-Markdown Note attachment file path' do context 'for a pre-Markdown Note attachment file path' do
it 'returns the ID as a string' do it 'returns the ID as a string' do
assert_model_id('/-/system/note/attachment/1234/some_attachment.pdf', '1234') assert_model_id('/-/system/note/attachment/1234/some_attachment.pdf', 1234)
end end
end end
context 'for a user avatar file path' do context 'for a user avatar file path' do
it 'returns the ID as a string' do it 'returns the ID as a string' do
assert_model_id('/-/system/user/avatar/1234/avatar.jpg', '1234') assert_model_id('/-/system/user/avatar/1234/avatar.jpg', 1234)
end end
end end
context 'for a group avatar file path' do context 'for a group avatar file path' do
it 'returns the ID as a string' do it 'returns the ID as a string' do
assert_model_id('/-/system/group/avatar/1234/avatar.jpg', '1234') assert_model_id('/-/system/group/avatar/1234/avatar.jpg', 1234)
end end
end end
context 'for a project avatar file path' do context 'for a project avatar file path' do
it 'returns the ID as a string' do it 'returns the ID as a string' do
assert_model_id('/-/system/project/avatar/1234/avatar.jpg', '1234') assert_model_id('/-/system/project/avatar/1234/avatar.jpg', 1234)
end end
end end
...@@ -430,7 +430,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do ...@@ -430,7 +430,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
it 'returns the ID as a string' do it 'returns the ID as a string' do
project = create(:project) project = create(:project)
assert_model_id("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", project.id.to_s) assert_model_id("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", project.id)
end end
end end
end end
......
...@@ -75,6 +75,15 @@ describe TrackUntrackedUploads, :migration, :sidekiq do ...@@ -75,6 +75,15 @@ describe TrackUntrackedUploads, :migration, :sidekiq do
expect(project1.uploads.where(uploader: 'FileUploader').first.attributes).to include(@project1_markdown_attributes) expect(project1.uploads.where(uploader: 'FileUploader').first.attributes).to include(@project1_markdown_attributes)
end end
it 'ignores uploads for deleted models' do
user2.destroy
project2.destroy
expect do
migrate!
end.to change { uploads.count }.from(4).to(5)
end
it 'the temporary table untracked_files_for_uploads no longer exists' do it 'the temporary table untracked_files_for_uploads no longer exists' do
migrate! migrate!
......
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