Fixing FanOutOnWriteService, fixing Sidekiq not having enough DB connections

in the pool, adding a throttle of 60rpm per IP, adding mini profiler, adding
admin status to users
master
Eugen Rochko 9 years ago
parent 8eeec389c1
commit e24bfbde1a
  1. 5
      Gemfile
  2. 7
      app/controllers/application_controller.rb
  3. 1
      app/lib/feed_manager.rb
  4. 4
      app/models/user.rb
  5. 4
      app/services/fan_out_on_write_service.rb
  6. 2
      config/database.yml
  7. 4
      config/initializers/rack-attack.rb
  8. 2
      config/routes.rb
  9. 5
      db/migrate/20160325130944_add_admin_to_users.rb
  10. 15
      db/schema.rb

@ -58,10 +58,13 @@ group :development do
gem 'rubocop', require: false gem 'rubocop', require: false
gem 'better_errors' gem 'better_errors'
gem 'binding_of_caller' gem 'binding_of_caller'
gem 'rack-mini-profiler'
gem 'letter_opener' gem 'letter_opener'
end end
group :production do group :production do
gem 'rails_12factor' gem 'rails_12factor'
end end
group :development, :production do
gem 'rack-mini-profiler'
end

@ -2,4 +2,11 @@ class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception. # Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead. # For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception protect_from_forgery with: :exception
# Profiling
before_action do
if current_user && current_user.admin?
Rack::MiniProfiler.authorize_request
end
end
end end

@ -6,6 +6,7 @@ class FeedManager
end end
def self.filter_status?(status, follower) def self.filter_status?(status, follower)
replied_to_user = status.reply? ? status.thread.account : nil
(status.reply? && !(follower.id = replied_to_user.id || follower.following?(replied_to_user))) (status.reply? && !(follower.id = replied_to_user.id || follower.following?(replied_to_user)))
end end
end end

@ -7,4 +7,8 @@ class User < ActiveRecord::Base
validates :account, presence: true validates :account, presence: true
has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner
def admin?
self.admin
end
end end

@ -3,7 +3,7 @@ class FanOutOnWriteService < BaseService
# @param [Status] status # @param [Status] status
def call(status) def call(status)
deliver_to_self(status) if status.account.local? deliver_to_self(status) if status.account.local?
deliver_to_followers(status, status.reply? ? status.thread.account : nil) deliver_to_followers(status)
deliver_to_mentioned(status) deliver_to_mentioned(status)
end end
@ -13,7 +13,7 @@ class FanOutOnWriteService < BaseService
push(:home, status.account.id, status) push(:home, status.account.id, status)
end end
def deliver_to_followers(status, replied_to_user) def deliver_to_followers(status)
status.account.followers.each do |follower| status.account.followers.each do |follower|
next if !follower.local? || FeedManager.filter_status?(status, follower) next if !follower.local? || FeedManager.filter_status?(status, follower)
push(:home, follower.id, status) push(:home, follower.id, status)

@ -1,6 +1,6 @@
default: &default default: &default
adapter: postgresql adapter: postgresql
pool: 5 pool: 25
timeout: 5000 timeout: 5000
encoding: unicode encoding: unicode

@ -1,3 +1,5 @@
class Rack::Attack class Rack::Attack
# TODO throttle('req/ip', limit: 300, period: 5.minutes) do |req|
req.ip
end
end end

@ -1,7 +1,7 @@
require 'sidekiq/web' require 'sidekiq/web'
Rails.application.routes.draw do Rails.application.routes.draw do
authenticate :user do authenticate :user, lambda { |u| u.admin? } do
mount Sidekiq::Web => '/sidekiq' mount Sidekiq::Web => '/sidekiq'
end end

@ -0,0 +1,5 @@
class AddAdminToUsers < ActiveRecord::Migration
def change
add_column :users, :admin, :boolean, default: false
end
end

@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160322193748) do ActiveRecord::Schema.define(version: 20160325130944) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -143,19 +143,20 @@ ActiveRecord::Schema.define(version: 20160322193748) do
add_index "stream_entries", ["activity_id", "activity_type"], name: "index_stream_entries_on_activity_id_and_activity_type", using: :btree add_index "stream_entries", ["activity_id", "activity_type"], name: "index_stream_entries_on_activity_id_and_activity_type", using: :btree
create_table "users", force: :cascade do |t| create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false t.string "email", default: "", null: false
t.integer "account_id", null: false t.integer "account_id", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.string "encrypted_password", default: "", null: false t.string "encrypted_password", default: "", null: false
t.string "reset_password_token" t.string "reset_password_token"
t.datetime "reset_password_sent_at" t.datetime "reset_password_sent_at"
t.datetime "remember_created_at" t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at" t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at" t.datetime "last_sign_in_at"
t.inet "current_sign_in_ip" t.inet "current_sign_in_ip"
t.inet "last_sign_in_ip" t.inet "last_sign_in_ip"
t.boolean "admin", default: false
end end
add_index "users", ["account_id"], name: "index_users_on_account_id", using: :btree add_index "users", ["account_id"], name: "index_users_on_account_id", using: :btree

Loading…
Cancel
Save