LINUX.ORG.RU

странное поведение lua (nginx)

 


0

3

есть lua, есть lua-sql-postgres, работает это всё в сферическом nginx в вакууме.
есть функция, которая возвращает указатель (userdata) на выполненный запрос для получения результата:

function _M.query(connection, query)
	-- determine conn --
	if not connection then connection = ngx.ctx.default_connection end
	if not connection then return false end

	local ret, pointer
	ret, pointer = pcall(assert, connection:execute(query))
	-- safe call
	if ret then return pointer else return false end 
end

который используется примерно так:

local connection = sql.connect(..)
local query = sql.query(sql.escape("update from users set variable = 'value'"))
local query = nil -- тут очищаем значение, но это не помогает!

так вот, с каждым запросом «утекает» примерно 8 байт памяти, если не «закрыть» указатель luasql:

query:close() -- если делаем так, никаких утечек 8 байт даже через 1000 запросов

вопрос - нормально ли это? куда уходит память, если мы явно обнуляем переменную query?

★★★★★

Последнее исправление: snoopcat (всего исправлений: 1)

Во-первых, garbage collector не обязан стразу освобождать память, во-вторых, luasql на C написан, может тупо C-шный free не вызваться. Ну и вообще, если есть close, то его нужно делать.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от Vovka-Korovka

даже если явно его (GC) вызвать -

collectgarbage()
request.die()
память не возвращает.
значит, будем склоняться ко второму варианту и вызывать close() после каждого запроса ☺

snoopcat ★★★★★
() автор топика
Последнее исправление: snoopcat (всего исправлений: 2)
Ответ на: комментарий от snoopcat

даже если явно его (GC) вызвать -

Ну если luajit используется, а не ванильный lua, то следует знать, что у него свой менеджер памяти и память он в систему сразу может и не отдать.

Vovka-Korovka ★★★★★
()

Может, баг в nginx'е или в sql-lua-postgres, или они намеренно не хотят вешать финализатор на это значение.

proud_anon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.