gitlab-org--gitlab-foss/lib/gitlab/import_export
Kamil Trzciński 0e56c1e7cb Improve performance and memory usage of project export
ActiveModel::Serialization is simple in that it recursively calls
`as_json` on each object to serialize everything. However, for a model
like a Project, this can generate a query for every single association,
which can add up to tens of thousands of queries and lead to memory
bloat.

To improve this, we can do several things:

1. We use `tree:` and `preload:` to automatically generate
   a list of all preloads that could be used to serialize
   objects in bulk.

2. We observe that a single project has many issues, merge requests,
   etc. Instead of serializing everything at once, which could lead to
   database timeouts and high memory usage, we take each top-level
   association and serialize the data in batches.

For example, we serialize the first 100 issues and preload all of
their associated events, notes, etc. before moving onto the next
batch. When we're done, we serialize merge requests in the same way.
We repeat this pattern for the remaining associations specified in
import_export.yml.
2019-09-09 15:40:49 +00:00
..
after_export_strategies Avoid calling freeze on already frozen strings in lib/gitlab 2019-09-04 09:52:02 +05:30
after_export_strategy_builder.rb
attribute_cleaner.rb Add commit_id to AttributeCleaner::ALLOWED_REFERENCES 2019-07-15 10:30:39 +01:00
attributes_finder.rb Improve performance and memory usage of project export 2019-09-09 15:40:49 +00:00
avatar_restorer.rb
avatar_saver.rb
command_line_util.rb
config.rb Normalize import_export structure 2019-09-06 14:21:17 +02:00
error.rb
fast_hash_serializer.rb Improve performance and memory usage of project export 2019-09-09 15:40:49 +00:00
file_importer.rb
group_project_object_builder.rb
hash_util.rb
import_export.yml Improve performance and memory usage of project export 2019-09-09 15:40:49 +00:00
importer.rb
lfs_restorer.rb LFS export records repository_type data 2019-07-24 11:23:51 +00:00
lfs_saver.rb LFS export records repository_type data 2019-07-24 11:23:51 +00:00
members_mapper.rb Merge branch 'optimise-import-performance' into 'master' 2019-07-24 18:01:44 +00:00
merge_request_parser.rb Add a rubocop for Rails.logger 2019-07-10 19:26:47 +00:00
project_tree_restorer.rb Normalize import_export structure 2019-09-06 14:21:17 +02:00
project_tree_saver.rb Improve performance and memory usage of project export 2019-09-09 15:40:49 +00:00
reader.rb Normalize import_export structure 2019-09-06 14:21:17 +02:00
relation_factory.rb Optimise import performance 2019-07-24 16:24:28 +02:00
relation_rename_service.rb
repo_restorer.rb
repo_saver.rb
saver.rb Add a rubocop for Rails.logger 2019-07-10 19:26:47 +00:00
shared.rb
statistics_restorer.rb
uploads_manager.rb
uploads_restorer.rb
uploads_saver.rb
version_checker.rb Add a rubocop for Rails.logger 2019-07-10 19:26:47 +00:00
version_saver.rb
wiki_repo_saver.rb
wiki_restorer.rb