diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-15 09:10:57 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-15 09:10:57 +0300 |
commit | 034e7d969a591605267c0e5ddbe6f2228bf8e43d (patch) | |
tree | 408e33f34a634187a765ee7d208a55d27bcbd770 | |
parent | 26c3184b621c4349997b1fade462c3fb480ad976 (diff) |
Add latest changes from gitlab-org/gitlab@master
-rw-r--r-- | app/models/award_emoji.rb | 2 | ||||
-rw-r--r-- | app/models/merge_request.rb | 14 | ||||
-rw-r--r-- | app/models/preloaders/merge_requests_preloader.rb | 19 | ||||
-rw-r--r-- | app/views/layouts/header/_default.html.haml | 2 | ||||
-rw-r--r-- | doc/development/elasticsearch.md | 5 | ||||
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | qa/qa/page/main/menu.rb | 11 | ||||
-rw-r--r-- | qa/qa/runtime/browser.rb | 20 | ||||
-rw-r--r-- | spec/models/preloaders/merge_requests_preloader_spec.rb | 42 | ||||
-rw-r--r-- | yarn.lock | 8 |
10 files changed, 119 insertions, 6 deletions
diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb index c8f6b9aaedb..d251b0adbd3 100644 --- a/app/models/award_emoji.rb +++ b/app/models/award_emoji.rb @@ -66,3 +66,5 @@ class AwardEmoji < ApplicationRecord awardable.try(:update_upvotes_count) if upvote? end end + +AwardEmoji.prepend_mod_with('AwardEmoji') diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index a24bb0b6bf9..db49ec6f412 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -1918,6 +1918,20 @@ class MergeRequest < ApplicationRecord end end + def lazy_upvotes_count + BatchLoader.for(id).batch(default_value: 0) do |ids, loader| + counts = AwardEmoji + .where(awardable_id: ids) + .upvotes + .group(:awardable_id) + .count + + counts.each do |id, count| + loader.call(id, count) + end + end + end + private def set_draft_status diff --git a/app/models/preloaders/merge_requests_preloader.rb b/app/models/preloaders/merge_requests_preloader.rb new file mode 100644 index 00000000000..cefe8408cab --- /dev/null +++ b/app/models/preloaders/merge_requests_preloader.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Preloaders + class MergeRequestsPreloader + attr_reader :merge_requests + + def initialize(merge_requests) + @merge_requests = merge_requests + end + + def execute + preloader = ActiveRecord::Associations::Preloader.new + preloader.preload(merge_requests, { target_project: [:project_feature] }) + merge_requests.each do |merge_request| + merge_request.lazy_upvotes_count + end + end + end +end diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 335e997c205..1dbd1049fce 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -15,7 +15,7 @@ %span.logo-text.d-none.d-lg-block.gl-ml-3 = logo_text - if Gitlab.com_and_canary? - = link_to 'https://next.gitlab.com', class: 'canary-badge bg-transparent', target: :_blank, rel: :_noopener do + = link_to 'https://next.gitlab.com', class: 'canary-badge bg-transparent', data: { qa_selector: 'canary_badge_link' }, target: :_blank, rel: :_noopener do %span.gl-badge.gl-bg-green-500.gl-text-white.gl-rounded-pill.gl-font-weight-bold.gl-py-1 = _('Next') diff --git a/doc/development/elasticsearch.md b/doc/development/elasticsearch.md index 6d3388d521f..bba4e1cda23 100644 --- a/doc/development/elasticsearch.md +++ b/doc/development/elasticsearch.md @@ -233,6 +233,11 @@ Any data or index cleanup needed to support migration retries should be handled will re-enqueue itself with a delay which is set using the `throttle_delay` option described below. The batching must be handled within the `migrate` method, this setting controls the re-enqueuing only. +- `batch_size` - Sets the number of documents modified during a `batched!` migration run. This size should be set to a value which allows the updates + enough time to finish. This can be tuned in combination with the `throttle_delay` option described below. The batching + must be handled within a custom `migrate` method or by using the [`Elastic::MigrationBackfillHelper`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/concerns/elastic/migration_backfill_helper.rb) + `migrate` method which uses this setting. Default value is 1000 documents. + - `throttle_delay` - Sets the wait time in between batch runs. This time should be set high enough to allow each migration batch enough time to finish. Additionally, the time should be less than 30 minutes since that is how often the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/elastic/migration_worker.rb) diff --git a/package.json b/package.json index 572ac82dea3..49f2ddbaab6 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@gitlab/favicon-overlay": "2.0.0", "@gitlab/svgs": "1.212.0", "@gitlab/tributejs": "1.0.0", - "@gitlab/ui": "32.10.0", + "@gitlab/ui": "32.10.1", "@gitlab/visual-review-tools": "1.6.1", "@rails/actioncable": "6.1.3-2", "@rails/ujs": "6.1.3-2", diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb index 760741a9630..ad5cd971afc 100644 --- a/qa/qa/page/main/menu.rb +++ b/qa/qa/page/main/menu.rb @@ -11,6 +11,7 @@ module QA view 'app/views/layouts/header/_default.html.haml' do element :navbar, required: true + element :canary_badge_link element :user_avatar, required: true element :user_menu, required: true element :stop_impersonation_link @@ -168,6 +169,16 @@ module QA click_element(:stop_impersonation_link) end + # To verify whether the user has been directed to a canary web node + # @return [Boolean] result of checking existence of :canary_badge_link element + # @example: + # Menu.perform do |menu| + # expect(menu.canary?).to be(true) + # end + def canary? + has_element?(:canary_badge_link) + end + private def within_top_menu(&block) diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb index 370c05edb86..f208a93d302 100644 --- a/qa/qa/runtime/browser.rb +++ b/qa/qa/runtime/browser.rb @@ -219,6 +219,26 @@ module QA yield.tap { clear! } if block_given? end + # To redirect the browser to a canary or non-canary web node + # after loading a subject test page + # @param [Boolean] Send to canary true or false + # @example: + # Runtime::Browser::Session.target_canary(true) + def self.target_canary(enable_canary) + if QA::Runtime::Env.qa_cookies.to_s.include?("gitlab_canary=true") + QA::Runtime::Logger.warn("WARNING: Setting cookie through QA_COOKIES var is incompatible with this method.") + return + end + + browser = Capybara.current_session.driver.browser + + if enable_canary + browser.manage.add_cookie name: "gitlab_canary", value: "true" + else + browser.manage.delete_cookie("gitlab_canary") + end + end + ## # Selenium allows to reset session cookies for current domain only. # diff --git a/spec/models/preloaders/merge_requests_preloader_spec.rb b/spec/models/preloaders/merge_requests_preloader_spec.rb new file mode 100644 index 00000000000..7108de2e491 --- /dev/null +++ b/spec/models/preloaders/merge_requests_preloader_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Preloaders::MergeRequestsPreloader do + describe '#execute' do + let_it_be_with_refind(:merge_requests) { create_list(:merge_request, 3) } + let_it_be(:upvotes) { merge_requests.each { |m| create(:award_emoji, :upvote, awardable: m) } } + + it 'does not make n+1 queries' do + described_class.new(merge_requests).execute + + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do + # expectations make sure the queries execute + merge_requests.each do |m| + expect(m.target_project.project_feature).not_to be_nil + expect(m.lazy_upvotes_count).to eq(1) + end + end + + # 1 query for BatchLoader to load all upvotes at once + expect(control.count).to eq(1) + end + + it 'runs extra queries without preloading' do + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do + # expectations make sure the queries execute + merge_requests.each do |m| + expect(m.target_project.project_feature).not_to be_nil + expect(m.lazy_upvotes_count).to eq(1) + end + end + + # 4 queries per merge request = + # 1 to load merge request + # 1 to load project + # 1 to load project_feature + # 1 to load upvotes count + expect(control.count).to eq(4 * merge_requests.size) + end + end +end diff --git a/yarn.lock b/yarn.lock index a2aa52b9542..a371b8472a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -974,10 +974,10 @@ resolved "https://registry.yarnpkg.com/@gitlab/tributejs/-/tributejs-1.0.0.tgz#672befa222aeffc83e7d799b0500a7a4418e59b8" integrity sha512-nmKw1+hB6MHvlmPz63yPwVs1qQkycHwsKgxpEbzmky16Y6mL4EJMk3w1b8QlOAF/AIAzjCERPhe/R4MJiohbZw== -"@gitlab/ui@32.10.0": - version "32.10.0" - resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-32.10.0.tgz#7c6ff39d2dc0b770237289dedf2eee46a618021b" - integrity sha512-Kr4sDomMmxOr/PgQsfJ45HCHdTjbb9UISYxwtugAGKJKha/zHmpSEtZFu0R1cLhnVUqS0Y+FSgkq2nAw3NuxIA== +"@gitlab/ui@32.10.1": + version "32.10.1" + resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-32.10.1.tgz#36c1e6688c5db85ddea7dcc1fc7e83ea8e3f091f" + integrity sha512-Z0qrhbrE1Y4XR9pUPZVLyjVUYOWwZHHwqw81mD3yP3sbSv0ZIxFRq7Ij0JOM1WPW74SM2nHPvSfwe3217xQkyg== dependencies: "@babel/standalone" "^7.0.0" bootstrap-vue "2.18.1" |