From 9a3e0b783c550fd751f93dd17b9a70423007413e Mon Sep 17 00:00:00 2001 From: Derek Collison Date: Mon, 17 Apr 2023 06:40:09 -0700 Subject: [PATCH] Fix for a data race when setting up service import subscriptions. Signed-off-by: Derek Collison --- server/accounts.go | 7 +++++++ server/server.go | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/server/accounts.go b/server/accounts.go index e95fd7bd..fa224662 100644 --- a/server/accounts.go +++ b/server/accounts.go @@ -2017,7 +2017,14 @@ func (a *Account) removeAllServiceImportSubs() { // Add in subscriptions for all registered service imports. func (a *Account) addAllServiceImportSubs() { + var sis [32]*serviceImport + serviceImports := sis[:0] + a.mu.RLock() for _, si := range a.imports.services { + serviceImports = append(serviceImports, si) + } + a.mu.RUnlock() + for _, si := range serviceImports { a.addServiceImportSub(si) } } diff --git a/server/server.go b/server/server.go index 2e62a68e..6ffd0247 100644 --- a/server/server.go +++ b/server/server.go @@ -1594,13 +1594,23 @@ func (s *Server) fetchAccount(name string) (*Account, error) { } // The sub imports may have been setup but will not have had their // subscriptions properly setup. Do that here. + var needImportSubs bool + + acc.mu.Lock() if len(acc.imports.services) > 0 { if acc.ic == nil { acc.ic = s.createInternalAccountClient() acc.ic.acc = acc } + needImportSubs = true + } + acc.mu.Unlock() + + // Do these outside the lock. + if needImportSubs { acc.addAllServiceImportSubs() } + return acc, nil }