From b81c2e8df3028576c783dbc8b407575be19b8be7 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 14 Feb 2020 10:00:27 -0800 Subject: [PATCH] Remove delayed_job (#6071) [deploy] * Update adapter to sidekiq * Remove delayed_jobs routes * Remove delayd_jobs initializer and references * Remove delayed_job_spec * Remove bin/delayed_job * Remove app/jobs/ * Migration to drop delayed_jobs table * Remove delayed_job_web & delayed_job_active_record * Update docs * Remove reference to delayed_job dashboard * Remove delayed_job settings from initializers * Add delayed_job_admin back to reserved words list --- Gemfile | 2 - Gemfile.lock | 18 ------ app/jobs/application_job.rb | 7 --- app/views/service_worker/index.js.erb | 1 - bin/delayed_job | 5 -- config/initializers/datadog_apm.rb | 1 - config/initializers/delayed_job.rb | 6 -- config/initializers/honeybadger.rb | 1 - config/routes.rb | 2 - .../20200213182938_drop_delayed_job_table.rb | 16 +++++ db/schema.rb | 17 +----- docs/getting-started/start-app.md | 4 +- docs/technical-overview/stack.md | 7 +-- spec/requests/delayed_job_spec.rb | 59 ------------------- spec/requests/internal/users_banish_spec.rb | 7 --- 15 files changed, 22 insertions(+), 131 deletions(-) delete mode 100644 app/jobs/application_job.rb delete mode 100755 bin/delayed_job delete mode 100644 config/initializers/delayed_job.rb create mode 100644 db/migrate/20200213182938_drop_delayed_job_table.rb delete mode 100644 spec/requests/delayed_job_spec.rb diff --git a/Gemfile b/Gemfile index 7cf8f95f6..b8047c5b4 100644 --- a/Gemfile +++ b/Gemfile @@ -29,8 +29,6 @@ gem "cld", "~> 0.8" # Compact Language Detection for Ruby gem "cloudinary", "~> 1.13" # Client library for easily using the Cloudinary service gem "counter_culture", "~> 2.2" # counter_culture provides turbo-charged counter caches that are kept up-to-date gem "ddtrace", "~> 0.32.0" # ddtrace is Datadog’s tracing client for Ruby. -gem "delayed_job_active_record", "~> 4.1" # ActiveRecord backend for Delayed::Job -gem "delayed_job_web", "~> 1.4" # Web interface for delayed_job gem "devise", "~> 4.7" # Flexible authentication solution for Rails gem "dogstatsd-ruby", "~> 4.6" # A client for DogStatsD, an extension of the StatsD metric server for Datadog gem "doorkeeper", "~> 5.3" # Oauth 2 provider diff --git a/Gemfile.lock b/Gemfile.lock index 8f5426e6c..7c7ac6693 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -209,16 +209,6 @@ GEM debug_inspector (0.0.3) declarative (0.0.10) declarative-option (0.1.0) - delayed_job (4.1.8) - activesupport (>= 3.0, < 6.1) - delayed_job_active_record (4.1.4) - activerecord (>= 3.0, < 6.1) - delayed_job (>= 3.0, < 5) - delayed_job_web (1.4.3) - activerecord (> 3.0.0) - delayed_job (> 2.0.3) - rack-protection (>= 1.5.5) - sinatra (>= 1.4.4) derailed_benchmarks (1.6.0) benchmark-ips (~> 2) get_process_mem (~> 0) @@ -490,7 +480,6 @@ GEM multi_json (1.14.1) multi_xml (0.6.0) multipart-post (2.1.1) - mustermann (1.0.3) nakayoshi_fork (0.0.4) naught (1.1.0) nenv (0.3.0) @@ -748,11 +737,6 @@ GEM json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.2) - sinatra (2.0.5) - mustermann (~> 1.0) - rack (~> 2.0) - rack-protection (= 2.0.5) - tilt (~> 2.0) sitemap_generator (6.1.0) builder (~> 3.0) slack-notifier (2.3.2) @@ -896,8 +880,6 @@ DEPENDENCIES cloudinary (~> 1.13) counter_culture (~> 2.2) ddtrace (~> 0.32.0) - delayed_job_active_record (~> 4.1) - delayed_job_web (~> 1.4) derailed_benchmarks (~> 1.6) devise (~> 4.7) dogstatsd-ruby (~> 4.6) diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb deleted file mode 100644 index d394c3d10..000000000 --- a/app/jobs/application_job.rb +++ /dev/null @@ -1,7 +0,0 @@ -class ApplicationJob < ActiveJob::Base - # Automatically retry jobs that encountered a deadlock - # retry_on ActiveRecord::Deadlocked - - # Most jobs are safe to ignore if the underlying records are no longer available - # discard_on ActiveJob::DeserializationError -end diff --git a/app/views/service_worker/index.js.erb b/app/views/service_worker/index.js.erb index 7921e569f..ae4b1500b 100644 --- a/app/views/service_worker/index.js.erb +++ b/app/views/service_worker/index.js.erb @@ -102,7 +102,6 @@ !url.href.includes('/internal') && // Don't fetch for internal dashboard. !url.href.includes('/future') && // Skip for /future. !url.href.includes('?preview=') && // Skip for preview pages. - !url.href.includes('/delayed_job') && // Skip for Delayed Job dashboard !url.href.includes('/sidekiq') && // Skip for Sidekiq dashboard !url.href.includes('/oauth/') && // Skip oauth apps !url.href.includes('/robots.txt') && // Skip robots for web crawlers diff --git a/bin/delayed_job b/bin/delayed_job deleted file mode 100755 index 2eee75904..000000000 --- a/bin/delayed_job +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env ruby - -require File.expand_path(File.join(File.dirname(__FILE__), "..", "config", "environment")) -require "delayed/command" -Delayed::Command.new(ARGV).daemonize diff --git a/config/initializers/datadog_apm.rb b/config/initializers/datadog_apm.rb index e2a3043e8..166e1e535 100644 --- a/config/initializers/datadog_apm.rb +++ b/config/initializers/datadog_apm.rb @@ -6,7 +6,6 @@ Datadog.configure do |c| c.tracer enabled: Rails.env.production? c.tracer partial_flush: true c.tracer priority_sampling: true - c.use :delayed_job c.use :sidekiq c.use :redis c.use :rails diff --git a/config/initializers/delayed_job.rb b/config/initializers/delayed_job.rb deleted file mode 100644 index 4c0241a01..000000000 --- a/config/initializers/delayed_job.rb +++ /dev/null @@ -1,6 +0,0 @@ -Delayed::Worker.destroy_failed_jobs = !Rails.env.development? -Delayed::Worker.sleep_delay = 60 -Delayed::Worker.max_attempts = 10 -Delayed::Worker.max_run_time = 30.minutes -Delayed::Worker.read_ahead = 5 -# Delayed::Worker.delay_jobs = !Rails.env.test? diff --git a/config/initializers/honeybadger.rb b/config/initializers/honeybadger.rb index 741079e87..06d1eed56 100644 --- a/config/initializers/honeybadger.rb +++ b/config/initializers/honeybadger.rb @@ -21,7 +21,6 @@ Honeybadger.configure do |config| ActiveRecord::QueryCanceled, ] config.request.filter_keys += %w[authorization] - config.delayed_job.attempt_threshold = 10 config.sidekiq.attempt_threshold = 10 config.breadcrumbs.enabled = true diff --git a/config/routes.rb b/config/routes.rb index 0ece21a8c..2ab6b9006 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,8 +12,6 @@ Rails.application.routes.draw do require "sidekiq/web" authenticated :user, ->(user) { user.tech_admin? } do - mount DelayedJobWeb, at: "/delayed_job" - Sidekiq::Web.set :session_secret, Rails.application.secrets[:secret_key_base] Sidekiq::Web.set :sessions, Rails.application.config.session_options Sidekiq::Web.class_eval do diff --git a/db/migrate/20200213182938_drop_delayed_job_table.rb b/db/migrate/20200213182938_drop_delayed_job_table.rb new file mode 100644 index 000000000..c5fb6b5e5 --- /dev/null +++ b/db/migrate/20200213182938_drop_delayed_job_table.rb @@ -0,0 +1,16 @@ +class DropDelayedJobTable < ActiveRecord::Migration[5.2] + def change + drop_table :delayed_jobs, force: true do |t| + t.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue + t.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually. + t.text :handler, null: false # YAML-encoded string of the object that will do work + t.text :last_error # reason for last failure (See Note below) + t.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. + t.datetime :locked_at # Set when a client is working on this object + t.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) + t.string :locked_by # Who is working on this object (if locked) + t.string :queue # The name of the queue this job is in + t.timestamps null: true + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 9996819be..272961a5c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_02_11_192415) do +ActiveRecord::Schema.define(version: 2020_02_13_182938) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -359,21 +359,6 @@ ActiveRecord::Schema.define(version: 2020_02_11_192415) do t.datetime "updated_at", null: false end - create_table "delayed_jobs", id: :serial, force: :cascade do |t| - t.integer "attempts", default: 0, null: false - t.datetime "created_at" - t.datetime "failed_at" - t.text "handler", null: false - t.text "last_error" - t.datetime "locked_at" - t.string "locked_by" - t.integer "priority", default: 0, null: false - t.string "queue" - t.datetime "run_at" - t.datetime "updated_at" - t.index ["priority", "run_at"], name: "delayed_jobs_priority" - end - create_table "display_ad_events", force: :cascade do |t| t.string "category" t.bigint "context_id" diff --git a/docs/getting-started/start-app.md b/docs/getting-started/start-app.md index b71655720..88ca63586 100644 --- a/docs/getting-started/start-app.md +++ b/docs/getting-started/start-app.md @@ -7,7 +7,7 @@ title: Starting the Application We're a Rails app, and we use [Webpacker][webpacker] to manage some of our JavaScript. -Start the application, Webpack, and our job runner [delayed_job][delayed_job] by +Start the application, Webpack, and our job runner [Sidekiq][sidekiq] by running: ```shell @@ -40,5 +40,5 @@ instance/tab of your shell. Current gotchas: potential environment issues with external services need to be worked out. -[delayed_job]: https://github.com/collectiveidea/delayed_job_active_record +[sidekiq]: https://github.com/mperham/sidekiq [webpacker]: https://github.com/rails/webpacker diff --git a/docs/technical-overview/stack.md b/docs/technical-overview/stack.md index 28f3d7270..0d64c96ee 100644 --- a/docs/technical-overview/stack.md +++ b/docs/technical-overview/stack.md @@ -14,10 +14,9 @@ For the Dev.to tech stack we use: - [_Cloudinary_](https://cloudinary.com/) for image manipulation/serving - [_Honeybadger_](https://www.honeybadger.io/) for error monitoring - [_Timber_](https://timber.io/) for logging -- [_Delayed Job_](https://github.com/collectiveidea/delayed_job) and -- [_Sidekiq_](https://github.com/mperham/sidekiq) (will be replacing delayed - job) and [_Active Job_](https://guides.rubyonrails.org/active_job_basics.html) - for background workers +- [_Sidekiq_](https://github.com/mperham/sidekiq) and + [_Active Job_](https://guides.rubyonrails.org/active_job_basics.html) for + background workers - [_Algolia_](https://www.algolia.com/) for search - [Ransack](https://github.com/activerecord-hackery/ransack) for internal search - [_Redcarpet_](https://github.com/vmg/redcarpet) and diff --git a/spec/requests/delayed_job_spec.rb b/spec/requests/delayed_job_spec.rb deleted file mode 100644 index 49b6032a6..000000000 --- a/spec/requests/delayed_job_spec.rb +++ /dev/null @@ -1,59 +0,0 @@ -require "rails_helper" - -RSpec.describe "Delayed Job web interface", type: :request do - let(:user) { create(:user) } - let(:super_admin) { create(:user, :super_admin) } - let(:article) { create(:article, user_id: user.id) } - let(:tech_admin) do - user = create(:user) - user.add_role :tech_admin - user - end - - describe "GET /delayed_job" do - context "when not logged in" do - it "raises 404" do - expect do - get "/delayed_job" - end.to raise_error(ActiveRecord::RecordNotFound) - end - end - - context "when logged in" do - it "raises 404" do - sign_in user - expect do - get "/delayed_job" - end.to raise_error(ActiveRecord::RecordNotFound) - end - end - - context "when logged in as a super admin" do - before { sign_in super_admin } - - it "redirects to overview" do - get "/delayed_job" - expect(response).to redirect_to("/delayed_job/overview") - end - - it "renders overview" do - get "/delayed_job/overview" - expect(response.body).to include "Overview" - end - end - - context "when logged in as a tech support member" do - before { sign_in tech_admin } - - it "redirects to overview" do - get "/delayed_job" - expect(response).to redirect_to("/delayed_job/overview") - end - - it "renders overview" do - get "/delayed_job/overview" - expect(response.body).to include "Overview" - end - end - end -end diff --git a/spec/requests/internal/users_banish_spec.rb b/spec/requests/internal/users_banish_spec.rb index 6be56cb8a..df5aeb02c 100644 --- a/spec/requests/internal/users_banish_spec.rb +++ b/spec/requests/internal/users_banish_spec.rb @@ -13,7 +13,6 @@ RSpec.describe "Internal::Users", type: :request do before do sign_in super_admin - Delayed::Worker.new(quiet: true).work_off dependents_for_offending_user_article offender_activity_on_other_content end @@ -32,7 +31,6 @@ RSpec.describe "Internal::Users", type: :request do perform_enqueued_jobs do Mention.create_all(comment2) end - Delayed::Worker.new(quiet: true).work_off end def offender_activity_on_other_content @@ -42,7 +40,6 @@ RSpec.describe "Internal::Users", type: :request do comment = create(:comment, commentable_type: "Article", commentable: article2, user: user) # user3 reacts to offender comment create(:reaction, reactable: comment, reactable_type: "Comment", user: user3) - Delayed::Worker.new(quiet: true).work_off end def full_profile @@ -62,13 +59,11 @@ RSpec.describe "Internal::Users", type: :request do url: Faker::Internet.url } GithubRepo.create(params) - Delayed::Worker.new(quiet: true).work_off end def call_ghost ghost post "/internal/users/#{user.id}/full_delete", params: { user: { ghostify: "true" } } - Delayed::Worker.new(quiet: true).work_off end context "when merging users" do @@ -187,7 +182,6 @@ RSpec.describe "Internal::Users", type: :request do create_mutual_follows create_mention create(:badge_achievement, rewarder_id: 1, rewarding_context_message: "yay", user_id: user.id) - Delayed::Worker.new(quiet: true).work_off end it "raises a 'record not found' error after deletion" do @@ -206,7 +200,6 @@ RSpec.describe "Internal::Users", type: :request do context "when banishing user" do def banish_user post "/internal/users/#{user.id}/banish" - Delayed::Worker.new(quiet: true).work_off user.reload end