From f11931314f976cde5ad8bd01046033bc6d241c4d Mon Sep 17 00:00:00 2001 From: Ivan Kozlovic Date: Thu, 30 Jul 2020 10:29:34 -0600 Subject: [PATCH] [FIXED] Deadlock on config reload with routes and account service import Related to #1544 Signed-off-by: Ivan Kozlovic --- server/reload.go | 2 ++ server/reload_test.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/server/reload.go b/server/reload.go index 6a92f2b3..3df1c10c 100644 --- a/server/reload.go +++ b/server/reload.go @@ -1129,6 +1129,7 @@ func (s *Server) reloadAuthorization() { s.gacc = nil s.configureAccounts() s.configureAuthorization() + s.mu.Unlock() s.accounts.Range(func(k, v interface{}) bool { newAcc := v.(*Account) @@ -1169,6 +1170,7 @@ func (s *Server) reloadAuthorization() { } return true }) + s.mu.Lock() // Check if we had a default system account. if s.sys != nil && s.sys.account != nil && !s.opts.NoSystemAccount { s.accounts.Store(s.sys.account.Name, s.sys.account) diff --git a/server/reload_test.go b/server/reload_test.go index 39cc9ea3..20d942ff 100644 --- a/server/reload_test.go +++ b/server/reload_test.go @@ -3100,11 +3100,23 @@ func TestConfigReloadAccountServicesImportExport(t *testing.T) { } } no_sys_acc: true + cluster { + name: "abc" + port: -1 + } `)) defer os.Remove(conf) s, opts := RunServerWithConfig(conf) defer s.Shutdown() + opts2 := DefaultOptions() + opts2.Cluster.Name = "abc" + opts2.Routes = RoutesFromStr(fmt.Sprintf("nats://127.0.0.1:%d", opts.Cluster.Port)) + s2 := RunServer(opts2) + defer s2.Shutdown() + + checkClusterFormed(t, s, s2) + derek, err := nats.Connect(fmt.Sprintf("nats://derek:foo@%s:%d", opts.Host, opts.Port)) if err != nil { t.Fatalf("Error on connect: %v", err) @@ -3148,6 +3160,9 @@ func TestConfigReloadAccountServicesImportExport(t *testing.T) { }); err != nil { t.Fatalf("Error on subscribe: %v", err) } + // This subscription is just to make sure that we can update + // route map without locking issues during reload. + natsSubSync(t, ivan, "bar") req := func(t *testing.T, nc *nats.Conn, subj string, reply string) { t.Helper() @@ -3199,6 +3214,10 @@ func TestConfigReloadAccountServicesImportExport(t *testing.T) { } } no_sys_acc: true + cluster { + name: "abc" + port: -1 + } `) // This still should work req(t, ivan, "foo", "reply1")