@@ -98,6 +98,7 @@ type ServerContext struct {
9898 DatabaseInitManager * DatabaseInitManager // Manages database initialization (index creation and readiness) independent of database stop/start/reload, when using persistent config
9999 ActiveReplicationsCounter
100100 invalidDatabaseConfigTracking invalidDatabaseConfigs
101+ signalContextFunc context.CancelFunc
101102 // handle sgcollect processes for a given Server
102103 SGCollect * sgCollect
103104}
@@ -209,7 +210,9 @@ func NewServerContext(ctx context.Context, config *StartupConfig, persistentConf
209210
210211 sc .startStatsLogger (ctx )
211212
212- sc .registerSignalHandlerForStackTrace (ctx )
213+ signalCtx , cancelFunc := context .WithCancel (ctx )
214+ sc .signalContextFunc = cancelFunc
215+ sc .registerSignalHandlerForStackTrace (signalCtx )
213216
214217 return sc
215218}
@@ -220,8 +223,14 @@ func (sc *ServerContext) registerSignalHandlerForStackTrace(ctx context.Context)
220223 signalChannel := make (chan os.Signal , 1 )
221224 signal .Notify (signalChannel , syscall .SIGUSR1 )
222225
226+ defer func () {
227+ signal .Stop (signalChannel )
228+ close (signalChannel )
229+ }()
230+
223231 go func () {
224- for sig := range signalChannel {
232+ select {
233+ case sig := <- signalChannel :
225234 base .InfofCtx (ctx , base .KeyAll , "Handling signal: %v" , sig )
226235 switch sig {
227236 case syscall .SIGUSR1 :
@@ -232,6 +241,8 @@ func (sc *ServerContext) registerSignalHandlerForStackTrace(ctx context.Context)
232241 default :
233242 // unhandled signal here
234243 }
244+ case <- ctx .Done ():
245+ return
235246 }
236247 }()
237248}
@@ -304,6 +315,9 @@ func (sc *ServerContext) Close(ctx context.Context) {
304315 base .InfofCtx (ctx , base .KeyAll , "Couldn't stop background config update worker: %v" , err )
305316 }
306317
318+ // cancel any signal handlers
319+ sc .signalContextFunc ()
320+
307321 sc .lock .Lock ()
308322 defer sc .lock .Unlock ()
309323
@@ -1882,26 +1896,26 @@ func (sc *ServerContext) logStackTraces(ctx context.Context, timestamp string) {
18821896 _ , _ = fmt .Fprintf (os .Stderr , "Stack trace:\n %s\n " , stackTrace )
18831897
18841898 filename := filepath .Join (sc .Config .Logging .LogFilePath , stackFilePrefix + timestamp + ".log" )
1885- file , err := base . CreateFileInDirectory (filename )
1899+ file , err := os . Create (filename )
18861900 defer func () {
1887- err = file .Close ()
1888- if err != nil {
1889- base .WarnfCtx (ctx , "Error closing stack trace file %s: %v" , filename , err )
1901+ closeErr : = file .Close ()
1902+ if closeErr != nil {
1903+ base .WarnfCtx (ctx , "Error closing stack trace file %s: %v" , filename , closeErr )
18901904 }
18911905 }()
18921906 if err != nil {
1893- base .DebugfCtx (ctx , base . KeyAll , "Error opening stack trace file %s: %v" , filename , err )
1907+ base .WarnfCtx (ctx , "Error opening stack trace file %s: %v" , filename , err )
18941908 }
18951909
18961910 _ , err = file .WriteString (fmt .Sprintf ("Stack trace:\n %s\n " , stackTrace ))
18971911 if err != nil {
1898- base .DebugfCtx (ctx , base . KeyAll , "Error writing stack trace to file %s: %v" , filename , err )
1912+ base .WarnfCtx (ctx , "Error writing stack trace to file %s: %v" , filename , err )
18991913 }
19001914
19011915 rotatePath := filepath .Join (sc .Config .Logging .LogFilePath , stackFilePrefix + "*.log" )
19021916 err = base .RotateProfilesIfNeeded (rotatePath )
19031917 if err != nil {
1904- base .DebugfCtx (ctx , base . KeyAll , "Error rotating stack trace files in path %s: %v" , rotatePath , err )
1918+ base .WarnfCtx (ctx , "Error rotating stack trace files in path %s: %v" , rotatePath , err )
19051919 }
19061920}
19071921
0 commit comments