Skip to content

Commit a73011d

Browse files
committed
readview: fix garbagecollector
Added workaround for garbagecollection of readview because for tarantool lua (and lua 5.1) __gc metamethod only works for cdata types. See tarantool/tarantool#5770
1 parent 416b880 commit a73011d

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

crud/readview.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,15 @@ end
286286
function Readview_obj.create(vshard_router, opts)
287287
local readview = {}
288288
setmetatable(readview, Readview_obj)
289+
290+
-- For tarantool lua (and lua 5.1) __gc metamethod only works for cdata types.
291+
-- So in order to create a proper GC hook, we need to create cdata with
292+
-- __gc call.
293+
-- __gc call for this cdata will be a __gc call for our readview.
294+
-- https://github.com/tarantool/tarantool/issues/5770
295+
local proxy = newproxy(true)
296+
getmetatable(proxy).__gc = function(_) Readview_obj.__gc(readview) end
297+
289298
readview._name = opts.name
290299
local results, err, err_uuid = vshard_router:map_callrw('_crud.readview_open_on_storage',
291300
{readview._name}, {timeout = opts.timeout})

test/integration/select_readview_test.lua

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
local fio = require('fio')
2+
local fiber = require('fiber')
23

34
local t = require('luatest')
45

@@ -187,14 +188,15 @@ pgroup.test_close_gc_on_router = function(g)
187188
collectgarbage("collect")
188189
collectgarbage("collect")
189190
]])
191+
fiber.sleep(1)
190192
t.assert_equals(err, nil)
191193
local res = {}
192-
helpers.call_on_storages(g.cluster, function(server, replicaset, res)
194+
helpers.call_on_storages(g.cluster, function(server)
193195
local instance_res = server.net_box:eval([[
194196
return box.read_view.list()]])
195-
res[replicaset.alias] = instance_res
197+
table.insert(res, instance_res)
196198
end, res)
197-
t.assert_equals(res, {["s-1"] = {}, ["s-2"] = {}})
199+
t.assert_equals(res, {{}, {}, {}, {}})
198200

199201
end
200202

@@ -209,12 +211,12 @@ pgroup.test_close = function(g)
209211
]])
210212
t.assert_equals(err, nil)
211213
local res = {}
212-
helpers.call_on_storages(g.cluster, function(server, replicaset, res)
214+
helpers.call_on_storages(g.cluster, function(server)
213215
local instance_res = server.net_box:eval([[
214216
return box.read_view.list()]])
215-
res[replicaset.alias] = instance_res
217+
table.insert(res, instance_res)
216218
end, res)
217-
t.assert_equals(res, {["s-1"] = {}, ["s-2"] = {}})
219+
t.assert_equals(res, {{}, {}, {}, {}})
218220

219221
end
220222

0 commit comments

Comments
 (0)