fairway 0.3.1 → 0.3.2

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OGE1MjlkNzEzY2FiZDc0MWMzMGNkZDhlYjkxODg4MzY3ZmJhNGE0NA==
4
+ ODBhZmUyMTQyYmZkMTk0ZmJkNGM3ZmQ4ZjdkZWUzNzc5MjRlMTE3Nw==
5
5
  data.tar.gz: !binary |-
6
- ZjBiMzdjNmQ3YWI4Mjg1OTE5MDVkNTU2OTUwMTZiNTIwODhjZDg5OQ==
6
+ MzcxMWQxYjFkMzVhYTY4M2Y1M2M0YjRlY2NlZGU0YzVjYjIwZjFmNA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ODAyMTVhODhiZWRmY2NhMzgyYTkyMzliZDIyNDUyOGM2NGJkMWY3Nzg1MmVm
10
- NmZhM2Q5OWI4NWZkNGQzZWIxOWQyMGJmZGM2NWUxOTY5ZjI0MmUzNmZiMTcx
11
- MTkwYzlhYzJkNWQyMzVmMjdhYThhNzAzMzI2YzMxNmFiZWY2Y2Y=
9
+ NGE4NmM1Yzk5NGE2NzYxNTdiNjIxYzQzZDU3ZjZiZmVjNjNkYjZmNTNjNDUz
10
+ Y2IwNmViOTgxNmU5NjAzM2U2OTE2MWJmNTk1YTEyYWVmZWEyMDFlZmI2NDgy
11
+ NDE5OTJiNDk1YTY5YTRlMDNiODFmNWU2YTQ3ODZiZjE3MjA0YWU=
12
12
  data.tar.gz: !binary |-
13
- YWRjM2RhYWI3NzJjNDljZmQwYjgxYzIzZGMwNGI4MDliZmY2NTFkZGY0ZDlm
14
- Y2U3MGU0YTUyZjU4ODNhNzA3N2RkOTI4ODYwYWY2NDM1YzYzMDk4NzQ5NDM1
15
- MjRiZGM1MjdkYjU1N2M1NTI0YjgzYjYwMGE0MzJlNjA5NjExMjA=
13
+ MDEwZDIwMzI0YzQ4Yzc0NDU2NWRkNzMxOGM5ZjkxMjMwY2I5NGFiYmU2NTE0
14
+ NjA1YTAxMmNmZjNmNjEzNWJmZWFlMjBkNzljZmVjZDZkYmY4YTQwODFiMWMy
15
+ NDFjZjA1OTNhZTc0MWM5YmVmZjU0MzMxMjRkMGEzNmE0MzRjNWQ=
data/Gemfile CHANGED
@@ -2,6 +2,8 @@ source :rubygems
2
2
 
3
3
  gem "rake"
4
4
 
5
+ gem "activesupport", "4.0.2"
6
+
5
7
  # Specify your gem's dependencies in fairway.gemspec
6
8
  gemspec
7
9
 
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fairway (0.2.7)
5
- activesupport (= 4.0.2)
4
+ fairway (0.3.1)
5
+ activesupport
6
6
  connection_pool
7
7
  redis
8
8
  redis-namespace (>= 1.3.0)
@@ -51,6 +51,7 @@ PLATFORMS
51
51
  ruby
52
52
 
53
53
  DEPENDENCIES
54
+ activesupport (= 4.0.2)
54
55
  fairway!
55
56
  rake
56
57
  rspec
data/go/fairway_ack.go CHANGED
@@ -49,8 +49,9 @@ if removed > 0 then
49
49
  redis.call('hset', facet_pool, facet, current + 1);
50
50
  end
51
51
 
52
- if (current == 0 and length == 0 and inflight_cur == 0 and n == 0) then
52
+ if (length == 0 and inflight_cur == 0 and n == 0) then
53
53
  redis.call('del', inflight_total);
54
+ redis.call('hdel', facet_pool, facet);
54
55
  redis.call('srem', active_facets, facet);
55
56
  end
56
57
  end
@@ -36,7 +36,6 @@ for i = 1, #registered_queues, 2 do
36
36
  local length = redis.call('lpush', k(queue, facet), message)
37
37
  redis.call('incr', k(queue, 'length'));
38
38
 
