Skip to main content
Sign in
Snippets Groups Projects
Unverified Commit 0b68bca0 authored by Luca Moser's avatar Luca Moser Committed by GitHub
Browse files

unblock message processor from acquiring neighbor manager locks (#499)

parent e8ba423d
No related branches found
No related tags found
No related merge requests found
......@@ -42,7 +42,7 @@ type Manager struct {
// NewManager creates a new Manager.
func NewManager(local *peer.Local, f LoadMessageFunc, log *logger.Logger) *Manager {
return &Manager{
m := &Manager{
local: local,
loadMessageFunc: f,
log: log,
......@@ -55,6 +55,8 @@ func NewManager(local *peer.Local, f LoadMessageFunc, log *logger.Logger) *Manag
srv: nil,
neighbors: make(map[identity.ID]*Neighbor),
}
m.inboxWorkerPool.Tune(2)
return m
}
// Start starts the manager for the given TCP server.
......@@ -215,7 +217,7 @@ func (m *Manager) addNeighbor(peer *peer.Peer, connectorFunc func(*peer.Peer) (n
dataCopy := make([]byte, len(data))
copy(dataCopy, data)
m.inboxWorkerPool.Submit(func() {
if err := m.handlePacket(dataCopy, peer); err != nil {
if err := m.handlePacket(dataCopy, n); err != nil {
m.log.Debugw("error handling packet", "err", err)
}
})
......@@ -228,7 +230,7 @@ func (m *Manager) addNeighbor(peer *peer.Peer, connectorFunc func(*peer.Peer) (n
return nil
}
func (m *Manager) handlePacket(data []byte, p *peer.Peer) error {
func (m *Manager) handlePacket(data []byte, n *Neighbor) error {
// ignore empty packages
if len(data) == 0 {
return nil
......@@ -241,8 +243,8 @@ func (m *Manager) handlePacket(data []byte, p *peer.Peer) error {
if err := proto.Unmarshal(data[1:], protoMsg); err != nil {
return fmt.Errorf("invalid packet: %w", err)
}
m.log.Debugw("received packet", "type", protoMsg.Type(), "peer-id", p.ID())
m.events.MessageReceived.Trigger(&MessageReceivedEvent{Data: protoMsg.GetData(), Peer: p})
m.log.Debugw("received packet", "type", protoMsg.Type(), "peer-id", n.Peer.ID())
m.events.MessageReceived.Trigger(&MessageReceivedEvent{Data: protoMsg.GetData(), Peer: n.Peer})
case pb.PacketMessageRequest:
protoMsgReq := new(pb.MessageRequest)
......@@ -250,20 +252,20 @@ func (m *Manager) handlePacket(data []byte, p *peer.Peer) error {
return fmt.Errorf("invalid packet: %w", err)
}
m.log.Debugw("received packet", "type", protoMsgReq.Type(), "peer-id", p.ID())
m.log.Debugw("received packet", "type", protoMsgReq.Type(), "peer-id", n.Peer.ID())
msgId, _, err := message.IdFromBytes(protoMsgReq.GetId())
if err != nil {
m.log.Debugw("couldn't compute message id from bytes", "peer-id", p.ID(), "err", err)
m.log.Debugw("couldn't compute message id from bytes", "peer-id", n.Peer.ID(), "err", err)
return nil
}
msg, err := m.loadMessageFunc(msgId)
if err != nil {
m.log.Debugw("error getting message", "peer-id", p.ID(), "msg-id", msgId, "err", err)
m.log.Debugw("error getting message", "peer-id", n.Peer.ID(), "msg-id", msgId, "err", err)
return nil
}
m.SendMessage(msg, p.ID())
n.Write(marshal(&pb.Message{Data: msg}))
default:
return ErrInvalidPacket
}
......
......
......@@ -2,6 +2,8 @@ package profiling
import (
"net/http"
"runtime"
// import required to profile
_ "net/http/pprof"
......@@ -33,6 +35,10 @@ func configure(_ *node.Plugin) {
func run(_ *node.Plugin) {
bindAddr := config.Node.GetString(CfgProfilingBindAddress)
runtime.SetMutexProfileFraction(5)
runtime.SetBlockProfileRate(5)
log.Infof("%s started, bind-address=%s", PluginName, bindAddr)
go http.ListenAndServe(bindAddr, nil)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment