New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Bug]: 运行正常情况下突然出现日志 #434
Comments
频繁发生? |
有看到 |
发生概率不频繁,运行3天后才出现的 |
OnClose() 和 OnTick() 里有没有返回 Shutdown?或者其他可能的地方,你全局搜一下 |
有类似Kill命令会触发Shutdown吗 |
暂时想不到还有什么情况会出现这种情况。你能提供一下能复现这个问题的 demo 代码吗? |
type netServer struct {
gnet.BuiltinEventEngine
eng gnet.Engine
network string
addr string
multicore bool
}
func (s *netServer) OnBoot(eng gnet.Engine) gnet.Action {
logger.Infof("running server on %s with multi-core=%t", fmt.Sprintf("%s://%s", s.network, s.addr), s.multicore)
s.eng = eng
return gnet.None
}
func (s *netServer) OnOpen(c gnet.Conn) ([]byte, gnet.Action) {
logger.Debugf("connected with fd: %d, remote_addr: %s\n", c.Fd(), c.RemoteAddr().String())
//c.SetContext(new(protocol.NetProtoCodec))
return nil, gnet.None
}
func (s *netServer) OnClose(c gnet.Conn, err error) (action gnet.Action) {
if err != nil {
logger.Errorf("error occurred on fd: %d, remote_addr: %s, %v\n", c.Fd(), c.RemoteAddr().String(), err)
}
return gnet.Close
}
func (s *netServer) OnTraffic(c gnet.Conn) (action gnet.Action) {
codec := new(NetProtoHeader)
data, err := codec.Decode(c)
if err != nil {
logger.Errorf("invalid packet: %v", err)
return gnet.Close
}
logger.Infof("gnet codec: %v", codec)
err = ants.Submit(func() {
switch codec.MsgType {
case MsgTypePTRQuery:
req := new(PTRReq)
err := req.Unpack(data)
if err != nil {
logger.Errorf("Query ptr invalid packet: %s", err.Error())
return
}
logger.Infof("PTR request: %+v", req)
payload, err := singlePTR(req)
if err != nil {
logger.Errorf("Query ptr record by ip %s failed: %s", req.Qip.IpAddr.String(), err.Error())
//return
header := NetProtoHeader{MsgType: MsgTypePTRRes}
resBody := DNSProtoSignalRes{
DstIp: req.DstIp,
ProtoBody: []byte{0x00, 0x00},
}
payload = header.Encode(resBody.Pack())
}
sendSignalReqChan <- signalReq{Dst: req.DstIp.IpAddr.String(), Type: "ptr response", Data: payload}
case MsgTypeTypeRes:
//ants.Submit(func(){
var ip net.IP
switch len(data) {
case 5 + 4, 17 + 4:
ip = data[1 : len(data)-4]
default:
logger.Errorf("invalid payload body length: %d", len(data))
return
}
logger.Infof("AIO addr: %s", ip.String())
key := fmt.Sprintf("%s,%d", ip.String(), MsgTypeTypeRes)
fn := func() (interface{}, error) {
cType := binary.BigEndian.Uint16(data[len(data)-4:])
ch, ok := ip2CType.Get(ip.String())
if !ok {
return nil, fmt.Errorf("invalid ip %s to conn type channel", ip.String())
}
ch <- cType
logger.Infof("Ip %s connection type %d", ip.String(), cType)
return nil, nil
}
_, err, _ := singleGroup.Do(key, fn)
if err != nil {
logger.Warnf("Handle ip %s type response failed %s", ip.String(), err.Error())
return
}
default:
logger.Errorf("invalid payload type: %d", codec.MsgType)
return
}
})
if err != nil {
logger.Errorf("Submits a task to ants pool failed %s", err.Error())
}
return
}
func InitPtrServer() {
port := viper.GetInt("ptr.port")
if port == 0 {
port = 30053
}
service := &netServer{
network: "udp",
addr: fmt.Sprintf(":%d", port),
multicore: true,
}
err := gnet.Run(service, service.network+"://"+service.addr, gnet.WithMulticore(service.multicore), gnet.WithLogger(logger))
if err != nil {
logger.Errorf("running server on %s with multi-core=%t failed", fmt.Sprintf("%s://%s", service.network, service.addr), service.multicore)
panic(err)
}
}
func InitPtrServer() {
port := viper.GetInt("ptr.port")
if port == 0 {
port = 30053
}
service := &netServer{
network: "udp",
addr: fmt.Sprintf(":%d", port),
multicore: true,
}
err := gnet.Run(service, service.network+"://"+service.addr, gnet.WithMulticore(service.multicore), gnet.WithLogger(logger))
if err != nil {
logger.Errorf("running server on %s with multi-core=%t failed", fmt.Sprintf("%s://%s", service.network, service.addr), service.multicore)
panic(err)
}
} |
上面的就是项目中关于gnet的全部代码了 |
gnet服务启动是在一个协程内启动的,单独的gnet shutdown会导致整个进程断掉吗 |
什么意思?你是主动调用了 gnet.Stop 方法吗? |
没主动调用 gnet.Stop方法,项目设计的gnet部分代码全部在上面了,上面的 InitPtrServer() 是 go InitPtrServer() 通过协程方式启动的,v2@v2.1.2/reactor_default_linux.go:124 event-loop(6) is exiting due to error: server is going to be shutdown 日志会导致整个进程断掉吗 |
不会使得整个进程退出,只是使 gnet.Run() 结束而已,而且如果发生了 |
后面没出现过这种日志 |
我准备优化一下错误打印这部分代码,把相应的堆栈信息也一起打印出来,这样后续定位问题更准确,至于你这个情况,麻烦你持续观察下,如果后面还有复现再一起来看看,谢谢。 |
好的,问题复现再追踪下 |
Actions I've taken before I'm here
What happened?
gnet 监听udp服务,打印日志v2@v2.1.2/reactor_default_linux.go:124 event-loop(6) is exiting due to error: server is going to be shutdown;随后进程终止
Major version of gnet
v2
Specific version of gnet
v2.1.2
Operating system
Linux
Relevant log output
Code snippets (optional)
No response
How to Reproduce
没特殊操作,正常运行的简单udp接收服务
Does this issue reproduce with the latest release?
It can reproduce with the latest release
The text was updated successfully, but these errors were encountered: