美好的一天! 我对在tarantool中重新加载c模块有一个小问题 例如:我有一个公开方法的c模块:
extern "C"
{
LUA_API int luaopen_cuendemodule(lua_State *L);
}
此外,我声明了入口点:
require('testmodule')
box.schema.func.create('testmodule.calculate')
box.schema.user.grant('user', 'execute', 'function', 'testmodule.calculate')
现在,我将这个模块(“ testmodule.so”)加载到tarantool中:
await tarantoolClient.Call<TarantoolTuple<CalculateParameters>, CalculationResults>("testmodule.calculate", TarantoolTuple.Create(....));
现在我从c#客户端调用此方法:
box.schema.func.create('testmodule.calculate', {language = 'C'})
它按预期工作-执行方法计算并返回结果
但是,如果我要更新模块而不是问题开始:在替换了so文件并调用计算方法后,我的tarantool重新启动,并且在dmesg中可以看到类似“ testmodule.so中的Tarntool无效操作码”的内容
阅读文档后,我在函数定义中看到了如下附加参数:
<tal:root define="lt string:<;gt string:>;
member python:options['member'];
portal_state context/@@plone_portal_state;
view context/@@passwordreset_view;
isAnon context/@@plone_portal_state/anonymous;
reset python:options['reset']"
>From: <span tal:replace="structure view/encoded_mail_sender" />
To: <span tal:replace="python:member.getProperty('email')" />
Subject: Request to reset your password
Content-Type: text/plain
Precedence: bulk
Hello
Some text
More text
Kind regards
Organization Name
</tal:root>
但是在此之后,如果我从c#调用它,则会收到消息“无法动态加载函数未定义的符号计算失败”的异常
我在ubuntu上使用tarantool 1.7 我这样用gcc 8.1.0编译了
答案 0 :(得分:2)
没有一个好的方法可以做到这一点(意味着-一种可移植的方法)。我认为,最好的方法是使用诸如dlopen()[1]之类的函数,该函数允许打开(一般管理共享对象)共享对象,但是您必须对此非常谨慎,它也可能使代码失败甚至您也可以进行sigfault。
一个很好的例子是:https://github.com/tarantool/mqtt,该模块不使用这些功能(func.create等),但也可以对其进行扩展。
因此,重点是:如果开发C模块,则必须考虑重新加载策略。 例如,类似* -unix的系统具有很多功能,可以重新加载某些共享库,而tarantool也具有一些功能。
而且,我建议您开始考虑像Lua的C模块一样的模块,实际上是一样的。
PS
还提供了一些重新加载模块:https://github.com/Mons/tnt-package-reload(我没有测试模块),https://github.com/tarantool/reload(我没有测试模块)
答案 1 :(得分:0)
我认为,您可以尝试使用此模块重新加载应用程序-https://github.com/moonlibs/package-reload。