39
-
40
39
  -- Manage facet queue and active facets
41
40
  local current = tonumber(redis.call('hget', facet_pool, facet)) or 0;
42
41
  local priority = tonumber(redis.call('hget', priorities, facet)) or 1;
data/go/fairway_pull.go CHANGED
@@ -10,38 +10,15 @@ local k = function (queue, subkey)
10
10
  return namespace .. queue .. ':' .. subkey;
11
11
  end
12
12
 
13
- -- Multiple queues can be passed through
14
- -- fairway_pull. We'll loop through all
15
- -- provided queues, and return a message
16
- -- from the first one that isn't empty.
17
- for i, queue in ipairs(ARGV) do
18
- local active_facets = k(queue, 'active_facets');
13
+ local pull = function (queue)
19
14
  local round_robin = k(queue, 'facet_queue');
20
15
  local inflight = k(queue, 'inflight');
21
- local inflight_limit = k(queue, 'limit');
22
- local priorities = k(queue, 'priorities');
23
- local facet_pool = k(queue, 'facet_pool');
24
-
25
- if wait ~= -1 then
26
- -- Check if any current inflight messages
27
- -- have been inflight for a long time.
28
- local inflightmessage = redis.call('zrange', inflight, 0, 0, 'WITHSCORES');
29
-
30
- -- If we have an inflight message and it's score
31
- -- is less than the current pull timestamp, reset
32
- -- the inflight score for the the message and resend.
33
- if #inflightmessage > 0 then
34
- if tonumber(inflightmessage[2]) <= timestamp then
35
- redis.call('zadd', inflight, timestamp + wait, inflightmessage[1]);
36
- return {queue, inflightmessage[1]}
37
- end
38
- end
39
- end
40
16
 
41
17
  -- Pull a facet from the round-robin list.
42
18
  -- This list guarantees each active facet will have a
43
19
  -- message pulled from the queue every time through..
44
20
  local facet = redis.call('rpop', round_robin);
21
+ local message = nil
45
22
 
46
23
  if facet then
47
24
  -- If we found an active facet, we know the facet
@@ -50,7 +27,7 @@ for i, queue in ipairs(ARGV) do
50
27
  local messages = k(queue, facet);
51
28
  local inflight_total = k(queue, facet .. ':inflight');
52
29
 
53
- local message = redis.call('rpop', messages);
30
+ message = redis.call('rpop', messages);
54
31
 
55
32
  if message then
56
33
  if wait ~= -1 then
@@ -60,43 +37,99 @@ for i, queue in ipairs(ARGV) do
60
37
 
61
38
  redis.call('decr', k(queue, 'length'));
62
39
  end
40
+ end
63
41
 
64
- -- Manage facet queue and active facets
65
- local current = tonumber(redis.call('hget', facet_pool, facet)) or 0;
66
- local priority = tonumber(redis.call('hget', priorities, facet)) or 1;
67
- local length = redis.call('llen', messages);
68
- local inflight_cur = tonumber(redis.call('get', inflight_total)) or 0;
69
- local inflight_max = tonumber(redis.call('get', inflight_limit)) or 0;
42
+ return {facet, message};
43
+ end
44
+
45
+ local manage = function (queue, facet)
46
+ local active_facets = k(queue, 'active_facets');
47
+ local round_robin = k(queue, 'facet_queue');
48
+ local inflight_limit = k(queue, 'limit');
49
+ local priorities = k(queue, 'priorities');
50
+ local facet_pool = k(queue, 'facet_pool');
51
+ local messages = k(queue, facet);
52
+ local inflight_total = k(queue, facet .. ':inflight');
53
+
54
+ local current = tonumber(redis.call('hget', facet_pool, facet)) or 0;
55
+ local priority = tonumber(redis.call('hget', priorities, facet)) or 1;
56
+ local length = redis.call('llen', messages);
57
+ local inflight_cur = tonumber(redis.call('get', inflight_total)) or 0;
58
+ local inflight_max = tonumber(redis.call('get', inflight_limit)) or 0;
59
+
60
+ local n = 0
61
+
62
+ -- redis.log(redis.LOG_WARNING, current.."/"..length.."/"..priority.."/"..inflight_max.."/"..inflight_cur);
63
+
64
+ if inflight_max > 0 then
65
+ n = math.min(length, priority, inflight_max - inflight_cur);
66
+ else
67
+ n = math.min(length, priority);
68
+ end
69
+
70
+ -- redis.log(redis.LOG_WARNING, "PULL: "..current.."/"..n);
71
+
72
+ if n < current then
73
+ -- redis.log(redis.LOG_WARNING, "shrinking");
74
+ redis.call('hset', facet_pool, facet, current - 1);
75
+ elseif n > current then
76
+ -- redis.log(redis.LOG_WARNING, "growing");
77
+ redis.call('lpush', round_robin, facet);
78
+ redis.call('lpush', round_robin, facet);
79
+ redis.call('hset', facet_pool, facet, current + 1);
80
+ else
81
+ -- redis.log(redis.LOG_WARNING, "maintaining");
82
+ redis.call('lpush', round_robin, facet);
83
+ end
84
+
85
+ if (length == 0 and inflight_cur == 0 and n == 0) then
86
+ redis.call('del', inflight_total);
87
+ redis.call('hdel', facet_pool, facet);
88
+ redis.call('srem', active_facets, facet);
89
+ end
90
+ end
70
91
 
