diff options
author | Stan Hu <stanhu@gmail.com> | 2019-06-20 21:49:14 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-06-21 01:57:58 -0700 |
commit | 656ec23bd50197bd736596e56483d7c863db3af4 (patch) | |
tree | 976cc5bc1af8b26978f57d8159519b3672322de8 | |
parent | 9f07114618f957941953d0374fa43ab010a8ec9f (diff) | |
download | gitlab-ce-sh-test-branch-push-2.tar.gz |
Speed up MR widget by disabling BatchLoader replace_methodssh-test-branch-push-2
We've seen a significant performance penalty when using
`BatchLoader#__replace_with!`. This defines methods on the batch loader
that proxy to the 'real' object using send. The alternative is
`method_missing`, which is slower. However, we've noticed that
`method_missing` can be faster if:
1. The objects being loaded have a large interface.
2. We don't call too many methods on the loaded object.
In production, we've observed a small percentage of time used in
Module#define_methods as a result of the BatchLoader. Disabling this for
ActiveRecord models is generally a good thing to do since there are so
many methods.
-rw-r--r-- | app/models/ci/pipeline.rb | 2 | ||||
-rw-r--r-- | app/models/ci/stage.rb | 2 | ||||
-rw-r--r-- | app/models/commit.rb | 2 | ||||
-rw-r--r-- | changelogs/unreleased/sh-disable-replace-methods-batch-loader.yml | 5 |
4 files changed, 8 insertions, 3 deletions
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 3727a9861aa..9c92d093129 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -516,7 +516,7 @@ module Ci end def number_of_warnings - BatchLoader.for(id).batch(default_value: 0) do |pipeline_ids, loader| + BatchLoader.for(id).batch(default_value: 0, replace_methods: false) do |pipeline_ids, loader| ::Ci::Build.where(commit_id: pipeline_ids) .latest .failed_but_allowed diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb index d90339d90dc..b460fd58c75 100644 --- a/app/models/ci/stage.rb +++ b/app/models/ci/stage.rb @@ -105,7 +105,7 @@ module Ci end def number_of_warnings - BatchLoader.for(id).batch(default_value: 0) do |stage_ids, loader| + BatchLoader.for(id).batch(default_value: 0, replace_methods: false) do |stage_ids, loader| ::Ci::Build.where(stage_id: stage_ids) .latest .failed_but_allowed diff --git a/app/models/commit.rb b/app/models/commit.rb index be37fa2e76f..3723e4e8fd6 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -229,7 +229,7 @@ class Commit end def lazy_author - BatchLoader.for(author_email.downcase).batch do |emails, loader| + BatchLoader.for(author_email.downcase).batch(replace_methods: false) do |emails, loader| users = User.by_any_email(emails).includes(:emails) emails.each do |email| diff --git a/changelogs/unreleased/sh-disable-replace-methods-batch-loader.yml b/changelogs/unreleased/sh-disable-replace-methods-batch-loader.yml new file mode 100644 index 00000000000..d44913fbd81 --- /dev/null +++ b/changelogs/unreleased/sh-disable-replace-methods-batch-loader.yml @@ -0,0 +1,5 @@ +--- +title: Speed up MR widget by disabling BatchLoader replace_methods +merge_request: 29920 +author: +type: performance |