Skip to content

Commit 702640c

Browse files
[FIXED] Prevent a server from panicking when shutdown immediately after starting. (#5663)
Signed-off-by: Derek Collison <[email protected]>
2 parents ddfce5f + 63b0bb3 commit 702640c

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

server/events.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,51 +1066,64 @@ func (s *Server) Node() string {
10661066
// Tradeoff is subscription and interest graph events vs connect and
10671067
// disconnect events, etc.
10681068
func (s *Server) initEventTracking() {
1069-
if !s.EventsEnabled() {
1069+
// Capture sys in case we are shutdown while setting up.
1070+
s.mu.RLock()
1071+
sys := s.sys
1072+
s.mu.RUnlock()
1073+
1074+
if sys == nil || sys.client == nil || sys.account == nil {
10701075
return
10711076
}
10721077
// Create a system hash which we use for other servers to target us specifically.
1073-
s.sys.shash = getHash(s.info.Name)
1078+
sys.shash = getHash(s.info.Name)
10741079

10751080
// This will be for all inbox responses.
1076-
subject := fmt.Sprintf(inboxRespSubj, s.sys.shash, "*")
1081+
subject := fmt.Sprintf(inboxRespSubj, sys.shash, "*")
10771082
if _, err := s.sysSubscribe(subject, s.inboxReply); err != nil {
10781083
s.Errorf("Error setting up internal tracking: %v", err)
1084+
return
10791085
}
1080-
s.sys.inboxPre = subject
1086+
sys.inboxPre = subject
10811087
// This is for remote updates for connection accounting.
10821088
subject = fmt.Sprintf(accConnsEventSubjOld, "*")
10831089
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.remoteConnsUpdate)); err != nil {
10841090
s.Errorf("Error setting up internal tracking for %s: %v", subject, err)
1091+
return
10851092
}
10861093
// This will be for responses for account info that we send out.
10871094
subject = fmt.Sprintf(connsRespSubj, s.info.ID)
10881095
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.remoteConnsUpdate)); err != nil {
10891096
s.Errorf("Error setting up internal tracking: %v", err)
1097+
return
10901098
}
10911099
// Listen for broad requests to respond with number of subscriptions for a given subject.
10921100
if _, err := s.sysSubscribe(accNumSubsReqSubj, s.noInlineCallback(s.nsubsRequest)); err != nil {
10931101
s.Errorf("Error setting up internal tracking: %v", err)
1102+
return
10941103
}
10951104
// Listen for statsz from others.
10961105
subject = fmt.Sprintf(serverStatsSubj, "*")
10971106
if sub, err := s.sysSubscribe(subject, s.noInlineCallback(s.remoteServerUpdate)); err != nil {
10981107
s.Errorf("Error setting up internal tracking: %v", err)
1108+
return
10991109
} else {
11001110
// Keep track of this one.
1101-
s.sys.remoteStatsSub = sub
1111+
sys.remoteStatsSub = sub
11021112
}
1113+
11031114
// Listen for all server shutdowns.
11041115
subject = fmt.Sprintf(shutdownEventSubj, "*")
11051116
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.remoteServerShutdown)); err != nil {
11061117
s.Errorf("Error setting up internal tracking: %v", err)
1118+
return
11071119
}
11081120
// Listen for servers entering lame-duck mode.
11091121
// NOTE: This currently is handled in the same way as a server shutdown, but has
11101122
// a different subject in case we need to handle differently in future.
11111123
subject = fmt.Sprintf(lameDuckEventSubj, "*")
11121124
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.remoteServerShutdown)); err != nil {
11131125
s.Errorf("Error setting up internal tracking: %v", err)
1126+
return
11141127
}
11151128
// Listen for account claims updates.
11161129
subscribeToUpdate := true
@@ -1121,13 +1134,15 @@ func (s *Server) initEventTracking() {
11211134
for _, sub := range []string{accUpdateEventSubjOld, accUpdateEventSubjNew} {
11221135
if _, err := s.sysSubscribe(fmt.Sprintf(sub, "*"), s.noInlineCallback(s.accountClaimUpdate)); err != nil {
11231136
s.Errorf("Error setting up internal tracking: %v", err)
1137+
return
11241138
}
11251139
}
11261140
}
11271141
// Listen for ping messages that will be sent to all servers for statsz.
11281142
// This subscription is kept for backwards compatibility. Got replaced by ...PING.STATZ from below
11291143
if _, err := s.sysSubscribe(serverStatsPingReqSubj, s.noInlineCallback(s.statszReq)); err != nil {
11301144
s.Errorf("Error setting up internal tracking: %v", err)
1145+
return
11311146
}
11321147
monSrvc := map[string]sysMsgHandler{
11331148
"IDZ": s.idzReq,
@@ -1181,10 +1196,12 @@ func (s *Server) initEventTracking() {
11811196
subject = fmt.Sprintf(serverDirectReqSubj, s.info.ID, name)
11821197
if _, err := s.sysSubscribe(subject, s.noInlineCallback(req)); err != nil {
11831198
s.Errorf("Error setting up internal tracking: %v", err)
1199+
return
11841200
}
11851201
subject = fmt.Sprintf(serverPingReqSubj, name)
11861202
if _, err := s.sysSubscribe(subject, s.noInlineCallback(req)); err != nil {
11871203
s.Errorf("Error setting up internal tracking: %v", err)
1204+
return
11881205
}
11891206
}
11901207
extractAccount := func(subject string) (string, error) {
@@ -1277,6 +1294,7 @@ func (s *Server) initEventTracking() {
12771294
for name, req := range monAccSrvc {
12781295
if _, err := s.sysSubscribe(fmt.Sprintf(accDirectReqSubj, "*", name), s.noInlineCallback(req)); err != nil {
12791296
s.Errorf("Error setting up internal tracking: %v", err)
1297+
return
12801298
}
12811299
}
12821300

@@ -1285,6 +1303,7 @@ func (s *Server) initEventTracking() {
12851303
// is only one that will answer. This breaks tests since we still forward on remote server connect.
12861304
if _, err := s.sysSubscribe(fmt.Sprintf(userDirectReqSubj, "*"), s.userInfoReq); err != nil {
12871305
s.Errorf("Error setting up internal tracking: %v", err)
1306+
return
12881307
}
12891308

12901309
// For now only the STATZ subject has an account specific ping equivalent.
@@ -1302,39 +1321,46 @@ func (s *Server) initEventTracking() {
13021321
})
13031322
})); err != nil {
13041323
s.Errorf("Error setting up internal tracking: %v", err)
1324+
return
13051325
}
13061326

