Skip to content

Commit 2efb6ac

Browse files
committed
gh-22 fix for utubettl and done/delete/bury counters
statistics test cases for each queue driver
1 parent 12d1322 commit 2efb6ac

File tree

6 files changed

+185
-13
lines changed

6 files changed

+185
-13
lines changed

queue/abstract.lua

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,19 @@ function tube.ack(self, id)
6767
if _taken == nil then
6868
box.error(box.error.PROC_LUA, "Task was not taken in the session")
6969
end
70+
local tube = box.space._queue:get{self.name}
71+
local space_name = tube[3]
7072

7173
self:peek(id)
74+
-- delete task
7275
box.space._queue_taken:delete{session.id(), self.tube_id, id}
73-
return self.raw:normalize_task(
74-
self.raw:delete(id):transform(2, 1, state.DONE))
76+
local result = self.raw:normalize_task(
77+
self.raw:delete(id):transform(2, 1, state.DONE)
78+
)
79+
-- swap delete and ack call counters
80+
queue.stat[space_name]:inc('ack')
81+
queue.stat[space_name]:dec('delete')
82+
return result
7583
end
7684

7785
function tube.release(self, id, opts)
@@ -198,6 +206,9 @@ local function make_self(driver, space, tube_name, tube_type, tube_id, opts)
198206
if stats_data ~= nil then
199207
queue.stat[space.name]:inc(stats_data)
200208
end
209+
if stats_data == 'delete' then
210+
queue.stat[space.name]:inc('done')
211+
end
201212
end
202213

