annotate teal-src/prosody/util/smqueue.tl @ 13946:f5e8ab42c708

mod_http_file_share: Check that files are still there with correct size Failed uploads can leave behind unused slots. Files shouldn't change size after they have been successfully uploaded, but might as well double check it.
author Kim Alvefur <zash@zash.se>
date Sat, 04 Dec 2021 18:56:51 +0100
parents 9ec961173b1c
children 1e01b91cf94d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12979
fbbf4f0db8f0 teal: Move into prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
1 local queue = require "prosody.util.queue";
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local record lib
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 -- T would typically be util.stanza
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 record smqueue<T>
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 _queue : queue.queue<T>
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 _head : integer
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 _tail : integer
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 enum ack_errors
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 "tail"
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 "head"
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 "pop"
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 end
13857
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
15 push : function (smqueue<T>, T)
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
16 ack : function (smqueue<T>, integer) : { T }, ack_errors
12057
e880f5a13080 util.smqueue: Add missing method to Teal record spec
Kim Alvefur <zash@zash.se>
parents: 12055
diff changeset
17 resumable : function (smqueue<T>) : boolean
e880f5a13080 util.smqueue: Add missing method to Teal record spec
Kim Alvefur <zash@zash.se>
parents: 12055
diff changeset
18 resume : function (smqueue<T>) : queue.queue.iterator, any, integer
13857
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
19 consume : function (smqueue<T>) : function() : T
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 table : function (smqueue<T>) : { T }
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 new : function <T>(integer) : smqueue<T>
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local type smqueue = lib.smqueue;
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27
13857
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
28 function smqueue:push(v : T)
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 self._head = self._head + 1;
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 -- Wraps instead of errors
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 assert(self._queue:push(v));
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33
13857
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
34 function smqueue:ack(h : integer) : { T }, smqueue.ack_errors
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 if h < self._tail then
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
36 return nil, "tail"
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 elseif h > self._head then
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
38 return nil, "head"
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 -- TODO optimize? cache table fields
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 local acked = {};
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 self._tail = h;
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 local expect = self._head - self._tail;
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 while expect < self._queue:count() do
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 local v = self._queue:pop();
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
46 if not v then
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
47 return nil, "pop"
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
48 end
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 table.insert(acked, v);
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 end
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
51 return acked
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 function smqueue:count_unacked() : integer
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
55 return self._head - self._tail
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 function smqueue:count_acked() : integer
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
59 return self._tail
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 function smqueue:resumable() : boolean
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
63 return self._queue:count() >= (self._head - self._tail)
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 function smqueue:resume() : queue.queue.iterator, any, integer
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
67 return self._queue:items()
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69
13857
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
70 function smqueue:consume() : (function() : T)
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
71 return self._queue:consume() as (function() : T)
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73
12058
4860da718e87 util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
74 -- Compatibility layer, plain ol' table
13857
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
75 function smqueue:table() : { T }
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
76 local t : { T } = {};
12058
4860da718e87 util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
77 for i, v in self:resume() do
4860da718e87 util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
78 t[i] = v;
4860da718e87 util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
79 end
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
80 return t
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 local function freeze(q : smqueue<any>) : { string:integer }
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 return { head = q._head, tail = q._tail }
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 local queue_mt = {
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 --
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 __name = "smqueue";
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 __index = smqueue;
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 __len = smqueue.count_unacked;
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 __freeze = freeze;
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 }
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94
13857
fc6495c887f6 util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
95 function lib.new<T>(size : integer) : smqueue<T>
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 assert(size>0);
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
97 return setmetatable({ _head = 0; _tail = 0; _queue = queue.new(size, true) }, queue_mt)
12055
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 end
daced16154fa util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99
13878
9ec961173b1c teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents: 13857
diff changeset
100 return lib