From f1adbf8f203203fb177376b42f764f693c8ceae3 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 22 Mar 2013 00:49:02 +0100 Subject: [PATCH] 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 --- assets/scripts/app/models/log.coffee | 4 +--- assets/scripts/app/store.coffee | 2 +- assets/scripts/app/views/log.coffee | 4 +++- assets/scripts/lib/travis/chunk_buffer.coffee | 12 ++++++---- .../spec/unit/chunk_buffer_spec.coffee | 24 +++++++++++++++++-- 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/assets/scripts/app/models/log.coffee b/assets/scripts/app/models/log.coffee index de96b6f6..2c29f9d5 100644 --- a/assets/scripts/app/models/log.coffee +++ b/assets/scripts/app/models/log.coffee @@ -8,7 +8,6 @@ require 'travis/chunk_buffer' init: -> @setParts() - @fetch() setParts: -> #@set 'parts', Ember.ArrayProxy.create(content: []) @@ -35,8 +34,7 @@ require 'travis/chunk_buffer' loadText: (text) -> console.log 'log model: load text' if Log.DEBUG - number = -1 - @append(number: 1, content: text) + @append(number: 1, content: text, final: true) @set('isLoaded', true) Travis.Log.Request = Em.Object.extend diff --git a/assets/scripts/app/store.coffee b/assets/scripts/app/store.coffee index 92519e07..101b5ae5 100644 --- a/assets/scripts/app/store.coffee +++ b/assets/scripts/app/store.coffee @@ -81,7 +81,7 @@ Travis.Store = DS.Store.extend console.log 'store: received job:log event', data if Log.DEBUG data = data.job 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()] @_loadOne(this, type, data) else if data[type.pluralName()] diff --git a/assets/scripts/app/views/log.coffee b/assets/scripts/app/views/log.coffee index d3aa63fe..cecae22c 100644 --- a/assets/scripts/app/views/log.coffee +++ b/assets/scripts/app/views/log.coffee @@ -165,7 +165,9 @@ Travis.reopen didInsertElement: -> job = @get('job') - job.subscribe() if job && !job.get('isFinished') + if job && !job.get('isFinished') + job.get('log').fetch() + job.subscribe() willDestroyElement: -> job = @get('job') diff --git a/assets/scripts/lib/travis/chunk_buffer.coffee b/assets/scripts/lib/travis/chunk_buffer.coffee index f2e6d8fc..e49a90f0 100644 --- a/assets/scripts/lib/travis/chunk_buffer.coffee +++ b/assets/scripts/lib/travis/chunk_buffer.coffee @@ -2,7 +2,7 @@ get = Ember.get Travis.ChunkBuffer = Em.ArrayProxy.extend timeout: 5000 - checkTimeoutFrequency: 1000 + checkTimeoutFrequency: 5000 start: 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') queue.pushObjects addedObjects @check() - @inserted() check: -> queue = @get('queue') @@ -60,11 +59,13 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend while queue.get('firstObject.number') <= next element = queue.shiftObject() if get(element, 'number') == next + @finalize() if get(element, 'final') toPush.pushObject get(element, 'content') next += 1 if toPush.length arrangedContent.pushObjects toPush + @inserted() @set('next', next) @@ -72,14 +73,17 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend now = @now() @lastInsert = now + finalize: -> + clearTimeout @get('runLaterId') + checkTimeout: -> now = @now() if now - @lastInsert > @get('timeout') @giveUpOnMissingParts() - @set 'runLaterId', Ember.run.later(this, @checkTimeout, @get('checkTimeoutFrequency')) + @set 'runLaterId', setTimeout((=> @checkTimeout()), @get('checkTimeoutFrequency')) willDestroy: -> - Ember.run.cancel @get('runLaterId') + @finalize() @_super.apply this, arguments now: -> diff --git a/assets/scripts/spec/unit/chunk_buffer_spec.coffee b/assets/scripts/spec/unit/chunk_buffer_spec.coffee index 399dcbb3..a07a5d1d 100644 --- a/assets/scripts/spec/unit/chunk_buffer_spec.coffee +++ b/assets/scripts/spec/unit/chunk_buffer_spec.coffee @@ -1,5 +1,5 @@ -createChunk = (number, content) -> - Em.Object.create(number: number, content: content) +createChunk = (number, content, options) -> + Em.Object.create(number: number, content: content, final: options?.final) describe 'Travis.ChunkBuffer', -> 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', -> buffer = Travis.ChunkBuffer.create(content: [], start: 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)