Skip to content

Commit f3056ea

Browse files
init: move storage code to a separate file
Part of #412 Part of #415
1 parent 0eccf47 commit f3056ea

20 files changed

+135
-127
lines changed

crud.lua

Lines changed: 11 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ local truncate = require('crud.truncate')
1717
local len = require('crud.len')
1818
local count = require('crud.count')
1919
local borders = require('crud.borders')
20-
local sharding_metadata = require('crud.common.sharding.sharding_metadata')
2120
local utils = require('crud.common.utils')
2221
local stats = require('crud.stats')
2322
local readview = require('crud.readview')
2423
local schema = require('crud.schema')
2524
local storage_info = require('crud.storage_info')
25+
local storage = require('crud.storage')
2626

2727
local crud = {}
2828

@@ -158,49 +158,6 @@ crud.readview = readview.new
158158
-- @function schema
159159
crud.schema = schema.call
160160

161-
--- Initializes crud on node
162-
--
163-
-- Exports all functions that are used for calls
164-
-- and CRUD operations.
165-
--
166-
-- @function init
167-
--
168-
function crud.init_storage()
169-
if type(box.cfg) ~= 'table' then
170-
error('box.cfg() must be called first')
171-
end
172-
173-
local user = nil
174-
if not box.info.ro then
175-
user = utils.get_this_replica_user() or 'guest'
176-
end
177-
178-
if rawget(_G, utils.STORAGE_NAMESPACE) == nil then
179-
rawset(_G, utils.STORAGE_NAMESPACE, {})
180-
end
181-
182-
insert.init(user)
183-
insert_many.init(user)
184-
get.init(user)
185-
replace.init(user)
186-
replace_many.init(user)
187-
update.init(user)
188-
upsert.init(user)
189-
upsert_many.init(user)
190-
delete.init(user)
191-
select.init(user)
192-
truncate.init(user)
193-
len.init(user)
194-
count.init(user)
195-
borders.init(user)
196-
sharding_metadata.init(user)
197-
readview.init(user)
198-
199-
-- Must be initialized last: properly working storage info is the flag
200-
-- of initialization success.
201-
storage_info.init(user)
202-
end
203-
204161
function crud.init_router()
205162
rawset(_G, 'crud', crud)
206163
end
@@ -209,8 +166,15 @@ function crud.stop_router()
209166
rawset(_G, 'crud', nil)
210167
end
211168

212-
function crud.stop_storage()
213-
rawset(_G, utils.STORAGE_NAMESPACE, nil)
214-
end
169+
--- Initializes crud on node
170+
--
171+
-- Exports all functions that are used for calls
172+
-- and CRUD operations.
173+
--
174+
-- @function init
175+
--
176+
crud.init_storage = storage.init
177+
178+
crud.stop_storage = storage.stop
215179

216180
return crud

crud/borders.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ local function get_border_on_storage(border_name, space_name, index_id, field_na
4343
})
4444
end
4545

46-
function borders.init(user)
47-
utils.init_storage_call(user, STAT_FUNC_NAME, get_border_on_storage)
48-
end
46+
borders.storage_api = {[STAT_FUNC_NAME] = get_border_on_storage}
4947

5048
local is_closer
5149

crud/common/sharding/sharding_metadata.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,6 @@ function sharding_metadata_module.reload_sharding_cache(vshard_router, space_nam
214214
end
215215
end
216216

217-
function sharding_metadata_module.init(user)
218-
utils.init_storage_call(user, FETCH_FUNC_NAME, sharding_metadata_module.fetch_on_storage)
219-
end
217+
sharding_metadata_module.storage_api = {[FETCH_FUNC_NAME] = sharding_metadata_module.fetch_on_storage}
220218

221219
return sharding_metadata_module

crud/common/utils.lua

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,30 +1130,6 @@ function utils.list_slice(list, start_index, end_index)
11301130
return slice
11311131
end
11321132

1133-
--- Initializes a storage function by its name.
1134-
--
1135-
-- It adds the function into the global scope by its name and required
1136-
-- access to a vshard storage user.
1137-
--
1138-
-- @function init_storage_call
1139-
--
1140-
-- @param string name of a user or nil if there is no need to setup access.
1141-
-- @param string name a name of the function.
1142-
-- @param function func the function.
1143-
--
1144-
-- @return nil
1145-
function utils.init_storage_call(user, name, func)
1146-
dev_checks('?string', 'string', 'function')
1147-
1148-
rawset(_G[utils.STORAGE_NAMESPACE], name, func)
1149-
1150-
if user ~= nil then
1151-
name = utils.get_storage_call(name)
1152-
box.schema.func.create(name, {setuid = true, if_not_exists = true})
1153-
box.schema.user.grant(user, 'execute', 'function', name, {if_not_exists=true})
1154-
end
1155-
end
1156-
11571133
local expected_vshard_api = {
11581134
'routeall', 'route', 'bucket_id_strcrc32',
11591135
'callrw', 'callro', 'callbro', 'callre',

crud/count.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,7 @@ local function count_on_storage(space_name, index_id, conditions, opts)
8686
return tuples_count
8787
end
8888

89-
function count.init(user)
90-
utils.init_storage_call(user, COUNT_FUNC_NAME, count_on_storage)
91-
end
89+
count.storage_api = {[COUNT_FUNC_NAME] = count_on_storage}
9290

9391
local check_count_safety_rl = ratelimit.new()
9492
local function check_count_safety(space_name, plan, opts)

crud/delete.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ local function delete_on_storage(space_name, key, field_names, opts)
5252
})
5353
end
5454

