* found some state/error transition bugs

This commit is contained in:
Seth Call 2015-09-17 22:13:07 -05:00
parent db34ac1611
commit 3d2eeba638
6 changed files with 67 additions and 41 deletions

View File

@ -78,6 +78,7 @@ module JamRuby
self.error_detail = error_detail
self.should_retry = self.error_count < 5
self.signing = false
self.signing_queued_at = nil # if left set, throws off signing_state on subsequent signing attempts
if save
Notification.send_mixdown_sign_failed(self)
@ -166,7 +167,7 @@ module JamRuby
if signed
state = 'SIGNED'
elsif signing_started_at
elsif signing_started_at && signing
# the maximum amount of time the packaging job can take is 10 seconds * num steps. For a 10 track song, this will be 110 seconds. It's a bit long.
if Time.now - signing_started_at > APP_CONFIG.signing_job_signing_max_time
state = 'SIGNING_TIMEOUT'

View File

@ -63,7 +63,7 @@ module JamRuby
# track that it's started ( and avoid db validations )
signing_started_at = Time.now
last_step_at = Time.now
JamTrackMixdownPackage.where(:id => @mixdown_package.id).update_all(:signing_started_at => signing_started_at, :should_retry => false, packaging_steps: total_steps, current_packaging_step: 0, last_step_at: last_step_at, :signing => true)
#JamTrackMixdownPackage.where(:id => @mixdown_package.id).update_all(:signing_started_at => signing_started_at, :should_retry => false, packaging_steps: total_steps, current_packaging_step: 0, last_step_at: last_step_at, :signing => true)
# because we are skipping 'after_save', we have to keep the model current for the notification. A bit ugly...
@ -72,7 +72,8 @@ module JamRuby
@mixdown_package.signing_started_at = signing_started_at
@mixdown_package.signing = true
@mixdown_package.should_retry = false
@mixdown_package.last_step_at = Time.now
@mixdown_package.last_step_at = last_step_at
@mixdown_package.save
SubscriptionMessage.mixdown_signing_job_change(@mixdown_package)
@ -83,6 +84,8 @@ module JamRuby
rescue Exception => e
# record the error in the database
post_error(e)
#SubscriptionMessage.mixdown_signing_job_change(@mixdown_package)
# and let the job fail, alerting ops too
raise
end
@ -441,7 +444,7 @@ module JamRuby
# set @error_reason before you raise an exception, and it will be sent back as the error reason
# otherwise, the error_reason will be unhandled-job-exception
def post_error(e)
#begin
begin
# if error_reason is null, assume this is an unhandled error
unless @error_reason
@error_reason = "unhandled-job-exception"
@ -449,9 +452,9 @@ module JamRuby
end
@mixdown_package.finish_errored(@error_reason, @error_detail)
#rescue Exception => e
# log.error "unable to post back to the database the error #{e}"
#end
rescue Exception => e
log.error "unable to post back to the database the error #{e}"
end
end
end
end

View File

