From 9b3495dddb11947cedcdac29de896c5f256a58e2 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 8 May 2018 21:27:23 -0700 Subject: [PATCH] agent/consul: retry reading provider a few times --- agent/consul/leader.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/agent/consul/leader.go b/agent/consul/leader.go index 2f01b88333..d71c3ead38 100644 --- a/agent/consul/leader.go +++ b/agent/consul/leader.go @@ -488,9 +488,23 @@ func (s *Server) createCAProvider(conf *structs.CAConfiguration) (connect.CAProv } func (s *Server) getCAProvider() connect.CAProvider { + retries := 0 + +RETRY_PROVIDER: s.caProviderLock.RLock() - defer s.caProviderLock.RUnlock() - return s.caProvider + result := s.caProvider + s.caProviderLock.RUnlock() + + // In cases where an agent is started with managed proxies, we may ask + // for the provider before establishLeadership completes. If we're the + // leader, then wait and get the provider again + if result == nil && s.IsLeader() && retries < 10 { + retries++ + time.Sleep(50 * time.Millisecond) + goto RETRY_PROVIDER + } + + return result } func (s *Server) setCAProvider(newProvider connect.CAProvider) {