55-
function delete.init(user)
56-
utils.init_storage_call(user, DELETE_FUNC_NAME, delete_on_storage)
57-
end
55+
delete.storage_api = {[DELETE_FUNC_NAME] = delete_on_storage}
5856

5957
-- returns result, err, need_reload
6058
-- need_reload indicates if reloading schema could help

crud/get.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@ local function get_on_storage(space_name, key, field_names, opts)
5050
})
5151
end
5252

53-
function get.init(user)
54-
utils.init_storage_call(user, GET_FUNC_NAME, get_on_storage)
55-
end
53+
get.storage_api = {[GET_FUNC_NAME] = get_on_storage}
5654

5755
-- returns result, err, need_reload
5856
-- need_reload indicates if reloading schema could help

crud/insert.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ local function insert_on_storage(space_name, tuple, opts)
5353
})
5454
end
5555

56-
function insert.init(user)
57-
utils.init_storage_call(user, INSERT_FUNC_NAME, insert_on_storage)
58-
end
56+
insert.storage_api = {[INSERT_FUNC_NAME] = insert_on_storage}
5957

6058
-- returns result, err, need_reload
6159
-- need_reload indicates if reloading schema could help

crud/insert_many.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,7 @@ local function insert_many_on_storage(space_name, tuples, opts)
123123
return inserted_tuples, nil, replica_schema_version
124124
end
125125

126-
function insert_many.init(user)
127-
utils.init_storage_call(user, INSERT_MANY_FUNC_NAME, insert_many_on_storage)
128-
end
126+
insert_many.storage_api = {[INSERT_MANY_FUNC_NAME] = insert_many_on_storage}
129127

130128
-- returns result, err, need_reload
131129
-- need_reload indicates if reloading schema could help

crud/len.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ local function len_on_storage(space_name)
1717
return box.space[space_name]:len()
1818
end
1919

20-
function len.init(user)
21-
utils.init_storage_call(user, LEN_FUNC_NAME, len_on_storage)
22-
end
20+
len.storage_api = {[LEN_FUNC_NAME] = len_on_storage}
2321

2422
--- Calculates the number of tuples in the space for memtx engine
2523
--- Calculates the maximum approximate number of tuples in the space for vinyl engine

crud/readview.lua

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ local CRUD_CLOSE_FUNC_NAME = utils.get_storage_call(CLOSE_FUNC_NAME)
2727
if (not utils.tarantool_version_at_least(2, 11, 0))
2828
or (tarantool.package ~= 'Tarantool Enterprise') or (not has_merger) then
2929
return {
30-
new = function() return nil,
31-
ReadviewError:new("Tarantool does not support readview") end,
32-
init = function() return nil end}
30+
new = function()
31+
return nil, ReadviewError:new("Tarantool does not support readview")
32+
end,
33+
storage_api = {},
34+
}
3335
end
3436
local select = require('crud.select.compat.select')
3537

@@ -241,11 +243,11 @@ function Readview_obj:pairs(space_name, user_conditions, opts)
241243
return pairs_call(space_name, user_conditions, opts)
242244
end
243245

244-
function readview.init(user)
245-
utils.init_storage_call(user, OPEN_FUNC_NAME, readview_open_on_storage)
246-
utils.init_storage_call(user, CLOSE_FUNC_NAME, readview_close_on_storage)
247-
utils.init_storage_call(user, SELECT_FUNC_NAME, select_readview_on_storage)
248-
end
246+
readview.storage_api = {
247+
[OPEN_FUNC_NAME] = readview_open_on_storage,
248+
[CLOSE_FUNC_NAME] = readview_close_on_storage,
249+
[SELECT_FUNC_NAME] = select_readview_on_storage,
250+
}
249251

250252
function Readview_obj:close(opts)
251253
checks('table', {

crud/replace.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ local function replace_on_storage(space_name, tuple, opts)
5353
})
5454
end
5555

56-
function replace.init(user)
57-
utils.init_storage_call(user, REPLACE_FUNC_NAME, replace_on_storage)
58-
end
56+
replace.storage_api = {[REPLACE_FUNC_NAME] = replace_on_storage}
5957

6058
-- returns result, err, need_reload
6159
-- need_reload indicates if reloading schema could help

crud/replace_many.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,7 @@ local function replace_many_on_storage(space_name, tuples, opts)
126126
return inserted_tuples, nil, replica_schema_version
127127
end
128128

129-
function replace_many.init(user)
130-
utils.init_storage_call(user, REPLACE_MANY_FUNC_NAME, replace_many_on_storage)
131-
end
129+
replace_many.storage_api = {[REPLACE_MANY_FUNC_NAME] = replace_many_on_storage}
132130

