Comments (6)
@marcelolx Yes, reload_schedule!
did work for this case. I could have sworn I did try that but it is reproducible now. Thank you!
$> bin/spring stop; RAILS_ENV=test bundle exec rails c
Spring stopped.
Running via Spring preloader in process 39188
Loading test environment (Rails 6.1.7.3)
irb(main):001:1* class Noop
irb(main):002:1* include ::Sidekiq::Job
irb(main):003:1* def perform; end
irb(main):004:2* class << self
irb(main):005:3* def enabled?
irb(main):006:3* Sidekiq::Scheduler.instance.job_enabled?("noop")
irb(main):007:2* end
irb(main):008:1* end
irb(main):009:0> end
=> :enabled?
irb(main):010:0>
irb(main):011:0> Sidekiq.schedule = { "noop" => { "every" => "1 minute", "class" => Noop.name, "enabled" => true } }
2023-07-06T19:27:33.399Z pid=39188 tid=rz4 INFO: Sidekiq 7.1.1 connecting to Redis with options {:size=>10, :pool_name=>"internal", :url=>"redis://:REDACTED@localhost:8212/1"}
=> {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true}}
irb(main):012:0> Sidekiq::Scheduler.instance.reload_schedule!
2023-07-06T19:27:35.861Z pid=39188 tid=rz4 INFO: SidekiqScheduler is disabled
=> true
irb(main):013:0> puts Sidekiq.get_schedule
{"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
=> nil
irb(main):014:0> Noop.enabled?
=> true
from sidekiq-scheduler.
when you run Sidekiq::Scheduler.instance.load_schedule!
in test mode, what does the log output? Does it output any of those of this method?
from sidekiq-scheduler.
I get a disabled message:
$> bin/spring stop; RAILS_ENV=test bundle exec rails c
Spring stopped.
Running via Spring preloader in process 53352
Loading test environment (Rails 6.1.7.3)
irb(main):001:1* class Noop
irb(main):002:1* include ::Sidekiq::Job
irb(main):003:1* def perform; end
irb(main):004:2* class << self
irb(main):005:3* def enabled?
irb(main):006:3* Sidekiq::Scheduler.instance.job_enabled?("noop")
irb(main):007:2* end
irb(main):008:1* end
irb(main):009:0> end
=> :enabled?
irb(main):010:0> Sidekiq.schedule = { "noop" => { "every" => "1 minute", "class" => Noop.name, "enabled" => true } }
2023-07-01T23:59:11.038Z pid=53352 tid=12vw INFO: Sidekiq 7.1.1 connecting to Redis with options {:size=>10, :pool_name=>"internal", :url=>"redis://:REDACTED@localhost:8212/1"}
=> {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true}}
irb(main):011:0>
irb(main):012:0> Sidekiq::Scheduler.instance.reload_schedule!
2023-07-01T23:59:16.219Z pid=53352 tid=12vw INFO: SidekiqScheduler is disabled
=> true
irb(main):013:0> puts Sidekiq.get_schedule
{"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
=> nil
irb(main):014:0> Noop.enabled? #=> true in development, false in test
=> false
I also get the message SidekiqScheduler is disabled
in development too. However, job_enabled?
returns true.
$> bin/spring stop; RAILS_ENV=development bundle exec rails c
Spring stopped.
Running via Spring preloader in process 52706
Loading development environment (Rails 6.1.7.3)
[1] pry(main)> class Noop
include ::Sidekiq::Job
def perform; end
class << self
def enabled?
Sidekiq::Scheduler.instance.job_enabled?("noop")
end
end
[1] pry(main)> class Noop
include ::Sidekiq::Job
def perform; end
class << self
def enabled?
Sidekiq::Scheduler.instance.job_enabled?("noop")
end
end
end
=> :enabled?
[3] pry(main)> Sidekiq.schedule = { "noop" => { "every" => "1 minute", "class" => Noop.name, "enabled" => true } }
=> {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true}}
[4] pry(main)> Sidekiq::Scheduler.instance.reload_schedule!
2023-07-01T23:57:29.159Z pid=52706 tid=16xi INFO: SidekiqScheduler is disabled
=> true
[5] pry(main)> puts Sidekiq.get_schedule
{"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
=> nil
[6] pry(main)> Noop.enabled? #=> true in development, false in test
=> true
from sidekiq-scheduler.
@shawnpyle You did use reload_schedule!
in your last example, in the first one, you used load_schedule!
, could you use reload_schedule!
in the test and see what you get? load_schedule!
checks if the scheduler is enabled and then loads it, while the reload_schedule! doesn't, it only loads the schedule from Redis. I wonder if it is that
from sidekiq-scheduler.
@marcelolx Did some additional testing with by scripting to try to make a more reproducible scenario.
Here is the script I am using:
# sidekiq_scheduler_enable.rb
class Noop
include ::Sidekiq::Job
def perform; end
end
SCHEDULE_NAME = "noop"
SCHEDULE = { SCHEDULE_NAME => { "every" => "1 minute", "class" => Noop.name, "enabled" => true } }
def enabled?
Sidekiq::Scheduler.instance.job_enabled?(SCHEDULE_NAME).inspect
rescue => e
e.message
end
def checks(header:)
puts "\n### #{header} ###"
puts "Scheduler Instance ID: #{Sidekiq::Scheduler.instance.object_id}"
puts "Schedule: #{Sidekiq.schedule.inspect}"
puts "Schedule state: #{Sidekiq::Scheduler.instance.send(:schedule_state, SCHEDULE_NAME)}"
puts "Noop enabled? #{enabled?}" #=> true in development, false in test
end
checks(header: "BEFORE")
Sidekiq.schedule = SCHEDULE
checks(header: "SCHEDULED")
Sidekiq::Scheduler.instance.reload_schedule!
checks(header: "RELOAD 1")
# Expect Noop to be enabled but doesn't work in test.
Sidekiq.schedule = {}
checks(header: "UNLOADED")
Sidekiq::Scheduler.instance.reload_schedule!
checks(header: "RELOAD 2")
Sidekiq.schedule = SCHEDULE
checks(header: "RESCHEDULED")
Sidekiq::Scheduler.instance.reload_schedule!
checks(header: "RELOAD 3")
In development, the Noop enabled?
is true as expected in the RELOAD 1
and RELOAD 3
sections.
$> bin/spring stop; RAILS_ENV=development bundle exec rails runner script/sidekiq_scheduler_enable.rb
Spring stopped.
Running via Spring preloader in process 93563
### BEFORE ###
Scheduler Instance ID: 26880
Schedule: nil
2023-07-19T15:47:26.973Z pid=93563 tid=22mz INFO: Sidekiq 7.1.1 connecting to Redis with options {:size=>10, :pool_name=>"internal", :url=>"redis://:REDACTED@localhost:8212/0"}
Schedule state: {}
Noop enabled? undefined method `[]' for nil:NilClass
### SCHEDULED ###
Scheduler Instance ID: 26880
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {}
Noop enabled? true
2023-07-19T15:47:26.997Z pid=93563 tid=22mz INFO: SidekiqScheduler is disabled
### RELOAD 1 ###
Scheduler Instance ID: 26880
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {}
Noop enabled? true
### UNLOADED ###
Scheduler Instance ID: 26880
Schedule: {}
Schedule state: {}
Noop enabled? nil
2023-07-19T15:47:27.014Z pid=93563 tid=22mz INFO: SidekiqScheduler is disabled
### RELOAD 2 ###
Scheduler Instance ID: 26880
Schedule: {}
Schedule state: {}
Noop enabled? nil
### RESCHEDULED ###
Scheduler Instance ID: 26880
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {}
Noop enabled? true
2023-07-19T15:47:27.119Z pid=93563 tid=22mz INFO: SidekiqScheduler is disabled
### RELOAD 3 ###
Scheduler Instance ID: 26880
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {}
Noop enabled? true
However in the test environment, it never returns true, even after reloading the schedule.
$> bin/spring stop; RAILS_ENV=test bundle exec rails runner script/sidekiq_scheduler_enable.rb
Spring stopped.
Running via Spring preloader in process 32848
### BEFORE ###
Scheduler Instance ID: 18760
Schedule: nil
2023-07-19T17:26:40.382Z pid=32848 tid=tf4 INFO: Sidekiq 7.1.1 connecting to Redis with options {:size=>10, :pool_name=>"internal", :url=>"redis://:REDACTED@localhost:8212/1"}
Schedule state: {"enabled"=>false}
Noop enabled? undefined method `[]' for nil:NilClass
### SCHEDULED ###
Scheduler Instance ID: 18760
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {"enabled"=>false}
Noop enabled? false
2023-07-19T17:26:40.396Z pid=32848 tid=tf4 INFO: SidekiqScheduler is disabled
### RELOAD 1 ###
Scheduler Instance ID: 18760
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {"enabled"=>false}
Noop enabled? false
### UNLOADED ###
Scheduler Instance ID: 18760
Schedule: {}
Schedule state: {"enabled"=>false}
Noop enabled? nil
2023-07-19T17:26:40.403Z pid=32848 tid=tf4 INFO: SidekiqScheduler is disabled
### RELOAD 2 ###
Scheduler Instance ID: 18760
Schedule: {}
Schedule state: {"enabled"=>false}
Noop enabled? nil
### RESCHEDULED ###
Scheduler Instance ID: 18760
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {"enabled"=>false}
Noop enabled? false
2023-07-19T17:26:40.412Z pid=32848 tid=tf4 INFO: SidekiqScheduler is disabled
### RELOAD 3 ###
Scheduler Instance ID: 18760
Schedule: {"noop"=>{"every"=>"1 minute", "class"=>"Noop", "enabled"=>true, "queue"=>"default"}}
Schedule state: {"enabled"=>false}
Noop enabled? false
The above happens most often but is not deterministic. In some cases (I'm working to identify the scenario) job_enabled?
will return true when expected. Do you know of any reason why Sidekiq::Scheduler.instance.schedule_state
would return {"enabled"=>false}
in some cases?
from sidekiq-scheduler.
Looking at how the scheduler is tested, it appears that a Sidekiq.redis(&:flushall)
goes a long way to clear up some of the issues I was having. I still think there is some issue with what RedisManager holds on to regarding enabled state but for now, I'm out of the woods.
from sidekiq-scheduler.
Related Issues (20)
- Move away from deprecated Redis commands HOT 2
- undefined method `next_time' for nil:NilClass HOT 5
- re-use Sidekiq Rack::Static instance for assets
- Sidekick (docker) deprecation warning HOT 1
- UI not loading on heroku HOT 7
- Error handler threw an error HOT 2
- [feature request] environment specific schedules HOT 1
- Recommend Sidekiq::Job instead of Sidekiq::Worker HOT 1
- How to test that sidekiq.yml is *correct*? HOT 3
- SidekiqScheduler::Manager enormous inspect output HOT 3
- Implement `to_hash` in SidekiqScheduler::Manager to avoid Stack level too deep error. HOT 2
- config option :dynamic causes fatal error on startup, but is intended for another gem HOT 2
- Clarification on UI changes overriding schedule configuration HOT 1
- keyword_argument: true do not work HOT 6
- v5.0.4
- Dark Mode looking funky in 5.0.4 HOT 8
- Keep testing against 2.7 and 3.0 in version 5.0.x to avoid breaking changes at patch level HOT 4
- Jobs don't correctly register when using the cron hour range since v5.0.4 HOT 1
- Monthly jobs are executed multiply on multiple hosts HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sidekiq-scheduler.