Skip to content

Commit

Permalink
do not eager load consumers before supervisor initialize application
Browse files Browse the repository at this point in the history
  • Loading branch information
marcosgz committed Nov 4, 2024
1 parent f37d2b7 commit 31d1e7a
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 28 deletions.
2 changes: 1 addition & 1 deletion gemfiles/rails52.gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ source "https://rubygems.org"

gemspec path: ".."

gem 'rails', '~> 5.2', '>= 5.2.8.1'
gem "rails", "~> 5.2", ">= 5.2.8.1"
2 changes: 1 addition & 1 deletion gemfiles/rails61.gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ source "https://rubygems.org"

gemspec path: ".."

gem 'rails', '~> 6.1', '>= 6.1.7.10'
gem "rails", "~> 6.1", ">= 6.1.7.10"
11 changes: 7 additions & 4 deletions lib/lepus/supervisor/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,13 @@ def consumers=(vals)
end

def consumers
@consumers ||= begin
Lepus.eager_load_consumers!
Lepus::Consumer.descendants.reject(&:abstract_class?).map(&:name)
end
@consumers ||= Dir[Lepus.config.consumers_directory.join("**/*.rb")].map { |path| Pathname.new(path) }.map do |path|
next unless path.extname == ".rb"

path.relative_path_from(Lepus.config.consumers_directory).to_s.sub(/\.rb$/, "").split("/").map do |part|
part.split("_").collect(&:capitalize).join
end.join("::")
end.compact
end

protected
Expand Down
40 changes: 20 additions & 20 deletions spec/lepus/process_registry_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,74 +4,74 @@

RSpec.describe Lepus::ProcessRegistry do
after do
Lepus::ProcessRegistry.instance.clear
described_class.instance.clear
end

let(:supervisor) { instance_double(Lepus::Process, id: "p1") }
let(:process) { instance_double(Lepus::Process, id: "p2", supervisor_id: "p1") }

describe "#add" do
it "adds a process to the registry" do
Lepus::ProcessRegistry.instance.add(supervisor)
described_class.instance.add(supervisor)

expect(Lepus::ProcessRegistry.instance.instance_variable_get(:@processes)).to eq("p1" => supervisor)
expect(described_class.instance.instance_variable_get(:@processes)).to eq("p1" => supervisor)
end
end

describe "#delete" do
it "deletes a process from the registry" do
Lepus::ProcessRegistry.instance.add(supervisor)
Lepus::ProcessRegistry.instance.add(process)
described_class.instance.add(supervisor)
described_class.instance.add(process)

Lepus::ProcessRegistry.instance.delete(process)
described_class.instance.delete(process)

expect(Lepus::ProcessRegistry.instance.all).to eq([supervisor])
expect(described_class.instance.all).to eq([supervisor])
end
end

describe "#find" do
it "returns a process by id" do
Lepus::ProcessRegistry.instance.add(supervisor)
described_class.instance.add(supervisor)

expect(Lepus::ProcessRegistry.instance.find("p1")).to eq(supervisor)
expect(described_class.instance.find("p1")).to eq(supervisor)
end

it "raises an error when the process does not exist" do
expect do
Lepus::ProcessRegistry.instance.find("non-existing")
described_class.instance.find("non-existing")
end.to raise_error(Lepus::Process::NotFoundError)
end
end

describe "#exists?" do
it "returns true when a process exists" do
Lepus::ProcessRegistry.instance.add(supervisor)
described_class.instance.add(supervisor)

expect(Lepus::ProcessRegistry.instance.exists?("p1")).to be(true)
expect(described_class.instance.exists?("p1")).to be(true)
end

it "returns false when a process does not exist" do
expect(Lepus::ProcessRegistry.instance.exists?("non-existing")).to be(false)
expect(described_class.instance.exists?("non-existing")).to be(false)
end
end

describe "#all" do
it "returns all processes" do
Lepus::ProcessRegistry.instance.add(supervisor)
Lepus::ProcessRegistry.instance.add(process)
described_class.instance.add(supervisor)
described_class.instance.add(process)

expect(Lepus::ProcessRegistry.instance.all).to eq([supervisor, process])
expect(described_class.instance.all).to eq([supervisor, process])
end
end

describe "#clear" do
it "clears all processes" do
Lepus::ProcessRegistry.instance.add(supervisor)
Lepus::ProcessRegistry.instance.add(process)
described_class.instance.add(supervisor)
described_class.instance.add(process)

Lepus::ProcessRegistry.instance.clear
described_class.instance.clear

expect(Lepus::ProcessRegistry.instance.all).to eq([])
expect(described_class.instance.all).to eq([])
end
end
end
4 changes: 2 additions & 2 deletions spec/lepus/process_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

describe ".prune" do
it "deletes all processes that are not running" do
prune = described_class.register(last_heartbeat_at: Time.now - 5 * 60, name: "prune-me")
described_class.register(last_heartbeat_at: Time.now - 5 * 60, name: "prune-me")
keep = described_class.register(last_heartbeat_at: Time.now, name: "keep-me")

described_class.prune
Expand Down Expand Up @@ -58,7 +58,7 @@
describe "#deregister" do
it "removes the process from the registry and deregisters supervisees" do
supervisor1 = described_class.register(name: "supervisor-1")
supervisee1 = described_class.register(name: "supervisee-1", supervisor_id: supervisor1.id)
described_class.register(name: "supervisee-1", supervisor_id: supervisor1.id)

supervisor2 = described_class.register(name: "supervisor-2")
supervisee2 = described_class.register(name: "supervisee-2", supervisor_id: supervisor2.id)
Expand Down
50 changes: 50 additions & 0 deletions spec/lepus/supervisor/config_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# frozen_string_literal: true

require "spec_helper"

RSpec.describe Lepus::Supervisor::Config do
let(:config) { described_class.new }

describe "#initialize" do
it "sets the pidfile" do
expect(config.pidfile).to eq("tmp/pids/lepus.pid")
end

it "sets the require_file" do
expect(config.require_file).to be_nil

config = described_class.new(require_file: "config/environment")
expect(config.require_file).to eq("config/environment")
end

it "sets the consumers" do
config = described_class.new(consumers: ["MyConsumer"])
expect(config.consumers).to eq(["MyConsumer"])
end
end

describe "#consumers" do
after { reset_config! }

it "returns an empty array if no consumers are configured" do
Lepus.config.consumers_directory = Pathname.new("/tmp/lepus/consumers")
expect(config.consumers).to eq([])
end

context "when consumers are configured" do
before do
Lepus.config.consumers_directory = Pathname.new("/tmp/lepus/consumers")
allow(Dir).to receive(:[]).and_return([
"/tmp/lepus/consumers/ignore.js",
"/tmp/lepus/consumers/exclude",
"/tmp/lepus/consumers/foo_consumer.rb",
"/tmp/lepus/consumers/namespaced/bar_consumer.rb"
])
end

it "returns the list of consumers" do
expect(config.consumers).to eq(["FooConsumer", "Namespaced::BarConsumer"])
end
end
end
end

0 comments on commit 31d1e7a

Please sign in to comment.