长期运行正常的Janus API GW昨晚崩溃了一次。
通过docker container的log路径,找到日志文件,保存了最后一段。
panic: runtime error: invalid memory address or nil pointer dereference\n
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xa66e15]\n
\n
goroutine 39 [running]:\n
github.com/hellofresh/janus/pkg/plugin/oauth2.(*FileSystemRepository).FindAll(0x0, 0xd3afe6, 0xa, 0x0, 0x0, 0x0)\n
\u0009\u003cautogenerated\u003e:1 +0x5\n
github.com/hellofresh/janus/pkg/plugin/oauth2.(*OAuthLoader).getOAuthServers(0x0, 0xe63f80, 0x0, 0x0, 0x0, 0x0)\n
\u0009/janus/pkg/plugin/oauth2/loader.go:80 +0x49\n
github.com/hellofresh/janus/pkg/plugin/oauth2.(*OAuthLoader).LoadDefinitions(0x0, 0xe63f80, 0x0)\n
\u0009/janus/pkg/plugin/oauth2/loader.go:25 +0x3f\n
github.com/hellofresh/janus/pkg/plugin/oauth2.onReload(0xc39440, 0xc00021e900, 0xd35a79, 0x6)\n
\u0009/janus/pkg/plugin/oauth2/setup.go:60 +0x5a\n
github.com/hellofresh/janus/pkg/plugin.EmitEvent(0xd35a79, 0x6, 0xc39440, 0xc00021e900, 0x0, 0x0)\n
\u0009/janus/pkg/plugin/plugin.go:99 +0x177\n
github.com/hellofresh/janus/pkg/server.(*Server).handleEvent(0xc0003e5500, 0xc0001f1380)\n
\u0009/janus/pkg/server/server.go:336 +0x14c\n
github.com/hellofresh/janus/pkg/server.(*Server).listenProviders(0xc0003e5500, 0xc00052efc0)\n
\u0009/janus/pkg/server/server.go:237 +0x161\n
created by github.com/hellofresh/janus/pkg/server.(*Server).StartWithContext\n
\u0009/janus/pkg/server/server.go:94 +0x2c7\n
看来是空指针导致的函数崩溃。
janus是GO 写的,类似C++,空指针导致主线程出错,就会导致进程整体崩溃。
不是Java那样的异常导致某个子线程处理失败,不影响进程。
分析:
去看崩溃函数的最新源代码:
https://github.com/hellofresh/janus/blob/master/pkg/plugin/oauth2/file_repository.go
已经重构过,没有这个接口了,肯定有更新的、更稳定的镜像版本
建议用最新3.8.22 (2020/1/20)
替换使用,暂时看正常,稳定性待观察。
(老版本是3.8.11-rc4)