71
- local n = 0
92
+ -- Multiple queues can be passed through
93
+ -- fairway_pull. We'll loop through all
94
+ -- provided queues, and return a message
95
+ -- from the first one that isn't empty.
96
+ for i, queue in ipairs(ARGV) do
97
+ local inflight = k(queue, 'inflight');
72
98
 
73
- -- redis.log(redis.LOG_WARNING, current.."/"..length.."/"..priority.."/"..inflight_max.."/"..inflight_cur);
99
+ if wait ~= -1 then
100
+ -- Check if any current inflight messages
101
+ -- have been inflight for a long time.
102
+ local inflightmessage = redis.call('zrange', inflight, 0, 0, 'WITHSCORES');
74
103
 
75
- if inflight_max > 0 then
76
- n = math.min(length, priority, inflight_max - inflight_cur);
77
- else
78
- n = math.min(length, priority);
104
+ -- If we have an inflight message and it's score
105
+ -- is less than the current pull timestamp, reset
106
+ -- the inflight score for the the message and resend.
107
+ if #inflightmessage > 0 then
108
+ if tonumber(inflightmessage[2]) <= timestamp then
109
+ redis.call('zadd', inflight, timestamp + wait, inflightmessage[1]);
110
+ return {queue, inflightmessage[1]}
111
+ end
79
112
  end
113
+ end
80
114
 
81
- -- redis.log(redis.LOG_WARNING, "PULL: "..current.."/"..n);
82
-
83
- if n < current then
84
- -- redis.log(redis.LOG_WARNING, "shrinking");
85
- redis.call('hset', facet_pool, facet, current - 1);
86
- elseif n > current then
87
- -- redis.log(redis.LOG_WARNING, "growing");
88
- redis.call('lpush', round_robin, facet);
89
- redis.call('lpush', round_robin, facet);
90
- redis.call('hset', facet_pool, facet, current + 1);
91
- else
92
- -- redis.log(redis.LOG_WARNING, "maintaining");
93
- redis.call('lpush', round_robin, facet);
94
- end
115
+ local pulled = pull(queue);
116
+ local facet = pulled[1];
117
+ local message = pulled[2];
95
118
 
96
- if (current == 1 and length == 0 and inflight_cur == 0 and n == 0) then
97
- redis.call('del', inflight_total);
98
- redis.call('srem', active_facets, facet);
99
- end
119
+ if facet then
120
+ manage(queue, facet);
121
+
122
+ -- if message then
123
+ -- else
124
+ -- -- TODO loop through until we find a message
125
+ -- pulled = pull(queue);
126
+ -- facet = pulled[1];
127
+ -- message = pulled[2];
128
+
129
+ -- if facet then
130
+ -- manage(queue, facet);
131
+ -- end
132
+ -- end
100
133
 
101
134
  return {queue, message};
102
135
  end
data/go/message.go CHANGED
@@ -2,7 +2,8 @@ package fairway
2
2
 
3
3
  import (
4
4
  "encoding/json"
5
- "github.com/customerio/go-simplejson"
5
+
6
+ "github.com/bitly/go-simplejson"
6
7
  )
