fairway 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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