Skip to content

Commit 71d4264

Browse files
(2.14) [ADDED] Config reload: add/remove remote leafnodes (#7937)
The configuration reload now supports adding and/or removing remote leafnodes. A remote is identified with the combination of its URLs list, local account and credentials file name. This is what is used by the server to detect changes for the remote leafnodes list. Signed-off-by: Ivan Kozlovic <ivan@synadia.com>
2 parents d4c377f + 64569d5 commit 71d4264

15 files changed

+1969
-451
lines changed

server/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6189,7 +6189,7 @@ func (c *client) reconnect() {
61896189
srv.Debugf("Gateway %q not in configuration, not attempting reconnect", gwName)
61906190
}
61916191
} else if leafCfg != nil {
6192-
// Check if this is a solicited leaf node. Start up a reconnect.
6192+
// This is a solicited leaf node. Start up a reconnect.
61936193
srv.startGoRoutine(func() { srv.reConnectToRemoteLeafNode(leafCfg) })
61946194
}
61956195
}

server/config_check_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2025,6 +2025,22 @@ func TestConfigCheck(t *testing.T) {
20252025
errorLine: 7,
20262026
errorPos: 8,
20272027
},
2028+
{
2029+
name: "duplicate remote leafnode",
2030+
config: `
2031+
leafnodes {
2032+
port: -1
2033+
remotes [
2034+
{ url: "nats://user1:pwd@127.0.0.1:1234" }
2035+
{ url: "nats://user2:pwd@127.0.0.1:1235" }
2036+
{ url: "nats://user1:pwd@127.0.0.1:1234" }
2037+
]
2038+
}
2039+
`,
2040+
err: fmt.Errorf("duplicate remote"),
2041+
errorLine: 7,
2042+
errorPos: 9,
2043+
},
20282044
{
20292045
name: "show warnings on empty configs without values",
20302046
config: ``,

server/gateway.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,9 +1156,7 @@ func (c *client) processGatewayInfo(info *Info) {
11561156
// defensive code above that if we did not register this connection
11571157
// because we already have an outbound for this name, then
11581158
// close this connection (and make sure it does not try to reconnect)
1159-
c.mu.Lock()
1160-
c.flags.set(noReconnect)
1161-
c.mu.Unlock()
1159+
c.setNoReconnect()
11621160
c.closeConnection(WrongGateway)
11631161
return
11641162
}

server/jetstream_cluster_2_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6141,8 +6141,11 @@ func TestJetStreamClusterLeafNodeSPOFMigrateLeadersWithMigrateDelay(t *testing.T
61416141
// Now make sure once leafnode is back we can have leaders on this server.
61426142
cl.reEnableLeafnodes()
61436143
checkLeafNodeConnectedCount(t, cl, 2)
6144-
for _, ln := range cl.leafRemoteCfgs {
6145-
require_True(t, ln.jsMigrateTimer == nil)
6144+
for ln := range cl.leafRemoteCfgs {
6145+
ln.RLock()
6146+
ok := ln.jsMigrateTimer == nil
6147+
ln.RUnlock()
6148+
require_True(t, ok)
61466149
}
61476150

61486151
// Make sure we can migrate back to this server now that we are connected.

server/jetstream_helpers_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,7 +1176,7 @@ func (s *Server) reEnableLeafnodes() {
11761176
// Helper to set the remote migrate feature.
11771177
func (s *Server) setJetStreamMigrateOnRemoteLeaf() {
11781178
s.mu.Lock()
1179-
for _, cfg := range s.leafRemoteCfgs {
1179+
for cfg := range s.leafRemoteCfgs {
11801180
cfg.JetStreamClusterMigrate = true
11811181
}
11821182
s.mu.Unlock()
@@ -1185,7 +1185,7 @@ func (s *Server) setJetStreamMigrateOnRemoteLeaf() {
11851185
// Helper to set the remote migrate feature.
11861186
func (s *Server) setJetStreamMigrateOnRemoteLeafWithDelay(delay time.Duration) {
11871187
s.mu.Lock()
1188-
for _, cfg := range s.leafRemoteCfgs {
1188+
for cfg := range s.leafRemoteCfgs {
11891189
cfg.JetStreamClusterMigrate = true
11901190
cfg.JetStreamClusterMigrateDelay = delay
11911191
}

server/jetstream_leafnode_test.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,7 +1279,10 @@ func TestJetStreamLeafNodeJSClusterMigrateRecovery(t *testing.T) {
12791279
// supposed to have and then take them down.
12801280
remotes := map[*Server]int{}
12811281
for _, s := range lnc.servers {
1282-
remotes[s] += len(s.leafRemoteCfgs)
1282+
s.mu.RLock()
1283+
count := len(s.leafRemoteCfgs)
1284+
s.mu.RUnlock()
1285+
remotes[s] += count
12831286
s.closeAndDisableLeafnodes()
12841287
checkLeafNodeConnectedCount(t, s, 0)
12851288
}
@@ -1362,7 +1365,10 @@ func TestJetStreamLeafNodeJSClusterMigrateRecoveryWithDelay(t *testing.T) {
13621365
// supposed to have and then take them down.
13631366
remotes := map[*Server]int{}
13641367
for _, s := range lnc.servers {
1365-
remotes[s] += len(s.leafRemoteCfgs)
1368+
s.mu.RLock()
1369+
count := len(s.leafRemoteCfgs)
1370+
s.mu.RUnlock()
1371+
remotes[s] += count
13661372
s.closeAndDisableLeafnodes()
13671373
checkLeafNodeConnectedCount(t, s, 0)
13681374
}
@@ -1418,8 +1424,11 @@ func TestJetStreamLeafNodeJSClusterMigrateRecoveryWithDelay(t *testing.T) {
14181424

14191425
// Make sure all delay timers in remotes are disabled
14201426
for _, s := range lnc.servers {
1421-
for _, r := range s.leafRemoteCfgs {
1422-
require_True(t, r.jsMigrateTimer == nil)
1427+
for r := range s.leafRemoteCfgs {
1428+
r.RLock()
1429+
ok := r.jsMigrateTimer == nil
1430+
r.RUnlock()
1431+
require_True(t, ok)
14231432
}
14241433
}
14251434

0 commit comments

Comments
 (0)