Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-09-15 09:10:57 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-09-15 09:10:57 +0300
commit034e7d969a591605267c0e5ddbe6f2228bf8e43d (patch)
tree408e33f34a634187a765ee7d208a55d27bcbd770
parent26c3184b621c4349997b1fade462c3fb480ad976 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--app/models/award_emoji.rb2
-rw-r--r--app/models/merge_request.rb14
-rw-r--r--app/models/preloaders/merge_requests_preloader.rb19
-rw-r--r--app/views/layouts/header/_default.html.haml2
-rw-r--r--doc/development/elasticsearch.md5
-rw-r--r--package.json2
-rw-r--r--qa/qa/page/main/menu.rb11
-rw-r--r--qa/qa/runtime/browser.rb20
-rw-r--r--spec/models/preloaders/merge_requests_preloader_spec.rb42
-rw-r--r--yarn.lock8
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"