@@ -10,9 +10,6 @@ local str_type = qc.str_type
10
10
11
11
local queue_session = {}
12
12
13
- -- Sessions that don't have any active connections.
14
- local inactive_sessions = {}
15
-
16
13
--- Create everything that's needed to work with "shared" sessions.
17
14
local function identification_init ()
18
15
local queue_session_ids = box .space ._queue_session_ids
@@ -36,16 +33,36 @@ local function identification_init()
36
33
unique = false
37
34
})
38
35
end
36
+
37
+ local queue_inactive_sessions = box .space ._queue_inactive_sessions
38
+ if queue_inactive_sessions == nil then
39
+ queue_inactive_sessions = box .schema .create_space (' _queue_inactive_sessions' , {
40
+ temporary = false ,
41
+ format = {
42
+ { name = ' uuid' , type = str_type () },
43
+ { name = ' exp_time' , type = num_type () }
44
+ }
45
+ })
46
+
47
+ queue_inactive_sessions :create_index (' uuid' , {
48
+ type = ' tree' ,
49
+ parts = { 1 , str_type () },
50
+ unique = true
51
+ })
52
+ end
39
53
end
40
54
41
55
local function cleanup_inactive_sessions ()
42
56
local cur_time = util .time ()
43
- for session_uuid , exp_time in pairs (inactive_sessions ) do
57
+
58
+ for _ , val in box .space ._queue_inactive_sessions :pairs () do
59
+ local session_uuid = val [1 ]
60
+ local exp_time = val [2 ]
44
61
if cur_time >= exp_time then
45
62
if queue_session ._on_session_remove ~= nil then
46
63
queue_session ._on_session_remove (session_uuid )
47
64
end
48
- inactive_sessions [ session_uuid ] = nil
65
+ box . space . _queue_inactive_sessions : delete { session_uuid }
49
66
end
50
67
end
51
68
end
75
92
-- an error will be thrown.
76
93
local function identify (conn_id , session_uuid )
77
94
local queue_session_ids = box .space ._queue_session_ids
95
+ local queue_inactive_sessions = box .space ._queue_inactive_sessions
78
96
local session_ids = queue_session_ids :get (conn_id )
79
97
local cur_uuid = session_ids and session_ids [2 ]
80
98
@@ -95,7 +113,8 @@ local function identify(conn_id, session_uuid)
95
113
-- Check that a session with this uuid exists.
96
114
local ids_by_uuid = queue_session_ids .index .uuid :select (
97
115
session_uuid , { limit = 1 })[1 ]
98
- if ids_by_uuid == nil and inactive_sessions [session_uuid ] == nil then
116
+ local inactive_session = queue_inactive_sessions :get (session_uuid )
117
+ if ids_by_uuid == nil and inactive_session == nil then
99
118
error (' The UUID ' .. uuid .frombin (session_uuid ):str () ..
100
119
' is unknown.' )
101
120
end
@@ -110,7 +129,7 @@ local function identify(conn_id, session_uuid)
110
129
end
111
130
112
131
-- Exclude the session from inactive.
113
- inactive_sessions [ cur_uuid ] = nil
132
+ queue_inactive_sessions : delete { cur_uuid }
114
133
115
134
return cur_uuid
116
135
end
126
145
-- release its tasks if necessary.
127
146
local function disconnect (conn_id )
128
147
local queue_session_ids = box .space ._queue_session_ids
148
+ local queue_inactive_sessions = box .space ._queue_inactive_sessions
129
149
local session_uuid = queue_session .identify (conn_id )
130
150
131
151
queue_session_ids :delete {conn_id }
@@ -137,7 +157,7 @@ local function disconnect(conn_id)
137
157
if session_ids == nil then
138
158
local ttr = queue_session .cfg [' ttr' ] or 0
139
159
if ttr > 0 then
140
- inactive_sessions [ session_uuid ] = util .event_time (ttr )
160
+ queue_inactive_sessions : insert { session_uuid , util .event_time (ttr )}
141
161
elseif queue_session ._on_session_remove ~= nil then
142
162
queue_session ._on_session_remove (session_uuid )
143
163
end
147
167
local function grant (user )
148
168
box .schema .user .grant (user , ' read, write' , ' space' , ' _queue_session_ids' ,
149
169
{ if_not_exists = true })
170
+ box .schema .user .grant (user , ' read, write' , ' space' , ' _queue_inactive_sessions' ,
171
+ { if_not_exists = true })
150
172
end
151
173
152
174
local function start ()
0 commit comments