diff --git a/nomad/client_rpc.go b/nomad/client_rpc.go index e1bbb6317daf..5a3498de7bff 100644 --- a/nomad/client_rpc.go +++ b/nomad/client_rpc.go @@ -40,6 +40,12 @@ func (s *Server) getNodeConn(nodeID string) (*nodeConnState, bool) { } } + // Shouldn't happen but rather be safe + if state == nil { + s.logger.Printf("[WARN] nomad.client_rpc: node %q exists in node connection map without any connection", nodeID) + return nil, false + } + return state, ok } @@ -111,7 +117,15 @@ func (s *Server) removeNodeConn(ctx *RPCContext) { for i, conn := range conns { if conn.Ctx.Conn.LocalAddr().String() == ctx.Conn.LocalAddr().String() && conn.Ctx.Conn.RemoteAddr().String() == ctx.Conn.RemoteAddr().String() { - s.nodeConns[ctx.NodeID] = append(s.nodeConns[ctx.NodeID][:i], s.nodeConns[ctx.NodeID][i+1:]...) + + if len(conns) == 1 { + // We are deleting the last conn, remove it from the map + delete(s.nodeConns, ctx.NodeID) + } else { + // Slice out the connection we are deleting + s.nodeConns[ctx.NodeID] = append(s.nodeConns[ctx.NodeID][:i], s.nodeConns[ctx.NodeID][i+1:]...) + } + return } } diff --git a/nomad/client_rpc_test.go b/nomad/client_rpc_test.go index d7edad6bc51d..e1a75c59693d 100644 --- a/nomad/client_rpc_test.go +++ b/nomad/client_rpc_test.go @@ -77,6 +77,9 @@ func TestServer_removeNodeConn_differentAddrs(t *testing.T) { // Delete the second s1.removeNodeConn(ctx2) require.Len(s1.connectedNodes(), 0) + + _, ok = s1.getNodeConn(nodeID) + require.False(ok) } func TestServerWithNodeConn_NoPath(t *testing.T) {