Commit 480535a1 authored by Robert Speicher's avatar Robert Speicher

Merge branch 'add-caching-for-project-count' into 'master'

Add a method in Project to return a cached value of total count of projects

This is in preparation to address the DB load caused by the counting
in gitlab-com/infrastructure#303.

See merge request !5746
parents 3f073738 1e631617
...@@ -378,6 +378,12 @@ class Project < ActiveRecord::Base ...@@ -378,6 +378,12 @@ class Project < ActiveRecord::Base
joins(join_body).reorder('join_note_counts.amount DESC') joins(join_body).reorder('join_note_counts.amount DESC')
end end
def cached_count
Rails.cache.fetch('total_project_count', expires_in: 5.minutes) do
Project.count
end
end
end end
def repository_storage_path def repository_storage_path
......
...@@ -714,6 +714,20 @@ describe Project, models: true do ...@@ -714,6 +714,20 @@ describe Project, models: true do
it { expect(project.builds_enabled?).to be_truthy } it { expect(project.builds_enabled?).to be_truthy }
end end
describe '.cached_count', caching: true do
let(:group) { create(:group, :public) }
let!(:project1) { create(:empty_project, :public, group: group) }
let!(:project2) { create(:empty_project, :public, group: group) }
it 'returns total project count' do
expect(Project).to receive(:count).once.and_call_original
3.times do
expect(Project.cached_count).to eq(2)
end
end
end
describe '.trending' do describe '.trending' do
let(:group) { create(:group, :public) } let(:group) { create(:group, :public) }
let(:project1) { create(:empty_project, :public, group: group) } let(:project1) { create(:empty_project, :public, group: group) }
......
...@@ -42,6 +42,13 @@ RSpec.configure do |config| ...@@ -42,6 +42,13 @@ RSpec.configure do |config|
config.before(:suite) do config.before(:suite) do
TestEnv.init TestEnv.init
end end
config.around(:each, :caching) do |example|
caching_store = Rails.cache
Rails.cache = ActiveSupport::Cache::MemoryStore.new if example.metadata[:caching]
example.run
Rails.cache = caching_store
end
end end
FactoryGirl::SyntaxRunner.class_eval do FactoryGirl::SyntaxRunner.class_eval do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment