From 63723ef6df788391ed776441421ae482ad4fbd82 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Fri, 13 Dec 2013 13:40:45 -0600 Subject: [PATCH] Fix dashboard event caching --- app/controllers/projects/issues_controller.rb | 1 + .../projects/merge_requests_controller.rb | 1 + app/controllers/projects/notes_controller.rb | 2 ++ app/models/issue.rb | 14 ++++++++++++++ app/models/merge_request.rb | 14 ++++++++++++++ app/models/note.rb | 15 +++++++++++++++ 6 files changed, 47 insertions(+) diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 5dcdba5d388..e7b4c837ae3 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -74,6 +74,7 @@ class Projects::IssuesController < Projects::ApplicationController def update @issue.update_attributes(params[:issue].merge(author_id_of_changes: current_user.id)) + @issue.reset_events_cache respond_to do |format| format.js diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 7d7c1104ec9..6d39673194a 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -97,6 +97,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id)) @merge_request.reload_code @merge_request.mark_as_unchecked + @merge_request.reset_events_cache redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully updated.' else render "edit" diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb index 2738a99459d..5ff5c5b7d96 100644 --- a/app/controllers/projects/notes_controller.rb +++ b/app/controllers/projects/notes_controller.rb @@ -39,6 +39,7 @@ class Projects::NotesController < Projects::ApplicationController @note = @project.notes.find(params[:id]) return access_denied! unless can?(current_user, :admin_note, @note) @note.destroy + @note.reset_events_cache respond_to do |format| format.js { render nothing: true } @@ -50,6 +51,7 @@ class Projects::NotesController < Projects::ApplicationController return access_denied! unless can?(current_user, :admin_note, @note) @note.update_attributes(params[:note]) + @note.reset_events_cache respond_to do |format| format.js do diff --git a/app/models/issue.rb b/app/models/issue.rb index d350b237d37..b3609cf2f45 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -64,4 +64,18 @@ class Issue < ActiveRecord::Base def gfm_reference "issue ##{iid}" end + + # Reset issue events cache + # + # Since we do cache @event we need to reset cache in special cases: + # * when an issue is updated + # Events cache stored like events/23-20130109142513. + # The cache key includes updated_at timestamp. + # Thus it will automatically generate a new fragment + # when the event is updated because the key changes. + def reset_events_cache + Event.where(target_id: self.id, target_type: 'Issue'). + order('id DESC').limit(100). + update_all(updated_at: Time.now) + end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index e862f35819c..e59aee8b445 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -305,6 +305,20 @@ class MergeRequest < ActiveRecord::Base self.target_project.repository.branch_names.include?(self.target_branch) end + # Reset merge request events cache + # + # Since we do cache @event we need to reset cache in special cases: + # * when a merge request is updated + # Events cache stored like events/23-20130109142513. + # The cache key includes updated_at timestamp. + # Thus it will automatically generate a new fragment + # when the event is updated because the key changes. + def reset_events_cache + Event.where(target_id: self.id, target_type: 'MergeRequest'). + order('id DESC').limit(100). + update_all(updated_at: Time.now) + end + private def dump_commits(commits) diff --git a/app/models/note.rb b/app/models/note.rb index 8284da8616f..b23f7df7742 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -239,4 +239,19 @@ class Note < ActiveRecord::Base def noteable_type=(sType) super(sType.to_s.classify.constantize.base_class.to_s) end + + # Reset notes events cache + # + # Since we do cache @event we need to reset cache in special cases: + # * when a note is updated + # * when a note is removed + # Events cache stored like events/23-20130109142513. + # The cache key includes updated_at timestamp. + # Thus it will automatically generate a new fragment + # when the event is updated because the key changes. + def reset_events_cache + Event.where(target_id: self.id, target_type: 'Note'). + order('id DESC').limit(100). + update_all(updated_at: Time.now) + end end