@ -112,15 +112,15 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
if selectedMixdown.client_state?
switch selectedMixdown.client_state
when 'cant_open'
customMixName = `<h5>L: {selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
customMixName = `<h5>{selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
when 'keying_timeout'
customMixName = `<h5>K: {selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
customMixName = `<h5>{selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
when 'download_fail'
customMixName = `<h5>D: {selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
customMixName = `<h5>{selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
when 'keying'
customMixName = `<h5>K: Loading selected mix... <img src="/assets/shared/spinner.gif" /></h5>`
customMixName = `<h5>Loading selected mix... <img src="/assets/shared/spinner.gif" /></h5>`
when 'downloading'
customMixName = `<h5>D: Loading selected mix... <img src="/assets/shared/spinner.gif" /></h5>`
customMixName = `<h5>Loading selected mix... <img src="/assets/shared/spinner.gif" /></h5>`
when 'ready'
customMixName = `<h5>{selectedMixdown.name}</h5>`
disabled = false
@ -128,7 +128,6 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
customMixName = `<h5>Creating mixdown... <img src="/assets/shared/spinner.gif" /></h5>`
else
logger.debug("STATE!", @state.downloadingJamTrack)
if SessionStore.downloadingJamTrack
downloader = `<img src="/assets/shared/spinner.gif" />`
@ -374,8 +373,7 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
e.preventDefault()
if @disableLoading
$target = $(e.target)
context.JK.prodBubble($target, 'no-change-while-loading', {}, {positions:['left', 'top']})
alert('Certain actions are disabled while a track is being loaded.')
return
# make this package the active one
@ -386,8 +384,7 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
# user wants to select the full track
if @disableLoading
$target = $(e.target)
context.JK.prodBubble($target, 'no-change-while-loading', {}, {positions:['left', 'top']})
alert('Certain actions are disabled while a track is being loaded.')
return
JamTrackActions.activateNoMixdown(jamtrack)
@ -411,14 +408,35 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
@setState({editingMixdownId: null})
mixdownDelete: (mixdown) ->
if confirm("Delete this custom mix?")
if @state.editingMixdownId?
@setState({editingMixdownId:null})
return
if confirm("Delete this custom mix?")
JamTrackMixdownActions.deleteMixdown(mixdown)
mixdownError: (mixdown) ->
alert("error")
myPackage = mixdown.myPackage
if myPackage?
switch myPackage.signing_state
when 'QUIET_TIMEOUT'
action = 'Custom mix never got created. Retry?'
when 'QUEUED_TIMEOUT'
action = 'Custom mix was never built. Retry?'
when 'SIGNING_TIMEOUT'
action = 'Custom mix took took long to build. Retry?'
when 'ERROR'
action = 'Custom mix failed to build. Retry?'
else
action = 'Custom mix never got created. Retry?'
return unless action?
if confirm(action)
JamTrackMixdownActions.enqueueMixdown(mixdown)
createMix: (e) ->
e.preventDefault()
@ -451,9 +469,7 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
mixdown = {jamTrackID: @state.jamTrackState.jamTrack.id, name: name, settings: {speed:speed, pitch: pitch}}
package_settings = {file_type: 'ogg', encrypt_type: 'jkz'}
JamTrackMixdownActions.createMixdown(mixdown, package_settings, @createMixdownDone, @createMixdownFail)
JamTrackMixdownActions.createMixdown(mixdown, @createMixdownDone, @createMixdownFail)
@setState({creatingMixdown: true, createMixdownErrors: null})
@ -471,6 +487,7 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
@setState({createMixdownErrors: response})
componentDidMount: () ->
$(window).unload(@windowUnloaded)
@ -496,6 +513,7 @@ mixins.push(Reflux.listenTo(JamTrackStore, 'onJamTrackChanged'))
componentDidUpdate: () ->
@resizeWindow()
setTimeout(@resizeWindow, 1000)
resizeWindow: () =>
$container = $('#minimal-container')

View File

@ -275,7 +275,7 @@ JamTrackActions = @JamTrackActions
@requestedFilter = null
requested
onCreateMixdown: (mixdown, package_settings, done, fail) ->
onCreateMixdown: (mixdown, done, fail) ->
volumeSettings = context.jamClient.GetJamTrackSettings();
@ -286,7 +286,7 @@ JamTrackActions = @JamTrackActions
mixdown.settings.tracks = track_settings
logger.debug("creating mixdown", mixdown, package_settings)
logger.debug("creating mixdown", mixdown)
rest.createMixdown(mixdown)
.done((created) =>
@ -295,26 +295,13 @@ JamTrackActions = @JamTrackActions
logger.debug("created mixdown", created)
package_settings.id = created.id
# we have to determine sample rate here, in the store, because child windows don't have access to jamClient
package_settings.sample_rate = @sampleRate
rest.enqueueMixdown(package_settings)
.done((enqueued) =>
logger.debug("enqueued mixdown package", package_settings)
@addOrUpdatePackage(enqueued)
done(enqueued)
)
.fail((jqxhr) =>
@app.layout.notify({title:'Unable to Create Custom Mix', text: 'You can push the RETRY button.'})
fail(jqxhr)
)
@onEnqueueMixdown({id: created.id}, done, fail)
)
.fail((jqxhr) =>
fail(jqxhr)
)
onEditMixdown: (mixdown) ->
logger.debug("editing mixdown", mixdown)
@ -379,9 +366,23 @@ JamTrackActions = @JamTrackActions
onCloseMixdown: (mixdown) ->
logger.debug("closing mixdown", mixdown)
onEnqueueMixdown: (mixdown) ->
onEnqueueMixdown: (mixdown, done, fail) ->
logger.debug("enqueuing mixdown", mixdown)
package_settings = {file_type: 'ogg', encrypt_type: 'jkz', sample_rate: @sampleRate}
package_settings.id = mixdown.id
rest.enqueueMixdown(package_settings)
.done((enqueued) =>
logger.debug("enqueued mixdown package", package_settings)
@addOrUpdatePackage(enqueued)
done(enqueued) if done
)
.fail((jqxhr) =>
@app.layout.notify({title:'Unable to Create Custom Mix', text: 'Click the error icon to retry.'})
fail(jqxhr) if fail?
)
onDownloadMixdown: (mixdown) ->
logger.debug("download mixdown", mixdown)

View File

@ -143,6 +143,8 @@ body.media-controls-popup.popup {
vertical-align: middle;
margin-left:10px;
width:100px;
white-space:nowrap;
min-width:100px;
}
.mixdown-stateful {

View File

@ -232,6 +232,7 @@ if defined?(Bundler)
config.signing_job_queue_max_time = 300;
# amount of time to allow before giving up on a single step in packaging job
config.mixdown_step_max_time = 300;
config.mixdown_job_queue_max_time = 300;
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'