nexia_worker_roulette 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ea8533bab4bfc550f23023bfa81f0befbcd107d
4
- data.tar.gz: 0daa96c1b20b1c1621bbb4098b5726ff645e283a
3
+ metadata.gz: f0f447f3680d7e1b31c9bb64288bfcd272e06e0b
4
+ data.tar.gz: 37a831cc363e6ecab5aee296d4fb0790e05f2900
5
5
  SHA512:
6
- metadata.gz: 507641dc68cffaaccdb6c5077e38039af0afce8b348f2c240a60048b76b04f3472a5246b04bfd671c6b3a41b5ee080e469844cc95020e6cc8f1457f8faca1d4f
7
- data.tar.gz: 42b459a4d9288efd387c5c15d56c490c857de003d09d16d1f2aeec6bd3f2d39e4afa9ffd12a9faddd7454ae46c78d798d273ffc1ff93455fdb1e78568b4d722d
6
+ metadata.gz: f60bf31b75564128c79229d3504e4b7f1b22d79f20be3b9c4ed9845685c917d7fd7c478b277aead096a58dc4d2355f11b855edb411de12b2a130ba2bbb7bc0ab
7
+ data.tar.gz: 268b3765ffe7bc6dba03668a6a43184607640dfdd4a8376b157374bbbadc4a35c443f0155bc7e961c97f923aaf51dc377e004e89e8d6076924142ce0af4823c2
@@ -65,6 +65,43 @@ module WorkerRoulette
65
65
  return drain_work_orders(job_board_key, last_sender_key, empty_string)
66
66
  HERE
67
67
 
68
+ LUA_DRAIN_WORK_ORDERS_FOR_SENDER = <<-THERE
69
+ local empty_string = ""
70
+ local job_board_key = KEYS[1]
71
+ local sender_key = KEYS[2] or empty_string
72
+ local redis_call = redis.call
73
+ local lock_key_prefix = "L*:"
74
+ local lock_value = 1
75
+ local get = "GET"
76
+ local del = "DEL"
77
+ local lrange = "LRANGE"
78
+ local zrange = "ZRANGE"
79
+ local zrem = "ZREM"
80
+
81
+ local function drain_work_orders_for_sender(job_board_key, sender_key)
82
+
83
+ if sender_key == empty_string then
84
+ return {empty_string, {}, 0}
85
+ end
86
+
87
+ local lock_key = lock_key_prefix .. sender_key
88
+ was_locked = redis_call(get, lock_key)
89
+
90
+ if was_locked == 1 then
91
+ local work_orders = redis_call(lrange, sender_key, 0, -1)
92
+ redis_call(del, sender_key)
93
+
94
+ redis_call(zrem, job_board_key, sender_key)
95
+
96
+ return { sender_key, work_orders }
97
+ else
98
+ return { sender_key, {} }
99
+ end
100
+ end
101
+
102
+ return drain_work_orders_for_sender(job_board_key, sender_key)
103
+ THERE
104
+
68
105
  def initialize(redis_pool, evented, namespace = nil, polling_time = WorkerRoulette::DEFAULT_POLLING_TIME)
69
106
  @evented = evented
70
107
  @polling_time = polling_time
@@ -99,6 +136,29 @@ module WorkerRoulette
99
136
  end
100
137
  end
101
138
 
139
+ def get_more_work_for_last_sender(&on_message_callback)
140
+ return unless on_message_callback
141
+ more_work_orders! do |work|
142
+ on_message_callback.call(work) if work.any?
143
+ if @evented
144
+ evented_drain_work_queue!(&on_message_callback)
145
+ else
146
+ non_evented_drain_work_queue!(&on_message_callback)
147
+ end
148
+ end
149
+ end
150
+
151
+ def more_work_orders!(&callback)
152
+ @lua.call(LUA_DRAIN_WORK_ORDERS_FOR_SENDER, [job_board_key, @last_sender]) do |results|
153
+ sender_key = results[0]
154
+ raise "wrong sender key returned from LUA_DRAIN_WORK_ORDERS_FOR_SENDER" unless sender_key == @last_sender
155
+ work_orders = results[1]
156
+ work = work_orders.map {|work_order| WorkerRoulette.load(work_order)}
157
+ callback.call work if callback
158
+ work
159
+ end
160
+ end
161
+
102
162
  def job_board_key
103
163
  @job_board_key ||= WorkerRoulette.job_board_key(@namespace)
104
164
  end
@@ -1,3 +1,3 @@
1
1
  module WorkerRoulette
2
- VERSION = '0.1.11'
2
+ VERSION = '0.1.12'
3
3
  end
@@ -1,5 +1,9 @@
1
1
  require "spec_helper"
2
2
  module WorkerRoulette
3
+ class Tradesman
4
+ attr_reader :lua
5
+ end
6
+
3
7
  describe WorkerRoulette do
4
8
  let(:sender) {'katie_80'}
5
9
  let(:work_orders) {["hello", "foreman"]}
@@ -69,8 +73,8 @@ module WorkerRoulette
69
73
  end
70
74
 
71
75
  context Tradesman do
72
- let(:foreman) { worker_roulette.foreman(sender) }
73
- let(:tradesman) { worker_roulette.tradesman }
76
+ let(:foreman) { worker_roulette.foreman(sender) }
77
+ subject(:tradesman) { worker_roulette.tradesman }
74
78
 
75
79
  before do
76
80
  foreman.enqueue_work_order(work_orders)
@@ -153,6 +157,26 @@ module WorkerRoulette
153
157
  end
154
158
  end
155
159
 
160
+ it "goes back to the channel to get more work for the same sender" do
161
+ tradesman.wait_for_work_orders do |redis_work_orders|
162
+ expect(redis_work_orders).to eq([work_orders_with_headers])
163
+ expect(tradesman.last_sender).to eq('katie_80')
164
+ allow(tradesman).to receive(:wait_for_work_orders)
165
+ end
166
+
167
+ expect(tradesman.lua).to receive(:call).with(Tradesman::LUA_DRAIN_WORK_ORDERS_FOR_SENDER, [instance_of(String), sender])
168
+ tradesman.get_more_work_for_last_sender do |redis_work_orders|
169
+ expect(redis_work_orders).to eq([])
170
+ end
171
+
172
+ foreman.enqueue_work_order("more_work_orders")
173
+ expect(tradesman.lua).to receive(:call).with(Tradesman::LUA_DRAIN_WORK_ORDERS_FOR_SENDER, [instance_of(String), sender])
174
+ tradesman.get_more_work_for_last_sender do |redis_work_orders|
175
+ expect(redis_work_orders).to eq(["more_work_orders"])
176
+ end
177
+
178
+ end
179
+
156
180
  context "Failure" do
157
181
  it "should not put the sender_id and work_orders back if processing fails bc new work_orders may have been processed while that process failed" do; end
158
182
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexia_worker_roulette
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Saieg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-18 00:00:00.000000000 Z
11
+ date: 2014-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj