Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix some system service imports going missing after reload #4360

Merged
merged 3 commits into from Aug 2, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
86 changes: 82 additions & 4 deletions server/reload_test.go
Expand Up @@ -2603,6 +2603,23 @@ func TestConfigReloadAccountUsers(t *testing.T) {
t.Fatalf("Error on subscribe: %v", err)
}

// confirm subscriptions before and after reload.
var expectedSubs uint32 = 4
sAcc, _ := s.LookupAccount("synadia")
sAcc.mu.RLock()
wallyqs marked this conversation as resolved.
Show resolved Hide resolved
n := sAcc.sl.Count()
sAcc.mu.RUnlock()
if n != expectedSubs {
t.Errorf("Synadia account should have %d sub, got %v", expectedSubs, n)
}
nAcc, _ := s.LookupAccount("nats.io")
nAcc.mu.RLock()
n = nAcc.sl.Count()
nAcc.mu.RUnlock()
if n != expectedSubs {
t.Errorf("Nats.io account should have %d sub, got %v", expectedSubs, n)
}

// Remove user from account and whole account
reloadUpdateConfig(t, s, conf, `
listen: "127.0.0.1:-1"
Expand Down Expand Up @@ -2678,8 +2695,8 @@ func TestConfigReloadAccountUsers(t *testing.T) {
n = sAcc.sl.Count()
barMatch := sAcc.sl.Match("bar")
sAcc.mu.RUnlock()
if n != 1 {
return fmt.Errorf("Synadia account should have 1 sub, got %v", n)
if n != expectedSubs {
return fmt.Errorf("Synadia account should have %d sub, got %v", expectedSubs, n)
}
if len(barMatch.psubs) != 1 {
return fmt.Errorf("Synadia account should have bar sub")
Expand All @@ -2690,8 +2707,8 @@ func TestConfigReloadAccountUsers(t *testing.T) {
n = nAcc.sl.Count()
batMatch := nAcc.sl.Match("bat")
nAcc.mu.RUnlock()
if n != 1 {
return fmt.Errorf("Nats.io account should have 1 sub, got %v", n)
if n != expectedSubs {
return fmt.Errorf("Nats.io account should have %d sub, got %v", expectedSubs, n)
}
if len(batMatch.psubs) != 1 {
return fmt.Errorf("Synadia account should have bar sub")
Expand All @@ -2700,6 +2717,67 @@ func TestConfigReloadAccountUsers(t *testing.T) {
})
}

func TestConfigReloadAccountWithNoChanges(t *testing.T) {
conf := createConfFile(t, []byte(`
listen: "127.0.0.1:-1"
system_account: sys
accounts {
A {
users = [{ user: a }]
}
B {
users = [{ user: b }]
}
C {
users = [{ user: c }]
}
sys {
users = [{ user: sys }]
}
}
`))
s, opts := RunServerWithConfig(conf)
defer s.Shutdown()

ncA, err := nats.Connect(fmt.Sprintf("nats://a:@%s:%d", opts.Host, opts.Port))
if err != nil {
t.Fatalf("Error on connect: %v", err)
}
defer ncA.Close()

// Confirm service imports are ok.
resp, err := ncA.Request("$SYS.REQ.ACCOUNT.PING.CONNZ", nil, time.Second)
if err != nil {
t.Error(err)
}
if resp == nil || !strings.Contains(string(resp.Data), `"num_connections":1`) {
t.Fatal("unexpected data in connz response")
}

before := s.NumSubscriptions()
s.Reload()
after := s.NumSubscriptions()
if before != after {
t.Errorf("Number of subscriptions changed after reload: %d -> %d", before, after)
}

// Confirm this still works...
resp, err = ncA.Request("$SYS.REQ.ACCOUNT.PING.CONNZ", nil, time.Second)
if err != nil {
t.Fatal(err)
}
if resp == nil || !strings.Contains(string(resp.Data), `"num_connections":1`) {
t.Fatal("unexpected data in connz response")
}

before = s.NumSubscriptions()
s.Reload()
after = s.NumSubscriptions()
if before != after {
t.Errorf("Number of subscriptions changed after reload: %d -> %d", before, after)
}
}

func TestConfigReloadAccountNKeyUsers(t *testing.T) {
conf := createConfFile(t, []byte(`
listen: "127.0.0.1:-1"
Expand Down
3 changes: 3 additions & 0 deletions server/server.go
Expand Up @@ -900,6 +900,9 @@ func (s *Server) configureAccounts(reloading bool) (map[string]struct{}, error)
c.processUnsub(sid)
}
acc.addAllServiceImportSubs()
s.mu.Unlock()
s.registerSystemImports(acc)
s.mu.Lock()
}

// Set the system account if it was configured.
Expand Down