13071327
// Listen for updates when leaf nodes connect for a given account. This will
13081328
// force any gateway connections to move to `modeInterestOnly`
13091329
subject = fmt.Sprintf(leafNodeConnectEventSubj, "*")
13101330
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.leafNodeConnected)); err != nil {
13111331
s.Errorf("Error setting up internal tracking: %v", err)
1332+
return
13121333
}
13131334
// For tracking remote latency measurements.
1314-
subject = fmt.Sprintf(remoteLatencyEventSubj, s.sys.shash)
1335+
subject = fmt.Sprintf(remoteLatencyEventSubj, sys.shash)
13151336
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.remoteLatencyUpdate)); err != nil {
13161337
s.Errorf("Error setting up internal latency tracking: %v", err)
1338+
return
13171339
}
13181340
// This is for simple debugging of number of subscribers that exist in the system.
13191341
if _, err := s.sysSubscribeInternal(accSubsSubj, s.noInlineCallback(s.debugSubscribers)); err != nil {
13201342
s.Errorf("Error setting up internal debug service for subscribers: %v", err)
1343+
return
13211344
}
13221345

13231346
// Listen for requests to reload the server configuration.
13241347
subject = fmt.Sprintf(serverReloadReqSubj, s.info.ID)
13251348
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.reloadConfig)); err != nil {
13261349
s.Errorf("Error setting up server reload handler: %v", err)
1350+
return
13271351
}
13281352

13291353
// Client connection kick
13301354
subject = fmt.Sprintf(clientKickReqSubj, s.info.ID)
13311355
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.kickClient)); err != nil {
13321356
s.Errorf("Error setting up client kick service: %v", err)
1357+
return
13331358
}
13341359
// Client connection LDM
13351360
subject = fmt.Sprintf(clientLDMReqSubj, s.info.ID)
13361361
if _, err := s.sysSubscribe(subject, s.noInlineCallback(s.ldmClient)); err != nil {
13371362
s.Errorf("Error setting up client LDM service: %v", err)
1363+
return
13381364
}
13391365
}
13401366

0 commit comments

Comments
 (0)