7
8
 
8
9
  type Msg struct {
data/go/queue_test.go CHANGED
@@ -62,6 +62,87 @@ func QueueSpec(c gospec.Context) {
62
62
  c.Expect(message.json(), Equals, msg2.json())
63
63
  })
64
64
 
65
+ c.Specify("skips over facets in invalid state", func() {
66
+ config.Facet = func(msg *Msg) string {
67
+ str, _ := msg.Get("facet").String()
68
+ return str
69
+ }
70
+
71
+ msg1, _ := NewMsg(map[string]string{"facet": "1", "name": "mymessage1"})
72
+ msg2, _ := NewMsg(map[string]string{"facet": "2", "name": "mymessage2"})
73
+ msg3, _ := NewMsg(map[string]string{"facet": "1", "name": "mymessage3"})
74
+
75
+ conn.Deliver(msg1)
76
+ conn.Deliver(msg2)
77
+ conn.Deliver(msg3)
78
+
79
+ r := config.Pool.Get()
80
+ defer r.Close()
81
+
82
+ count, _ := redis.Int(r.Do("llen", "fairway:myqueue:1"))
83
+ c.Expect(count, Equals, 2)
84
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:2"))
85
+ c.Expect(count, Equals, 1)
86
+ count, _ = redis.Int(r.Do("scard", "fairway:myqueue:active_facets"))
87
+ c.Expect(count, Equals, 2)
88
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:facet_queue"))
89
+ c.Expect(count, Equals, 2)
90
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "1"))
91
+ c.Expect(count, Equals, 1)
92
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "2"))
93
+ c.Expect(count, Equals, 1)
94
+
95
+ queueName, message := queue.Pull(-1)
96
+ c.Expect(queueName, Equals, "myqueue")
97
+ c.Expect(message.json(), Equals, msg1.json())
98
+
99
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:1"))
100
+ c.Expect(count, Equals, 1)
101
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:2"))
102
+ c.Expect(count, Equals, 1)
103
+ count, _ = redis.Int(r.Do("scard", "fairway:myqueue:active_facets"))
104
+ c.Expect(count, Equals, 2)
105
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:facet_queue"))
106
+ c.Expect(count, Equals, 2)
107
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "1"))
108
+ c.Expect(count, Equals, 1)
109
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "2"))
110
+ c.Expect(count, Equals, 1)
111
+
112
+ // We expect a message to be in here
113
+ r.Do("del", "fairway:myqueue:2")
114
+
115
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:1"))
116
+ c.Expect(count, Equals, 1)
117
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:2"))
118
+ c.Expect(count, Equals, 0)
119
+ count, _ = redis.Int(r.Do("scard", "fairway:myqueue:active_facets"))
120
+ c.Expect(count, Equals, 2)
121
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:facet_queue"))
122
+ c.Expect(count, Equals, 2)
123
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "1"))
124
+ c.Expect(count, Equals, 1)
125
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "2"))
126
+ c.Expect(count, Equals, 1)
127
+
128
+ queueName, message = queue.Pull(-1)
129
+ c.Expect(queueName, Equals, "myqueue")
130
+ c.Expect(message.json(), Equals, msg3.json())
131
+
132
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:1"))
133
+ c.Expect(count, Equals, 0)
134
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:2"))
135
+ c.Expect(count, Equals, 0)
136
+ count, _ = redis.Int(r.Do("scard", "fairway:myqueue:active_facets"))
137
+ c.Expect(count, Equals, 0)
138
+ count, _ = redis.Int(r.Do("llen", "fairway:myqueue:facet_queue"))
139
+ c.Expect(count, Equals, 0)
140
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "1"))
141
+ c.Expect(count, Equals, 0)
142
+ count, _ = redis.Int(r.Do("hget", "fairway:myqueue:facet_pool", "2"))
143
+ c.Expect(count, Equals, 0)
144
+ })
145
+
65
146
  c.Specify("places pulled message on inflight sorted set until acknowledged", func() {
66
147
  msg1, _ := NewMsg(map[string]string{"name": "mymessage1"})
67
148
 
@@ -1,3 +1,3 @@
1
1
  module Fairway
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -32,7 +32,6 @@ for i = 1, #registered_queues, 2 do
32
32
  local length = redis.call('lpush', k(queue, facet), message)
33
33
  redis.call('incr', k(queue, 'length'));
34
34
 
35
-
36
35
  -- Manage facet queue and active facets
37
36
  local current = tonumber(redis.call('hget', facet_pool, facet)) or 0;
38
37
  local priority = tonumber(redis.call('hget', priorities, facet)) or 1;
@@ -6,38 +6,15 @@ local k = function (queue, subkey)
6
6
  return namespace .. queue .. ':' .. subkey;
7
7
  end
8
8
 
9
- -- Multiple queues can be passed through
10
- -- fairway_pull. We'll loop through all
11
- -- provided queues, and return a message
12
- -- from the first one that isn't empty.
13
- for i, queue in ipairs(ARGV) do
14
- local active_facets = k(queue, 'active_facets');
9
+ local pull = function (queue)
15
10
  local round_robin = k(queue, 'facet_queue');
16
11
  local inflight = k(queue, 'inflight');
17
- local inflight_limit = k(queue, 'limit');
18
- local priorities = k(queue, 'priorities');
19
- local facet_pool = k(queue, 'facet_pool');
20
-
21
- if wait ~= -1 then
22
- -- Check if any current inflight messages
23
- -- have been inflight for a long time.
24
- local inflightmessage = redis.call('zrange', inflight, 0, 0, 'WITHSCORES');
25
-
26
- -- If we have an inflight message and it's score
27
- -- is less than the current pull timestamp, reset
28
- -- the inflight score for the the message and resend.
29
- if #inflightmessage > 0 then
30
- if tonumber(inflightmessage[2]) <= timestamp then
31
- redis.call('zadd', inflight, timestamp + wait, inflightmessage[1]);
32
- return {queue, inflightmessage[1]}
33
- end
34
- end
35
- end
36
12
 
37
13
  -- Pull a facet from the round-robin list.
38
14
  -- This list guarantees each active facet will have a
39
15
  -- message pulled from the queue every time through..
40
16
  local facet = redis.call('rpop', round_robin);
17
+ local message = nil
41
18
 
42
19
  if facet then
43
20
  -- If we found an active facet, we know the facet
@@ -46,7 +23,7 @@ for i, queue in ipairs(ARGV) do
46
23
  local messages = k(queue, facet);
47
24
  local inflight_total = k(queue, facet .. ':inflight');
48
25
 
49
- local message = redis.call('rpop', messages);
26
+ message = redis.call('rpop', messages);
50
27
 
51
28
  if message then
52
29
  if wait ~= -1 then
@@ -56,44 +33,101 @@ for i, queue in ipairs(ARGV) do
56
33
 
57
34
  redis.call('decr', k(queue, 'length'));
58
35
  end
36
+ end
59
37
 
60
- -- Manage facet queue and active facets
61
- local current = tonumber(redis.call('hget', facet_pool, facet)) or 0;
62
- local priority = tonumber(redis.call('hget', priorities, facet)) or 1;
63
- local length = redis.call('llen', messages);
64
- local inflight_cur = tonumber(redis.call('get', inflight_total)) or 0;
65
- local inflight_max = tonumber(redis.call('get', inflight_limit)) or 0;
38
+ return {facet, message};
39
+ end
66
40
 
67
- local n = 0
41
+ local manage = function (queue, facet)
42
+ local active_facets = k(queue, 'active_facets');
43
+ local round_robin = k(queue, 'facet_queue');
44
+ local inflight_limit = k(queue, 'limit');
45
+ local priorities = k(queue, 'priorities');
46
+ local facet_pool = k(queue, 'facet_pool');
47
+ local messages = k(queue, facet);
48
+ local inflight_total = k(queue, facet .. ':inflight');
49
+
50
+ local current = tonumber(redis.call('hget', facet_pool, facet)) or 0;
51
+ local priority = tonumber(redis.call('hget', priorities, facet)) or 1;
52
+ local length = redis.call('llen', messages);
53
+ local inflight_cur = tonumber(redis.call('get', inflight_total)) or 0;
54
+ local inflight_max = tonumber(redis.call('get', inflight_limit)) or 0;
55
+
56
+ local n = 0
57
+
58
+ -- redis.log(redis.LOG_WARNING, current.."/"..length.."/"..priority.."/"..inflight_max.."/"..inflight_cur);
59
+
60
+ if inflight_max > 0 then
61
+ n = math.min(length, priority, inflight_max - inflight_cur);
62
+ else
63
+ n = math.min(length, priority);
64
+ end
65
+
66
+ -- redis.log(redis.LOG_WARNING, "PULL: "..current.."/"..n);
67
+
68
+ if n < current then
69
+ -- redis.log(redis.LOG_WARNING, "shrinking");
70
+ redis.call('hset', facet_pool, facet, current - 1);
71
+ elseif n > current then
72
+ -- redis.log(redis.LOG_WARNING, "growing");
73
+ redis.call('lpush', round_robin, facet);
74
+ redis.call('lpush', round_robin, facet);
75
+ redis.call('hset', facet_pool, facet, current + 1);
76
+ else
77
+ -- redis.log(redis.LOG_WARNING, "maintaining");
78
+ redis.call('lpush', round_robin, facet);
79
+ end
80
+
81
+ if (length == 0 and inflight_cur == 0 and n == 0) then
82
+ redis.call('del', inflight_total);
83
+ redis.call('hdel', facet_pool, facet);
84
+ redis.call('srem', active_facets, facet);
85
+ end
86
+ end
68
87
 
69
- -- redis.log(redis.LOG_WARNING, current.."/"..length.."/"..priority.."/"..inflight_max.."/"..inflight_cur);
88
+ -- Multiple queues can be passed through
89
+ -- fairway_pull. We'll loop through all
90
+ -- provided queues, and return a message
91
+ -- from the first one that isn't empty.
92
+ for i, queue in ipairs(ARGV) do
93
+ local inflight = k(queue, 'inflight');
70
94
 
71
- if inflight_max > 0 then
72
- n = math.min(length, priority, inflight_max - inflight_cur);
73
- else
74
- n = math.min(length, priority);
75
- end
95
+ if wait ~= -1 then
96
+ -- Check if any current inflight messages
97
+ -- have been inflight for a long time.
98
+ local inflightmessage = redis.call('zrange', inflight, 0, 0, 'WITHSCORES');
76
99
 
77
- -- redis.log(redis.LOG_WARNING, "PULL: "..current.."/"..n);
78
-
79
- if n < current then
80
- -- redis.log(redis.LOG_WARNING, "shrinking");
81
- redis.call('hset', facet_pool, facet, current - 1);
82
- elseif n > current then
83
- -- redis.log(redis.LOG_WARNING, "growing");
84
- redis.call('lpush', round_robin, facet);
85
- redis.call('lpush', round_robin, facet);
86
- redis.call('hset', facet_pool, facet, current + 1);
87
- else
88
- -- redis.log(redis.LOG_WARNING, "maintaining");
89
- redis.call('lpush', round_robin, facet);
100
+ -- If we have an inflight message and it's score
101
+ -- is less than the current pull timestamp, reset
102
+ -- the inflight score for the the message and resend.
103
+ if #inflightmessage > 0 then
104
+ if tonumber(inflightmessage[2]) <= timestamp then
105
+ redis.call('zadd', inflight, timestamp + wait, inflightmessage[1]);
106
+ return {queue, inflightmessage[1]}
107
+ end
90
108
  end
109
+ end
91
110
 
92
- if (current == 1 and length == 0 and inflight_cur == 0 and n == 0) then
93
- redis.call('del', inflight_total);
94
- redis.call('srem', active_facets, facet);
95
- end
111
+ local pulled = pull(queue);
112
+ local facet = pulled[1];
113
+ local message = pulled[2];
114
+
115
+ if facet then
116
+ manage(queue, facet);
117
+
118
+ -- if message then
119
+ -- else
120
+ -- -- TODO loop through until we find a message
121
+ -- pulled = pull(queue);
122
+ -- facet = pulled[1];
123
+ -- message = pulled[2];
124
+
125
+ -- if facet then
126
+ -- manage(queue, facet);
127
+ -- end
128
+ -- end
96
129
 
97
130
  return {queue, message};
98
131
  end
99
132
  end
133
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fairway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Allison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-15 00:00:00.000000000 Z
11
+ date: 2016-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport