VRFS-1497 VRFS-1749 added resque job to clean stale sessions, added tests for session scheduler and session cleaner jobs
This commit is contained in:
parent
55aea1109f
commit
3bc94249ca
|
|
@ -188,4 +188,5 @@ fix_use_open_rsvp.sql
|
|||
allow_unspecified_rsvps.sql
|
||||
music_session_cancel_flag.sql
|
||||
fix_sms_query_cancel_flag.sql
|
||||
fix_sms_query_cancel_flag2.sql
|
||||
fix_sms_query_cancel_flag2.sql
|
||||
next_session_scheduled_default.sql
|
||||
|
|
@ -0,0 +1 @@
|
|||
alter table only music_sessions alter column next_session_scheduled set default false;
|
||||
|
|
@ -45,6 +45,8 @@ require "jam_ruby/resque/scheduled/unused_music_notation_cleaner"
|
|||
require "jam_ruby/resque/scheduled/user_progress_emailer"
|
||||
require "jam_ruby/resque/scheduled/daily_session_emailer"
|
||||
require "jam_ruby/resque/scheduled/new_musician_emailer"
|
||||
require "jam_ruby/resque/scheduled/music_session_scheduler"
|
||||
require "jam_ruby/resque/scheduled/active_music_session_cleaner"
|
||||
require "jam_ruby/resque/google_analytics_event"
|
||||
require "jam_ruby/resque/batch_email_job"
|
||||
require "jam_ruby/mq_router"
|
||||
|
|
|
|||
|
|
@ -77,8 +77,7 @@ module JamRuby
|
|||
new_session.user_id = self.user_id
|
||||
new_session.band_id = self.band_id
|
||||
new_session.fan_access = self.fan_access
|
||||
# TODO: confirm this logic
|
||||
# new_session.scheduled_start = self.scheduled_start + self.scheduled_duration
|
||||
new_session.scheduled_start = self.scheduled_start + 1.week
|
||||
new_session.scheduled_duration = self.scheduled_duration
|
||||
new_session.musician_access = self.musician_access
|
||||
new_session.approval_required = self.approval_required
|
||||
|
|
@ -90,6 +89,8 @@ module JamRuby
|
|||
new_session.recurring_mode = self.recurring_mode
|
||||
new_session.timezone = self.timezone
|
||||
new_session.open_rsvps = self.open_rsvps
|
||||
new_session.is_unstructured_rsvp = self.is_unstructured_rsvp
|
||||
new_session.legal_terms = true
|
||||
|
||||
# copy rsvp_slots, rsvp_requests, and rsvp_requests_rsvp_slots
|
||||
RsvpSlot.find_each(:conditions => "music_session_id = '#{self.id}'") do |slot|
|
||||
|
|
@ -140,12 +141,12 @@ module JamRuby
|
|||
new_notation.user_id = notation.user_id
|
||||
new_notation.music_session = new_session
|
||||
new_notation.file_url = notation.file_url
|
||||
# new_notation.file_name = notation.file_name
|
||||
new_notation.file_name = notation.file_name
|
||||
new_notation.size = notation.size
|
||||
new_session.music_notations << new_notation
|
||||
end
|
||||
|
||||
new_session.save
|
||||
new_session.save!
|
||||
|
||||
# mark the next session as scheduled
|
||||
self.next_session_scheduled = true
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
require 'json'
|
||||
require 'resque'
|
||||
require 'resque-retry'
|
||||
require 'net/http'
|
||||
require 'digest/md5'
|
||||
|
||||
module JamRuby
|
||||
|
||||
class ActiveMusicSessionCleaner
|
||||
extend Resque::Plugins::LonelyJob
|
||||
|
||||
attr_accessor :interval
|
||||
|
||||
@queue = :active_music_session_cleaner
|
||||
|
||||
@@log = Logging.logger[ActiveMusicSessionCleaner]
|
||||
|
||||
def self.lock_timeout
|
||||
120
|
||||
end
|
||||
|
||||
def self.perform
|
||||
@@log.debug("ActiveMusicSessionCleaner waking up")
|
||||
|
||||
JamWebEventMachine.run_wait_stop do
|
||||
cleaner = ActiveMusicSessionCleaner.new
|
||||
cleaner.interval = "INTERVAL '1 minute'"
|
||||
cleaner.run
|
||||
end
|
||||
|
||||
@@log.debug("ActiveMusicSessionCleaner done")
|
||||
end
|
||||
|
||||
def run
|
||||
# get all active sessions where there are no connections
|
||||
stale_sessions = ActiveMusicSession.includes(:connections)
|
||||
.where("active_music_sessions.updated_at < NOW() - #{self.interval}")
|
||||
|
||||
stale_sessions.each do |s|
|
||||
if s.connections.count == 0
|
||||
s.delete
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -5,7 +5,6 @@ require 'net/http'
|
|||
require 'digest/md5'
|
||||
|
||||
module JamRuby
|
||||
|
||||
class MusicSessionScheduler
|
||||
extend Resque::Plugins::LonelyJob
|
||||
|
||||
|
|
@ -18,13 +17,13 @@ module JamRuby
|
|||
end
|
||||
|
||||
def self.perform
|
||||
@@log.debug("waking up")
|
||||
@@log.debug("MusicSessionScheduler waking up")
|
||||
|
||||
JamWebEventMachine.run_wait_stop do
|
||||
MusicSessionScheduler.new.run
|
||||
end
|
||||
|
||||
@@log.debug("done")
|
||||
@@log.debug("MusicSessionScheduler done")
|
||||
end
|
||||
|
||||
def run
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe "ActiveMusicSessionCleaner" do
|
||||
|
||||
before(:all) do
|
||||
@cleaner = ActiveMusicSessionCleaner.new
|
||||
@cleaner.interval = "INTERVAL '1 second'"
|
||||
end
|
||||
|
||||
describe "active session cleaning" do
|
||||
|
||||
it "should remove active sessions that meet criteria" do
|
||||
ms = FactoryGirl.create(:single_user_session)
|
||||
ActiveMusicSession.all.count.should == 1
|
||||
|
||||
@cleaner.run
|
||||
ActiveMusicSession.all.count.should == 1
|
||||
|
||||
# delete all connections
|
||||
ms.connections.each do |c|
|
||||
c.delete
|
||||
end
|
||||
|
||||
# hasn't been 1 minute yet
|
||||
@cleaner.run
|
||||
ActiveMusicSession.all.count.should == 1
|
||||
|
||||
# wait 3 seconds so the updated_at expires
|
||||
sleep 3
|
||||
|
||||
@cleaner.run
|
||||
ActiveMusicSession.all.count.should == 0
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe "MusicSessionScheduler" do
|
||||
|
||||
before(:all) do
|
||||
@scheduler = MusicSessionScheduler.new
|
||||
end
|
||||
|
||||
describe "session scheduling" do
|
||||
|
||||
it "should reschedule sessions that meet criteria" do
|
||||
ms = FactoryGirl.create(:recurring_music_session_weekly)
|
||||
ms.next_session_scheduled.should == false
|
||||
|
||||
MusicSession.all.count.should == 1
|
||||
|
||||
@scheduler.run
|
||||
|
||||
MusicSession.all.count.should == 1
|
||||
|
||||
# end the session
|
||||
ms.session_removed_at = Time.now
|
||||
ms.save!
|
||||
|
||||
# run the scheduler again
|
||||
@scheduler.run
|
||||
|
||||
MusicSession.all.count.should == 2
|
||||
|
||||
MusicSession.where(:session_removed_at => nil).count.should == 1
|
||||
MusicSession.where(:next_session_scheduled => true).count.should == 1
|
||||
end
|
||||
|
||||
it "should not reschedule session that does not meet criteria" do
|
||||
# test non-recurring session
|
||||
ms = FactoryGirl.create(:music_session)
|
||||
|
||||
MusicSession.all.count.should == 1
|
||||
|
||||
@scheduler.run
|
||||
MusicSession.all.count.should == 1
|
||||
|
||||
ms.session_removed_at = Time.now
|
||||
ms.save!
|
||||
|
||||
@scheduler.run
|
||||
MusicSession.all.count.should == 1
|
||||
|
||||
# test canceled session
|
||||
ms = FactoryGirl.create(:recurring_music_session_weekly)
|
||||
MusicSession.all.count.should == 2
|
||||
|
||||
ms.canceled = true
|
||||
ms.save!
|
||||
|
||||
@scheduler.run
|
||||
MusicSession.all.count.should == 2
|
||||
|
||||
# test already rescheduled
|
||||
ms = FactoryGirl.create(:recurring_music_session_weekly)
|
||||
ms.next_session_scheduled = true
|
||||
ms.save!
|
||||
|
||||
MusicSession.all.count.should == 3
|
||||
|
||||
@scheduler.run
|
||||
MusicSession.all.count.should == 3
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -42,4 +42,9 @@ NewMusicianEmailer:
|
|||
MusicSessionScheduler:
|
||||
cron: "0 */5 0 * *"
|
||||
class: "JamRuby::MusicSessionScheduler"
|
||||
description: "Schedules music sessions that are marked as recurring"
|
||||
description: "Schedules music sessions that are marked as recurring"
|
||||
|
||||
ActiveMusicSessionCleaner:
|
||||
cron: "0 */5 0 * *"
|
||||
class: "JamRuby::ActiveMusicSessionCleaner"
|
||||
description: "Removes any active music sessions that are stale."
|
||||
Loading…
Reference in New Issue