Improve log handling

* don't fetch log content on Travis.Log init
* use timeout in ChunkBuffer instead of Ember.run.later
* remove timeout when log is finalized
This commit is contained in:
Piotr Sarnacki 2013-03-22 00:49:02 +01:00
parent 5d049fd7de
commit f1adbf8f20
5 changed files with 35 additions and 11 deletions

View File

@ -8,7 +8,6 @@ require 'travis/chunk_buffer'
init: -> init: ->
@setParts() @setParts()
@fetch()
setParts: -> setParts: ->
#@set 'parts', Ember.ArrayProxy.create(content: []) #@set 'parts', Ember.ArrayProxy.create(content: [])
@ -35,8 +34,7 @@ require 'travis/chunk_buffer'
loadText: (text) -> loadText: (text) ->
console.log 'log model: load text' if Log.DEBUG console.log 'log model: load text' if Log.DEBUG
number = -1 @append(number: 1, content: text, final: true)
@append(number: 1, content: text)
@set('isLoaded', true) @set('isLoaded', true)
Travis.Log.Request = Em.Object.extend Travis.Log.Request = Em.Object.extend

View File

@ -81,7 +81,7 @@ Travis.Store = DS.Store.extend
console.log 'store: received job:log event', data if Log.DEBUG console.log 'store: received job:log event', data if Log.DEBUG
data = data.job data = data.job
job = @find(Travis.Job, data.id) job = @find(Travis.Job, data.id)
job.appendLog(number: parseInt(data.number), content: data._log) job.appendLog(number: parseInt(data.number), content: data._log, final: data.final)
else if data[type.singularName()] else if data[type.singularName()]
@_loadOne(this, type, data) @_loadOne(this, type, data)
else if data[type.pluralName()] else if data[type.pluralName()]

View File

@ -165,7 +165,9 @@ Travis.reopen
didInsertElement: -> didInsertElement: ->
job = @get('job') job = @get('job')
job.subscribe() if job && !job.get('isFinished') if job && !job.get('isFinished')
job.get('log').fetch()
job.subscribe()
willDestroyElement: -> willDestroyElement: ->
job = @get('job') job = @get('job')

View File

@ -2,7 +2,7 @@ get = Ember.get
Travis.ChunkBuffer = Em.ArrayProxy.extend Travis.ChunkBuffer = Em.ArrayProxy.extend
timeout: 5000 timeout: 5000
checkTimeoutFrequency: 1000 checkTimeoutFrequency: 5000
start: 1 start: 1
next: 1 next: 1
@ -48,7 +48,6 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') )+'', 'current', @get('next') console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') )+'', 'current', @get('next')
queue.pushObjects addedObjects queue.pushObjects addedObjects
@check() @check()
@inserted()
check: -> check: ->
queue = @get('queue') queue = @get('queue')
@ -60,11 +59,13 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
while queue.get('firstObject.number') <= next while queue.get('firstObject.number') <= next
element = queue.shiftObject() element = queue.shiftObject()
if get(element, 'number') == next if get(element, 'number') == next
@finalize() if get(element, 'final')
toPush.pushObject get(element, 'content') toPush.pushObject get(element, 'content')
next += 1 next += 1
if toPush.length if toPush.length
arrangedContent.pushObjects toPush arrangedContent.pushObjects toPush
@inserted()
@set('next', next) @set('next', next)
@ -72,14 +73,17 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
now = @now() now = @now()
@lastInsert = now @lastInsert = now
finalize: ->
clearTimeout @get('runLaterId')
checkTimeout: -> checkTimeout: ->
now = @now() now = @now()
if now - @lastInsert > @get('timeout') if now - @lastInsert > @get('timeout')
@giveUpOnMissingParts() @giveUpOnMissingParts()
@set 'runLaterId', Ember.run.later(this, @checkTimeout, @get('checkTimeoutFrequency')) @set 'runLaterId', setTimeout((=> @checkTimeout()), @get('checkTimeoutFrequency'))
willDestroy: -> willDestroy: ->
Ember.run.cancel @get('runLaterId') @finalize()
@_super.apply this, arguments @_super.apply this, arguments
now: -> now: ->

View File

@ -1,5 +1,5 @@
createChunk = (number, content) -> createChunk = (number, content, options) ->
Em.Object.create(number: number, content: content) Em.Object.create(number: number, content: content, final: options?.final)
describe 'Travis.ChunkBuffer', -> describe 'Travis.ChunkBuffer', ->
it 'waits for parts to be in order before revealing them', -> it 'waits for parts to be in order before revealing them', ->
@ -91,3 +91,23 @@ describe 'Travis.ChunkBuffer', ->
it 'sets next to start if start is given at init', -> it 'sets next to start if start is given at init', ->
buffer = Travis.ChunkBuffer.create(content: [], start: 5) buffer = Travis.ChunkBuffer.create(content: [], start: 5)
expect(buffer.get('next')).toEqual(5) expect(buffer.get('next')).toEqual(5)
it 'runs finalize after getting final element', ->
finalizeRuns = 0
buffer = Travis.ChunkBuffer.extend({
finalize: ->
@_super.apply this, arguments
finalizeRuns += 1
}).create(content: [])
buffer.pushObject createChunk(1, "foo")
buffer.pushObject createChunk(2, "bar")
buffer.pushObject createChunk(3, "baz")
expect(finalizeRuns).toEqual(0)
buffer.pushObject createChunk(4, "qux", final: true)
expect(buffer.get('length')).toEqual(4)
expect(finalizeRuns).toEqual(1)