安装插件失败

插件目录挂载在GFS server上时,通过dashboard安装插件报下面错误:

错误报告

2023-03-14T02:58:28.430175+00:00 [warning] mfa: minirest_handler:apply_callback/3
line: 116
exception: error
path: /plugins/install
reason: {badmatch,{error,#{path =>
<<“plugins/emqx_plugin_test-0.1.tar.gz”>>,
reason => “bad_plugin_package”,return => eof}}}
stacktrace: [{emqx_mgmt_api_plugins,do_install_package,2,
[{file,“emqx_mgmt_api_plugins.erl”},{line,383}]},
{minirest_handler,apply_callback,3,
[{file,“minirest_handler.erl”},{line,111}]},
{minirest_handler,handle,2,
[{file,“minirest_handler.erl”},{line,44}]},
{minirest_handler,init,2,
[{file,“minirest_handler.erl”},{line,27}]},
{cowboy_handler,execute,2,
[{file,“cowboy_handler.erl”},{line,41}]},
{cowboy_stream_h,execute,3,
[{file,“cowboy_stream_h.erl”},{line,318}]},
{cowboy_stream_h,request_process,3,
[{file,“cowboy_stream_h.erl”},{line,302}]},
{proc_lib,init_p_do_apply,3,
[{file,“proc_lib.erl”},{line,226}]}]

环境

  • EMQX 版本:5.0.17
  • 操作系统版本:centos7.9

重现此问题的步骤

预期行为

实际行为


功能请求

描述你需要的功能

为什么你需要这个功能


其他

感觉像是你插件有问题。

这个包我手动传到GFS对应的目录下是可以正常使用的

有点奇怪
先排除一下是不是emqx的应用没有写入这个目录的权限或者写入的包不完整。
你可以直接把包手动到传到GFS上,
然后 emqx remote_console 执行下:
File = filename:join(emqx_plugins:install_dir(), “emqx_plugin_test-0.1.tar.gz”),
NewFile = filename:join(emqx_plugins:install_dir(), “emqx_plugin_test-0.2.tar.gz”),
{ok, Bin} = file:read_file(File),
ok = file:write_file(NewFile, Bin).

然后看看2个文件是不是一样的

刚刚试了一下,两个文件大小是一模一样的

说明emqx用户读写这个文件目录没问题。

再看看这个一模一样的文件可以被extract么
erl_tar:extract(TarGz, [compressed, memory]).
是返回ok,还是eof。

只有通过dashboard安装的时候有问题,我手动把包放到插件目录下,然后解压,通过dashboard可以看到该插件,并且可以通过dashboard来控制启动停止

嗯嗯,所以我们想排除一下,能不能能过emqx解压,

在提供的日志bad_plugin_package eof的错上,也是解压时返回了eof,说明前面的上传已经过了,解压这一块最可疑。
https://github.com/emqx/emqx/blob/v5.0.17/apps/emqx_plugins/src/emqx_plugins.erl#L91-L110

执行erl_tar:extract解压文件没有问题

麻烦再问一下,k8s集群里emqx作为有状态服务部署,emqx的多个实例共用挂载在GFS上插件,这种用法有没有问题?

默认的方式应该是有问题的。k8s推荐用emqx-operator。
插件的作用还没持久化到data


目前如果都是挂载在同一GFS里面,直接不要通过dashboard上传,自己解压好放在那里,安装,启动停止就行了。

方便把插件上传一下,发上来么,或者再做构建一个简单的有问题的插件包给我们,我们这边试一下。

或者在这里下载一个插件的模板包,看看会不会有问题。
https://github.com/emqx/emqx-plugin-template/releases/download/5.0.0/emqx_plugin_template-5.0.0.tar.gz

这个模板我试了,没有问题

如果模板包没有问题,那可能是包里面有什么特殊的地方,方便提供一个脱敏的有问题包么,我们这边重现一下。

等我晚点打个包给你