Code Monkey home page Code Monkey logo

Comments (6)

shawnpyle avatar shawnpyle commented on September 27, 2024 2

@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.

marcelolx avatar marcelolx commented on September 27, 2024

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.

shawnpyle avatar shawnpyle commented on September 27, 2024

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.

marcelolx avatar marcelolx commented on September 27, 2024

@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.

shawnpyle avatar shawnpyle commented on September 27, 2024

@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.

shawnpyle avatar shawnpyle commented on September 27, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.