перезагрузить модуль без перезагрузки сервера - PullRequest
0 голосов
/ 26 июня 2018

добрый день! У меня есть маленький вопрос о перезагрузке модуля C в Tarantool например: у меня есть модуль c, который предоставляет метод:

int calculate(lua_State* L);

Кроме того, я объявил точку входа:

extern "C"
{    
    LUA_API int luaopen_cuendemodule(lua_State *L);
}

Теперь я загружаю этот модуль ("testmodule.so") в tarantool:

require('testmodule')
box.schema.func.create('testmodule.calculate')
box.schema.user.grant('user', 'execute', 'function', 'testmodule.calculate')

и теперь я вызываю этот метод из моего клиента c #:

await tarantoolClient.Call<TarantoolTuple<CalculateParameters>, CalculationResults>("testmodule.calculate", TarantoolTuple.Create(....));

и все работает как ожидалось - метод расчета выполнен и результаты возвращены

но если я хочу еще обновить мой модуль, то начинаются проблемы: после того, как я заменил файл и вызвал метод вычисления, мой tarantool перезапустился, и я могу увидеть что-то вроде "tarntool invalid opcode в testmodule.so" в dmesg

после прочтения документации я вижу дополнительные параметры в определении функции, например:

box.schema.func.create('testmodule.calculate', {language = 'C'})

но после этого, если я вызываю его из c #, я получаю исключение с сообщением "не удалось динамически загрузить функцию, вычисление неопределенного символа"

я использую tarantool 1.7 в Ubuntu мой так скомпилирован с gcc 8.1.0

Ответы [ 2 ]

0 голосов
/ 24 июля 2018

Я думаю, вы можете попробовать этот модуль для перезагрузки вашего приложения - https://github.com/moonlibs/package-reload.

0 голосов
/ 22 июля 2018

Нет хорошего способа сделать это (значит - портативный способ). Я думаю, что лучший способ - использовать что-то вроде dlopen () [1], функция позволяет открывать (управлять общими объектами в целом) общий объект, но вы должны быть очень осторожны с этим, это может также привести к сбою в вашем коде или даже у вас может быть sigfault.

Хороший пример: https://github.com/tarantool/mqtt, модуль не использует эти функции (func.create и т. Д.), Но он также может быть расширен.

Итак, суть в том, что если вы разрабатываете C-модуль, вы должны подумать о перезагрузке политики. Например, * -unix-подобные системы имеют множество функций, которые позволяют перезагрузить некоторые общие объекты, а также tarantool также имеет некоторые функции.

А также, я предлагаю вам, начните думать о модулях так же, как о C-модулях Lua, это на самом деле то же самое.

PS

Также доступны некоторые модули перезагрузки: https://github.com/Mons/tnt-package-reload (я не тестировал модуль), https://github.com/tarantool/reload (я не тестировал модуль)

[1] http://man7.org/linux/man-pages/man3/dlopen.3.html

...