Skip to content

Commit 574486e

Browse files
committed
deep symbolize keys on messages
1 parent c1b0fd1 commit 574486e

File tree

5 files changed

+64
-27
lines changed

5 files changed

+64
-27
lines changed

lib/travis/hub/handler.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
require 'travis/hub/helper/context'
2+
require 'travis/hub/helper/hash'
23
require 'travis/hub/helper/string'
34
require 'travis/hub/service'
45

56
module Travis
67
module Hub
78
class Handler
8-
include Helper::Context, Helper::String
9+
include Helper::Context, Helper::Hash, Helper::String
910

1011
attr_reader :context, :type, :event, :payload, :object
1112

@@ -46,7 +47,7 @@ def normalize_event(event)
4647
end
4748

4849
def normalize_payload(payload)
49-
payload = payload.symbolize_keys
50+
payload = deep_symbolize_keys(payload)
5051
payload = normalize_state(payload)
5152
normalize_timestamps(payload)
5253
end

lib/travis/hub/helper/hash.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module Travis
2+
module Hub
3+
module Helper
4+
module Hash
5+
def deep_symbolize_keys(hash)
6+
hash.map do |key, obj|
7+
obj = case obj
8+
when Array
9+
obj.map { |obj| deep_symbolize_keys(obj) }
10+
when ::Hash
11+
deep_symbolize_keys(obj)
12+
else
13+
obj
14+
end
15+
[key.to_sym, obj]
16+
end.to_h
17+
end
18+
end
19+
end
20+
end
21+
end

lib/travis/hub/service/state_update.rb

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
module Travis
22
module Hub
33
module Service
4-
class StateUpdate < Struct.new(:event, :data)
4+
class StateUpdate < Struct.new(:event, :data, :block)
55
class Counter < Struct.new(:job_id, :redis)
6-
TTL = 3600 * 12
6+
TTL = 3600 * 24
77

88
def count
99
@count ||= redis.get(key).to_i
1010
end
1111

12-
def increment
13-
count = redis.incr(key)
12+
def store(count)
13+
redis.set(key, count)
1414
redis.expire(key, TTL)
15-
count
1615
end
1716

1817
private
@@ -29,47 +28,63 @@ def key
2928
MSGS = {
3029
missing: 'Received state update (%p) with no count for job id=%p, last known count: %p.',
3130
ordered: 'Received state update %p (%p) for job id=%p, last known count: %p',
32-
unordered: 'Received state update %p (%p) for job id=%p, last known count: %p. %s',
33-
skip: 'Skipping the message.'
31+
unordered: 'Received state update %p (%p) for job id=%p, last known count: %p. Skipping the message.',
3432
}
3533

36-
def apply?
37-
return true if out_of_band? # TODO we need to increment the counter here, don't we?
38-
return missing unless given?
39-
apply = ordered? ? ordered : unordered
40-
return true unless ENV['UPDATE_COUNT']
41-
apply
34+
def apply
35+
if !enabled? || out_of_band?
36+
call
37+
elsif missing?
38+
missing
39+
elsif ordered?
40+
ordered
41+
else
42+
unordered
43+
end
4244
end
4345

4446
private
4547

48+
def call
49+
block.call
50+
end
51+
52+
def enabled?
53+
!!ENV['UPDATE_COUNT']
54+
end
55+
4656
def out_of_band?
4757
OUT_OF_BAND.include?(event)
4858
end
4959

50-
def given?
51-
!count.nil?
60+
def missing?
61+
count.nil?
5262
end
5363

5464
def missing
5565
warn :missing, event, job_id, counter.count
56-
true
66+
call
67+
store
5768
end
5869

5970
def ordered
6071
info :ordered, count, event, job_id, counter.count
61-
true
72+
call
73+
store
6274
end
6375

6476
def unordered
65-
warn :unordered, count, event, job_id, counter.count, ENV['UPDATE_COUNT'] ? MSGS[:skip] : ''
66-
false
77+
warn :unordered, count, event, job_id, counter.count
6778
end
6879

6980
def ordered?
7081
count >= counter.count
7182
end
7283

84+
def store
85+
counter.store(count)
86+
end
87+
7388
def counter
7489
@counter ||= Counter.new(job_id, redis)
7590
end

lib/travis/hub/service/update_job.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ class UpdateJob < Struct.new(:event, :data)
2323
def run
2424
exclusive do
2525
validate
26-
update_job
27-
notify
26+
with_state_update do
27+
update_job
28+
notify
29+
end
2830
end
2931
end
3032
instrument :run
@@ -38,7 +40,6 @@ def job
3840
private
3941

4042
def update_job
41-
return skipped unless apply_state_update?
4243
return error_job if event == :reset && resets.limited? && !job.finished?
4344
return recancel if recancel?
4445
return skipped if skip_canceled?
@@ -74,8 +75,8 @@ def skipped
7475
warn :skipped, event, job.id, job.state, data[:state], data
7576
end
7677

77-
def apply_state_update?
78-
StateUpdate.new(context, event, data).apply?
78+
def with_state_update(&block)
79+
StateUpdate.new(context, event, data, block).apply
7980
end
8081

8182
def resets

spec/travis/hub/service/update_job_spec.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ def recieve(msg)
270270

271271
it { expect(job.reload.state).to eq :received }
272272
it { expect(log).to include "W Received state update 2 (:start) for job id=#{job.id}, last known count: 3. Skipping the message." }
273-
it { expect(log).to include "W Skipped event job:start for <Job id=#{job.id}> trying to update state from :received to :started" }
274273
end
275274
end
276275
end

0 commit comments

Comments
 (0)