203214
self = {
@@ -370,7 +381,7 @@ local function build_stats(space)
370381

371382
-- add api calls stats
372383
for name, value in pairs(st) do
373-
if type(value) ~= 'function' then
384+
if type(value) ~= 'function' and name ~= 'done' then
374385
stats['calls'][tostring(name)] = value
375386
end
376387
end
@@ -383,6 +394,7 @@ local function build_stats(space)
383394
local state = human_states[s]
384395
stats['tasks'][state] = box.space[space].index[idx_tube]:count(s)
385396
end
397+
stats['tasks']['done'] = st.done
386398

387399
return stats
388400
end
@@ -406,6 +418,10 @@ setmetatable(queue.stat, {
406418
inc = function(t, cnt)
407419
t[cnt] = t[cnt] + 1
408420
return t[cnt]
421+
end,
422+
dec = function(t, cnt)
423+
t[cnt] = t[cnt] - 1
424+
return t[cnt]
409425
end
410426
}
411427
setmetatable(spt, {

queue/abstract/driver/utubettl.lua

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ function tube.new(space, on_task_change, opts)
9696
end
9797

9898

99-
local function process_neighbour(self, task)
100-
self:on_task_change(task)
99+
local function process_neighbour(self, task, operation)
100+
self:on_task_change(task, operation)
101101
if task ~= nil then
102102
local neighbour = self.space.index.utube:min{state.READY, task[i_utube]}
103103
if neighbour ~= nil and neighbour[i_status] == state.READY then
@@ -252,7 +252,7 @@ function method.delete(self, id)
252252
local task = self.space:delete(id)
253253
if task ~= nil then
254254
task = task:transform(i_status, 1, state.DONE)
255-
return process_neighbour(self, task)
255+
return process_neighbour(self, task, 'delete')
256256
end
257257
self:on_task_change(task, 'delete')
258258
end
@@ -270,7 +270,7 @@ function method.release(self, id, opts)
270270
{ '+', i_ttl, opts.delay }
271271
})
272272
if task ~= nil then
273-
return process_neighbour(self, task)
273+
return process_neighbour(self, task, 'release')
274274
end
275275
else
276276
task = self.space:update(id, {
@@ -286,7 +286,9 @@ end
286286
function method.bury(self, id)
287287
local task = self.space:update(id, {{ '=', i_status, state.BURIED }})
288288
if task ~= nil then
289-
return process_neighbour(self, task:transform(i_status, 1, state.BURIED))
289+
return process_neighbour(
290+
self, task:transform(i_status, 1, state.BURIED), 'bury'
291+
)
290292
end
291293
self:on_task_change(task, 'bury')
292294
end

t/010-fifo.t

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ local test = (require 'tap').test()
66
local tnt = require 't.tnt'
77
local state = require 'queue.abstract.state'
88
local yaml = require 'yaml'
9-
test:plan(11)
9+
test:plan(12)
1010

1111
test:ok(rawget(box, 'space'), 'box started')
1212

@@ -15,10 +15,48 @@ test:ok(queue.start(), 'queue.start()')
1515
test:ok(queue, 'queue is loaded')
1616

1717
local tube = queue.create_tube('test', 'fifo')
18+
local tube2 = queue.create_tube('test_stat', 'fifo')
1819
test:ok(tube, 'test tube created')
1920
test:is(tube.name, 'test', 'tube.name')
2021
test:is(tube.type, 'fifo', 'tube.type')
2122

23+
test:test('Fifo statistics', function(test)
24+
test:plan(13)
25+
tube2:put('stat_0')
26+
tube2:put('stat_1')
27+
tube2:put('stat_2')
28+
tube2:put('stat_3')
29+
tube2:put('stat_4')
30+
tube2:delete(4)
31+
tube2:take(.001)
32+
tube2:release(0)
33+
tube2:take(.001)
34+
tube2:ack(0)
35+
tube2:bury(1)
36+
tube2:bury(2)
37+
tube2:kick(1)
38+
tube2:take(.001)
39+
40+
stats = queue.statistics('test_stat')
41+
42+
-- check tasks statistics
43+
test:is(stats.tasks.taken, 1, 'tasks.taken')
44+
test:is(stats.tasks.buried, 1, 'tasks.buried')
45+
test:is(stats.tasks.ready, 1, 'tasks.ready')
46+
test:is(stats.tasks.done, 2, 'tasks.done')
47+
test:is(stats.tasks.delayed, 0, 'tasks.delayed')
48+
test:is(stats.tasks.total, 3, 'tasks.total')
49+
50+
-- check function call statistics
51+
test:is(stats.calls.delete, 1, 'calls.delete')
52+
test:is(stats.calls.ack, 1, 'calls.ack')
53+
test:is(stats.calls.take, 3, 'calls.take')
54+
test:is(stats.calls.kick, 1, 'calls.kick')
55+
test:is(stats.calls.bury, 2, 'calls.bury')
56+
test:is(stats.calls.put, 5, 'calls.put')
57+
test:is(stats.calls.release, 1, 'calls.release')
58+
end)
59+
2260
test:test('Easy put/take/ack', function(test)
2361
test:plan(5)
2462

@@ -181,7 +219,7 @@ test:test('creating existing tube', function(test)
181219
test:plan(2)
182220
local s, e = pcall(function() queue.create_tube('test', 'fifo') end)
183221
test:ok(not s, 'exception was thrown')
184-
test:is(e, 'Space queue_fifo_test already exists', 'text of exception')
222+
test:is(e, 'Space test already exists', 'text of exception')
185223
end)
186224

187225
test:test('tempspace', function(test)

t/020-fifottl.t

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,55 @@ local fiber = require 'fiber'
66
local test = (require 'tap').test()
77
local tnt = require 't.tnt'
88
local state = require 'queue.abstract.state'
9-
test:plan(9)
9+
test:plan(10)
1010

1111
local queue = require 'queue.abstract'
1212
test:ok(queue.start(), 'queue.start()')
1313
test:ok(queue, 'queue is loaded')
1414

1515
local tube = queue.create_tube('test', 'fifottl')
16+
local tube2 = queue.create_tube('test_stat', 'fifottl')
1617
test:ok(tube, 'test tube created')
1718
test:is(tube.name, 'test', 'tube.name')
1819
test:is(tube.type, 'fifottl', 'tube.type')
1920

21+
test:test('Fifottl statistics', function(test)
22+
test:plan(13)
23+
tube2:put('stat_0')
24+
tube2:put('stat_1')
25+
tube2:put('stat_2')
26+
tube2:put('stat_3')
27+
tube2:put('stat_4')
28+
tube2:delete(4)
29+
tube2:take(.001)
30+
tube2:release(0)
31+
tube2:take(.001)
32+
tube2:ack(0)
33+
tube2:bury(1)
34+
tube2:bury(2)
35+
tube2:kick(1)
36+
tube2:take(.001)
37+
38+
stats = queue.statistics('test_stat')
39+
40+
-- check tasks statistics
41+
test:is(stats.tasks.taken, 1, 'tasks.taken')
42+
test:is(stats.tasks.buried, 1, 'tasks.buried')
43+
test:is(stats.tasks.ready, 1, 'tasks.ready')
44+
test:is(stats.tasks.done, 2, 'tasks.done')
45+
test:is(stats.tasks.delayed, 0, 'tasks.delayed')
46+
test:is(stats.tasks.total, 3, 'tasks.total')
47+
48+
-- check function call statistics
49+
test:is(stats.calls.delete, 1, 'calls.delete')
50+
test:is(stats.calls.ack, 1, 'calls.ack')
51+
test:is(stats.calls.take, 3, 'calls.take')
52+
test:is(stats.calls.kick, 1, 'calls.kick')
53+
test:is(stats.calls.bury, 2, 'calls.bury')
54+
test:is(stats.calls.put, 5, 'calls.put')
55+
test:is(stats.calls.release, 1, 'calls.release')
56+
end)
57+
2058

2159
test:test('put/take/peek', function(test)
2260
test:plan(11)

t/030-utube.t

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ local test = (require 'tap').test()
66
local tnt = require 't.tnt'
77
local state = require 'queue.abstract.state'
88
local yaml = require 'yaml'
9-
test:plan(10)
9+
test:plan(11)
1010

1111
test:ok(rawget(box, 'space'), 'box started')
1212

@@ -15,10 +15,49 @@ test:ok(queue.start(), 'queue.start()')
1515
test:ok(queue, 'queue is loaded')
1616

1717
local tube = queue.create_tube('test', 'utube')
18+
local tube2 = queue.create_tube('test_stat', 'utube')
1819
test:ok(tube, 'test tube created')
1920
test:is(tube.name, 'test', 'tube.name')
2021
test:is(tube.type, 'utube', 'tube.type')
2122

23+
test:test('Utube statistics', function(test)
24+
test:plan(13)
25+
tube2:put('stat_0')
26+
tube2:put('stat_1')
27+
tube2:put('stat_2')
28+
tube2:put('stat_3')
29+
tube2:put('stat_4')
30+
tube2:delete(4)
31+
tube2:take(.001)
32+
tube2:release(0)
33+
tube2:take(.001)
34+
tube2:ack(0)
35+
tube2:bury(1)
36+
tube2:bury(2)
37+
tube2:kick(1)
38+
tube2:take(.001)
39+
40+
stats = queue.statistics('test_stat')
41+
42+
-- check tasks statistics
43+
test:is(stats.tasks.taken, 1, 'tasks.taken')
44+
test:is(stats.tasks.buried, 1, 'tasks.buried')
45+
test:is(stats.tasks.ready, 1, 'tasks.ready')
46+
test:is(stats.tasks.done, 2, 'tasks.done')
47+
test:is(stats.tasks.delayed, 0, 'tasks.delayed')
48+
test:is(stats.tasks.total, 3, 'tasks.total')
49+
50+
-- check function call statistics
51+
test:is(stats.calls.delete, 1, 'calls.delete')
52+
test:is(stats.calls.ack, 1, 'calls.ack')
53+
test:is(stats.calls.take, 3, 'calls.take')
54+
test:is(stats.calls.kick, 1, 'calls.kick')
55+
test:is(stats.calls.bury, 2, 'calls.bury')
56+
test:is(stats.calls.put, 5, 'calls.put')
57+
test:is(stats.calls.release, 1, 'calls.release')
58+
end)
59+
60+
2261
test:test('Easy put/take/ack', function(test)
2362
test:plan(12)
2463

t/040-utubettl.t

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ local test = (require 'tap').test()
66
local tnt = require 't.tnt'
77
local state = require 'queue.abstract.state'
88
local yaml = require 'yaml'
9-
test:plan(13)
9+
test:plan(14)
1010

1111
test:ok(rawget(box, 'space'), 'box started')
1212

@@ -15,10 +15,49 @@ test:ok(queue.start(), 'queue.start()')
1515
test:ok(queue, 'queue is loaded')
1616

1717
local tube = queue.create_tube('test', 'utubettl')
18+
local tube2 = queue.create_tube('test_stat', 'utubettl')
1819
test:ok(tube, 'test tube created')
1920
test:is(tube.name, 'test', 'tube.name')
2021
test:is(tube.type, 'utubettl', 'tube.type')
2122

23+
test:test('Utubettl statistics', function(test)
24+
test:plan(13)
25+
tube2:put('stat_0')
26+
tube2:put('stat_1')
27+
tube2:put('stat_2')
28+
tube2:put('stat_3')
29+
tube2:put('stat_4')
30+
tube2:delete(4)
31+
tube2:take(.001)
32+
tube2:release(0)
33+
tube2:take(.001)
34+
tube2:ack(0)
35+
tube2:bury(1)
36+
tube2:bury(2)
37+
tube2:kick(1)
38+
tube2:take(.001)
39+
40+
stats = queue.statistics('test_stat')
41+
42+
-- check tasks statistics
43+
test:is(stats.tasks.taken, 1, 'tasks.taken')
44+
test:is(stats.tasks.buried, 1, 'tasks.buried')
45+
test:is(stats.tasks.ready, 1, 'tasks.ready')
46+
test:is(stats.tasks.done, 2, 'tasks.done')
47+
test:is(stats.tasks.delayed, 0, 'tasks.delayed')
48+
test:is(stats.tasks.total, 3, 'tasks.total')
49+
50+
-- check function call statistics
51+
test:is(stats.calls.delete, 1, 'calls.delete')
52+
test:is(stats.calls.ack, 1, 'calls.ack')
53+
test:is(stats.calls.take, 3, 'calls.take')
54+
test:is(stats.calls.kick, 1, 'calls.kick')
55+
test:is(stats.calls.bury, 2, 'calls.bury')
56+
test:is(stats.calls.put, 5, 'calls.put')
57+
test:is(stats.calls.release, 1, 'calls.release')
58+
end)
59+
60+
2261
test:test('Easy put/take/ack', function(test)
2362
test:plan(12)
2463

0 commit comments

Comments
 (0)