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:
Brian Smith 2014-07-11 02:23:10 -04:00
parent 55aea1109f
commit 3bc94249ca
9 changed files with 171 additions and 9 deletions

View File

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

View File

@ -0,0 +1 @@
alter table only music_sessions alter column next_session_scheduled set default false;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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