From 12eeb460a37a6484f313e4cd26255e024a5a88a3 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Thu, 7 May 2015 08:49:15 -0500 Subject: [PATCH] * VRFS-3212 - track counts of concurrent packaging attempts --- db/manifest | 1 + db/up/signing.sql | 2 + ruby/lib/jam_ruby/models/jam_track_right.rb | 23 +++++++- .../lib/jam_ruby/resque/jam_tracks_builder.rb | 6 ++- .../jam_ruby/resque/scheduled/stats_maker.rb | 1 + ruby/spec/factories.rb | 2 + .../jam_ruby/models/jam_track_right_spec.rb | 53 +++++++++++++++++++ .../javascripts/jam_track_screen.js.coffee | 3 ++ web/config/application.rb | 2 +- .../api_jam_tracks_controller_spec.rb | 6 --- 10 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 db/up/signing.sql diff --git a/db/manifest b/db/manifest index 6bfc68106..223d8cc39 100755 --- a/db/manifest +++ b/db/manifest @@ -282,3 +282,4 @@ first_played_jamtrack_at.sql payment_history.sql jam_track_right_private_key.sql first_downloaded_jamtrack_at.sql +signing.sql diff --git a/db/up/signing.sql b/db/up/signing.sql new file mode 100644 index 000000000..3de748aae --- /dev/null +++ b/db/up/signing.sql @@ -0,0 +1,2 @@ +ALTER TABLE jam_track_rights ADD COLUMN signing_44 BOOLEAN DEFAULT FALSE; +ALTER TABLE jam_track_rights ADD COLUMN signing_48 BOOLEAN DEFAULT FALSE; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/jam_track_right.rb b/ruby/lib/jam_ruby/models/jam_track_right.rb index 6ae031f4c..6f1678885 100644 --- a/ruby/lib/jam_ruby/models/jam_track_right.rb +++ b/ruby/lib/jam_ruby/models/jam_track_right.rb @@ -53,12 +53,18 @@ module JamRuby JamTrackRight.where("downloaded_since_sign=? AND updated_at <= ?", true, 5.minutes.ago).limit(1000) end - def finish_errored(error_reason, error_detail) + def finish_errored(error_reason, error_detail, sample_rate) self.last_signed_at = Time.now self.error_count = self.error_count + 1 self.error_reason = error_reason self.error_detail = error_detail self.should_retry = self.error_count < 5 + if sample_rate == 48 + self.signing_48 = false + else + self.signing_44 = false + end + if save Notification.send_jam_track_sign_failed(self) else @@ -72,10 +78,12 @@ module JamRuby self.length_48 = length self.md5_48 = md5 self.signed_48 = true + self.signing_48 = false else self.length_44 = length self.md5_44 = md5 self.signed_44 = true + self.signing_44 = false end self.error_count = 0 self.error_reason = nil @@ -202,6 +210,17 @@ module JamRuby .joins("LEFT OUTER JOIN jam_track_rights ON jam_tracks.id = jam_track_rights.jam_track_id AND jam_track_rights.user_id = '#{user.id}'") .where('jam_tracks.id IN (?)', jamtracks) end - + + def self.stats + stats = {} + + result = JamTrackRight.select('count(id) as total, count(CASE WHEN signing_44 THEN 1 ELSE NULL END) + count(CASE WHEN signing_48 THEN 1 ELSE NULL END) as signing_count, count(CASE WHEN redeemed THEN 1 ELSE NULL END) as redeem_count').where(is_test_purchase: false).first + + stats['count'] = result['total'].to_i + stats['signing_count'] = result['signing_count'].to_i + stats['redeemed_count'] = result['redeem_count'].to_i + stats['purchased_count'] = stats['count'] - stats['redeemed_count'] + stats + end end end diff --git a/ruby/lib/jam_ruby/resque/jam_tracks_builder.rb b/ruby/lib/jam_ruby/resque/jam_tracks_builder.rb index 71018e1bd..359bdc514 100644 --- a/ruby/lib/jam_ruby/resque/jam_tracks_builder.rb +++ b/ruby/lib/jam_ruby/resque/jam_tracks_builder.rb @@ -40,12 +40,14 @@ module JamRuby # track that it's started ( and avoid db validations ) signing_started_at = Time.now signing_started_model_symbol = bitrate == 48 ? :signing_started_at_48 : :signing_started_at_44 + signing_state_symbol = bitrate == 48 ? :signing_48 : :signing_44 last_step_at = Time.now - JamTrackRight.where(:id => @jam_track_right.id).update_all(signing_started_model_symbol => signing_started_at, :should_retry => false, packaging_steps: total_steps, current_packaging_step: 0, last_step_at: last_step_at) + JamTrackRight.where(:id => @jam_track_right.id).update_all(signing_started_model_symbol => signing_started_at, :should_retry => false, packaging_steps: total_steps, current_packaging_step: 0, last_step_at: last_step_at, signing_state_symbol => true) # because we are skipping 'after_save', we have to keep the model current for the notification. A bit ugly... @jam_track_right.current_packaging_step = 0 @jam_track_right.packaging_steps = total_steps @jam_track_right[signing_started_model_symbol] = signing_started_at + @jam_track_right[signing_state_symbol] = true @jam_track_right.should_retry = false @jam_track_right.last_step_at = Time.now SubscriptionMessage.jam_track_signing_job_change(@jam_track_right) @@ -75,7 +77,7 @@ module JamRuby @error_reason = "unhandled-job-exception" @error_detail = e.to_s end - @jam_track_right.finish_errored(@error_reason, @error_detail) + @jam_track_right.finish_errored(@error_reason, @error_detail, self.bitrate) rescue Exception => e log.error "unable to post back to the database the error #{e}" diff --git a/ruby/lib/jam_ruby/resque/scheduled/stats_maker.rb b/ruby/lib/jam_ruby/resque/scheduled/stats_maker.rb index ffab136e4..6bff4192e 100644 --- a/ruby/lib/jam_ruby/resque/scheduled/stats_maker.rb +++ b/ruby/lib/jam_ruby/resque/scheduled/stats_maker.rb @@ -30,6 +30,7 @@ module JamRuby Stats.write('connection', Connection.stats) Stats.write('users', User.stats) Stats.write('sessions', ActiveMusicSession.stats) + Stats.write('jam_track_rights', JamTrackRight.stats) end end diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index 1f4e3c662..2c7de6801 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -761,6 +761,8 @@ FactoryGirl.define do factory :jam_track_right, :class => JamRuby::JamTrackRight do association :jam_track, factory: :jam_track association :user, factory: :user + signing_44 false + signing_48 false end factory :jam_track_tap_in, :class => JamRuby::JamTrackTapIn do diff --git a/ruby/spec/jam_ruby/models/jam_track_right_spec.rb b/ruby/spec/jam_ruby/models/jam_track_right_spec.rb index 90953fc3b..1c68e2037 100644 --- a/ruby/spec/jam_ruby/models/jam_track_right_spec.rb +++ b/ruby/spec/jam_ruby/models/jam_track_right_spec.rb @@ -155,5 +155,58 @@ describe JamTrackRight do end end + describe "stats" do + + it "empty" do + JamTrackRight.stats['count'].should eq(0) + end + + + + it "one" do + right1 = FactoryGirl.create(:jam_track_right) + JamTrackRight.stats.should eq('count' => 1, + 'signing_count' => 0, + 'redeemed_count' => 0, + 'purchased_count' => 1) + end + + it "two" do + right1 = FactoryGirl.create(:jam_track_right) + right2 = FactoryGirl.create(:jam_track_right) + + JamTrackRight.stats.should eq('count' => 2, + 'signing_count' => 0, + 'redeemed_count' => 0, + 'purchased_count' => 2) + + right1.signing_44 = true + right1.save! + right2.signing_48 = true + right2.save! + + JamTrackRight.stats.should eq('count' => 2, + 'signing_count' => 2, + 'redeemed_count' => 0, + 'purchased_count' => 2) + + right1.redeemed = true + right1.save! + + JamTrackRight.stats.should eq('count' => 2, + 'signing_count' => 2, + 'redeemed_count' => 1, + 'purchased_count' => 1) + + right2.is_test_purchase = true + right2.save! + + JamTrackRight.stats.should eq('count' => 1, + 'signing_count' => 1, + 'redeemed_count' => 1, + 'purchased_count' => 0) + end + end + end diff --git a/web/app/assets/javascripts/jam_track_screen.js.coffee b/web/app/assets/javascripts/jam_track_screen.js.coffee index bef29e944..22b74b5b8 100644 --- a/web/app/assets/javascripts/jam_track_screen.js.coffee +++ b/web/app/assets/javascripts/jam_track_screen.js.coffee @@ -31,6 +31,9 @@ context.JK.JamTrackScreen=class JamTrackScreen this.refresh() ).fail((arg) => @logger.error("app.user.done failed: " + JSON.stringify(arg)) + + @logger.debug(arg.statusCode); + throw 'fail should not occur if user is available' ) else diff --git a/web/config/application.rb b/web/config/application.rb index b793f174c..1ba661088 100644 --- a/web/config/application.rb +++ b/web/config/application.rb @@ -219,7 +219,7 @@ if defined?(Bundler) # amount of time before we think the queue is stuck config.signing_job_queue_max_time = 20 # 20 seconds # amount of time to allow before giving up on a single step in packaging job - config.signing_step_max_time = 40; # 40 seconds + config.signing_step_max_time = 60; # 60 seconds config.email_alerts_alias = 'alerts@jamkazam.com' # should be used for 'oh no' server down/service down sorts of emails config.email_generic_from = 'nobody@jamkazam.com' diff --git a/web/spec/controllers/api_jam_tracks_controller_spec.rb b/web/spec/controllers/api_jam_tracks_controller_spec.rb index 123041120..d96e78d23 100644 --- a/web/spec/controllers/api_jam_tracks_controller_spec.rb +++ b/web/spec/controllers/api_jam_tracks_controller_spec.rb @@ -172,9 +172,6 @@ describe ApiJamTracksController do response.location.should =~ /.*#{Regexp.escape(right.filename(:url_48))}.*/ right.reload right.download_count.should eq(1) - - notifications = Notification.where(:jam_track_right_id=>right.id) - notifications.count.should == 1 end it "supports multiple bitrates" do @@ -206,9 +203,6 @@ describe ApiJamTracksController do response.location.should =~ /.*#{Regexp.escape(right.filename(:url_44))}.*/ right.reload right.download_count.should eq(1) - - notifications = Notification.where(:jam_track_right_id=>right.id) - notifications.count.should == 1 end end