fairway 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fairway (0.0.5)
4
+ fairway (0.0.6)
5
5
  activesupport
6
6
  hiredis
7
7
  redis
data/lib/fairway/queue.rb CHANGED
@@ -4,15 +4,15 @@ module Fairway
4
4
 
5
5
  def initialize(connection, *queue_names)
6
6
  @connection = connection
7
- @queue_names = [queue_names].flatten!
7
+ @queue_names = parse_queue_names(queue_names)
8
8
  end
9
9
 
10
10
  def length
11
- @connection.redis.mget(@queue_names.map{|q| "#{q}:length" }).sum.to_i
11
+ @connection.redis.mget(@queue_names.uniq.map{|q| "#{q}:length" }).sum.to_i
12
12
  end
13
13
 
14
14
  def pull
15
- @connection.scripts.fairway_pull(@queue_names)
15
+ @connection.scripts.fairway_pull(@queue_names.shuffle.uniq)
16
16
  end
17
17
 
18
18
  def ==(other)
@@ -21,5 +21,21 @@ module Fairway
21
21
  connection == other.connection &&
22
22
  queue_names == other.queue_names
23
23
  end
24
+
25
+ private
26
+
27
+ def parse_queue_names(names)
28
+ [].tap do |queues|
29
+ names.each do |name|
30
+ if name.is_a?(Hash)
31
+ name.each do |key, value|
32
+ value.times { queues << key }
33
+ end
34
+ else
35
+ queues << name
36
+ end
37
+ end
38
+ end
39
+ end
24
40
  end
25
41
  end
@@ -1,3 +1,3 @@
1
1
  module Fairway
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -93,8 +93,47 @@ module Fairway
93
93
  connection.deliver(message2 = message.merge(topic: "event:2"))
94
94
 
95
95
  queue = Queue.new(connection, "myqueue2", "myqueue1")
96
- queue.pull.should == ["myqueue2", message2.to_json]
97
- queue.pull.should == ["myqueue1", message1.to_json]
96
+
97
+ messages = [["myqueue1", message1.to_json], ["myqueue2", message2.to_json]]
98
+ messages.should include(queue.pull)
99
+ messages.should include(queue.pull)
100
+ end
101
+
102
+ it "randomized order of queues attempted to reduce starvation" do
103
+ queue = Queue.new(connection, "myqueue2", "myqueue1")
104
+
105
+ order = {}
106
+
107
+ queue.connection.scripts.stub(:fairway_pull) do |queues|
108
+ order[queues.join(":")] ||= 0
109
+ order[queues.join(":")] += 1
110
+ end
111
+
112
+ 100.times { queue.pull }
113
+
114
+ order.keys.length.should == 2
115
+ order["myqueue2:myqueue1"].should > 0
116
+ order["myqueue1:myqueue2"].should > 0
117
+ end
118
+
119
+ it "allows weighting of queues for ordering" do
120
+ queue = Queue.new(connection, "myqueue2" => 10, "myqueue1" => 1)
121
+
122
+ queue.queue_names.should == [Array.new(10, "myqueue2"), "myqueue1"].flatten
123
+
124
+ order = {}
125
+
126
+ queue.connection.scripts.stub(:fairway_pull) do |queues|
127
+ order[queues.join(":")] ||= 0
128
+ order[queues.join(":")] += 1
129
+ end
130
+
131
+ 100.times { queue.pull }
132
+
133
+ order.keys.length.should == 2
134
+ order["myqueue2:myqueue1"].should > 0
135
+ order["myqueue1:myqueue2"].should > 0
136
+ order["myqueue2:myqueue1"].should > order["myqueue1:myqueue2"]
98
137
  end
99
138
 
100
139
  it "returns nil if no queues have messages" do
@@ -108,11 +147,17 @@ module Fairway
108
147
  connection.deliver(message3 = message.merge(facet: 2, topic: "event:1"))
109
148
  connection.deliver(message4 = message.merge(facet: 1, topic: "event:2"))
110
149
 
150
+ queue1_messages = []
111
151
  queue = Queue.new(connection, "myqueue2", "myqueue1")
112
- queue.pull.should == ["myqueue2", message4.to_json]
113
- queue.pull.should == ["myqueue1", message1.to_json]
114
- queue.pull.should == ["myqueue1", message3.to_json]
115
- queue.pull.should == ["myqueue1", message2.to_json]
152
+
153
+ 4.times do
154
+ message = queue.pull
155
+ queue1_messages << message if message.first == "myqueue1"
156
+ end
157
+
158
+ queue1_messages[0].should == ["myqueue1", message1.to_json]
159
+ queue1_messages[1].should == ["myqueue1", message3.to_json]
160
+ queue1_messages[2].should == ["myqueue1", message2.to_json]
116
161
  end
117
162
  end
118
163
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fairway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-16 00:00:00.000000000 Z
12
+ date: 2013-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport