Optimize ProjectWiki#empty? check

The `empty?` check was iterating over all Wiki pages to determine
whether it was empty. Using the limit parameter allows us to bail
out early once we found a page.

Note that this currently only improves performance for GitLab 11.0
until https://gitlab.com/gitlab-org/gitaly/issues/1204 is fixed.

Relates to #40101
This commit is contained in:
Stan Hu 2018-07-11 23:19:20 -07:00
parent ba38931d90
commit 081264f186
3 changed files with 18 additions and 2 deletions

View File

@ -20,7 +20,6 @@ class ProjectWiki
@user = user
end
delegate :empty?, to: :pages
delegate :repository_storage, :hashed_storage?, to: :project
def path
@ -74,6 +73,10 @@ class ProjectWiki
!!find_page('home')
end
def empty?
pages(limit: 1).empty?
end
# Returns an Array of Gitlab WikiPage instances or an
# empty Array if this Wiki has no pages.
def pages(limit: nil)

View File

@ -0,0 +1,5 @@
---
title: Optimize ProjectWiki#empty? check
merge_request: 20573
author:
type: performance

View File

@ -1,3 +1,4 @@
# coding: utf-8
require "spec_helper"
describe ProjectWiki do
@ -10,7 +11,6 @@ describe ProjectWiki do
subject { project_wiki }
it { is_expected.to delegate_method(:empty?).to :pages }
it { is_expected.to delegate_method(:repository_storage).to :project }
it { is_expected.to delegate_method(:hashed_storage?).to :project }
@ -92,11 +92,19 @@ describe ProjectWiki do
context "when the wiki has pages" do
before do
project_wiki.create_page("index", "This is an awesome new Gollum Wiki")
project_wiki.create_page("another-page", "This is another page")
end
describe '#empty?' do
subject { super().empty? }
it { is_expected.to be_falsey }
# Re-enable this when https://gitlab.com/gitlab-org/gitaly/issues/1204 is fixed
xit 'only instantiates a Wiki page once' do
expect(WikiPage).to receive(:new).once.and_call_original
subject
end
end
end
end