From 4247e67be1faa9d52691757dad954a7fa63e8bfe Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 3 Jan 2020 12:07:59 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- changelogs/unreleased/118669-blob-preload.yml | 5 ++++ changelogs/unreleased/remove-pg-limit-fix.yml | 5 ++++ config/initializers/postgresql_limit_fix.rb | 27 ---------------------- lib/gitlab/file_finder.rb | 2 +- .../components/knative_domain_editor_spec.js | 4 +++- ...ninstall_application_confirmation_modal_spec.js | 7 +++--- .../services/crossplane_provider_stack_spec.js | 4 +++- .../diffs/components/diff_file_header_spec.js | 8 +++++-- spec/frontend/ide/components/jobs/stage_spec.js | 4 +++- .../notes/components/discussion_notes_spec.js | 20 ++++++++++++---- .../repository/components/last_commit_spec.js | 6 +++-- .../mr_widget_commit_message_dropdown_spec.js | 4 +++- spec/lib/gitlab/file_finder_spec.rb | 6 +++++ spec/lib/gitlab/project_search_results_spec.rb | 3 +-- 14 files changed, 60 insertions(+), 45 deletions(-) create mode 100644 changelogs/unreleased/118669-blob-preload.yml create mode 100644 changelogs/unreleased/remove-pg-limit-fix.yml delete mode 100644 config/initializers/postgresql_limit_fix.rb diff --git a/changelogs/unreleased/118669-blob-preload.yml b/changelogs/unreleased/118669-blob-preload.yml new file mode 100644 index 00000000000..757ae0154db --- /dev/null +++ b/changelogs/unreleased/118669-blob-preload.yml @@ -0,0 +1,5 @@ +--- +title: Fix slow query on blob search when doing path filtering +merge_request: 21996 +author: +type: performance diff --git a/changelogs/unreleased/remove-pg-limit-fix.yml b/changelogs/unreleased/remove-pg-limit-fix.yml new file mode 100644 index 00000000000..dfa29978347 --- /dev/null +++ b/changelogs/unreleased/remove-pg-limit-fix.yml @@ -0,0 +1,5 @@ +--- +title: Remove ActiveRecord patch to ignore limit on text columns +merge_request: 22406 +author: +type: other diff --git a/config/initializers/postgresql_limit_fix.rb b/config/initializers/postgresql_limit_fix.rb deleted file mode 100644 index 4224d857e8a..00000000000 --- a/config/initializers/postgresql_limit_fix.rb +++ /dev/null @@ -1,27 +0,0 @@ -if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) - class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter - module LimitFilter - def add_column(table_name, column_name, type, options = {}) - options.delete(:limit) if type == :text - super(table_name, column_name, type, options) - end - - def change_column(table_name, column_name, type, options = {}) - options.delete(:limit) if type == :text - super(table_name, column_name, type, options) - end - end - - prepend ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::LimitFilter - - class TableDefinition - def text(*args) - options = args.extract_options! - options.delete(:limit) - column_names = args - type = :text - column_names.each { |name| column(name, type, options) } - end - end - end -end diff --git a/lib/gitlab/file_finder.rb b/lib/gitlab/file_finder.rb index ec9d2df613b..a71baadfdb3 100644 --- a/lib/gitlab/file_finder.rb +++ b/lib/gitlab/file_finder.rb @@ -37,7 +37,7 @@ module Gitlab def find_by_path(query) search_paths(query).map do |path| - Gitlab::Search::FoundBlob.new(blob_path: path, project: project, ref: ref, repository: repository) + Gitlab::Search::FoundBlob.new(blob_path: path, path: path, project: project, ref: ref, repository: repository) end end diff --git a/spec/frontend/clusters/components/knative_domain_editor_spec.js b/spec/frontend/clusters/components/knative_domain_editor_spec.js index 94e34088c85..6514d883c0d 100644 --- a/spec/frontend/clusters/components/knative_domain_editor_spec.js +++ b/spec/frontend/clusters/components/knative_domain_editor_spec.js @@ -79,7 +79,9 @@ describe('KnativeDomainEditor', () => { it('triggers save event and pass current knative hostname', () => { wrapper.find(LoadingButton).vm.$emit('click'); - expect(wrapper.emitted('save')[0]).toEqual([knative.hostname]); + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted('save')[0]).toEqual([knative.hostname]); + }); }); }); diff --git a/spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js b/spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js index f95bce775c6..c07f6851826 100644 --- a/spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js +++ b/spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js @@ -35,9 +35,10 @@ describe('UninstallApplicationConfirmationModal', () => { wrapper.find(GlModal).vm.$emit('ok'); }); - it('emits confirm event', () => { - expect(wrapper.emitted('confirm')).toBeTruthy(); - }); + it('emits confirm event', () => + wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted('confirm')).toBeTruthy(); + })); it('calls track uninstall button click mixin', () => { expect(wrapper.vm.trackUninstallButtonClick).toHaveBeenCalledWith(INGRESS); diff --git a/spec/frontend/clusters/services/crossplane_provider_stack_spec.js b/spec/frontend/clusters/services/crossplane_provider_stack_spec.js index d43dc9333b4..3e5f8de8e7b 100644 --- a/spec/frontend/clusters/services/crossplane_provider_stack_spec.js +++ b/spec/frontend/clusters/services/crossplane_provider_stack_spec.js @@ -70,7 +70,9 @@ describe('CrossplaneProviderStack component', () => { }; createComponent({ crossplane }); findFirstDropdownElement().vm.$emit('click'); - expect(wrapper.emitted().set[0][0].code).toEqual('gcp'); + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().set[0][0].code).toEqual('gcp'); + }); }); it('renders the correct dropdown text when no stack is selected', () => { diff --git a/spec/frontend/diffs/components/diff_file_header_spec.js b/spec/frontend/diffs/components/diff_file_header_spec.js index d2f537950d1..4f6e771aec8 100644 --- a/spec/frontend/diffs/components/diff_file_header_spec.js +++ b/spec/frontend/diffs/components/diff_file_header_spec.js @@ -126,7 +126,9 @@ describe('DiffFileHeader component', () => { it('when collapseIcon is clicked emits toggleFile', () => { createComponent({ collapsible: true }); findCollapseIcon().vm.$emit('click', new Event('click')); - expect(wrapper.emitted().toggleFile).toBeDefined(); + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().toggleFile).toBeDefined(); + }); }); it('when other element in header is clicked does not emits toggleFile', () => { @@ -200,7 +202,9 @@ describe('DiffFileHeader component', () => { addMergeRequestButtons: true, }); wrapper.find(EditButton).vm.$emit('showForkMessage'); - expect(wrapper.emitted().showForkMessage).toBeDefined(); + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().showForkMessage).toBeDefined(); + }); }); it('for mode_changed file mode displays mode changes', () => { diff --git a/spec/frontend/ide/components/jobs/stage_spec.js b/spec/frontend/ide/components/jobs/stage_spec.js index dadf5b4caee..400eabfee6d 100644 --- a/spec/frontend/ide/components/jobs/stage_spec.js +++ b/spec/frontend/ide/components/jobs/stage_spec.js @@ -65,7 +65,9 @@ describe('IDE pipeline stage', () => { .findAll(Item) .at(0) .vm.$emit('clickViewLog', job); - expect(wrapper.emitted().clickViewLog[0][0]).toBe(job); + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().clickViewLog[0][0]).toBe(job); + }); }); it('renders stage details & icon', () => { diff --git a/spec/frontend/notes/components/discussion_notes_spec.js b/spec/frontend/notes/components/discussion_notes_spec.js index 5ab26d742ca..51c7f45d5b0 100644 --- a/spec/frontend/notes/components/discussion_notes_spec.js +++ b/spec/frontend/notes/components/discussion_notes_spec.js @@ -119,17 +119,26 @@ describe('DiscussionNotes', () => { it('emits deleteNote when first note emits handleDeleteNote', () => { findNoteAtIndex(0).vm.$emit('handleDeleteNote'); - expect(wrapper.emitted().deleteNote).toBeTruthy(); + + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().deleteNote).toBeTruthy(); + }); }); it('emits startReplying when first note emits startReplying', () => { findNoteAtIndex(0).vm.$emit('startReplying'); - expect(wrapper.emitted().startReplying).toBeTruthy(); + + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().startReplying).toBeTruthy(); + }); }); it('emits deleteNote when second note emits handleDeleteNote', () => { findNoteAtIndex(1).vm.$emit('handleDeleteNote'); - expect(wrapper.emitted().deleteNote).toBeTruthy(); + + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().deleteNote).toBeTruthy(); + }); }); }); @@ -142,7 +151,10 @@ describe('DiscussionNotes', () => { it('emits deleteNote when first note emits handleDeleteNote', () => { note.vm.$emit('handleDeleteNote'); - expect(wrapper.emitted().deleteNote).toBeTruthy(); + + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().deleteNote).toBeTruthy(); + }); }); }); }); diff --git a/spec/frontend/repository/components/last_commit_spec.js b/spec/frontend/repository/components/last_commit_spec.js index 855837d8746..b25045b107b 100644 --- a/spec/frontend/repository/components/last_commit_spec.js +++ b/spec/frontend/repository/components/last_commit_spec.js @@ -118,8 +118,10 @@ describe('Repository last commit component', () => { vm.find('.text-expander').vm.$emit('click'); - expect(vm.find('.commit-row-description').isVisible()).toBe(true); - expect(vm.find('.text-expander').classes('open')).toBe(true); + return vm.vm.$nextTick().then(() => { + expect(vm.find('.commit-row-description').isVisible()).toBe(true); + expect(vm.find('.text-expander').classes('open')).toBe(true); + }); }); it('renders the signature HTML as returned by the backend', () => { diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_commit_message_dropdown_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_commit_message_dropdown_spec.js index daf1cc2d98b..d1310515856 100644 --- a/spec/frontend/vue_mr_widget/components/states/mr_widget_commit_message_dropdown_spec.js +++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_commit_message_dropdown_spec.js @@ -56,6 +56,8 @@ describe('Commits message dropdown component', () => { it('should emit a commit title on selecting commit', () => { findFirstDropdownElement().vm.$emit('click'); - expect(wrapper.emitted().input[0]).toEqual(['Update test.txt']); + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.emitted().input[0]).toEqual(['Update test.txt']); + }); }); }); diff --git a/spec/lib/gitlab/file_finder_spec.rb b/spec/lib/gitlab/file_finder_spec.rb index 6cc5141a6fe..90aa759671a 100644 --- a/spec/lib/gitlab/file_finder_spec.rb +++ b/spec/lib/gitlab/file_finder_spec.rb @@ -30,5 +30,11 @@ describe Gitlab::FileFinder do expect(results.count).to eq(1) end + + it 'does not cause N+1 query' do + expect(Gitlab::GitalyClient).to receive(:call).at_most(10).times.and_call_original + + subject.find(': filename:wm.svg') + end end end diff --git a/spec/lib/gitlab/project_search_results_spec.rb b/spec/lib/gitlab/project_search_results_spec.rb index 6f4844d4543..ae4c14e4deb 100644 --- a/spec/lib/gitlab/project_search_results_spec.rb +++ b/spec/lib/gitlab/project_search_results_spec.rb @@ -86,8 +86,7 @@ describe Gitlab::ProjectSearchResults do it "loads all blobs for path matches in single batch" do expect(Gitlab::Git::Blob).to receive(:batch).once.and_call_original - expected = project.repository.search_files_by_name(query, 'master') - expect(results.map(&:path)).to include(*expected) + results.map(&:data) end it 'finds by content' do -- cgit v1.2.3