Skip to content

Commit

Permalink
Unuse ActiveRecord::Base#cache_key (#8185)
Browse files Browse the repository at this point in the history
* Unuse ActiveRecord::Base#cache_key

* Enable cache_versioning

* Call cache_collection
  • Loading branch information
abcang authored and Gargron committed Aug 19, 2018
1 parent 0d1d9b9 commit 9e75aa3
Show file tree
Hide file tree
Showing 6 changed files with 9 additions and 17 deletions.
2 changes: 1 addition & 1 deletion app/controllers/accounts_controller.rb
Expand Up @@ -42,7 +42,7 @@ def show
format.json do
skip_session!

render_cached_json(['activitypub', 'actor', @account.cache_key], content_type: 'application/activity+json') do
render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter)
end
end
Expand Down
3 changes: 1 addition & 2 deletions app/controllers/api/v1/statuses_controller.rb
Expand Up @@ -17,8 +17,7 @@ class Api::V1::StatusesController < Api::BaseController
CONTEXT_LIMIT = 4_096

def show
cached = Rails.cache.read(@status.cache_key)
@status = cached unless cached.nil?
@status = cache_collection([@status], Status).first
render json: @status, serializer: REST::StatusSerializer
end

Expand Down
13 changes: 4 additions & 9 deletions app/controllers/application_controller.rb
Expand Up @@ -103,24 +103,20 @@ def cache_collection(raw, klass)
return raw unless klass.respond_to?(:with_includes)

raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation)
uncached_ids = []
cached_keys_with_value = Rails.cache.read_multi(*raw.map(&:cache_key))

raw.each do |item|
uncached_ids << item.id unless cached_keys_with_value.key?(item.cache_key)
end
cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id)
uncached_ids = raw.map(&:id) - cached_keys_with_value.keys

klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!)

unless uncached_ids.empty?
uncached = klass.where(id: uncached_ids).with_includes.map { |item| [item.id, item] }.to_h

uncached.each_value do |item|
Rails.cache.write(item.cache_key, item)
Rails.cache.write(item, item)
end
end

raw.map { |item| cached_keys_with_value[item.cache_key] || uncached[item.id] }.compact
raw.map { |item| cached_keys_with_value[item.id] || uncached[item.id] }.compact
end

def respond_with_error(code)
Expand All @@ -135,7 +131,6 @@ def respond_with_error(code)

def render_cached_json(cache_key, **options)
options[:expires_in] ||= 3.minutes
cache_key = cache_key.join(':') if cache_key.is_a?(Enumerable)
cache_public = options.key?(:public) ? options.delete(:public) : true
content_type = options.delete(:content_type) || 'application/json'

Expand Down
2 changes: 1 addition & 1 deletion app/controllers/emojis_controller.rb
Expand Up @@ -9,7 +9,7 @@ def show
format.json do
skip_session!

render_cached_json(['activitypub', 'emoji', @emoji.cache_key], content_type: 'application/activity+json') do
render_cached_json(['activitypub', 'emoji', @emoji], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@emoji, serializer: ActivityPub::EmojiSerializer, adapter: ActivityPub::Adapter)
end
end
Expand Down
4 changes: 2 additions & 2 deletions app/controllers/statuses_controller.rb
Expand Up @@ -33,7 +33,7 @@ def show
format.json do
skip_session! unless @stream_entry.hidden?

render_cached_json(['activitypub', 'note', @status.cache_key], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
render_cached_json(['activitypub', 'note', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter)
end
end
Expand All @@ -43,7 +43,7 @@ def show
def activity
skip_session!

render_cached_json(['activitypub', 'activity', @status.cache_key], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
render_cached_json(['activitypub', 'activity', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter)
end
end
Expand Down
2 changes: 0 additions & 2 deletions app/models/status.rb
Expand Up @@ -24,8 +24,6 @@
#

class Status < ApplicationRecord
self.cache_versioning = false

include Paginable
include Streamable
include Cacheable
Expand Down

0 comments on commit 9e75aa3

Please sign in to comment.