133131
-- returns result, err, need_reload
134132
-- need_reload indicates if reloading schema could help

crud/select.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,6 @@ local function select_on_storage(space_name, index_id, conditions, opts)
126126
return unpack(result)
127127
end
128128

129-
function select_module.init(user)
130-
utils.init_storage_call(user, SELECT_FUNC_NAME, select_on_storage)
131-
end
129+
select_module.storage_api = {[SELECT_FUNC_NAME] = select_on_storage}
132130

133131
return select_module

crud/storage.lua

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
local dev_checks = require('crud.common.dev_checks')
2+
local utils = require('crud.common.utils')
3+
4+
local sharding_metadata = require('crud.common.sharding.sharding_metadata')
5+
local insert = require('crud.insert')
6+
local insert_many = require('crud.insert_many')
7+
local replace = require('crud.replace')
8+
local replace_many = require('crud.replace_many')
9+
local get = require('crud.get')
10+
local update = require('crud.update')
11+
local upsert = require('crud.upsert')
12+
local upsert_many = require('crud.upsert_many')
13+
local delete = require('crud.delete')
14+
local select = require('crud.select')
15+
local truncate = require('crud.truncate')
16+
local len = require('crud.len')
17+
local count = require('crud.count')
18+
local borders = require('crud.borders')
19+
local readview = require('crud.readview')
20+
local storage_info = require('crud.storage_info')
21+
22+
local storage = {}
23+
24+
local function init_local_part(_, name, func)
25+
rawset(_G[utils.STORAGE_NAMESPACE], name, func)
26+
end
27+
28+
local function init_persistent_part(user, name, _)
29+
name = utils.get_storage_call(name)
30+
box.schema.func.create(name, {setuid = true, if_not_exists = true})
31+
box.schema.user.grant(user, 'execute', 'function', name, {if_not_exists = true})
32+
end
33+
34+
--- Initializes a storage function by its name.
35+
--
36+
-- It adds the function into the global scope by its name and required
37+
-- access to a vshard storage user.
38+
--
39+
-- @function init_storage_call
40+
--
41+
-- @param string name of a user.
42+
-- @param string name a name of the function.
43+
-- @param function func the function.
44+
--
45+
-- @return nil
46+
local function init_storage_call(user, storage_api)
47+
dev_checks('string', 'table')
48+
49+
for name, func in pairs(storage_api) do
50+
init_local_part(user, name, func)
51+
52+
if not box.info.ro then
53+
init_persistent_part(user, name, func)
54+
end
55+
end
56+
end
57+
58+
local modules_with_storage_api = {
59+
sharding_metadata,
60+
insert,
61+
insert_many,
62+
get,
63+
replace,
64+
replace_many,
65+
update,
66+
upsert,
67+
upsert_many,
68+
delete,
69+
select,
70+
truncate,
71+
len,
72+
count,
73+
borders,
74+
readview,
75+
-- Must be initialized last: properly working storage info is the flag
76+
-- of initialization success.
77+
storage_info,
78+
}
79+
80+
function storage.init()
81+
if type(box.cfg) ~= 'table' then
82+
error('box.cfg() must be called first')
83+
end
84+
85+
rawset(_G, utils.STORAGE_NAMESPACE, {})
86+
87+
local user = utils.get_this_replica_user() or 'guest'
88+
89+
for _, module in ipairs(modules_with_storage_api) do
90+
init_storage_call(user, module.storage_api)
91+
end
92+
end
93+
94+
function storage.stop()
95+
rawset(_G, utils.STORAGE_NAMESPACE, nil)
96+
end
97+
98+
return storage

crud/storage_info.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ local function storage_info_on_storage()
2222
return {status = "running"}
2323
end
2424

25-
function storage_info.init(user)
26-
utils.init_storage_call(user, STORAGE_INFO_FUNC_NAME, storage_info_on_storage)
27-
end
25+
storage_info.storage_api = {[STORAGE_INFO_FUNC_NAME] = storage_info_on_storage}
2826

2927
--- Polls replicas for storage state
3028
--

crud/truncate.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ local function truncate_on_storage(space_name)
2323
return space:truncate()
2424
end
2525

26-
function truncate.init(user)
27-
utils.init_storage_call(user, TRUNCATE_FUNC_NAME, truncate_on_storage)
28-
end
26+
truncate.storage_api = {[TRUNCATE_FUNC_NAME] = truncate_on_storage}
2927

3028
--- Truncates specified space
3129
--

crud/update.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ local function update_on_storage(space_name, key, operations, field_names, opts)
7777
return res, err
7878
end
7979

80-
function update.init(user)
81-
utils.init_storage_call(user, UPDATE_FUNC_NAME, update_on_storage)
82-
end
80+
update.storage_api = {[UPDATE_FUNC_NAME] = update_on_storage}
8381

8482
-- returns result, err, need_reload
8583
-- need_reload indicates if reloading schema could help

0 commit comments

Comments
 (0)