From dd9dd37d3b241dace845f731d23afec9d80e797e Mon Sep 17 00:00:00 2001 From: Christian Mouchet Date: Mon, 22 Apr 2024 19:01:24 +0200 Subject: [PATCH] re-fixing deadlock in executor --- protocols/executor.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/protocols/executor.go b/protocols/executor.go index 4eac4d3..56e37fd 100644 --- a/protocols/executor.go +++ b/protocols/executor.go @@ -362,11 +362,10 @@ func (s *Executor) runAsAggregator(ctx context.Context, sess *sessions.Session, for _, part := range pd.Participants { s.connectedNodes[part].Remove(pd.ID()) } - s.connectedNodesMu.Unlock() - s.connectedNodesCond.Broadcast() - delete(s.runningProtos, pid) s.runningProtoMu.Unlock() + s.connectedNodesMu.Unlock() + s.connectedNodesCond.Broadcast() } //s.runningProtoWg.Add(1) @@ -586,22 +585,23 @@ func (s *Executor) Register(peer sessions.NodeID) error { func (s *Executor) Unregister(peer sessions.NodeID) error { s.connectedNodesMu.Lock() + s.runningProtoMu.RLock() + pids, has := s.connectedNodes[peer] if !has { panic("unregistering an unregistered node") } - s.runningProtoMu.RLock() for pid := range pids { p, has := s.runningProtos[pid] if !has { - panic("incoherent state: protocol not running but node is registered for it") + panic(fmt.Errorf("incoherent state: protocol %s not running but node is registered for it", pid)) } p.disconnected <- peer } - s.runningProtoMu.RUnlock() delete(s.connectedNodes, peer) + s.runningProtoMu.RUnlock() s.connectedNodesMu.Unlock() s.Logf("unregistered peer %v, %d online nodes", peer, len(s.connectedNodes))