Skip to content

Commit

Permalink
Reduce server load caused by anonymous viewing. (mastodon#9059)
Browse files Browse the repository at this point in the history
Do not start a session if the current user is not logged in for public-facing pages.

Mark pages that don't care about sessions as publicly cacheable.

Keep the max age as 0 so proxies and browsers will still try to retrieve an updated version but can still fall back to the stale version if the site is down or too slow.

Fixes mastodon#9035.
  • Loading branch information
BenLubar authored and Gargron committed Mar 17, 2019
1 parent dee526d commit bfaab20
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 2 deletions.
8 changes: 7 additions & 1 deletion app/controllers/accounts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class AccountsController < ApplicationController
def show
respond_to do |format|
format.html do
mark_cacheable! unless user_signed_in?

@body_classes = 'with-modals'
@pinned_statuses = []
@endorsed_accounts = @account.endorsed_accounts.to_a.sample(4)
Expand All @@ -30,17 +32,21 @@ def show
end

format.atom do
mark_cacheable!

@entries = @account.stream_entries.where(hidden: false).with_includes.paginate_by_max_id(PAGE_SIZE, params[:max_id], params[:since_id])
render xml: OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, @entries.reject { |entry| entry.status.nil? }))
end

format.rss do
mark_cacheable!

@statuses = cache_collection(default_statuses.without_reblogs.without_replies.limit(PAGE_SIZE), Status)
render xml: RSS::AccountSerializer.render(@account, @statuses)
end

format.json do
skip_session!
mark_cacheable!

render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter)
Expand Down
5 changes: 5 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,11 @@ def set_cache_headers
response.headers['Vary'] = 'Accept'
end

def mark_cacheable!
skip_session!
expires_in 0, public: true
end

def skip_session!
request.session_options[:skip] = true
end
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/follower_accounts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ class FollowerAccountsController < ApplicationController
def index
respond_to do |format|
format.html do
mark_cacheable! unless user_signed_in?

next if @account.user_hides_network?

follows
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/statuses_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class StatusesController < ApplicationController
def show
respond_to do |format|
format.html do
mark_cacheable! unless user_signed_in?

@body_classes = 'with-modals'

set_ancestors
Expand All @@ -36,7 +38,7 @@ def show
end

format.json do
skip_session! unless @stream_entry.hidden?
mark_cacheable! unless @stream_entry.hidden?

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)
Expand Down

0 comments on commit bfaab20

Please sign in to comment.