From d5692991ce9e6e80371534d7b61c43d82f15cfe1 Mon Sep 17 00:00:00 2001 From: jbhusson <jonah@elixxir.io> Date: Tue, 28 Jun 2022 17:43:00 -0400 Subject: [PATCH] Potential fix for deadlock --- auth/callbacks.go | 3 +++ auth/receivedConfirm.go | 2 -- auth/receivedRequest.go | 6 ------ auth/state.go | 2 -- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/auth/callbacks.go b/auth/callbacks.go index 781164bb8..3c5862e7a 100644 --- a/auth/callbacks.go +++ b/auth/callbacks.go @@ -42,6 +42,9 @@ func (p *partnerCallbacks) DeletePartnerCallback(partnerId *id.ID) { // getPartnerCallback returns the Callbacks for the given partnerId func (p *partnerCallbacks) getPartnerCallback(partnerId *id.ID) Callbacks { + p.RLock() + defer p.RUnlock() + return p.callbacks[*partnerId] } diff --git a/auth/receivedConfirm.go b/auth/receivedConfirm.go index 538329e1b..bf25d5661 100644 --- a/auth/receivedConfirm.go +++ b/auth/receivedConfirm.go @@ -113,13 +113,11 @@ func (rcs *receivedConfirmService) Process(msg format.Message, Facts: make([]fact.Fact, 0), } - authState.partnerCallbacks.RLock() if cb := authState.partnerCallbacks.getPartnerCallback(c.ID); cb != nil { cb.Confirm(c, receptionID, round) } else { authState.callbacks.Confirm(c, receptionID, round) } - authState.partnerCallbacks.RUnlock() } func (rcs *receivedConfirmService) String() string { diff --git a/auth/receivedRequest.go b/auth/receivedRequest.go index b410b04a3..4e3325996 100644 --- a/auth/receivedRequest.go +++ b/auth/receivedRequest.go @@ -130,21 +130,17 @@ func (rrs *receivedRequestService) Process(message format.Message, } else if authState.params.ReplayRequests { //if we did not already accept, auto replay the request if rrs.reset { - authState.partnerCallbacks.RLock() if cb := authState.partnerCallbacks.getPartnerCallback(c.ID); cb != nil { cb.Reset(c, receptionID, round) } else { authState.callbacks.Reset(c, receptionID, round) } - authState.partnerCallbacks.RUnlock() } else { - authState.partnerCallbacks.RLock() if cb := authState.partnerCallbacks.getPartnerCallback(c.ID); cb != nil { cb.Request(c, receptionID, round) } else { authState.callbacks.Request(c, receptionID, round) } - authState.partnerCallbacks.RUnlock() } } //if not confirm, and params.replay requests is true, we need to replay @@ -254,8 +250,6 @@ func (rrs *receivedRequestService) Process(message format.Message, } // auto-confirm if we should - authState.partnerCallbacks.RLock() - defer authState.partnerCallbacks.RUnlock() if autoConfirm || reset { _, _ = authState.confirm(c, authState.params.getConfirmTag(reset)) //handle callbacks diff --git a/auth/state.go b/auth/state.go index 43e1d9735..fda5ba2c9 100644 --- a/auth/state.go +++ b/auth/state.go @@ -115,13 +115,11 @@ func (s *state) CallAllReceivedRequests() { rr := rrList[i] eph := receptionID.BuildIdentityFromRound(rr.GetContact().ID, rr.GetRound()) - s.partnerCallbacks.RLock() if cb := s.partnerCallbacks.getPartnerCallback(rr.GetContact().ID); cb != nil { cb.Request(rr.GetContact(), eph, rr.GetRound()) } else { s.callbacks.Request(rr.GetContact(), eph, rr.GetRound()) } - s.partnerCallbacks.RUnlock() } } -- GitLab