Merge branch 'performance-improvements' into 'master'
Performance improvements * More efficient DB queries * Cache ApplicationSettings per request * Dont query for objects you dont need See merge request !1540
This commit is contained in:
commit
057d43500b
13 changed files with 71 additions and 41 deletions
|
@ -60,6 +60,7 @@ v 7.8.0 (unreleased)
|
|||
- Make sure Markdown previews always use the same styling as the eventual destination.
|
||||
- Remove deprecated Group#owner_id from API
|
||||
- Show projects user contributed to on user page. Show stars near project on user page.
|
||||
- Improve database performance for GitLab
|
||||
|
||||
v 7.7.2
|
||||
- Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch
|
||||
|
|
|
@ -12,11 +12,7 @@ class DashboardController < ApplicationController
|
|||
@groups = current_user.authorized_groups.order_name_asc
|
||||
@has_authorized_projects = @projects.count > 0
|
||||
@projects_count = @projects.count
|
||||
@projects = @projects.limit(@projects_limit)
|
||||
|
||||
@events = Event.in_projects(current_user.authorized_projects.pluck(:id))
|
||||
@events = @event_filter.apply_filter(@events)
|
||||
@events = @events.limit(20).offset(params[:offset] || 0)
|
||||
@projects = @projects.includes(:namespace).limit(@projects_limit)
|
||||
|
||||
@last_push = current_user.recent_push
|
||||
|
||||
|
@ -24,8 +20,16 @@ class DashboardController < ApplicationController
|
|||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.json { pager_json("events/_events", @events.count) }
|
||||
format.atom { render layout: false }
|
||||
|
||||
format.json do
|
||||
load_events
|
||||
pager_json("events/_events", @events.count)
|
||||
end
|
||||
|
||||
format.atom do
|
||||
load_events
|
||||
render layout: false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -74,4 +78,10 @@ class DashboardController < ApplicationController
|
|||
def load_projects
|
||||
@projects = current_user.authorized_projects.sorted_by_activity.non_archived
|
||||
end
|
||||
|
||||
def load_events
|
||||
@events = Event.in_projects(current_user.authorized_projects.pluck(:id))
|
||||
@events = @event_filter.apply_filter(@events).with_associations
|
||||
@events = @events.limit(20).offset(params[:offset] || 0)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -10,11 +10,11 @@ class GroupsController < ApplicationController
|
|||
|
||||
# Load group projects
|
||||
before_filter :load_projects, except: [:new, :create, :projects, :edit, :update]
|
||||
before_filter :event_filter, only: :show
|
||||
before_filter :set_title, only: [:new, :create]
|
||||
|
||||
layout :determine_layout
|
||||
|
||||
before_filter :set_title, only: [:new, :create]
|
||||
|
||||
def new
|
||||
@group = Group.new
|
||||
end
|
||||
|
@ -32,15 +32,21 @@ class GroupsController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
@events = Event.in_projects(project_ids)
|
||||
@events = event_filter.apply_filter(@events)
|
||||
@events = @events.limit(20).offset(params[:offset] || 0)
|
||||
@last_push = current_user.recent_push if current_user
|
||||
@projects = @projects.includes(:namespace)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.json { pager_json("events/_events", @events.count) }
|
||||
format.atom { render layout: false }
|
||||
|
||||
format.json do
|
||||
load_events
|
||||
pager_json("events/_events", @events.count)
|
||||
end
|
||||
|
||||
format.atom do
|
||||
load_events
|
||||
render layout: false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -149,4 +155,10 @@ class GroupsController < ApplicationController
|
|||
def group_params
|
||||
params.require(:group).permit(:name, :description, :path, :avatar)
|
||||
end
|
||||
|
||||
def load_events
|
||||
@events = Event.in_projects(project_ids)
|
||||
@events = event_filter.apply_filter(@events).with_associations
|
||||
@events = @events.limit(20).offset(params[:offset] || 0)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -5,9 +5,10 @@ class ProjectsController < ApplicationController
|
|||
|
||||
# Authorize
|
||||
before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive]
|
||||
before_filter :set_title, only: [:new, :create]
|
||||
before_filter :event_filter, only: :show
|
||||
|
||||
layout 'navless', only: [:new, :create, :fork]
|
||||
before_filter :set_title, only: [:new, :create]
|
||||
|
||||
def new
|
||||
@project = Project.new
|
||||
|
@ -56,9 +57,6 @@ class ProjectsController < ApplicationController
|
|||
end
|
||||
|
||||
limit = (params[:limit] || 20).to_i
|
||||
@events = @project.events.recent
|
||||
@events = event_filter.apply_filter(@events)
|
||||
@events = @events.limit(limit).offset(params[:offset] || 0)
|
||||
|
||||
@show_star = !(current_user && current_user.starred?(@project))
|
||||
|
||||
|
@ -76,7 +74,12 @@ class ProjectsController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
format.json { pager_json('events/_events', @events.count) }
|
||||
format.json do
|
||||
@events = @project.events.recent
|
||||
@events = event_filter.apply_filter(@events).with_associations
|
||||
@events = @events.limit(limit).offset(params[:offset] || 0)
|
||||
pager_json('events/_events', @events.count)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -9,17 +9,18 @@ class UsersController < ApplicationController
|
|||
authorized_projects_ids = visible_projects.pluck(:id)
|
||||
|
||||
@contributed_projects = Project.where(id: authorized_projects_ids).
|
||||
in_group_namespace
|
||||
in_group_namespace.includes(:namespace)
|
||||
|
||||
@projects = @user.personal_projects.
|
||||
where(id: authorized_projects_ids)
|
||||
where(id: authorized_projects_ids).includes(:namespace)
|
||||
|
||||
# Collect only groups common for both users
|
||||
@groups = @user.groups & GroupsFinder.new.execute(current_user)
|
||||
|
||||
# Get user activity feed for projects common for both users
|
||||
@events = @user.recent_events.
|
||||
where(project_id: authorized_projects_ids).limit(30)
|
||||
where(project_id: authorized_projects_ids).
|
||||
with_associations.limit(30)
|
||||
|
||||
@title = @user.name
|
||||
@title_url = user_path(@user)
|
||||
|
|
|
@ -51,7 +51,13 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
def project_icon(project_id, options = {})
|
||||
project = Project.find_with_namespace(project_id)
|
||||
project =
|
||||
if project_id.is_a?(Project)
|
||||
project = project_id
|
||||
else
|
||||
Project.find_with_namespace(project_id)
|
||||
end
|
||||
|
||||
if project.avatar.present?
|
||||
image_tag project.avatar.url, options
|
||||
elsif project.avatar_in_git
|
||||
|
|
|
@ -47,6 +47,7 @@ class Event < ActiveRecord::Base
|
|||
scope :recent, -> { order("created_at DESC") }
|
||||
scope :code_push, -> { where(action: PUSHED) }
|
||||
scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
|
||||
scope :with_associations, -> { includes(project: :namespace) }
|
||||
|
||||
class << self
|
||||
def reset_event_cache_for(target)
|
||||
|
|
|
@ -1,9 +1,4 @@
|
|||
= render "events/event_last_push", event: @last_push
|
||||
= render 'shared/event_filter'
|
||||
|
||||
- if @events.any?
|
||||
.content_list
|
||||
- else
|
||||
.nothing-here-block Projects activity will be displayed here
|
||||
|
||||
.content_list
|
||||
= spinner
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
= link_to project_path(project), class: dom_class(project) do
|
||||
.dash-project-avatar
|
||||
= project_icon(project.to_param, alt: '', class: 'avatar project-avatar s40')
|
||||
= project_icon(project, alt: '', class: 'avatar project-avatar s40')
|
||||
.dash-project-access-icon
|
||||
= visibility_level_icon(project.visibility_level)
|
||||
%span.str-truncated
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
%li.project-row
|
||||
= link_to project_path(project), class: dom_class(project) do
|
||||
.dash-project-avatar
|
||||
= project_icon(project.to_param, alt: '', class: 'avatar s40')
|
||||
= project_icon(project, alt: '', class: 'avatar s40')
|
||||
.dash-project-access-icon
|
||||
= visibility_level_icon(project.visibility_level)
|
||||
%span.str-truncated
|
||||
|
|
|
@ -13,10 +13,7 @@
|
|||
- if current_user
|
||||
= render "events/event_last_push", event: @last_push
|
||||
= render 'shared/event_filter'
|
||||
- if @events.any?
|
||||
.content_list
|
||||
- else
|
||||
.nothing-here-block Project activity will be displayed here
|
||||
.content_list
|
||||
= spinner
|
||||
%aside.side.col-md-4
|
||||
= render "projects", projects: @projects
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
- empty_repo = @project.empty_repo?
|
||||
.project-home-panel{:class => ("empty-project" if empty_repo)}
|
||||
.project-identicon-holder
|
||||
= project_icon(@project.to_param, alt: '', class: 'avatar project-avatar')
|
||||
= project_icon(@project, alt: '', class: 'avatar project-avatar')
|
||||
.project-home-row
|
||||
.project-home-desc
|
||||
- if @project.description.present?
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
module Gitlab
|
||||
module CurrentSettings
|
||||
def current_application_settings
|
||||
if ActiveRecord::Base.connected? && ActiveRecord::Base.connection.table_exists?('application_settings')
|
||||
ApplicationSetting.current ||
|
||||
ApplicationSetting.create_from_defaults
|
||||
else
|
||||
fake_application_settings
|
||||
key = :current_application_settings
|
||||
|
||||
RequestStore.store[key] ||= begin
|
||||
if ActiveRecord::Base.connected? && ActiveRecord::Base.connection.table_exists?('application_settings')
|
||||
RequestStore.store[:current_application_settings] =
|
||||
(ApplicationSetting.current || ApplicationSetting.create_from_defaults)
|
||||
else
|
||||
fake_application_settings
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue