Go垃圾回收误删在用ZeroMQ套接字致程序崩溃求助
问题排查:ZeroMQ "socket operation on non-socket" 崩溃问题
我正在使用Go和ZeroMQ开发一款类似分布式账本的分布式系统,支持内容查询与追加操作。配置自动客户端发送GET和ADD请求后,程序运行数秒即崩溃,抛出错误:
panic: socket operation on non-socket
我尝试通过debug.SetGCPercent(-1)关闭垃圾回收,但认为这并非根本解决方案。
服务器初始化代码
package server import ( "backend/config" "backend/gset" "backend/tools" zmq "github.com/pebbe/zmq4" ) type Server struct { Zctx *zmq.Context Peers map[string]*zmq.Socket Receive_socket zmq.Socket Id string Gset map[string]string Port string My_init map[string]bool My_echo map[string]bool My_vote map[string]bool Peers_echo map[string]bool Peers_vote map[string]bool } func CreateServer(node config.Node, peers []config.Node, zctx *zmq.Context) *Server { id := node.Host + node.Port port := node.Port server_sockets := make(map[string]*zmq.Socket) my_gset := gset.Create() my_init := make(map[string]bool) my_echo := make(map[string]bool) my_vote := make(map[string]bool) peers_echo := make(map[string]bool) peers_vote := make(map[string]bool) receive_socket, _ := zctx.NewSocket(zmq.ROUTER) receive_socket.Bind("tcp://*:" + node.Port) tools.Log(id, "Bound tcp://*:"+node.Port) // Connect my dealer sockets to all other servers' router for i := 0; i < len(peers); i++ { s, _ := zctx.NewSocket(zmq.DEALER) s.SetIdentity(id) s.Connect("tcp://localhost:" + peers[i].Port) // append socket to socket list server_sockets["tcp://localhost:"+peers[i].Port] = s } return &Server{ Peers: server_sockets, Receive_socket: *receive_socket, Id: id, Port: port, Gset: my_gset, My_init: my_init, My_echo: my_echo, My_vote: my_vote, Peers_echo: peers_echo, Peers_vote: peers_vote, } }
服务器控制函数
func Normal_listener_task(s *server.Server) { for { message, err := s.Receive_socket.RecvMessage(0) if err != nil { fmt.Println(zmq.AsErrno(err)) panic(err) } messaging.HandleMessage(s, message) } }
完整代码可查看GitHub仓库:Loukas Papalazarou的Thesis仓库下的BFT-Distributed-G-Set-Local目录。
恳请各位帮忙排查问题原因,这对我的毕业论文至关重要,感谢支持!
内容的提问来源于stack exchange,提问作者Loukas Papalazarou
相关产品推荐
相关产品推荐

